Selected Work
Case study · 02 / 03

pocket-ghost

Expo · Claude · Streaming AI

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.

ExpoReact NativeClaude APIStreaming
pocket-ghost home screen with the hold-to-conjure button
RoleDuo — design & build
TypePersonal project
PlatformiOS · Android
StatusIn development
01

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.

02

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.

03

My role

A duo project with my partner: we worked on the concept and design together, and I built it.

React Native / Expo app
Serverless API (Vercel)
Wikipedia geosearch & reverse geocoding
Claude prompt design & streaming
Location-based caching
04

How it works

pocket-ghost hold-to-conjure button on the home screen

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.

pocket-ghost map view of nearby historical locations

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.

pocket-ghost story streaming in live from Claude

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.

05

Stack & architecture

App
ExpoReact Nativeexpo-locationexpo-haptics
API
Vercel serverless functionsClaude API (claude-sonnet-4-6)Server-sent events
Data
Upstash RedisGeohashingWikipedia API

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.

06

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.