Your voice never leaves your Mac.
Hold Speak is built local-first on purpose. Microphone audio is captured, transcribed, and inserted entirely on your machine. No servers see it. No analytics log it. There is no account to create and nothing to sign in to.
Short version
Hold the hotkey, speak, release. The entire pipeline — microphone capture, Whisper transcription, text insertion — runs in a single process on your Mac. Nothing is sent to Anthropic, OpenAI, or any other third party. Nothing is sent to me. Nothing is sent anywhere during dictation.
Whisper runs on your GPU via WhisperKit (Apple's CoreML). Model weights are downloaded once from Hugging Face on first run, then all inference is offline.
What happens when you hold the key
on-device ┌───────────┐ PCM ┌─────────────┐ text ┌──────────────┐ │ microphone│ ─────────▶ │ WhisperKit │ ────────▶ │ focused field│ └───────────┘ in-memory │ (GPU/ANE) │ CGEvent └──────────────┘ └─────────────┘ │ ▼ history.sqlite (last 10, in ~/Library) cloud upload analytics crash reporting remote logging
- Capture. Audio is read from the mic into a memory buffer. It is never written to disk as a file.
- Transcribe. The buffer is passed to WhisperKit, which runs CoreML on the Apple Neural Engine / GPU. No network socket is opened.
- Insert. The resulting text is typed into the focused input via
CGEventKeyboardSetUnicodeString. Password fields are detected and skipped. - Forget. The audio buffer is released. Only the final text is kept, and only if you want history.
What's stored on disk, and where
Everything Hold Speak keeps lives under your user's Application Support directory. You own these files; delete them anytime.
~/Library/Application Support/holdspeak/history.sqlite— the last transcriptions shown in the menu bar popover, plus metrics (total words, 7-day avg WPM). Text only — no audio.~/Library/Application Support/holdspeak/Models/— downloaded Whisper model weights (Tiny / Small / Turbo).~/Library/Application Support/holdspeak/terminology/<lang>.json— your terminology dictionary (canonical terms and variants).~/Library/Preferences/…holdspeak.plist— app preferences (hotkey, model, HUD position, etc.) via standardUserDefaults.~/Library/Logs/holdspeak.log— diagnostic log (levels, RMS values, language-detection decisions). Does not contain transcript text.
To wipe history and reset metrics: Preferences → History → Clear history. To nuke everything the app has ever stored, quit the app and delete the folders above.
The only times the app touches the network
Dictation itself is fully offline. Three optional, clearly-bounded operations do reach the network — and none of them ever send your voice or your transcripts:
- Model download (once). On first use of a given Whisper model, weights are fetched from huggingface.co/argmaxinc. This is a plain HTTPS download of a public file. You can also point the app at an existing local WhisperKit models folder (e.g. from MacWhisper) and skip the download entirely.
- Update check. The app periodically hits the GitHub Releases API for
timmal/HoldSpeakto see if a newer version exists. This is a single anonymous HTTPS request — GitHub's standard server logs apply. You can trigger it manually via Preferences → General → Check for updates, and ignore the banner if you don't want it. - Links you click. Buttons like "Download", "View source", or the Support tab open URLs in your default browser. Nothing the app initiates on its own.
Permissions the app asks for — and why
macOS gates each permission individually. Hold Speak only uses what it strictly needs:
- Microphone — to capture audio while you hold the hotkey. Not used at any other time.
- Accessibility — to insert the transcribed text into the focused input via the synthetic-key API.
- Input Monitoring — to detect the push-to-talk key press globally (e.g. Right Option / Right Cmd).
The app does not request Full Disk Access, Screen Recording, Contacts, Calendars, Reminders, Photos, or Automation.
Security posture
- Password fields are skipped. When the focused input is marked secure, the app refuses to insert text — your passwords never end up in a transcript.
- No clipboard detour. Text is typed directly as Unicode key events, so your clipboard is not overwritten and clipboard managers don't capture what you dictate.
- Audio is never written to disk. Capture happens in a RAM buffer that is discarded after transcription.
- Logs redact content.
~/Library/Logs/holdspeak.logrecords levels, durations, and decisions — not what you said. - No background listening. The microphone is only opened while the hotkey is held; the mic indicator in the menu bar confirms this.
- Open source, inspectable. The full pipeline is auditable at github.com/timmal/HoldSpeak. If you don't trust this page, read the code — or build your own DMG from source.
- Runs in the user sandbox. Standard macOS TCC gates every sensitive API; revoke any permission in System Settings → Privacy & Security and the corresponding feature simply stops working.
What we do not do
- No accounts, no sign-up, no email.
- No analytics SDK (no Mixpanel, PostHog, Amplitude, Segment, Firebase, etc.).
- No crash-reporting SDK (no Sentry, Crashlytics, Bugsnag).
- No ads, no ad identifiers, no fingerprinting.
- No cloud sync. Your history and terminology dictionary live only on this Mac.
- No third-party transcription API — WhisperKit runs locally; no data goes to OpenAI, Anthropic, Google, or anyone else.
- No selling, sharing, renting, or "aggregating" anything. There is nothing to sell.
Your data, your control
- Inspect — open the files under
~/Library/Application Support/holdspeak/with any SQLite or text editor. - Export — your terminology dictionary is plain JSON; commit it to a dotfiles repo if you want.
- Delete — Preferences → History → Clear history, or remove the folder. There is no "server" to ask.
- Revoke — remove Microphone / Accessibility / Input Monitoring in System Settings → Privacy & Security at any time.
Changes to this policy
This page is versioned in the same Git repository as the app. Any change is a commit you can inspect, diff, and blame. If the app's behavior ever changes in a way that affects privacy, the release notes will call it out.
Questions or concerns: open an issue at github.com/timmal/HoldSpeak/issues.