DEV Community

Cover image for Granny Memories: a ghost writer that lives on my grandma's phone
Paula
Paula

Posted on AI-assisted

Granny Memories: a ghost writer that lives on my grandma's phone

Hacktoberfest Weekend Challenge: Build for a Friend Submission 🤝

This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend

What I Built

My grandmother has more than 80 years of stories. She doesn't write them down. She tells them, the way stories have been passed on for thousands of years: out loud, to whoever is listening. Lately that means voice notes on her phone.

Those voice notes are a treasure, and they are scattered. Turning them into a book usually means someone else rewrites everything, and somewhere in that rewrite her voice disappears. The text becomes "well written" and stops sounding like her.

Granny Memories is an Android app that gives her the autonomy to tell her own story, simply, directly on her own phone. It works like a ghost writer that is always by her side:

  1. She records a story (or picks a voice note she already has).
  2. The app transcribes it and shows her the text. Words it wasn't sure about are marked, and she taps them to fix them.
  3. It separates the story into ideas, each one tied to the exact words she said.
  4. It learns her way of telling: short sentences, how she opens a story, the expressions she repeats. For each trait it shows a real quote from her and asks: "Is this you?" Only the traits she approves are used.
  5. It writes a short chapter in her voice. Every passage carries a little seal ("Audio 1 · 00:20"). Tap it and you see, and hear, the exact moment of the recording it came from.
  6. She reads it and approves it. The book grows chapter by chapter, and she can preview it as a book.

What the ghost writer will not do matters as much: it never invents a fact, a name, a line of dialogue or a moral she didn't say. When something is missing, it asks her a question instead of filling the gap. And it never decides that a story is "too sensitive" to tell. That decision is always hers.

A modern touch to the oldest tradition we have: telling our stories out loud.

Something I've heard from my grandmother, and from other people in their eighties I've talked to, is that they have seen so much, and that everything in their time was different from what we live today. I confess I find it fascinating to hear these accounts of the past first-hand, and I'd like to preserve them somehow. This project is a humble attempt to make it easier to turn stories told out loud into a book of memories.

Demo

