GhostRunner
An open-source, local-first AI audio drama engine that combines running or walking routes with LLM-generated thriller narratives. GPS triggers pre-compiled audio beats, playing story content at corresponding landmarks along the route.
Timeline (last 90 days)
GhostRunner is an open-source, local-first audio drama engine that turns real streets into a thriller radio drama stage.
Every story beat in GhostRunner is anchored to a specific distance along the route (chainage, in meters), with triggers based on distance rather than time.
GhostRunner's narrator can only mention landmarks that actually exist on the route in OpenStreetMap, and a validator rejects any fabricated landmarks.
GhostRunner's story is compiled and voiced before execution, and playing lines is lookup rather than real-time inference.
GhostRunner can run on a laptop GPU with only 4 GB of VRAM.
GhostRunner uses the Overpass API to query POIs in OpenStreetMap along the route corridor as material for the LLM narration.
GhostRunner uses two LangGraph graphs: compile_graph does the heavy lifting (route planning, POI fetching, director LLM, beat writer, validator and TTS rendering), while runtime_graph is millisecond-level deterministic nodes (GPS reading, pace classification, trigger checks, etc.).
In GhostRunner, all orchestration decisions are made in pure Python, and the LLM is only responsible for the director (one structured call) and the beat writer (three variants of at most 30 words per beat).
GhostRunner uses TabPFN to classify runners as CRUISING, ACCELERATING, EXHAUSTED or STOPPED, and uses a 3-tick hysteresis filter to avoid the story flip-flopping back and forth.
GhostRunner's TabPFN training labels come from transparent heuristic rules applied to simulated running trajectories, with no labeled dataset; if loading fails, a rule-based classifier takes over automatically.
5 more timeline events
All Facts (15)
GhostRunner is an open-source, local-first audio drama engine that turns real streets into a thriller radio drama stage.
50%UnverifiedEvery story beat in GhostRunner is anchored to a specific distance along the route (chainage, in meters), with triggers based on distance rather than time.
50%UnverifiedGhostRunner's narrator can only mention landmarks that actually exist on the route in OpenStreetMap, and a validator rejects any fabricated landmarks.
50%UnverifiedGhostRunner's story is compiled and voiced before execution, and playing lines is lookup rather than real-time inference.
50%UnverifiedGhostRunner can run on a laptop GPU with only 4 GB of VRAM.
50%UnverifiedGhostRunner uses the Overpass API to query POIs in OpenStreetMap along the route corridor as material for the LLM narration.
50%UnverifiedGhostRunner uses two LangGraph graphs: compile_graph does the heavy lifting (route planning, POI fetching, director LLM, beat writer, validator and TTS rendering), while runtime_graph is millisecond-level deterministic nodes (GPS reading, pace classification, trigger checks, etc.).
50%UnverifiedIn GhostRunner, all orchestration decisions are made in pure Python, and the LLM is only responsible for the director (one structured call) and the beat writer (three variants of at most 30 words per beat).
50%UnverifiedGhostRunner uses TabPFN to classify runners as CRUISING, ACCELERATING, EXHAUSTED or STOPPED, and uses a 3-tick hysteresis filter to avoid the story flip-flopping back and forth.
50%UnverifiedGhostRunner's TabPFN training labels come from transparent heuristic rules applied to simulated running trajectories, with no labeled dataset; if loading fails, a rule-based classifier takes over automatically.
50%UnverifiedGhostRunner uses ElevenLabs to voice each line, rendered ahead of time via a rolling window of the next three triggers, with audio clips content-addressed by sha256(voice + text), making repeated lines zero-cost.
50%UnverifiedGhostRunner's voice cost is its only usage-based cost, about 25 beats × 3 variants × about 150 characters, roughly 11,000 characters for a complete package, calculated per route rather than per listener.
50%UnverifiedIn GhostRunner, the real-time GPS trajectory never leaves the machine running the app, and the raw trajectory is deleted after the session ends.
50%UnverifiedGhostRunner's saved missions can be replayed with the LLM, router and TTS all turned off.
50%UnverifiedGhostRunner's unit of sale is the mission package: one route, one compiled story and voiced audio, produced once and replayable unlimited times; as of now no paid pilot has been run and pricing has not been validated.
50%