Vocula

On a phone? Vocula runs on your Mac. Send this page to your Mac

How to check whether a dictation app is really offline

Every dictation app on the Mac says your voice stays private. It costs nothing to say. Here is how to find out for yourself — in about ten minutes, with tools already on your Mac, for any app, ours included.

Why the claim needs checking at all

Not because vendors lie, mostly. Because the claim goes stale, and because “private” and “local” are used to mean four different things.

Three examples, all measured on 21 August 2026, all still visible on the vendors’ own pages as of that date:

None of that is discoverable by reading a landing page. All of it is discoverable in ten minutes.

1. Read the terms, and check the dates

Open the privacy policy and the terms of service side by side and look at the date on each. Then search both for process, server, third party, sub-processor and retention. Marketing pages get rewritten for launches; terms of service get rewritten by lawyers when the architecture changes. When the two disagree, the terms are the accurate one.

2. Watch what the app connects to, live

nettop ships with macOS. Start the app, then run:

nettop -p Vocula

Replace Vocula with the app’s process name. Now dictate something. A local app shows no new connections at all while it transcribes — the row count does not change and no bytes move. A cloud app opens a connection the moment you stop speaking, and you can watch the byte counter climb by roughly the size of your audio.

3. Take a snapshot of its open sockets

lsof -i -a -p $(pgrep -x Vocula)

This prints every internet socket that one process currently holds. On a genuinely local app, immediately after a dictation, it prints nothing.

One honest caveat about both commands. They show you what is happening while you look. An app that phones home once a week, or only on launch, or only when it thinks it is idle, can pass a ten-minute inspection. That is what step 4 is for.

4. Record everything, including what happens when you are not watching

An outbound firewall logs every attempted connection and lets you deny it. Little Snitch is the well-known paid one; LuLu from Objective-See is free and open source and is enough for this. Install one, leave it running for a week of normal use, and then read the log for the app in question.

This is the check that finds analytics. Transcription traffic is obvious — it is large and it happens exactly when you stop speaking. Telemetry is small, irregular, and goes to a domain you have to look up.

5. Pull the plug

The simplest test, and the one that needs no tools: turn off Wi-Fi, unplug the Ethernet, and dictate.

A local app behaves identically. A cloud app stops working, silently degrades to a worse on-device model, or queues your audio to send later — and the third case is worth knowing about, because the app appears to work offline while accumulating recordings it intends to upload.

What this method does not prove

It is worth being precise, because a check that claims too much is no better than the claim it was meant to test.

What happens when you run this on Vocula

Nothing moves while you dictate — no account, no licence check, no analytics. Run step 4 for a week and the firewall log will show exactly one thing: a connection to GitHub about once a day. That is the version check, it ships switched on, and it fetches one small file that says what the latest version is. Turn it off in Settings → Permissions and the log stays empty. Transcription happens on your Mac, in a process you can watch, using a model sitting in your own Application Support folder — Whisper on the GPU, or Parakeet on the Neural Engine, whichever you chose.

The one we found by breaking it on purpose

This is the sort of thing the method above exists to catch, and it is worth writing down because we caught it in our own product rather than in someone else's.

The Parakeet engine is built on FluidAudio, and FluidAudio's model loader will fetch a missing file from HuggingFace by itself. Left alone, a model damaged on disk would be quietly repaired over the network, from a third-party host, without anyone being asked. Vocula stops it: the engine refuses to load unless every bundle is already present, so a broken model is a visible failure you repair from our own GitHub release — not an invisible download.

We know it behaves that way because we corrupted an installed model deliberately and watched what happened, not because we read the code and concluded it should be fine. Reading the code is how you find where to look. Breaking it is how you find out.

The weights are mirrored on Vocula's own release for a second and more ordinary reason: a corporate network can block huggingface.co, and the people this app is built for are often behind exactly that network. Every file was verified byte-for-byte against the upstream repository before upload, and again after a full round trip through the mirror.

We would rather you did not take that on trust either. The source is published, so the strongest version of this check is not nettop — it is reading the code and finding that there is no networking in it to audit.

What Vocula is