Local-first voice dictation for macOS. On-device speech, no telemetry, powerful modes when you want them.
KeyScribe turns speech into finished text wherever you type. Hold a key, say the thought, release, and the result lands in the app you're already using. Plain Dictation stays entirely on your Mac. Optional rewrite modes can polish, format, or edit text through a provider and key you configure.
brew install rsperko/tap/keyscribeHomebrew 6+ can require trust for third-party taps. If prompted, confirm the tap, or run
brew tap rsperko/tap && brew trust --tap rsperko/tapbeforehand.
Download the latest notarized KeyScribe-<version>.dmg from
Releases, open it, and drag KeyScribe to
Applications. Current binaries are pre-1.0 prereleases.
KeyScribe is a menu-bar app. After launch, look for the waveform glyph in the menu bar; there is no Dock icon or main window.
- Launch KeyScribe.
- Download an on-device speech model.
- Grant Microphone, then Accessibility when prompted.
- Focus any text field.
- Hold
Fn (Globe), say one sentence, and release.
The whole dictation inserts as one unit, so one Cmd-Z removes it. If the Globe key opens Emoji,
Apple Dictation, or the input-source switcher, set the Globe action to "Do Nothing" in System
Settings > Keyboard, or choose Right Option in KeyScribe Settings.
Requirements: macOS 15+ on Apple silicon. Apple Speech, the zero-download system model, requires macOS 26+.
| Capability | What it means |
|---|---|
| On-device speech only | Audio never leaves your Mac. There is no cloud STT mode. |
| No account, subscription, or telemetry | KeyScribe does not collect usage, speech, transcripts, diagnostics, or crash reports. |
| Plain Dictation without an LLM | The default mode inserts local transcript text with live edits, vocabulary, and replacements. |
| Modes instead of one global prompt | Route by trigger key, app, URL, window title, menu choice, or spoken suffix such as as an email. A shortcut scoped to certain apps stays out of the way everywhere else. |
| Spoken edits before insertion | Say line breaks, paragraphs, tabs, scratch that, verbatim spans, or insert clipboard contents. |
| Optional BYOK rewrite | Hosted or local OpenAI-compatible providers can polish, format, or rewrite text only for modes you enable. |
| Plain files | Config, modes, prompt fragments, vocabulary, replacements, and history live under ~/Library/Application Support/KeyScribe/. |
| Reproducible model testing | Record your own corpus and compare on-device models against your voice. |
KeyScribe can turn spoken commands into local text edits before anything reaches the target app. This works in Plain Dictation and does not require an LLM.
Useful commands include:
insert new lineinsert new paragraphinsert tab characterscratch thatinsert clipboard contentsbegin verbatim ... end verbatim
Clipboard insertion is tokenized like a verbatim span. In a rewrite mode, the model sees only a placeholder; the clipboard text stays on your Mac and is restored locally into the final result.
Modes are reusable pipeline presets. A mode can decide when it runs, which local transforms apply, whether rewrite is enabled, which provider handles that rewrite, what context may be sent, and how the result is inserted.
A few of the starter modes:
| Mode | Use it for | Requires rewrite |
|---|---|---|
| Plain Dictation | Local transcript at the cursor. | No |
| Cleanup | Same meaning, cleaner text. | Yes |
| A rough thought shaped into an email. | Yes | |
| Edit Selection | Select text, speak an instruction, replace the selection. | Yes |
| Markdown | Notes with headings, bullets, and code fences. | Yes |
| Shell | A terminal-ready command inserted as text, never run by KeyScribe. | Yes |
More ship alongside these — Settings ▸ Modes ▸ Add Mode lists the current template set.
End a dictation with a spoken suffix like as an email, choose a one-shot mode from the menu bar,
or bind the same key to different modes in different apps.
A mode limited to certain apps releases its shortcut everywhere else, so that key keeps working normally in every other app. Give the same key to Plain Dictation as well when you want it to still dictate plainly outside those apps.
Speech recognition is always local. KeyScribe touches the network only for:
- Downloading on-device speech model weights.
- Optional BYOK rewrite calls for modes you enable.
When rewrite runs, the request goes to the provider or endpoint you configured. Saved API keys live in macOS Keychain, local/no-auth endpoints are supported, and command-generated bearer tokens are kept in memory only.
Best-effort redaction can tokenize recognizable sensitive spans before rewrite and restore them locally afterward. It is pattern matching, not a security guarantee. Content that must never reach a third-party provider should stay in Plain Dictation or another no-rewrite mode.
Full details: PRIVACY.md.
hotkey -> microphone -> local STT -> local pipeline -> optional BYOK rewrite -> atomic insert
The local pipeline handles dictionary bias/recovery, replacements, spoken edits, verbatim spans, clipboard tokenization, number normalization, and best-effort redaction. Rewrite, when enabled, is validated before insertion so redaction/verbatim/clipboard tokens survive and restore correctly.
Speech models span the Parakeet, Whisper, Apple Speech, and Qwen3-ASR families, from compact English-only models of a few hundred megabytes up to multi-gigabyte multilingual ones. Settings ▸ Speech Models has the current list with sizes and language coverage. Availability depends on macOS version and model download state.
No Apple Developer account or paid certificate is required for a local build:
git clone https://github.com/rsperko/keyscribe.git
cd keyscribe
./make-app.sh && open ./KeyScribeDev.appmake-app.sh builds the dev variant so it can run alongside an installed KeyScribe. Build
prerequisites, signing options, release builds, and permission persistence are in BUILD.md.
- docs/README.md — start here for the full documentation map.
- docs/getting_started.md — progressive ramp from first dictation to modes, privacy controls, and history.
- PRIVACY.md — exact local/cloud boundary and redaction limits.
- FAQ.md — first-run issues, permissions, model choice, and troubleshooting.
- docs/troubleshooting.md —
--diagnosesnapshots and why dictated text did not land where you expected. - BUILD.md — building, signing, packaging, and release notes.
- docs/reference/stt_benchmarks.md — reference model numbers and how to benchmark on your own voice.
- docs/reference/advanced_configuration.md and docs/reference/config_schema.md — file-level configuration.
- CONTRIBUTING.md — project conventions and development entry points.
KeyScribe is open source under GPLv3. Third-party libraries and downloaded model weights retain their own licenses; see THIRD-PARTY-NOTICES.md.