Hold fn
Talk.
It's typed.
The free, local alternative to Wispr Flow. Whisper runs on your Mac's GPU, the text lands wherever your cursor is, and every dictation is kept with its audio.
Real output, unedited: a 7.6-second sentence in a synthetic macOS voice, transcribed by FnFlow on an M4 Pro Mac.
Gets your jargon right. The built-in engine doesn't.
Same recording, same Mac: the speech engine built into macOS against FnFlow's Whisper. Plain speech is fine either way; names, acronyms and tech terms are where it splits.
| Run | Time to text | Term errors |
|---|---|---|
| macOS built-in (SpeechAnalyzer) | – | 3 of 3 |
| FnFlow, cold start (0.8.1) | 2.26 s | 0 |
| FnFlow, kept warm (0.9.1+) | 1.17–1.19 s | 0 |
7.6 s sentence, synthetic macOS voice, M4 Pro, 4 Oct 2026. Apple time not measured separately. Whisper large-v3-turbo via whisper.cpp with Metal and flash attention.
Small model now, big model in the background.
We ran 32 real dictations through every light Whisper model to pick the one that ships inside the 187 MB download. Below ~200 MB, only small holds up in Russian; base and tiny turn sentences into noise. large-v3-turbo downloads on Wi-Fi after install and FnFlow switches to it on its own.
| Model | Size | Diff, RU | Diff, EN-heavy | Cold run |
|---|---|---|---|---|
| large-v3-turbo · later | 1.62 GB | reference | reference | 4.01 s |
| small-q5_1 · built in | 190 MB | 24% | 41% | 1.36 s |
| base | 148 MB | 35% | 65% | 0.97 s |
| base-q5_1 | 60 MB | 34% | 70% | 0.73 s |
| tiny | 78 MB | 52% | 65% | 0.24 s |
32 real dictations (24 Russian, 8 mostly English with Russian mixed in), ~10 s each, M4 Pro, 5 Oct 2026. Word diff = word-level edit distance against large-v3-turbo's output, not against a human transcript. Cold run = one whisper-cli call including model load; with the warm server a phrase takes about a second.
Made for the apps you live in.
Electron apps hide their text fields from macOS until someone asks. FnFlow wakes up their accessibility tree, pastes, then reads the field back to confirm the text actually landed.
Every recording stays, with its audio.
Bad transcript? Re-run the same audio with the other engine. Paste didn't land? It's one click away in history.
Audio + text, on disk
JSON and CAF per dictation in a folder you own. Search, play back, copy again.
Retry with the other engine
Apple for plain speech, Whisper for jargon. Switch per recording, no need to talk twice.
Honest paste status
Pasted, paste sent, or saved for ⌘V. You always know where your words went.
Boring, local, inspectable.
Native menu-bar app. No Electron, no web view, no background browser. Liquid Glass on macOS 26.
The on-device engine that ships with macOS 26. A second option there; on macOS 15 FnFlow runs on Whisper.
Built from a pinned commit, statically linked, Metal shaders embedded. No Homebrew. Flash attention on the GPU, CPU fallback if Metal fails.
Starts when you press fn, so it loads while you talk. Shuts down after 3 idle minutes to free ~1.6 GB.
History as JSON + CAF, files mode 600. Old recordings go to the Trash, not into the void.
Timings and errors in Console.app for debugging. Your words are never logged.
Same gesture. Different deal.
| FnFlow | Wispr Flow | Superwhisper | |
|---|---|---|---|
| Price | Free | $15 / month | $8.49 / month or lifetime |
| Free usage | Unlimited | 2,000 words / week | 3,000-word trial, then free tier |
| Where speech is processed | On your Mac | Cloud | On your Mac or cloud |
| Rewrites your words | No | Yes | Optional |
| Keeps audio of each dictation | Yes | – | – |
Competitor data from their websites and reviews, September 2026. "–" = not verified.
New, and honest about it.
No wall of tweets yet. No invented ones either. Run it on your own jargon and tell us where it slips.
Free. No word counter.
- Unlimited dictation
- Custom vocabulary: spelling hints + replacements
- Whisper built in, Apple engine on macOS 26
- History with audio, retry, search
- Paste check in Electron and native apps
- Apple Silicon only, macOS 15 or later; the Apple engine needs macOS 26
- Best accuracy after the 1.6 GB model finishes downloading in the background
- English and Russian are tested; other languages may work with Whisper
- No iPhone or Windows version
FAQ
Why fn?
It's the one key almost nobody uses while typing. Hold to talk, double-tap for hands-free. Set macOS "Press 🌐 key to" to "Do Nothing" first.
Does it work in Cursor and other Electron apps?
That's what it was built for. FnFlow asks Electron apps to expose their text fields, pastes, then checks the field. If an app still refuses, the text waits in history and the pill tells you to press ⌘V.
Is anything sent to a server?
No. Recognition runs locally. The network is used once to download a model. The warm Whisper server listens on 127.0.0.1 only.
Why is it faster after the first dictation?
The model is loaded when you press fn and kept in memory for 3 minutes. Turn that off in Settings if you'd rather save the ~1.6 GB.
Can it learn my project's names?
Yes. Add terms in Settings → Vocabulary and FnFlow passes them to Whisper as a spelling hint on every run. On a test sentence that turned "update Zapot" into "update Saypad" and "по Устгарсе" into "Postgres". Replacements ("кубернетес" → "Kubernetes") fix the finished text with any engine.
Does it clean up my speech with AI?
No. It types what you said. Whisper adds punctuation; nothing is rephrased.
Where is my data?
~/Library/Application Support/FnFlow: one JSON and one audio file per dictation. Delete moves them to the Trash.