Flit privacy: verify it yourself
Claim: your audio and your text never leave your Mac. Ever.
Flit records your voice, transcribes it, and cleans it up entirely on-device:
| Stage | What runs | Where |
|---|---|---|
| Speech-to-text | Flit’s own local speech models, or Apple’s built-in recognizer | Your Mac |
| Smart formatting | A local formatting model, or Apple’s on-device model where macOS provides one | Your Mac |
| History | A local database, plus audio files only if you opt in | ~/Library/Application Support/Flit |
There is no account, no telemetry, no analytics, and no crash reporter, and no server ever sees your voice or your text. The design keeps all networking in three well-defined places, listed below in full.
The only network calls Flit ever makes
- Model downloads you explicitly start — clicking Download in Settings fetches
model files from
huggingface.co. Apple’s own speech and formatting assets are fetched by macOS itself. - License activation, once per Mac — when you paste your license key, Flit sends
apps.fore.studiothe key, a SHA-256 hash of this Mac’s platform UUID (never the UUID itself), the Mac’s name, and the macOS and Flit versions, and receives a signed license file that it then verifies offline on every launch. While licensed it re-confirms the key and hash at most once every 7 days and fetches a signed list of revoked licenses. Nothing you dictate is part of any of this, and the trial makes no network call at all. - The update check — Sparkle asks, on first launch, whether Flit may check for
updates. If you say yes it periodically fetches
statics.fore.studio/flit/updates/appcast.xml, sending the installed version and macOS version so it can pick the right build. Say no and it never checks unless you choose Check for Updates… from the menu yourself.
That is the whole list.
Developer Mode
When you dictate into a code editor or terminal, Flit reads the focused window’s document path through the macOS Accessibility API (the same permission it already uses to paste), finds the project root, and indexes the project’s file and directory names so spoken identifiers are spelled correctly. The index lives in memory only — it is never written to disk, never included in history, and never sent anywhere. File contents are not read. Turn it off in Settings → Formatting.
Context-aware formatting
Off by default. When you turn it on (Settings → Formatting), Flit reads the dictation target’s focused text field and the text visible in its window through the macOS Accessibility API — the same permission it already uses to paste — so the formatter can spell names the way the conversation spells them and continue an unfinished sentence naturally. This capture lives in memory for exactly one dictation: it feeds the local formatting model only, is never written to disk or history, and never sent anywhere. Password/secure fields abort the capture entirely.
Edit selection by voice
This one also reads the screen, so it belongs in the same list. Off by default. When you turn “Edit selection by voice” on (Settings → Formatting), a dictation that both sits over a selection and sounds like an instruction — “make this shorter” — sends that selected text to the local formatting model so it can be rewritten in place. The selection is read through the Accessibility API, used for that one rewrite, and discarded; it is never written to disk or history and never leaves the Mac. Nothing is read when there is no selection, and a dictation that does not look like an instruction is inserted as ordinary text instead. Turn it off in Settings → Formatting.
Both are off when you install Flit, so out of the box it reads no text from your screen at all. The only thing it looks at either way is the focused element’s role — enough to tell a search box from a document, so a dictated query lands as search terms instead of a sentence. That check reads no text, and there is no setting to turn off because there is nothing to opt out of.
Learning from your corrections
A few seconds after a paste — and only if you are still in the same app — Flit reads the focused field once through the Accessibility API and compares it with what it inserted. The comparison happens in memory and the field text is discarded immediately. What is kept, locally: repeated word corrections (the written and corrected spellings) and per-app style counters (for example “dropped the trailing period in WhatsApp, 3 times” — a bundle ID, a category, and a number; never your text). Both only ever become suggestions in Settings with Add/Dismiss buttons — Flit never changes your dictionary or your app styles on its own. Password/secure fields are never readable this way.
Verify with a network monitor
Using Little Snitch, LuLu, or Proxyman:
- Install your models first (Settings → Models / Formatting → Download).
- Start the network monitor and filter by process
Flit. - Dictate anything, anywhere, as much as you like.
- Observed connections while dictating: none. Across a whole day you will see
at most the three things above: the downloads you clicked, one license
confirmation to
apps.fore.studio(weekly at most, never during a dictation), and the update check tostatics.fore.studioif you allowed it.
Flit.app can also be inspected statically: the binary links no analytics SDK
(otool -L Flit.app/Contents/MacOS/Flit shows Apple’s system frameworks plus
Sparkle, the open-source updater).
Local data you control
- Transcript history — optional, capped, delete-all in Settings → History.
- Audio history — off by default; explicit opt-in with auto-delete policies.
- Clipboard hygiene — dictated text is marked transient
(
org.nspasteboard.TransientType), so clipboard managers don’t archive it.
Questions or a hole in the claim? Open an issue — we treat privacy reports as P0.