Damir Kranjčević / @root

Projects / 2026

Murmur, Speak and It Types

Push to talk dictation for Windows that keeps your voice on your own machine

Hold Right Ctrl. Say the sentence. Let go. The words show up in whatever window you were in, the terminal, a chat, the email you were about to type by hand. That is the whole product, and most of the work went into making that one sentence true in every app on the machine.

Murmur is a push to talk dictation app for Windows. With the local engine your voice never leaves the computer. No account, no subscription, nothing phoning home.

Two engines

Out of the box it listens with a Whisper model running on your own CPU. Private and free, and it takes its time.

So there's a second engine. Fast Mode sends the audio to Groq, a free cloud service that comes back with text in about a second. Murmur offers to set it up the first time you open it, and it's three steps: open the Groq key page, copy the key, paste it into Murmur. The key lives in %APPDATA%\Murmur\groq.key on your own disk and is never in the download. If the network drops, Murmur falls back to the local model without making a fuss about it.

That's the tradeoff. Private and slow, or fast and your audio goes to a third party. You pick, and you can turn Fast Mode on any time from the File menu.

Why the dictionary has two mechanisms

Speech models don't know your words. "Claude Code" comes back as "cloud code", Supabase becomes "super base", and no amount of enunciating fixes it. Murmur handles this with a dictionary, a TOML file at %APPDATA%\Murmur\dictionary.toml that you can edit in the app or by hand.

terms = ["Anthropic", "Vercel", "Supabase"] [corrections] "cloud code" = "Claude Code"

The terms go to the engine as a short hint before it listens, so it leans toward your spelling. The corrections run as a pass after it listens. It needs both, because biasing is a nudge, not a promise. The correction pass is what guarantees the result.

The hint is kept deliberately short: the first 32 terms and at most 380 characters. A long hint makes these models drift and invent text on quiet audio, which is worse than the typo you were trying to fix.

The correction rules do some quiet work too. One rule for cloud code catches Cloud-Code, cloud_code and CloudCode. Longest match wins, so a rule for cloud code cli beats the one for cloud code. And a pattern has to match whole words, so the cloud code rule never touches Cloudflare or the plain word cloud. If you try to add a rule that would rewrite ordinary English, the app warns you before it saves.

It learns from your fixes

Every transcript stays in the Transcripts panel, searchable, with a Copy button on each row and a Fixed column showing which rules fired. When it heard something wrong, double-click the line, fix the word, press Enter. Murmur compares your fix with what it heard, writes a dictionary rule out of the difference, and adds the corrected name to the bias list. Next time it leans your way before it even listens.

It's careful about this on purpose. Only short, word for word swaps are learned. Rewriting a whole sentence teaches it nothing, and a rule that would change ordinary English gets refused.

What happens between key down and key up

The pipeline is a handful of small files. hotkey.py is a global key listener on pynput. audio.py records the mic at 16 kHz mono and reports the live level for the meter. When you let go, the dictionary hands its hint to the engine, either local_whisper.py or groq_api.py, and the text comes back. The correction pass runs. Then cleanup, which is either rules.py, free and instant, or llm.py, which goes through Claude. inject.py copies the result, sends Ctrl+V, and puts your old clipboard back. history.py writes it to disk so the window can show it later.

ui/controller.py drives all of that off the UI thread, so the window and the level needle never stutter while the model is thinking. The engine layer didn't change to build the interface, which I count as a small win.

A real window

I wanted a real Windows application, not another tray utility. Taskbar icon, Alt+Tab, a resizable window, a menu bar. Settings on Ctrl+comma. There is a tray icon too, but it's secondary: it keeps the hotkey alive while you're in another app. Closing the window leaves Murmur running in the tray, and Ctrl+Q quits for real.

The look is a 1990s MiniDisc deck. Light silver body, honest Windows 95 bevels, and one dark glass display with bright teal segments behind it, holding the record lamp, the status, the elapsed counter and the level meter. Teal is the accent, the same family as the tray icon. Red is reserved for the record lamp and nothing else. The level meter is green and amber with a peak marker that hangs back and falls slowly, like the hold LED on real gear. Silkscreen labels, monospaced counters, no drop shadows. Every colour, size and spacing value lives in one tokens file, and every view pulls from it, so there are no one-off numbers hiding in components.

Installing it

There's a normal installer on the Releases page. Windows will show its blue "Windows protected your PC" box once, because Murmur is unsigned open source software. Click More info, then Run anyway. It scans clean in Defender and it doesn't need admin rights. The setup asks whether you want a desktop shortcut and whether to start with Windows, and after that Murmur shows up in Start and in Settings, Apps, like any other program. Uninstall from there too. Your settings and history stay in %APPDATA%\Murmur unless you delete the folder yourself.

If you'd rather not run an installer, there's a portable zip. Extract it, run Murmur.exe, done. No shortcuts, no auto start.

The built app is about 340 MB, which is what carrying a local speech engine costs. I'm not thrilled about it, but it's the price of the private option working with nothing else installed.

Not built yet

Command mode. Saying "make this more formal" and having it rewrite the selection. It's on the list.

Murmur is MIT licensed and the code is at github.com/getGit789/murmur.

More articles

Back to all articles