Kiroku

A voice notebook where nothing leaves the phone.


Inspiration

There is a specific moment I kept having.

I would be walking, or driving, and say something into my phone that I meant only for myself. Something about work I was not ready to say out loud to anyone. Something about a person. Something I would have written badly, or not at all, if I had to type it.

And then, a second later, the app would show me a little spinner while it sent that sentence to a server in a different country, to be processed by a company whose business model I had not read carefully.

Every voice app works this way. Record, upload, transcribe remotely, summarize remotely, retain indefinitely. The privacy policies are not lying, exactly. They are just written by people who assume you will never ask what "processing" means in practice.

I did not want a better promise. Promises are unfalsifiable. I wanted an app that was structurally incapable of the thing I was worried about, where the audio, the transcript, and the model reading it all lived on the same piece of glass in my hand.


The test it has to pass

Open the app. Turn on airplane mode. Record a note.

It transcribes. It proofreads the messy speech-to-text output into clean prose. It writes a title, tags the recurring themes, reads the emotional tone. You can ask it for a summary, or the tasks you rattled off, or the decision you talked yourself into. You can have it rewrite the note in a different voice. You can chat with it. Months of those emotion tags stack up into a weekly trend view that has told me more about my year than my calendar did.

All of that, with the radio off.

If a feature cannot survive that test, it does not ship as a default. That single rule decided most of the architecture.


How I built it

The app is React Native 0.86 on Expo 57, with Drizzle over SQLite for storage and Zustand for state. Storage being local was never in question, so the real work was making inference local too.

Kiroku runs on device through two paths: Gemini Nano on the phone's NPU, via Google's ADK and ML Kit GenAI, and MLC for downloadable open weight models on hardware without Nano. There is a third path, Gemini 3.5 Flash through Firebase AI Logic behind App Check, but it is a fallback you choose, not a default you inherit, and the model selector always shows you which one answered.


Built With

Share this project:

Updates

Submission history