pocket-ghost
Built with my partner for spooky walks with friends. Hold the ghost button and it conjures a story for exactly where you're standing, using local history to make it feel real, and you never see the same story twice.

Overview
We always made up ghost stories on night walks, so we built an app to do it for us.
Me, my partner and our friends have always made up ghost stories when we're somewhere that feels a bit spooky at night, York, Edinburgh, wherever. My partner and I wanted to turn that into an app: hold a button, and it conjures a story grounded in the real history of exactly where you're standing.
The app pulls nearby and area history from Wikipedia, reverse-geocodes your location for context, then streams a story back from Claude in real time. Stories are cached by location, so the API can serve a fresh one instantly next time, but you'll never get the same one twice.
The problem
We wanted the stories to feel like more than generic AI horror, something with a thread of truth and history to it, tied to the actual place you're standing. That meant building real grounding into the system, not just prompting an AI to make something up.
My role
A duo project with my partner: we worked on the concept and design together, and I built it.
How it works

Hold to conjure
Hold the ghost button on the home screen and the story slowly builds, with animation and haptics (still a work in progress), then streams in live as it's generated.

Grounded in real local history
Nearby and area-level Wikipedia history feeds the story, so it's tied to real names, dates and places rather than generic horror tropes.

Never the same story twice
Stories are cached by location for other users, but the app tracks what you've already seen and Claude is told to take a different angle each time, so a spot never repeats itself for you.
Stack & architecture
Streaming comes straight from the Claude API over SSE, so the title and each paragraph appear as they're written rather than waiting on a full response. Stories are pooled in Redis by geohash to keep repeat visits fast.
What I learned
Getting the grounding right took more care than the AI generation itself, sourcing the right historical context is what makes a story feel like it could be real instead of generic.