Murmela ← Back to murmela.com

Security

Security and data

Last updated: October 14, 2026. Describes Murmela 1.0.0 for macOS.

This page is written for the person who has to approve software: the IT contact, the compliance officer, the partner who signed the NDA. It lists every network connection the app can make, where data is stored, what each permission does, and how to check all of it without trusting us. Every statement was checked against the app's source code, which is public: github.com/0561joni/murmela-app.

The short version

Every network connection

This is the complete list. Murmela 1.0.0 contains no other code that opens a network connection, and its helper processes for speech, translation and speaker separation are started in offline mode. None of these requests contains audio, text, translations, file names or anything else you work with.

DestinationWhenWhat is sent, and what comes back
huggingface.co
Model downloads
When you choose a speech or translation model during setup or in Settings. Also once, shortly after the first launch, for a 0.9 MB voice-activity file (ggml-silero-v6.2.0.bin) that finds pauses in long recordings. Downloads redirect to Hugging Face's content hosts under hf.co. A plain download request for the file. Hugging Face sees your IP address and the file name, like any download. No account, no token, no device identifier. Every file is compared with a size and SHA-256 fingerprint built into the app before it is installed. The two TranslateGemma models are downloaded only after you accept Google's Gemma terms in the app.
github.com
Update checks
Sixty seconds after launch, then every six hours, while Check for updates automatically is on. It is on by default. Switch it off in Settings under About, where you can also check by hand with Check now. A request for one fixed address: the latest.json file of the newest release in the public murmela-releases repository. The user agent is tauri-plugin-updater/2.12.0. The address carries no version number or machine identifier. The answer lists the newest version, its notes, a download link and a signature. If a newer version exists, the archive is downloaded from GitHub's release host (release-assets.githubusercontent.com) and its signature is checked against the key below. Nothing is installed while you work. The update is applied when you click Restart to update or when Murmela quits.
api.lemonsqueezy.com
Pro activation
Once, when you paste a Pro license key or open the activation link from your receipt. Again only if you choose Deactivate this Mac in Settings under License. Activation sends two fields: the license key and a device label made of the word "Mac" and six random characters, such as "Mac 3f9a2c". Not your computer's name, serial number or user name. The answer says whether the key is valid and includes the name and email on the order, which the app stores on your Mac to show whom the license belongs to. The answer also says which product the key is for and when it was bought; the app stores whether it is a Pro or a Lifetime key and, for Pro, the last day of its year of updates. Whether a version of Murmela includes Pro is decided on your Mac, by comparing that day with the version's release date, which is built into the app. Deactivation sends the key and the activation ID. The key is never checked again. Pro works offline and would keep working if the license server disappeared.

No analytics, no crash reports

Murmela contains no analytics library, crash reporter, error upload or usage counter. Its interface loads no remote content, fonts or scripts. The Rust code has one HTTP client, used only for the three requests above. The helper processes for speech, translation and speaker separation are started with Hugging Face's offline mode forced on and contain no network code of their own. A model file is data, not a program; the runtime that reads it has no way to send anything.

Connections to your own Mac

A firewall may show Murmela listening on two ports at 127.0.0.1. One lets a second launch of the app wake the copy already running. The other plays audio inside the review view. Both are bound to the loopback address, accept nothing from the network and move nothing outside your Mac.

Working offline

After your models are downloaded, dictation, live dictation, translation, file transcription, speaker labels, vocabulary, the library and Pro all work with Wi-Fi off or with every connection blocked. Only three things need the internet: downloading a model, checking for an update, and activating or deactivating Pro.

Where your data lives

Everything Murmela stores is in one folder in your home directory:

