Hold a key. Speak.
It's typed.

Personal hold-to-talk dictation for macOS — fully local, English + Spanish. No cloud, no accounts. Audio and text never leave the machine.

Get scribe

macOS 15+, Apple silicon. Not notarized — right-click, Open on first launch. Models (~3.5 GB) download once.

Hold Right ⌥ and speak — the cleaned-up text lands here.
1
Hold Right ⌥
The mic is captured only while recording — while you hold the key, or until you tap again if you latched. A small pill above the Dock shows the level, and the orange indicator turns off the moment it stops. Hands-free: set Hotkey mode to "Hold, or double-tap to latch" in Settings › General and a double-tap records until you tap again (auto-stop after 4 minutes). Prefer Right ⌘ or F13? Pick it in Settings.
2
Speak
Parakeet Ultra transcribes in ~0.2 s. A local cleanup model — Gemma 3 4B by default — strips fillers and resolves self-corrections.
3
Release
Text is pasted into whatever app has focus. If focus moved while it was transcribing, the text is copied instead — press ⌘V. If cleanup ever misbehaves, the raw transcript is pasted — you never lose words.

Say what you want done.

A few phrases act instead of pasting — in English and Spanish, with no cloud and no new permission. Snippets and per-app rules shape what does get pasted.

Said the first point is speed new line the second point is privacy
Typed The first point is speed.
The second point is privacy.
Commands
Say "enter" or "send it" on its own and scribe presses Return; "scratch that" sends ⌘Z. Spanish: "enviar", "borra eso". They pass the same focus check as a paste: if focus moved to another app while it was transcribing, the command is dropped instead of sent.
Line breaks
"new line" and "new paragraph" — "nueva línea", "nuevo párrafo" — work alone or inside a sentence. Each part is cleaned on its own, so the cleanup model never sees a break phrase or a newline.
Per-app rules
In Settings › Apps, pick an app and set its rules: cleanup on or off, voice commands on or off, drop the trailing period for chat, lowercase the first letter. The text rules run after cleanup — the cleanup model never sees them.
Snippets
A spoken trigger — "my address" — stands for a block of text, said alone or inside a sentence. The text takes its place after cleanup, so the model never sees it and its line breaks survive.

A command counts only as the whole utterance: "please send it to the team" is text. Line breaks count anywhere; to dictate one of these phrases as words, say "the words" first ("the words new line"; Spanish "las palabras"), or turn voice commands off for one app in Settings › Apps. If the recognizer keeps mishearing a command, add a Dictionary pair for what it hears.

Teach it your words.

Cleanup knows English and Spanish — not the names of your projects, tools and teammates. Teach it the ones it keeps getting wrong.

Heard deploy with camel to headstar tonight
Typed Deploy with kamal to Hetzner tonight.
Replacements
Correct it once — heard as → replace with — and it sticks, on every dictation from then on. Speech recognition mangles an unfamiliar name differently each time, so add the spelling you keep seeing.
Fix a Word
History → Fix a Word… shows a recent dictation's words. Click the one scribe misheard — several in a row for a phrase — type what you said, and the pair is added for you. Only the pair is stored.
Learned terms — experimental
scribe can also pick up distinctive vocabulary on its own, after it turns up in three separate dictations. It's off by default: today it can cost you a word elsewhere in the sentence, so it stays opt-in until that's fixed.
History
The last 10 dictations by default, in memory only. Click one to copy it; Option-click copies what the engine heard before your corrections; Paste Again re-pastes the last one into the app that has focus.

Stored on your Mac as words and phrases — never transcripts. Turn learning off or clear it whenever you like.

Audio and text never leave the machine.

Local models only
Parakeet Ultra for speech, a cleanup model you choose — Gemma 3 4B by default — downloaded once, then everything runs offline. The Gemma cleanup models are pinned to a fixed version.
Transcripts never saved
History keeps the last 10 dictations by default, in memory only. Transcripts are never written to disk. scribe writes your dictionary (words and phrases), a diagnostic log that contains no dictated text, and — only when a dictation fails — one audio file you can delete. Dictations are marked transient, so clipboard managers that honor the marker skip them; a copy you make from History is an ordinary copy. Stats are per-day counts and timings, never text. App rules are app names, bundle ids and switches; snippets are your own text, stored in plain text.
Nothing sent
No cloud, no accounts, no telemetry. The scribe://paste-last and scribe://toggle hooks for Raycast or Stream Deck are off by default and accept no parameters, so a URL can never carry text into scribe. Once you turn them on, any app, or a web page you allow, can paste your last dictation or turn on the microphone and dictate what it hears into the app that has focus.