2026-11-03 · Build log · Mat Silverstein

Building local dictation in Minutes

Minutes has had dictation since March. You hold a key, talk, and the words land wherever your cursor is. All of it runs on your Mac. This post covers the engine change in October and its numbers, how the text gets into the app you are using, the bugs I hit along the way, and two features I tested and dropped.

Switching from Whisper to Parakeet v3

For most of this year, dictation used Whisper small. In October I moved the final pass to NVIDIA's Parakeet v3. I tested it on 39 of my own saved dictation clips. There is no hand-checked transcript for those, so Whisper medium served as the reference.

EngineWords differedCommands lostMedian decode
Whisper small6.9%8168 ms
Parakeet v32.1%051 ms

Whisper small returned nothing at all for eight short commands like "Done." and "Proceed." On one 1.3-second clip it wrote 감사합니다, Korean for "thank you." Parakeet did neither. In the app, the Parakeet pass took 127 to 192 ms on real dictations.

Since late October, Parakeet v3 is the default wherever it is installed and your language is one it covers, and you can install it from inside the app. It has one clear weakness: rare names. It wrote "Garek" for "Garrett," a name Whisper small got right. Adding the misspellings you see to your vocabulary fixes those. The full engine comparison is in Whisper vs Parakeet v3 for local transcription.

Getting text into the right app

Dictation is only useful if the words show up in the field you were typing in. On a Mac there are two ways to do that. Minutes can write into the focused control through Accessibility, or it can put the text on the clipboard and press Cmd-V for you.

Writing through Accessibility is cleaner, but macOS can report it as a success when nothing arrived. That happened in Ghostty: the write succeeded and the prompt stayed empty. The terminal built into Minutes did the same thing. So terminals always get the paste path now, and Minutes only says Typed when it can see that the text actually changed. Otherwise it says Pasted or Copied, and either way the words stay on your clipboard.

The text also goes to the exact window you started in, even when two windows of the same app are open.

Linux on X11 gets a paste that Minutes cannot verify. On Windows and Wayland, Minutes copies the text and tells you to paste it.

Bugs from daily use

With the default settings, every dictation pasted twice. That stayed hidden because the paste keystroke does nothing until you grant Accessibility permission. Granting it is what made the second paste show up.

The start sound played just after the microphone opened, so the microphone picked it up and one transcript began with "[MUSIC PLAYING]." Dictation starts silently now.

A missing model file showed "mic silent, check input device." The microphone, the permission, the signature and the device were all fine. Minutes now checks for the model before it opens the microphone, and offers a download button if it is missing. In a separate bug, macOS never showed its microphone prompt, and dictation sat waiting for 59 seconds while Escape did nothing. Now Minutes asks for access itself and gives up after 30 seconds.

Two features that failed their tests

The first was showing words on screen while you speak. The bar was a first useful word in under 700 ms for 95% of runs, at most 30% of words wrong, and never rewriting text already on screen. I tried five setups across four engines. Apple's DictationTranscriber came closest, at 751 ms. Whisper tiny was quick and invented things, including "Maddened Wesley of the World." Nothing passed, so the dictation pill shows a waveform. I would rather show nothing than a fast guess that changes as you watch.

The second was self-correction: when you say "actually" and fix yourself mid-sentence, drop the part you corrected. I tested a rule that treats "actually" after a dash as a correction. It caught all 12 real corrections in the test set. It also rewrote 9 of the 20 sentences that were not corrections. The bar was zero wrong rewrites, because changing what someone said without telling them is worse than leaving an extra word in. So "actually" stays literal, and you say "scratch that" when you want to take something back.

Cleanup does remove filler it can be sure about. From the tests: "Alright, this is a dictation app test. Well, I mean, yeah, let's try that again." becomes "Alright, this is a dictation app test. Let's try that again."

What works today

On an Apple Silicon Mac with Parakeet v3 installed, Parakeet writes the final text. Whisper covers everything else and steps in if Parakeet fails. Every dictation is saved as a Markdown file you own. The next release adds a hook that can hand each dictation to your own agent, a script or a webhook.

What is still open: rare names on Parakeet, typing at the cursor on Windows, and a side-by-side test against Wispr Flow on real speech. I haven't run that comparison, so I won't claim we match it.

The code, the evaluation write-ups and the failed experiments are all on GitHub.