Security & data handling
For Dictera 0.8.5 · This page is written to be forwarded. If someone has to approve Dictera before you can install it, this is the document for them.
The short version: speech recognition and the built-in AI model run on your Mac. The app has no account system, no analytics SDK, and no telemetry of any kind. Left on its defaults it contacts four hosts, three of which you trigger yourself. The exception is deliberate and opt-in: if you connect a cloud AI provider or the Claude Code CLI engine, the text you process goes to that provider under your own account.
1. Everything that leaves the Mac
This is the complete list. There is no fifth destination on default settings.
| Destination | What is sent | When | Triggered by |
|---|---|---|---|
| Our licensing service Google Cloud, EU region |
A SHA-256 hash of a hardware identifier, your license key, and an activation name that defaults to your Mac's name - which often contains a person's name. | On activation, then re-validated on a jittered timer roughly once a day. | The app, on a schedule |
| Hugging Face | Nothing but the request itself; you receive model weights. They see standard technical data such as your IP address. | Only while a model is downloading. | You, by choosing a model |
| dictera.app | Nothing but the request. Returns the update feed. | Update checks, on Sparkle's schedule. | The app, on a schedule |
| Lemon Squeezy | Whatever you enter at checkout. We never receive full card details. | Only when you buy. | You |
| Your chosen AI provider opt-in, off by default |
The text being processed. For the AI Assistant that includes the transcript window and any screenshots you captured, sent on each pass. | Every request, once configured. | You, by configuring it |
| Anthropic opt-in, off by default |
Via the Claude Code CLI engine: your conversation and the contents of files it reads in the folder you nominated. Signed in with your own Claude account. | Every request, once configured. | You, by configuring it |
Audio is never uploaded, to anyone, ever. It is transcribed in real time and never written to disk as a recording - not by the dictation path and not by the AI Assistant. What can be sent to a remote model is text, and only if you set one up.
The calendar integration adds no destination. Dictera reads the calendar database macOS already keeps on this Mac, through EventKit; it makes no network request of its own, contacts no calendar provider, and never writes an event. It is off until you switch it on. The one thing to know: if you have configured a remote AI engine, attendee names read from an invite are part of the meeting setup sent with each request - so there is a switch, Send attendee names to remote engines, that keeps those names on local models only. Email addresses are never stored at all, in any case: the app's calendar model has no field for one.
1.1 What is not there
- No analytics or telemetry in the app. No Google Analytics, Firebase Analytics, Crashlytics, Sentry, PostHog, Mixpanel or Amplitude. Not disabled by default - not present in the binary. This website is a separate thing and does use Google Analytics, but only if you allow it when asked, and it can only ever see pages on dictera.app - never anything you do in the app. The Privacy Policy sets out exactly what that collects.
- No account system. No signup, no email, no password, no profile.
- No crash or usage reporting. If Dictera crashes, we don't hear about it.
- Three third-party dependencies in total, all open source: the speech runtime, the update framework, and the local model runtime.
2. What is stored, and where
Everything is a plain file: your content in
~/Library/Application Support/Dictera/, your settings in the standard macOS
preferences file. Nothing is synced, and deleting those two deletes all of it.
| File | Contents | Controls |
|---|---|---|
history.json | Your transcriptions | Retention period, export, clear all, or turn history off |
stats.json | Word and session counts | Can be switched off |
vocabulary.json | Your custom replacements | Edited in Settings |
assistant-sessions.json | Assistant transcripts, answers and notes - plus, if you connect Calendar, a snapshot of the meeting a session was linked to: its title, time, and the names on the invite | Most recent 50 kept; searchable, exportable, deletable; can be switched off entirely |
assistant-screenshots/ | One image per screen capture you took, and per image you pasted into a question | Capped at 250 MB, oldest removed first; deleted with the session |
~/Library/Preferences/ | Your settings. With Calendar on this also holds which calendars you watch and your per-series recording choices - keyed by the calendar's own series identifier, not by the meeting's title. The only meeting-ish text here is a series label you typed yourself, kept so it can carry a color | Labels are renamed or deleted in Settings ▸ History; the file itself goes when you remove the app's data |
No calendar events are copied wholesale. Dictera stores the snapshot above for a meeting you actually recorded, so the notes still say what they belong to after the event is edited or deleted. Meetings you never recorded are read on demand and not written anywhere.
These files are not encrypted at rest beyond whatever FileVault provides. If that matters for your threat model, turn assistant history off - with it off, nothing is written.
3. Credentials
- API keys for any provider you configure are stored in the macOS Keychain, never in preferences or a plain file.
- They are marked
kSecAttrAccessibleAfterFirstUnlock, so they are unavailable until the Mac has been unlocked once after boot. - The Claude Code CLI uses your existing Claude sign-in. Dictera never sees or stores those credentials.
- There is no Dictera password to steal, because there is no Dictera account.
4. A guarantee worth reading twice
To place dictated text correctly, Dictera sometimes needs to look at the characters immediately around your cursor - which means looking at a fragment of whatever document you have open. That fragment is never sent to a remote model. When the decision needs a model at all, the app will only ask the built-in on-device model or a server on loopback; if your engine is a cloud provider, Dictera falls back to a local heuristic instead of sending your document anywhere.
This is a design constraint in the code, not a setting you have to find.
5. Permissions, and why each is needed
| Permission | Needed for | Optional? |
|---|---|---|
| Microphone | Dictation, and your side of a call | Required |
| Accessibility | Typing text into other apps, and reading a selection you asked it to fix | Required for dictation |
| Audio recording | Capturing the other participants on a call, via a Core Audio process tap | Only for the AI Assistant's listening modes |
| Screen recording | The capture button in the assistant panel and in Ask Dictera | Optional - meetings do not need it, and an image pasted from the clipboard does not either |
| Calendar | Reading which meeting a recording belongs to, who was invited, and the day's agenda | Optional - never requested at first run, only when you switch Calendar on. Read-only access; Dictera cannot write an event |
The first-run walkthrough asks for what dictation itself needs - microphone, accessibility and input monitoring. The rest are requested only when you first use the feature that needs them: audio recording on your first listening session, screen recording on your first screenshot, calendar when you switch Calendar on. Every one of them is listed with its current status in Settings ▸ General, with a link straight to the right System Settings pane.
6. Distribution and integrity
- Signed with an Apple Developer ID and notarized by Apple.
- Hardened runtime enabled, with a timestamped signature.
- Updates are delivered over HTTPS and verified with an EdDSA signature before installation - a compromised download cannot install.
- The app sandbox is deliberately off. Dictation requires global keyboard event taps and synthesized keystrokes, which a sandboxed app cannot do. That is also why Dictera is not on the Mac App Store. The entitlements file grants exactly one capability: audio input.
7. Verify it yourself
Don't take the above on trust - it takes about a minute to check.
- Watch the connections. With Dictera running, run
lsof -i -P | grep -i dicterain Terminal. Dictate, translate, take meeting notes. On default settings you will see nothing beyond an occasional licence or update check. - Block it entirely. Turn off Wi-Fi once your models are downloaded. Dictation, cleanup, translation, text correction and on-device meeting notes all keep working. A license keeps working offline for 14 days.
- Use a firewall. Little Snitch or LuLu will show you every outbound connection attempt and let you deny the ones you don't want. The list in section 1 is what you should see.
- Check the signature.
codesign -dv --verbose=4 /Applications/Dictera.appandspctl -a -vv /Applications/Dictera.app.
Any product can claim it doesn't upload your data. Very few can be checked in a minute with tools you already have.
8. What we can and cannot see
We cannot read your transcriptions, your meeting notes, your history or your screenshots. They are not on our servers, so there is nothing for us to hand over, lose, or be breached out of. What we hold is what's needed to sell and validate a licence: the device hash, the licence key and status, and the email address attached to the purchase. That is described in full in the Privacy Policy.
9. Questions we're happy to answer
If your security team needs something this page doesn't cover - a specific control, a questionnaire, a data-processing agreement - write to info@dictera.app and we'll answer directly.