A local voice interface for Codex and Claude Code on Apple Silicon. Start Talking, speak naturally, and let your coding agent decide what to say back — no daemon, no cloud, no second language model in the loop. See Cadence Code privacy for the exact local-processing and host handoff boundary.
- Apple Silicon Mac, macOS 14+
- Python 3.11-3.14 on
PATH - A working microphone and output device, with mic permission for the host app
- Internet access for the initial install and selected model downloads
- ~500 MB-4.5 GB disk space depending on the models you pick (shared with other local Hugging Face apps)
Claude Code
/plugin marketplace add michael-L-i/cadence-code
/plugin install cadence-code@cadence-code-marketplace
Restart Claude Code, then run /cadence-code:start-talking.
Codex (CLI and desktop app; the IDE extension doesn't support plugins yet)
codex plugin marketplace add michael-L-i/cadence-code
codex plugin add cadence-code@cadence-code-marketplaceStart a new Codex session, then run $start-talking (or pick Start Talking from
/skills).
On first run Cadence Code shows a quick orientation, starts with Pocket TTS and
Parakeet 110M, requests microphone access, and downloads both models
automatically. Change either model anytime with /cadence-code:voice-settings
(Claude Code) or $voice-settings (Codex).
During a conversation, press Escape and use /cadence-code:jump-in or
$jump-in to redirect by voice. Use /cadence-code:wrap-up or $wrap-up to
end cleanly and release the local speech models. Saying "stop" or "goodbye"
does the same thing.
If Claude Code's voice tools are still connecting on first use, Start Talking
finishes the one-time dependency setup and asks you to run /reload-plugins
before invoking it again.
To update, re-run the marketplace/plugin update commands for your host, then fully restart it — an already-running MCP process isn't replaced in place.
Cadence Code runs one lightweight stdio MCP server alongside your coding agent. The agent decides what to say and writes every spoken response; Cadence Code just converts that text to speech and your replies back to text, using local MLX models. Detailed answers stay on screen — voice gets a short, separately composed version, like a coworker giving you the useful part instead of reading a terminal response aloud.
Only one voice conversation can hold the microphone and model memory at a time, enforced by a machine-wide lock so Codex, Claude Code, and dev sessions never collide.
| TTS model card | Tier | Language | License | Download |
|---|---|---|---|---|
| Pocket TTS 100M | Lightweight | English | CC BY 4.0 | 236 MB |
| Kokoro 82M | Lightweight | English | Apache 2.0 | 389 MB |
| Chatterbox Turbo 350M | Balanced | English | Apache 2.0 | 417 MB |
| Qwen 0.6B | Heavy, highest quality | English | Apache 2.0 | 1.97 GB |
| STT model card | Tier | Language | License | Download |
|---|---|---|---|---|
| Moonshine Base 61M | Lightweight | English | MIT | 248 MB |
| Parakeet 110M | Balanced | English | CC BY 4.0 | 459 MB |
| Parakeet 0.6B v3 | Heavy, highest accuracy | 25 languages | CC BY 4.0 | 2.51 GB |
TTS is currently English-only. For multilingual transcription, choose Parakeet 0.6B v3. Follow each model card for its upstream license terms.
Settings live in config.toml — ~/.cadence-code for Codex and direct
development, or Claude Code's per-plugin data directory. It has [tts],
[stt], and [audio] sections for model, voice, speed, endpointing, and
device choices; upgrades migrate old configs automatically.
Model weights are cached in Hugging Face's shared cache
(~/.cache/huggingface/hub), not Cadence Code's own directory, so switching
models keeps the previous one for other local MLX tools to reuse. Clean up
manually with:
hf cache scan
hf cache delete --sort size- No microphone or output: allow mic access for Codex or Claude Code in
macOS System Settings > Privacy & Security > Microphone, verify the
[audio]device settings, then restart the host. - Setup or model download fails: confirm the supported Python version, internet access, and free disk space, then restart the host to retry.
- Session already in use: stop Cadence Code in every Codex, Claude Code, and dev session — only one process can own the audio session at a time.
- An update still reports the old version: fully exit every host process that loaded Cadence Code and start a new one.
For a checkout-based diagnosis, run uv run --locked cadence-code doctor or
uv run --locked cadence-code listen-test.
Stop every Cadence Code session first.
# Codex
codex plugin remove cadence-code@cadence-code-marketplace
codex plugin marketplace remove cadence-code-marketplace
# Claude Code
claude plugin uninstall cadence-code@cadence-code-marketplace
claude plugin marketplace remove cadence-code-marketplaceBoth leave configuration and the private Python environment behind (decline
--keep-data in Claude Code to remove them too); delete ~/.cadence-code
manually for Codex. Model weights stay in the shared Hugging Face cache — use
the cache commands above to remove specific ones.
uv.lock is the source of truth for local development and CI.
uv sync --locked --python 3.13
uv run --locked cadence-code doctor
./dev check # tests + plugin validation
./dev claude # local branch test in Claude Code
./dev codex # local branch test in CodexSee AGENTS.md for the full project map and MCP tool reference, and CONTRIBUTING.md before changing the lock file. CI and release details are in RELEASING.md.
Contributions are welcome. Use GitHub Discussions for questions and the issue forms for bugs and feature proposals.
Please follow the Code of Conduct. Report security issues privately as described in SECURITY.md.
Cadence Code is released under the MIT License.