~/Library/Application Support/com.murmela.app
Inside itWhat it holds
speech_to_text.sqliteYour library (dictations, file transcripts, speaker labels, translations and translated documents), your vocabulary, your settings, the model terms you accepted and the Pro activation record. With Save transcripts to the Library off, dictations and transcripts are not kept.
models/Every model you downloaded, one file or folder per model. Delete a model in Settings or by deleting its file.
temp/The audio of the dictation in progress, as a WAV file. The most recent recording stays here until the next dictation finishes, so that a failed live dictation can be recovered. Then it is deleted. Audio prepared for playback in the review view is deleted at launch and when it is no longer needed.
file-transcription.logA plain-text log of file transcription jobs: timestamps, job IDs, file names, stages and error messages. It contains no transcript text.
desktop-instance.lock, desktop-instance.jsonA lock file and the loopback port number that keep one copy of the app running.

Files you transcribe or translate stay where they are. The library records the path, name, size, duration and a SHA-256 fingerprint of the file so it can find the same file again. It does not copy it.

While a file is transcribed by one of the helper processes, a decoded copy of its audio is written to the macOS temporary folder and deleted when the job ends. Live dictation writes short audio chunks there in the same way and removes them as it goes.

Standard macOS folders

Like every Mac app, Murmela also gets system-managed folders named after it, such as ~/Library/WebKit/com.murmela.app and ~/Library/Caches/com.murmela.app, where the interface keeps its window state and two preferences: appearance and the last translation language. If Launch at login is on, ~/Library/LaunchAgents/com.murmela.app.plist exists. It is removed when you switch the option off.

Deleting everything

  1. If you have Pro and want to use the key on another Mac, choose Deactivate this Mac first. Deleting the folder removes the activation record without freeing the slot. If you forgot, write to hello@murmela.com and we will free it.
  2. Quit Murmela.
  3. Delete ~/Library/Application Support/com.murmela.app. This removes the library, models, settings, temporary audio, the log and the activation record.
  4. Optionally delete the WebKit, Caches and LaunchAgents entries above and the app itself.

Nothing remains on a server, because nothing was sent to one. The only record outside your Mac is your purchase and activation at Lemon Squeezy, if you bought Pro. The privacy policy describes it.

What each permission is for

Microphone

Used only while you record. The app asks the first time you start a dictation. Audio goes to the speech model on your Mac and to the temporary file described above, and nowhere else. The app carries the audio-input entitlement and one other, described under Automation.

Accessibility

Two things need it.

If you prefer not to grant Accessibility, dictations are copied to the clipboard and you paste them yourself. A regular keyboard shortcut works without it, and Paste automatically can be switched off in Settings so the app only ever copies.

Automation (System Events)

Before pasting, Murmela asks System Events which app is in front, so it can bring that app back if it lost focus. macOS shows this as "Murmela wants to control System Events". The same mechanism lowers the output volume while you record, if you turn that option on. This is the app's second and last entitlement.

Code signing and updates

Murmela is a direct download, not a Mac App Store app. Every release is signed with the Apple Developer ID below, built with the hardened runtime and notarized by Apple, which scans it for malware and issues a ticket that is stapled to the app and to the disk image.

Developer ID Application: Jonathan Zuecker (97Q3YS54E4)

The app is not sandboxed, because the Accessibility features above are not available to sandboxed apps. Its entitlements are exactly two: microphone input and Apple Events. Check the signature and notarization on your own Mac:

codesign -dv --verbose=2 /Applications/Murmela.app
spctl -a -vv -t exec /Applications/Murmela.app

The first command prints Authority lines with the identity above and flags=0x10000(runtime). The second ends with source=Notarized Developer ID.

Signed updates

Each update archive is signed on the developer's own Mac with a minisign key. The matching public key is built into every copy of Murmela, and the app refuses an archive whose signature does not verify, even if it came from GitHub. The key is public. Here it is, so you can compare it with the one your copy of the app uses:

untrusted comment: minisign public key: CDB6B6B4120DB2ED
RWTtsg0StLa2zd1XYch1WAO23ZEk0GWd+c9q9e6uMJLKrodfL9Vzxi/b

To check a release by hand, download the update archive and its .sig file from the releases page and run minisign with that key:

minisign -Vm Murmela_1.0.0_aarch64.app.tar.gz -P RWTtsg0StLa2zd1XYch1WAO23ZEk0GWd+c9q9e6uMJLKrodfL9Vzxi/b

