Talk to your coding agents. Keep every word on your Mac.
Realtime, fully local dictation for the menu bar. Press a key and speak — your words appear while you're still talking.
demo.mp4
Unlike tools that transcribe after you stop speaking, localvoxtral streams text as the audio arrives, powered by Mistral AI's Voxtral Mini 4B Realtime running on your own Apple Silicon. It is built first for prompting coding agents by voice, and it stays a solid general dictation app everywhere else. Everything runs on-device — no account, no subscription, nothing leaving your Mac (see Privacy).
curl -fsSL https://raw.githubusercontent.com/T0mSIlver/localvoxtral/main/scripts/install.sh | bashOr download the latest .dmg from Releases.
On first launch, a setup wizard walks you through the microphone and Accessibility permissions and downloads the local engine with live progress. Dictate the moment it finishes. You can re-run the wizard any time from Settings.
Note
Requirements: an Apple Silicon Mac running macOS 15 or later.
Important
Releases are ad-hoc signed, not notarized yet (see Roadmap). The installer script handles Gatekeeper for you. If you install the DMG by hand and macOS blocks or stalls the first launch ("damaged", Open Anyway, or a hang on macOS 26), clear the quarantine flag:
xattr -cr /Applications/localvoxtral.app- Built for coding agents — terminals are first-class targets and polishing understands developer speech (details)
- One-key dictation — a single modifier key (Fn/Globe, Right Command, or Right Option) drives both modes, or use classic per-mode keyboard shortcuts (details)
- Two output modes — Overlay Buffer (review, then commit on stop) or Live Auto-Paste (words land in the focused app while you speak)
- Automatic cleanup — an exact-match replacement dictionary in both output modes, plus optional LLM polishing with editable prompts when an Overlay Buffer dictation commits
- Bring your own server — dictation and polishing can each point at any OpenAI-compatible endpoint instead of the built-in local engines
- Menu bar native — instant popover with dictation status at a glance, microphone picker, auto-copy of the final text, and the raw transcript one click away after a polished commit
Tip
If localvoxtral is useful to you, a ⭐ on this repo helps others find it.
In the default Managed local mode, nothing you say or write is sent anywhere. Audio capture, transcription, and LLM polishing all run as local processes on your Mac, and the only network traffic is the one-time engine and model download. There is no telemetry, no account, and no cloud fallback. The context-aware polishing features (repo vocabulary, clipboard context) are opt-in and only ever talk to a loopback polishing endpoint, never a remote server. If you point localvoxtral at your own External URL server instead, your data goes only where you send it.
Two ways to trigger dictation, configured in Settings → Dictation:
Single modifier key — Fn/Globe, Right Command, or Right Option. One key, two gestures:
| Gesture | Behavior |
|---|---|
| Tap | Toggle Overlay Buffer dictation on/off |
| Hold (past the hold delay, default 350 ms) | Live Auto-Paste push-to-talk — dictates while held, stops on release |
The gesture selects the output mode, so both workflows are always one key away. A tap commits through optional LLM polishing, while a hold streams words in real time (the replacement dictionary applies in both). Pressing any other key while the modifier is down cancels the gesture, so regular keyboard combos involving the modifier are unaffected. Requires Accessibility permission.
Per-mode keyboard shortcuts — separate shortcuts for Overlay Buffer and Live Auto-Paste; behavior follows the Toggle / Push to Talk setting.
Escape cancels an in-progress dictation.
Most dictation tools fall apart in a terminal. localvoxtral treats it as its primary target: prompt Claude Code — or any CLI coding agent — by voice and watch the words stream in live. SSH sessions work too, since text is typed into your local terminal. Terminal apps are detected automatically (Terminal, iTerm2, Ghostty, Warp, WezTerm, kitty, Alacritty, cmux, and more), and apps that embed a terminal can be added in terminal_apps.toml. Live dictation adapts:
- Prompt-safe output — newlines and tabs are typed as spaces, so a stray line break never submits a half-finished prompt and a tab never triggers shell completion
- Replacements without rewriting — dictionary replacements are applied before text is typed; localvoxtral never backspaces over what the terminal has already drawn
- Secure input handling — if Secure Keyboard Entry is active (a
sudopassword prompt, say), a live session refuses to start instead of typing into the void, and an overlay commit falls back to copying the text to the clipboard
When an Overlay Buffer dictation commits, optional LLM polishing understands how developers talk:
- Agent prompt profile (on by default) — when the target is a terminal, polishing switches to an agent-tuned prompt. Spoken symbol forms become written ones ("dash dash force" →
--force, "src slash auth" →src/auth, "the dot env file" →.env), code-like tokens (and only those) get backticks, filler words are stripped, self-corrections resolve to the final intent, and explicit enumerations become lists - Model-first polishing — both prompt profiles trust the model's final wording and technical formatting so useful Markdown and reconstructed identifiers survive; only explicit clipboard-paste placeholder-count integrity remains as a post-model fallback
- Repo vocabulary (opt-in) — when the terminal sits in a git repo, localvoxtral indexes the repo's file list (a single sandboxed
git ls-files, cached briefly) and passes up to 12 relevant terms as hints to the polisher, so "use auth dot t s" comes out asuseAuth.ts. Hints only, never automatic replacement - Clipboard as context (opt-in) — the polisher sees a sanitized excerpt of your clipboard to ground technical spellings
- "Paste clipboard" macro (on by default) — say it mid-dictation and the clipboard content is embedded as a code block when the text commits
The overlay shows a Polished badge whenever the LLM touched your text, and the raw transcript stays one click away in the menu bar popover.
Open Settings from the menu bar popover:
- General — permission status for Microphone and Accessibility (with grant buttons), copy-final-segment toggle, and Re-run Setup
- Endpoints — Dictation and Polishing each switch independently between
Managed local(a model picker for polishing, plus a status light) andExternal URL(endpoint URL, model name, API key) - Dictation — the trigger (single modifier key with tap/hold gestures, or per-mode keyboard shortcuts) and the menu-bar output mode
- Text Processing — exact-match replacements, plus the LLM Polishing switch and its agent-dictation features (agent prompt profile, repo vocabulary, clipboard context, spoken clipboard paste)
- About — version, link to this repository, and Export Diagnostics (writes a redacted local report to the Desktop)
The config folder at ~/Library/Application Support/localvoxtral/config holds replacement_dictionary.toml, the LLM prompt TOMLs (including the agent variants), and terminal_apps.toml. When an update ships improved defaults, files you haven't edited are refreshed automatically; files you have edited are never touched without asking — the app offers to update them and keeps your versions as .backup files alongside.
In Managed local mode (the default), localvoxtral launches and supervises two inference engines for you — no terminal required:
- Dictation — voxmlx streaming Voxtral Mini 4B Realtime in 4-bit. localvoxtral ships a tuned build that adds a native OpenAI Realtime WebSocket server and memory-management optimizations for long dictation sessions.
- Polishing — a bundled native engine built on Apple's MLX Swift, running Qwen3.5-4B-OptiQ in 4-bit by default (a lighter 0.8B and a larger 9B are one click away in Settings). A warm prompt cache keeps polish latency low, and the engine runs as a supervised helper process, so turning polishing off frees its memory immediately.
The dictation engine installs from pinned, checksum-verified releases into ~/Library/Application Support/localvoxtral; the polishing engine ships inside the app bundle. Model weights download from Hugging Face at an exact pinned commit, so an upstream edit to a model repo can never change what your install runs. Neither engine ever outlives the app (a watchdog stops them even after a crash), and uninstalling means deleting the app and that one folder.
Prefer your own hardware? Switch Dictation or Polishing to External URL in Settings → Endpoints: any OpenAI Realtime-compatible server works for dictation, any chat-completions server for polishing.
Example: Voxtral Realtime on vLLM (NVIDIA GPU)
VLLM_DISABLE_COMPILE_CACHE=1
vllm serve mistralai/Voxtral-Mini-4B-Realtime-2602 --compilation_config '{"cudagraph_mode": "PIECEWISE"}'The settings recommended on the model page, tested against an NVIDIA RTX 3090.
./scripts/package_app.sh release
open ./dist/localvoxtral.app
| General | Endpoints |
![]() |
![]() |
| Dictation | Text Processing |
![]() |
![]() |
- Developer ID signing + notarization — install with no Gatekeeper workarounds
- End-to-end quality evals — realistic audio → transcription → polish benchmarks driving technical-dictation quality (in progress)
- Documentation website — a visual, end-user guide beyond this README
- More streaming ASR models beyond Voxtral Realtime — e.g. NVIDIA Nemotron 3.5 ASR Streaming 0.6B



