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

Demo video goes here.

Have a look inside

The candle wall: each story is a candle whose shape and flame colour show its mood; one unopened story burns low
The candle wall. Each story's mood picks its candle; a story you haven't opened for a while burns low.
A story page with the Archivist's note, tags, and an answer added later under its question
A story, with the Archivist's note and an answer added later under its question.
A séance answer with numbered sources
The séance answers only from your stories, and numbers the ones it used.
An unclear recording: the words came to me as fog
A recording it couldn't hear clearly is never turned into a made-up memory.
Plain mode: simple cards and neutral words
Plain mode: the same app in simple words, with no effects.

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

  1. Your voicebrowser recording
  2. ffmpeg16 kHz audio
  3. Whispertranscript
  4. Quality checkfog is not a memory
  5. Gemma 4validated JSON
  6. SQLite + EmbeddingGemmawords and meanings
  7. Séancegrounded answers
  8. 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 page46 seconds
Gemma's writing speed10 to 19 tokens (pieces of words) a second
A séance answerfirst words in 7 to 24 seconds
Finding stories by meaning (EmbeddingGemma)under a tenth of a second
The ghost's voicestarts 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-whisperOpenAI and SYSTRAN, MIT
OllamaMIT
Piper text-to-speechRhasspy, MIT (with espeak-ng, GPL-3.0)
Voice: northern_english_malePiper voices, trained on OpenSLR 83, CC BY-SA 4.0
SQLite, FastAPI, ffmpegpublic domain, MIT, GPL-3.0 (build used)
Caveat and IM Fell English fontsSIL 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

The code, the README and the credits are on GitHub.