A few months ago my wrists started aching by mid-afternoon. I type for a living, most days for nine to twelve hours, and by evening I was closing the laptop instead of answering one more email.
I tried the voice to text apps people recommend. A couple of them are good. Every one I tried wanted a monthly subscription and sent my voice to a server before the text came back, and I've written enough software to know that audio can sit on somebody else's disk for as long as they like.
So I built my own, over a few weekends that turned into a few months. I wanted to see whether small open models could do the whole job on a laptop people already own. The result is Purr, a free, open-source menu bar app for macOS. You hold Right Option, talk and let go, and the words get typed into whatever text field has focus. It doesn't need an account, and nothing it hears leaves your Mac. Once the models have downloaded, it works offline.
What it does
Dictation is the main thing. If you'd rather see words appear while you talk, Smart Typing types as you speak instead of waiting for the key to come up.
Voice Edit works on text you've already written. Select a paragraph, hold the Voice Edit key, say "make the second sentence shorter", and only that sentence changes.
Meetings mode records your mic and your Mac's audio together, so nobody has to invite a bot to the call. It labels who said what and saves the notes as Markdown, with a summary if you want one.
English is the default. Switch the engine to Whisper and dictation covers about 100 languages, and meetings handle 28. You can add names and jargon in Vocabulary so Purr listens for them, and it drops the "um"s before anything reaches the text field.
How it's built
Purr is a native Swift and SwiftUI app. Speech recognition runs on NVIDIA's Parakeet models through FluidAudio and on Whisper through WhisperKit. Both use Core ML, so most of the work runs on Apple Silicon's Neural Engine.
After each transcript, a small CTC model rescores it against your word list, which gets names and jargon right more often. Meetings use a pyannote speaker diarizer converted to Core ML, with SpeexDSP for echo cancellation. Summaries and Voice Edit run on Apple's on-device Foundation Models, or on Gemma 4 E2B through llama.cpp if your Mac doesn't have Apple Intelligence.
Three problems that took longer than I expected
Echo in meetings
If you take a call without headphones, the other person's voice comes out of your speakers and back into your mic. Purr records both sides, so their words started turning up in my transcript under "You".
My first fix was a loudness cut on the mic track. It got rid of the echo and also deleted the quieter half of my own sentences. What finally worked was measuring, word by word, how much call audio the echo canceller had just removed, and comparing what was left with my normal speaking level. Echo goes, and quiet words stay.
Voice Edit touching things I didn't ask about
The first version handed the selected paragraph to the model and pasted back whatever it returned. Small models have a hard time leaving text alone. Ask for one shorter sentence and you'd also find "use" turned into "utilize" two lines further down.
Now the model doesn't return a paragraph at all. It names the words to replace and what to put in their place, and Purr makes those edits itself, so the rest of your text can't drift.
A slow first press
Right after launch, the first hold of the key had a pause before recording started. Every press after that was instant. I assumed the model was still loading, but the delay came from macOS starting some of its audio services cold for the first app that asks. Purr now does that setup in the background at launch, before you reach for the key.
What I'd tell myself at the start
I thought I'd spend my time comparing models. Most of it went into the audio pipeline around them, deciding which sound to throw away and checking a model's answer before it touches your text.
Try it
Purr needs an Apple Silicon Mac with macOS 14 or later. You can download it from purr.arunbrahma.com or build it from source on GitHub. It's MIT licensed, and issues and pull requests are welcome.
If your wrists hurt too, give it a try.



