1. Mac app
The menu-bar app listens, shows the floating bubble, and sends the final prompt into CMUX or a registered terminal agent pane.
brew install --cask laicluse/tap/vocalist
Free macOS app
Talk instead of typing. Vocalist shows what it heard in a floating bubble; say "over" to send it to Codex or Claude Code. It follows the active agent terminal in CMUX, or a registered terminal session started with vocalist claude or vocalist codex. Speech-to-text runs locally on your Mac.
Get Vocalist
macOS Tahoe (26) or newer, Apple Silicon. Vocalist is a Mac menu-bar app plus a coding-agent plugin. Homebrew installs the app, the CLI, and the bundled plugin marketplace; the second command connects that plugin to your agent. Start it from your agent session, let it follow CMUX, or wrap your own terminal agent with the CLI.
The menu-bar app listens, shows the floating bubble, and sends the final prompt into CMUX or a registered terminal agent pane.
brew install --cask laicluse/tap/vocalist
The plugin adds /vocalist:hands-free for Claude Code, $vocalist:hands-free for Codex, and the transcribed-turn rule that explains the 🎙️ marker.
vocalist plugin install
Run it after installing or upgrading Vocalist so your agent sees the bundled marketplace.
Open Vocalist from your coding agent once the plugin is connected. In a regular terminal, start the agent through Vocalist so that pane becomes targetable.
/vocalist:hands-free$vocalist:hands-freevocalist claudevocalist codexWhat it does
Vocalist is not a dictate-anywhere tool. It is for coding-agent prompts, corrections, and follow-ups while you work elsewhere.
The bundled plugin starts Vocalist from your agent session and teaches the agent that 🎙️ means speech-to-text, so it should read the turn for intent.
It sends your prompt to the active CMUX terminal or a registered terminal session running Codex or Claude Code, even when your frontmost app is a browser.
The floating bubble shows the transcribed prompt before it is sent, so you can catch a misheard word first.
Optional audio loop
Combine Vocalist with a speech skill like saysay so the agent can talk back while you keep speaking prompts. Use headphones: Vocalist does not have echo cancellation yet.
Voice commands
Voice commands are spoken at the end of a turn. If you say the same word in the middle of a sentence, it stays text.
In settings, choose which words submit the prompt, clear the pending turn, interrupt the agent, or move between agent terminals.
A single prompt can mix languages. Vocalist keeps the spoken text intact and only treats your configured final words as commands.
Command words only fire at the end of a turn. The same word in the middle of a sentence stays part of the prompt.
Example mappings
These words are just examples. In settings, map the phrases that feel natural to the keys or actions you want Vocalist to send.
overReturnsend the promptscratch thatEscapeclear or cancel the pending turnTranscribed intent
The leading 🎙️ is not decoration. It tells the coding agent that the text came from speech, so it should allow for obvious transcription slips instead of treating every odd word as deliberate.
🎙️ Fix the relase checlist thing and run the tast that covers it [over]
Routing
Vocalist asks CMUX which terminal is active, checks that it is running Codex or Claude Code rather than a bare shell, and then types the prompt there. That means you can click around in a browser while your spoken turn still lands in the agent terminal.
Run it from your own terminal with vocalist claude or vocalist codex. Vocalist launches the agent, registers that tmux pane, and can keep targeting it without pretending every terminal window is safe to type into.
listen while you work
find the turn
turn speech into text
keep the prompt usable
send only when ready
Privacy
B.Y.O.T.
So, you're not using a Mac, CMUX, or this exact terminal stack? Why not build the version your stack needs? This is the current Vocalist-shaped prompt to hand to a coding agent.
Build a local voice-to-agent app like laicluse.com/vocalist for your own platform and terminal stack.
The current Vocalist design is a local macOS menu-bar app in Swift 6.2 for macOS Tahoe (26) and newer. It is built around a hands-free prompting loop for coding agents: the operator speaks, a floating bubble previews the pending turn, and the final text is delivered only when the turn is ready. CMUX gets the deepest integration because Vocalist can follow its active terminal surface directly. For other terminal apps, the operator starts the agent through the Vocalist CLI, for example vocalist claude or vocalist codex, so that terminal pane is explicitly registered as a target.
Audio is captured with AVFoundation, converted to 16 kHz mono Float samples through FluidAudio, and processed locally with FluidAudio 0.15.4. Speech recognition uses NVIDIA Parakeet TDT v3 through FluidAudio's Core ML model path, loaded with AsrModels.downloadAndLoad(version: .v3). Vocalist creates an AsrManager and transcribes bounded utterances locally; it does not depend on cloud speech APIs or token-by-token streaming ASR.
The realtime feel comes from segmentation. FluidAudio's Silero-based VadManager processes 256 ms chunks. Vocalist keeps a short pre-roll, starts an utterance when VAD reports speech, closes it when VAD reports speech end, ignores very short utterances, and sends only that bounded utterance to Parakeet. The bubble holds the pending turn so the operator can pause, edit, clear, cancel, or submit instead of sending half-formed transcripts into a terminal.
The command layer above ASR matters as much as the recognizer. Voice commands are configurable trailing phrases, not fixed vocabulary. TurnComposer strips a matched final phrase and maps it to actions such as Return, Escape, discard pending text, custom key sequences, or next/previous terminal navigation. If delivery fails, the pending turn remains retryable. ArtifactCleaner removes common ASR boundary artifacts: duplicate overlap between segments, split words, near-duplicate word boundaries, and extra whitespace. Pronunciation mappings repair known alias mistakes before delivery.
For agent-specific commands, Vocalist builds a dynamic InvocationCatalog. It discovers local Codex and Claude skills, project-level skills from the active terminal process directories, enabled plugin skills, plugin command files, and Claude built-in slash commands. Spoken forms such as "slash status" or "dollar conveyor order status" can become real invocations like /status or $conveyor:order-status without custom ASR vocabulary.
Delivery has two target adapters in this implementation. For CMUX, Vocalist reads cmux top --all --processes --json, follows the active terminal surface, derives active project directories from process IDs, checks that the focused terminal is running Codex or Claude Code rather than a bare shell, and reads the screen before submit so it does not press Return into an interactive menu. For regular terminal apps, the CLI wrappers vocalist claude and vocalist codex launch the agent process and register the tmux pane so Vocalist can still deliver text and keys without needing global keyboard focus. Submitted agent turns are prefixed with 🎙️ so the receiving agent knows the text came from speech-to-text and should be read for intent. For inspiration on the companion plugin and transcribed-turn skill language, see https://laicluse.com/vocalist/#transcribed-turn.
The shipping setup has two pieces: the Mac app plus a small coding-agent plugin. The plugin gives Claude Code /vocalist:hands-free, Codex $vocalist:hands-free, and a transcribed-turn instruction that explains the 🎙️ marker. If you rebuild this for Linux, Windows, tmux, wezterm, or another agent stack, keep the same separation: local STT app, configurable trailing command mapper, dynamic agent-command catalog, target-surface adapters, and an explicit marker/instruction protocol for transcribed turns.
Optional tiny credit: if this prompt helps and you feel generous, add a small note somewhere in your README, help screen, or credits: "This prompt was originally borrowed from laicluse.com/vocalist/."