Ghostwriter
The ghost that keeps your stories.
Record the stories your family tells before they're forgotten: your grandmother's kitchen, a strange night in the hostel, the letter nobody can explain. The Archivist, a kind ghost living in your laptop, writes each one down, keeps it, and haunts you with it later. Nothing leaves the laptop.
“That memory was never given to me.”
See it with the Wi-Fi off
Have a look inside
Read what the ghost wrote
The ghost lives on your laptop, not on a server, so this page can't run it for you. But here is what it makes: a memory book exported by Ghostwriter from fictional sample stories, told in English and in Hindi, including an answer added later to one of them. The titles, summaries, people, places, unfinished business and the Archivist's notes were all written by Gemma 4 on a laptop. Your own archive exports the same way: one file that any browser can open, years from now.
What the ghost does
It listens
Record in the browser or drop in a voice note, in Hindi, English or the mix most of us actually speak. Whisper writes down every word, guided by the names already in your archive, so Meera stays Meera.
It remembers
Gemma 4 gives each story a title and a short summary, and notes who was there, where and when, and the objects, recipes and sayings worth keeping. It writes only what you said.
It won't invent a memory
If a recording comes out as noise, the ghost says the words came to it as fog, writes nothing up, and offers to listen again in another language or let you fix the words.
It notices what you left out
After every story the ghost asks about what you left out: who else was there, how it smelled, what happened next. Answer out loud, and your answer joins the story it completes.
“You never told me where the brass pot went...”
It holds a séance
Ask the archive anything. EmbeddingGemma finds the stories that mean the same thing (a "good cook" finds the kadhi story), and the ghost answers only from them, cites them, and admits what it was never told.
It lights a candle for each memory
Your stories stand as candles on a wall strung with orange and white lights. The ones you haven't visited in a while burn low. Open one, and it flares back to life.
It speaks, and it retells
The Archivist can read its answers aloud in a low, echoing voice, and retell any memory as a campfire bhoot-kahani: always labelled as a retelling, never replacing what you said.
Nothing leaves the laptop
Your voice stays home
Recordings, transcripts and stories live in one folder on your disk. There is no cloud, no account and no analytics.
The lights can go out
Every model runs locally, so it works with the internet switched off. The page doesn't even load fonts from the web.
No bill, no expiry
No API keys and no subscription. Export the whole archive as one file that any browser can open, years from now.
Swap the brains
Model names are one line in a settings file. Use a smaller Gemma on an older laptop, or a larger Whisper for better Hindi.
How it works
- Your voicebrowser recording
- ffmpeg16 kHz audio
- Whispertranscript
- Quality checkfog is not a memory
- Gemma 4validated JSON
- SQLite + EmbeddingGemmawords and meanings
- Séancegrounded answers
- Piperthe ghost's voice
Gemma runs through Ollama and streams its words to the page as they are written, so the answer appears like ink from an invisible hand. Search combines SQLite's full-text index, which finds Hindi and English alike, with EmbeddingGemma, which finds stories by meaning. When nothing in your stories matches a question, Gemma isn't asked at all.
Real numbers, ordinary laptop
Measured on an Intel i7-13620H with 16 GB of RAM and no graphics card doing the work:
| Writing down a recording (Whisper small) | about 35 seconds per minute of audio |
|---|---|
| An 11-second story, from upload to finished page | 46 seconds |
| Gemma's writing speed | 10 to 19 tokens (pieces of words) a second |
| A séance answer | first words in 7 to 24 seconds |
| Finding stories by meaning (EmbeddingGemma) | under a tenth of a second |
| The ghost's voice | starts at once for a note it has already voiced; 2.3 seconds for something new |
Built on open work
| Gemma 4 (e4b) | Google DeepMind, Apache 2.0 |
|---|---|
| EmbeddingGemma (300m, q8) | Google DeepMind, Gemma Terms of Use |
| Whisper, via faster-whisper | OpenAI and SYSTRAN, MIT |
| Ollama | MIT |
| Piper text-to-speech | Rhasspy, MIT (with espeak-ng, GPL-3.0) |
| Voice: northern_english_male | Piper voices, trained on OpenSLR 83, CC BY-SA 4.0 |
| SQLite, FastAPI, ffmpeg | public domain, MIT, GPL-3.0 (build used) |
| Caveat and IM Fell English fonts | SIL Open Font License 1.1 |
Run it yourself
Windows, Python 3.11, ffmpeg and Ollama. The full steps are in the README.
ollama pull gemma4:e4b
ollama pull embeddinggemma:300m-qat-q8_0
powershell -ExecutionPolicy Bypass -File scripts\setup.ps1
powershell -ExecutionPolicy Bypass -File scripts\demo.ps1