"The microphone is the cheapest part. The product is everything that happens after you stop talking."
What You're Actually Building
It's tempting to describe a dictation app as "a chat window with a mic." That framing is wrong, and it will lead you to build the wrong thing. Firekeeper never opens a window you type into. You are already in Mail, or a terminal, or a browser text field. You hold a key, you talk, you let go, and the words appear where your cursor already was. There is no destination app called "Firekeeper." The app is invisible; the loop is the product.
The Loop
Every dictation is the same five-step pipeline. Memorize it — the rest of this quest is just each step in depth:
global hotkey -> microphone -> local STT -> cleanup -> insert into active app
Notice what's not in that line: no cloud, no account, no "send." The audio is captured locally, transcribed locally, and the only thing that can leave your machine is the transcript text, for the cleanup pass — and only in a lane you chose in settings. The default lane cleans on the Mac. The Pippa-backed lanes send the text to your own office machine, and from there to the brain or model the family has assigned, which can be a cloud model. Local Mini sends it to the Ollama host you set. The audio itself never leaves.
A Surface, Not a Brain
Firekeeper is a client surface for Pippa, not a second Pippa. When it needs judgment — a command, opt-in Full dictation, a voice chat — it asks cwkPippa, and its generic dictation cleanup runs in a persona-free family worker; it does not stand up its own identity, memory, or model routing. That single rule is what keeps the family coherent: one brain in cwkPippa, many surfaces around it — Cinder for drawing, Rekindle for prose, Firekeeper for voice. A surface can stay narrow and sharp because it borrows the brain instead of rebuilding it.