Dictate: On-Device Dictation for the Mac
Hold Fn, talk, release. Your words paste into whatever app has focus. Open source, entirely on-device, and it learns from your corrections.
Hold Fn, talk, release. Your words paste into whatever app has focus. Open source, entirely on-device, and it learns from your corrections.
Dictate is a free, open-source macOS menu bar app: hold Fn, speak, release, and the text pastes into whatever has focus. Recognition runs entirely on-device with Apple's SpeechTranscriber, so nothing you say leaves your Mac, and it learns from how you edit its output so the same mistranscription stops happening twice.
Tools like Wispr Flow convinced me that held-key dictation is the right interaction. Hold a key, talk, release, and the text lands wherever your cursor is. No app to switch to, no record button, no transcript to copy out of somewhere. What I didn't love was paying a subscription to stream my voice to someone else's servers.
macOS 26 shipped SpeechAnalyzer and SpeechTranscriber, Apple's new on-device speech stack. That removed my excuse. So I built Dictate, a menu bar app that does the whole thing locally. The audio never leaves the machine.
Hold Fn anywhere, talk, release. A pill at the bottom of the screen shows your mic level and the live transcript. When you let go, the text pastes into whatever app has focus. A quick tap instead of a hold locks dictation on for hands-free use. Tap again to stop and insert.
Filler words get stripped locally. Past that, cleanup is a setting with four modes: off, Apple Intelligence on-device, Claude with your own API key, or any OpenAI-compatible local server like Ollama or LM Studio. One rule I won't break: if a cleanup request fails for any reason, the raw transcript gets inserted anyway. Dictation that eats your words is worse than no dictation.
There's also a history popup on ⌃⌥⌘V with the last hour of dictations. Click one to copy it. It lives in memory only and is gone when the app quits.
My favorite part. Right after Dictate pastes, it snapshots the text field through the Accessibility API. When you dictate again, it re-reads the field and diffs. If you changed "cube colonel" to "kube control", that's a correction. Once the same correction shows up twice, Dictate applies it automatically before inserting. Undo an applied correction and it unlearns it.
The corrections live in a small JSON file in Application Support. The log keeps statistics and correction pairs, never transcripts. Password fields are never read.
The repo is really a Swift package, VoiceKit, and Dictate is one product built on it. VoiceKit wraps the SpeechTranscriber pipeline in async streams. It also has a PositionMapper that maps spoken words to character positions in a reference script, which is the hard part of a teleprompter that follows the speaker. There's a protocol seam for swapping in other recognition backends, and a mock provider so you can test without a microphone.
You need macOS 26 and Xcode 26.
git clone https://github.com/fennelouski/voicekit.git
cd voicekit
Scripts/make-app.sh && open build/Dictate.app
Grant Accessibility, Microphone, and Speech Recognition on first launch. Set "Press 🌐 key to" → Do Nothing in Keyboard settings so Apple's built-in dictation doesn't fight over the Fn key. The README covers the rest of the sharp edges, like the way rebuilding with an ad-hoc signature makes macOS forget your permission grants.
It's MIT licensed. Try it and tell me what it mishears.