Hold a key anywhere on macOS, speak, release — your words are typed into
whatever app has focus. Everything runs on your Mac via
Apple MLX: no cloud, no account, no
telemetry.
- Works everywhere — any app that accepts paste
- Fast — under 1.5 s from key-release to text (about 0.15 s to transcribe a
short dictation on an M4 Max), with Qwen3-ASR 1.7B, which beat Whisper
large-v3-turbo on accuracy in our benchmark
- Hands-free — double-tap the hotkey to lock recording, tap to stop
- Recording pill — floating mic-level indicator with an elapsed timer,
then live progress ("Transcribing…", "Rewriting…", "Pasted") so you always
know what it's doing
- Dictionary — list your names, products, and jargon; the model stops
guessing "cow" for "Kaho"
- Words on screen — names already in the window you're dictating into
(the Slack thread, the email, the PR) are spelled the way that window
spells them, with nothing added to the dictionary. Read in memory when you
press the hotkey, used for that one dictation, then discarded
- On-device — audio never leaves the machine; works offline. (Optional:
point the rewrite step at a cloud model with your own key — transcript
only, never audio.)
- Small — one Python file, eight dependencies
The menu
Recent transcripts (click to copy), your hotkey, rewrite mode, history,
log, and one-click bug reports:
- Settings… — a real window (⌘,) for hotkey, trigger, language and
rewrite. About Kaho at the bottom shows the installed version, and says
when a newer one is out; the menu also shows Kaho x.y.z is available…
- Edit Dictionary… — names and jargon the model should spell your way
- Use Words on Screen — on by default; untick it (here or in Settings) to
stop Kaho reading the focused window at all. Some apps don't expose their
text: Electron apps such as Slack, Notion and VS Code only do once asked,
so the first dictation into one gets no words and later ones do
- Hotkey — right Option (default), right Command, right Control, or right
Shift. Right-side only: the left keys are needed for typing.
- Say how you want it written — while still holding the hotkey (or
during hands-free), press either Shift and keep talking. It is held, not latched — release it and you
are dictating again, so a thought can be interrupted with an aside and then
carry on. Everything said while it is down is an instruction, not message: "tell Mark I can't make the offsite, suggest
November" → ⇧ → "formal, two sentences" becomes "Mark, I am unable to
attend the offsite; I recommend scheduling it in November." The same words
with "casual, like texting a friend" come out as "Hey Mark, I'm sorry but
I can't make the offsite…". It can change what the message says as well as
how it reads: "drop the part about shipping", "it's 4 pm, not 3", "the
PR is number six". Nothing to configure and nothing stored — the
instruction is spoken once and forgotten.
- Edit text you've already written — select it in any app, then hold the
hotkey and Shift and say what to change: "make this more formal",
"shorten it to one line", "the date is Friday, not Thursday". Kaho
rewrites the selection and pastes over it. Holding the hotkey alone over a
selection still replaces it with what you dictate. Kaho reads the selection
through Accessibility, and in apps that don't expose it (some terminals and
web apps) copies it with ⌘C and puts your clipboard back.
- Rewrite model — on this Mac by default. You can point the rewrite step
at OpenAI, Anthropic, or any OpenAI-compatible endpoint (Groq, OpenRouter,
a local Ollama) with your own key, which is worth it for "turn this ramble
into a paragraph" where a 4B model has a ceiling. The key is stored in your
Keychain, never in Kaho's settings file. Your audio never leaves the Mac
either way — only the transcript is sent, and only when a key is set. If
the request fails for any reason, Kaho falls back to the on-device model
rather than losing your words.
- Trigger — hold the key while you speak (default), or tap once to start
and once to stop. Holding is self-limiting, so a forgotten recording cannot
run for minutes; tapping is easier through a long prompt, and is the only
usable mode if you cannot hold a modifier down.
- Language — detected automatically by default. Pin yours if short
dictations come back in the wrong script: Whisper guesses per 30-second
window, and on brief or noisy audio it guesses wrong.
- Restart Kaho — recovers a stuck microphone. macOS's audio stack can
wedge mid-recording; the pill says so when it happens.
- Report a Bug… — opens a pre-filled Mail draft with diagnostics and the
log attached; nothing sends until you review it.
If your menu bar is full, macOS hides the icon behind the notch. Kaho
detects that and adds a Dock icon with the same menu, so Settings and
History stay reachable — no alert, no lost settings.
Rewrite (optional)
A second on-device model (Qwen3-4B-Instruct, ~2.3 GB on first enable,
~0.5 s per dictation) polishes the transcript before it's pasted. Three
modes: Clean up keeps your wording, strips filler and keeps only the
fix when you correct yourself ("Thursday, no wait, Friday"), Structured
gives the dictation the shape it needs (crisp prose, bullets for parallel
items, numbered steps for a sequence), and Caveman compresses hard for
pasting into an AI assistant — one line, every instruction kept, the words and
formatting around them cut.
This is the beginning of the README. Read the rest at the original. Read the full README ↗