Murmure is a small menu bar app I built for voice dictation on macOS. You press Cmd+Shift+E, you talk, and the text is pasted into whatever app you're in. Transcription runs locally with whisper.cpp and the large-v3-turbo model: no account, no subscription, no API key.
I wrote about the first public version a week ago. Version 1.2.0 is out today, and it fixes the thing I was least happy with: how you install it.
Repo: github.com/croustibat/murmure
A signed, notarized DMG. Version 1.1.0 meant cloning the repo, having Homebrew and the Xcode command line tools, and running ./install.sh. That's fine for me and for a few developers, and a dead end for everyone else. Now you open Murmure.dmg, drag the app to Applications, and it opens without a Gatekeeper warning.
Everything is inside the app. whisper.cpp is compiled for Apple Silicon and bundled. ffmpeg is gone, replaced by a native recorder. Nothing to install next to it.
Automatic updates. Murmure checks once a day and installs a new version when you say so. It never interrupts a dictation: if an update shows up while you're talking, it waits.
The model downloads from the app. On first launch Murmure offers to download its transcription model (about 550 MB, once). The download resumes after a network cut and the file is checked against its SHA-256 hash before use.
There are smaller fixes too. Unplugging a headset during a dictation no longer stops it: recording continues on another microphone. Long dictations keep the custom vocabulary better. And a Whisper noise label like *sad* can no longer replace what you actually said.
Why: the install was the product
With 1.1.0, before your first dictation you needed Homebrew, the Xcode command line tools and a terminal. For a dictation app, that's backwards: a tool that saves you typing shouldn't start with a terminal session.
Signing also matters for a less visible reason. macOS ties the Microphone and Accessibility permissions to the app's signature. With the old install, a copy built on your Mac and signed ad hoc was identified by its binary hash, so a rebuild could mean granting Accessibility again. With a Developer ID signature, permissions survive updates. That's what makes automatic updates bearable: an update that silently breaks auto-paste would be worse than no update.
The gotcha: the first word of every sentence
Replacing ffmpeg with a native Core Audio recorder (murmure-rec) was mostly about having one less dependency. It also fixed a bug.
With 1.1.0, the start signal came as soon as the recording process was launched. But a microphone takes a moment to actually deliver audio. If you started talking right away, which is exactly what a shortcut invites you to do, the first syllables were lost.
The new recorder only gives the start signal once the microphone is ready. It sounds obvious written down. It took a dedicated recorder to make it true.
The same recorder lists your input devices, which helps if you want to pin a specific microphone:
You can then set the device by name in ~/.local/share/murmure/config (MURMURE_DEVICE=MacBook Pro Microphone), or pick it in the Settings window. A name is safer than an index, which changes when you plug in a headset.
Transcription never leaves the Mac. Murmure makes two kinds of requests: the one-time model download from Hugging Face, and the daily update check, which reads appcast.xml from the latest GitHub release with Sparkle. No text, audio, identifier or system profile is sent. MURMURE_CHECK_UPDATES=0 turns update checks off.
1.1.0 can't update itself. Quit Murmure, download the DMG and drag the app over the old one. Your settings, vocabulary, corrections, history and model are kept, since they live in ~/.local/share/murmure.
Because the signature changed, macOS asks for the microphone again, and the old Accessibility entry still looks checked but no longer counts. In System Settings > Privacy & Security > Accessibility, remove the old Murmure entry (–), then add the new one (+). After that, future versions arrive on their own.
You need an Apple Silicon Mac on macOS 14 or later.
The menus are in French for now. Dictation is French by default and switches to English or any Whisper language in Settings, or with MURMURE_LANG=en.
It's MIT licensed. Issues and PRs are welcome, and I'm especially curious how it behaves with other languages and microphones: github.com/croustibat/murmure.
Baptiste — freelance web dev for 20 years, building in Laravel/PHP and shipping small open-source tools.


Reader Comments