Security & Architecture
KeyMic reads your keystrokes and your clipboard. That is a lot of trust to ask for, so this page describes what the app actually does rather than reassuring you in general terms. Everything here is checkable against the source.
What leaves your machine
This is the complete list. KeyMic makes no other outbound requests.
| Destination | When | Default |
|---|---|---|
| An LLM endpoint you configure | Only when you use a Persona to reshape text | Off — no endpoint is set |
| Speech model download | Once, when you pick a local model | On demand |
| keymic.io | Sign-in, settings sync, subscription status | Only if you create an account |
| TelemetryDeck | Anonymous usage signals — see below | On, switchable off |
| GitHub Releases | Update check | On |
Your keystrokes, clipboard contents, transcripts and screenshots are not in that list. They stay on the machine unless you explicitly route text through an LLM endpoint you configured yourself.
Speech runs on-device
Transcription uses local engines — ONNX, SenseVoice, or Apple’s on-device SpeechAnalyzer. Audio is captured only while you hold the trigger key, and it is never uploaded for transcription. The one network call in the speech path is downloading a model file, once.
The vault, and why your secrets do not reach history
Every clipboard write is scanned with a gitleaks-derived detector. Matches are diverted into the macOS Keychain; the plaintext never lands in the local clipboard history. Clipboard history itself is a local SwiftData store, and it skips transient, concealed and self-generated writes.
The server side enforces the same boundary from the other direction: the settings-sync endpoint rejects any payload containing a secret-shaped keyand returns an error rather than storing it. KeyMic’s backend is built so that it cannot accumulate your API keys even if the app tried to send them.
Telemetry is on by default, and content-free
We would rather say this plainly than bury it. Anonymous usage telemetry is enabled by default and can be switched off in Settings; turning it off shuts the SDK down so nothing queued is sent afterwards.
It is content-free by construction, not by policy. The internal interface only accepts enums, durations, booleans and short identifiers — there is no code path that could send a transcript, a clipboard entry or OCR text. The signals are things like which speech engine was selected, whether a model download succeeded, cold-start timing, permission states, and which features were used.
There is no crash-reporting service and no analytics SDK beyond that one.
The app is not sandboxed
Stated openly because it matters: KeyMic does not run in the macOS App Sandbox. A session-level CGEventtap, microphone access, the Speech framework and screen capture do not work inside it. Instead the app relies on macOS’s TCC permission prompts, which you grant individually on first use:
- Accessibility — the event tap that makes remapping and hotkeys possible
- Microphone — recording your speech for transcription, only while the trigger key is held
- Speech Recognition — converting voice to text
- Screen Recording — taking screenshots
- Apple Events — running shell commands in Terminal, if you bind a hotkey that does so
You can revoke any of these in System Settings; the corresponding feature stops working and the rest continues.
Releases and updates
Builds are signed and notarized, and updates are delivered through Sparkle with EdDSA signature verification — an update that is not signed with the project key will not install. The current release is v1.0.3 for macOS 14.0+. Source is available under AGPL-3.0, so you can build it yourself instead of trusting the binary.
Accounts and tokens
An account is optional; the app is fully functional without one. If you sign in, you do so through GitHub or Google — KeyMic never sees a password. The desktop app receives a long-lived token which is stored hashed on the server and kept in the macOS Keychain on your machine. The browser hand-off uses a one-time code that expires in 60 seconds. Tokens can be revoked from your dashboard.
Reporting a vulnerability
Email lorne@keymic.io — please do not open a public GitHub issue. Include what you found, how to reproduce it, the impact you think it has, and your macOS and KeyMic versions. You will get a response within seven days, and confirmed issues are prioritised for the next release.