The idea
A small desktop app that watches the folder your voice memos sync into, transcribes every recording locally, and indexes the text. You get a search box over everything you have ever dictated — the walk where you talked out a business plan, the parking-lot note after a doctor's appointment, the three-minute ramble that contained one good sentence. Results play from the matched timestamp, not from the top of the file.
Why build this
People record far more than they replay. A voice memo is cheap to make and expensive to retrieve: the only metadata is a date and, if you are lucky, a first-line auto-title. The recordings pile up into a write-only archive, which is why most of them are never opened again.
Cloud transcription solves the retrieval problem and creates a worse one. These recordings are unusually personal — medical notes, arguments rehearsed in the car, salary conversations, half-formed ideas people would not put in a shared doc. Uploading a decade of that to a third party is a real cost, and the reason plenty of people never bother.
What changed is that local speech-to-text got good. whisper.cpp with a quantized large-v3-turbo model transcribes faster than real time on any Apple Silicon Mac or a recent laptop with a mid-range GPU, and it is accurate enough on casual, noisy, first-person speech — the hardest case for older engines. Small embedding models now run locally too, so "meaning" search does not require an API either. The whole pipeline fits on the user's machine, which turns the privacy objection into the selling point.
Stack sketch
- Shell: Tauri v2 — small binaries, native file access, and a real menu bar. React plus Tailwind inside.
- Transcription:
whisper.cppvia thewhisper-rsbindings, bundled with a quantizedlarge-v3-turboGGUF, with abase.enfallback for weak machines. Emit word-level timestamps. - Index: SQLite. FTS5 for keyword search,
sqlite-vecfor vector search over per-segment embeddings fromfastembed-rs(bge-small-en-v1.5). One file, no server. - Watching:
notify(the Rust crate) on the memo directory —~/Library/Application Support/com.apple.voicememos, a Dropbox folder, an Android sync target. Debounce, then queue. - Audio:
symphoniafor decode,ffmpegshelled out only for exotic containers. Waveform rendering with WaveSurfer.js. - Optional cloud: a user-supplied Anthropic key for per-memo summaries and action-item extraction. Off by default, clearly labeled, never a dependency.
Scope for v1
In:
- Pick one or more watched folders; import the backlog on first run with a visible progress queue.
- Background transcription with pause/resume, so a 900-file backlog does not melt the laptop.
- Hybrid search: FTS5 and vector results merged with reciprocal rank fusion, ranked into one list.
- Result cards showing the matched sentence, date, duration, and a play button that seeks to that word.
- Full transcript view with click-to-seek, plus copy and export to Markdown.
Out: recording inside the app, speaker diarization, mobile clients, sync between machines, editing transcripts, and any account system. There is no login because there is no server.
Where it could go
The obvious next layer is structure. Once transcripts are local and cheap to reprocess, you can pull out dates, names, and commitments, then surface "things you said you would do" as a review list. That is where a local model earns its keep — a nightly pass over new memos costs nothing and needs no network.
Second path: become the search layer for other audio. The same pipeline handles lecture recordings, podcast archives, interview tapes, and meeting captures dropped into a folder. Journalists and researchers with hundreds of hours of interviews are a paying audience for exactly this, and they are the least likely to accept a cloud uploader.
Third path: a documented plugin point for exporters — Obsidian vault, Day One, plain Markdown — so the app becomes an ingest stage in an existing note system rather than another silo.
Watch out for
Model licensing and distribution size are the real friction: shipping a multi-gigabyte GGUF inside an installer is hostile, so download models on first run and be honest about disk use. Also test on the worst audio you can find — pocket recordings and wind noise produce confident nonsense, and a search hit on a hallucinated sentence erodes trust faster than a missing result does.