Updates can be switched off entirely in Settings under About. With the option off, Murmela never contacts GitHub, and you install new versions yourself from murmela.com.

Verify it yourself

You do not have to take any of this on trust. The first three checks take about ten minutes; the fourth is for anyone who wants to read the code.

1. Watch the connections

Install an outbound firewall such as Little Snitch or LuLu, then use Murmela for a day. Besides the loopback ports, you will see at most these hosts, each only at the moment described above:

HostReason
huggingface.co and *.hf.coModel downloads you start, and the voice-activity file once.
github.com and release-assets.githubusercontent.comThe update check every six hours, and the download when a newer version exists.
api.lemonsqueezy.comPro activation, once. Deactivation, if you choose it.

Allow or deny as you like. Denying all three after setup changes nothing about dictation, translation or transcription. If you ever see Murmela contact any other host, write to hello@murmela.com. That would be a bug, and we want to know.

2. Turn Wi-Fi off

Download your models, turn Wi-Fi off or unplug the network cable, and dictate, translate and transcribe a file. Everything works. Turn the network back on only when you want a new model or an update.

3. Read the signature

Run the two commands in the signing section. They are built into macOS and need nothing installed.

4. Read the source

The source code of the app and the browser helper is at github.com/0561joni/murmela-app, under the GPL 3.0. Only three files may make network requests (the license, model download and update code), each through src-tauri/src/network_activity.rs, which logs it. A unit test fails if any other file talks to the network. You can also build the app yourself from that code; the README explains how.

What to tell your compliance contact

Open models and their licenses

Murmela runs open-weight models published by their makers. They are downloaded unchanged from the sources listed here, pinned to a specific revision and fingerprint. The license texts ship inside the app: in Settings under About, and as THIRD_PARTY_NOTICES.md with a licenses folder in the app bundle under Contents/Resources.

ModelUsed forMaker and license
Whisper (small, medium, large-v3-turbo, and a quantized turbo)Dictation and file transcription in almost any language.OpenAI, MIT. Downloaded from ggerganov/whisper.cpp.
Qwen3-ASR 1.7BAccurate dictation and transcription in German, English and French, including mixed speech.Qwen team, Alibaba Cloud, Apache-2.0.
Nemotron 3.5 ASR Streaming 0.6B and Parakeet TDT 0.6B v3The live engine: words appear while you speak, then a final pass when you let go.NVIDIA, OpenMDW-1.1 and CC BY 4.0. Core ML conversions by FluidInference, used unchanged. NVIDIA does not endorse Murmela.
MOSS Transcribe-Diarize 0.9BFile transcription with speaker labels.OpenMOSS, Apache-2.0.
VibeVoice-ASR (8-bit)Experimental long-file transcription with speaker labels, on Macs with 18 GB of memory or more.Microsoft, MIT. Published for research, which is why Murmela labels it Experimental.
pyannote segmentation 3.0 and 3D-Speaker ERes2NetTelling speakers apart.pyannote, MIT, and 3D-Speaker, Apache-2.0, as exported by the sherpa-onnx project.
Silero VAD 6.2.0Finding pauses in long recordings. Downloaded automatically, 0.9 MB.Silero, MIT.
TranslateGemma 12B and 4BTranslation.Google, under the Gemma Terms of Use, which you accept in the app before the download. GGUF conversions by mradermacher, used unchanged.

The runtimes that execute these models are open source as well: whisper.cpp, llama.cpp, qwen-asr, moss-transcribe.cpp, MLX and mlx-audio (all MIT), and sherpa-onnx and FluidAudio (Apache-2.0). Murmela itself is open source under the GPL 3.0: github.com/0561joni/murmela-app. The Murmela name and icons are not covered by that license.

Questions and security reports

Write to hello@murmela.com. Security reports go to the same address and are read by the developer, not a ticket system. If anything on this page stops being true, for example a new kind of request, this page and the privacy policy are updated before the change ships, and the release notes say so.