In the video, "Grandma" is an ElevenLabs AI voice (a Brazilian older woman's voice from the Voice Library) reading a fictional memory I wrote for the demo: going to tea at the Mappin department store in downtown São Paulo in the 1960s. No real family recordings are in the repository or in the video.

Organizing the book is just as simple: each story goes into a chapter, and she changes the order with big arrows. No dragging, one hand is enough.

Real app prints running on Android

Code

GitHub logo paulaksm / granny-memories

A ghost writer agent built for my grandma transform her beautiful life journey into a book.

Granny Memories

Um app Android que transforma os áudios que uma avó grava contando a vida dela em um livro escrito na voz dela. Ela não precisa escrever nada. O app transcreve, separa as ideias, aprende o jeito dela de contar e redige capítulo a capítulo. Ela decide o que fica.

An Android app that turns the voice notes a grandmother records about her life into a book written in her own voice. The writing runs on the phone with an open-weight model (Gemma 4); only the audio leaves the device, to be transcribed.

Feito para a minha avó, no Hacktoberfest Weekend Challenge: Build for a Friend, da DEV.

Para quem e por quê

As histórias da minha avó estão espalhadas em áudios de WhatsApp. Transformar isso em livro exige reescrever tudo, e no caminho a voz de quem conta se perde: o texto fica "bem escrito" e…

How I Built It

It runs on the phone. The writing happens on a Samsung Galaxy S24 with an open-weight model, Gemma 4 E2B (Apache 2.0), quantized to GGUF Q4_K_M (about 3.1 GB) and run with llama.rn, the React Native binding for llama.cpp. On the S24 (Exynos 2400, CPU only) it loads in about 5 seconds and generates 11 to 12 tokens per second. From a short recording to a finished chapter takes a few minutes, on her own phone, offline.

Only the audio leaves the phone. Transcription is the one external call: ElevenLabs Scribe v2, with automatic language detection. I use the per-word confidence it returns to mark doubtful words with [?] so she can fix them. Her API key is typed in the app and kept in Android's secure storage. It is never bundled in the app.

A small model needs a strict harness. A 2B-class model on a phone will happily rewrite your grandmother into a generic memoir. So the app doesn't trust it with formats or facts:

  • The model returns content, the code writes the files. Every agent answers in JSON constrained by a JSON Schema (llama.rn turns it into a grammar), so the output always has the right shape. IDs, timestamps, sources and confidence are computed by code, never by the model.
  • Deterministic checks after every step, with no language model involved:
    • cleanup: the cleaned text may remove "uh"s and false starts, but it can't contain a single word she didn't say.
    • ideas: every idea must quote a passage that literally exists in the transcript.
    • traceability: every paragraph of the chapter must cite ideas that exist.

If a check fails, the step is retried once with the errors shown to the model. If it fails again, the app keeps her words as she said them.

  • Her voice is half statistics, half her. Sentence length, repeated expressions and oral markers are counted by code. Real quotes are picked from validated ideas. The model may describe at most three traits, each one backed by a literal quote, and she approves or rejects every one.
  • A fixed pipeline, no orchestrator agent. In this slice the order of steps is a deterministic TypeScript runner. The ghost writer's voice shows up only in the chapter's notes and questions.

Every agent's system prompt shares the same two rules: editorial neutrality (no agent ever weighs whether a story is worth telling for religious, cultural or social reasons) and fidelity (no invented facts, names, dates or dialogue; gaps become questions; contradictions go back to her).

Stack: Expo (React Native) + TypeScript, Expo dev client built with EAS, llama.rn, expo-audio, expo-file-system, expo-secure-store. The UI was designed in Claude Design for an older, non-technical user: large type (Literata for the book, Atkinson Hyperlegible for the interface), high contrast, one primary button per screen, and the word "ideas", never "atoms" or "prompts". The harness has 23 tests that run in Node without a phone or a model, including an end-to-end run with a fake model.

What I learned on a real phone:

  • The first test runs exposed things no unit test would catch. Expo SDK 57's fetch no longer accepts React Native's { uri, name, type } form-data parts (you pass the File from expo-file-system, which is a Blob). And Android killed the app for low memory on a second run until I released the model between tasks.
  • Prompting a small model is mostly about taking things away from it. My first chapter added a "because" she never said, inherited from a summary. Giving the writer only her literal quotes fixed it.
  • A small model still gets things wrong, and the design has to expect it. In the demo, one suggested trait is about what she talks about (her mother) instead of how she talks. That is exactly why every trait needs her "Is this you?" before it is used.

Built with the help of Claude Code as a pair programmer; this post was also drafted with Claude from my notes and reviewed by me.

Why Open Innovation Matters Here

These are family memories: names, losses, fights, secrets. For this app, open models aren't a nice-to-have. They are what makes it possible at all.

  • Privacy by architecture, not by policy. With an open-weight model running on her phone, the text of her life never leaves her hands. The only thing that goes out is the audio, for transcription, and the app says so plainly on the home screen and in Settings.
  • No meter running. Once the model is downloaded, writing a chapter costs nothing and needs no internet. Grandma doesn't need a subscription to tell her story.
  • Her book isn't locked to a vendor. The original recordings and transcripts are kept untouched. When a better open model comes out, the whole book can be reprocessed.
  • Trust you can read. The prompts, the checks that keep the model honest and the app itself are open source. Anyone can verify why it doesn't make things up, and anyone can build the same thing for their own grandparents.

Oral tradition has always been open: whoever hears a story can carry it on. This project tries to keep it that way.

Prize categories

  • Best Use of Gemma: Gemma 4 E2B does all of the writing on the device: cleanup, idea extraction, the voice profile and the chapter.
  • Best Use of ElevenLabs: Scribe v2 turns her voice notes into text, with automatic language detection and per-word confidence that drives the "tap the doubtful word" screen.

Top comments (0)