Contributing to Cadence Code
July 23, 2026 ยท View on GitHub
Thanks for helping improve Cadence Code. Bug reports, focused fixes, documentation improvements, and carefully scoped features are welcome.
By participating, you agree to follow the Code of Conduct. By submitting a contribution, you agree that it may be distributed under the project's MIT License.
Before you start
- Search existing issues and pull requests before opening a new one.
- Use a GitHub Discussion for setup help and general questions.
- Open an issue before investing in a large change so its scope and product fit can be discussed first.
- Never include credentials, private transcripts, recordings, model caches, or other sensitive data in an issue or pull request.
Cadence Code is deliberately local and narrowly scoped. Contributions should preserve the boundaries described in the README: no cloud services, telemetry, detached daemon, passive narration, or second language model unless the project direction is explicitly changed first.
Development setup
Development requires an Apple Silicon Mac running macOS 14 or newer and Python 3.11 through 3.14. From the repository root:
uv sync --locked --python 3.13
./dev check
uv run --locked python scripts/validate_plugin.py
uv run --locked cadence-code doctor
The first real voice session can download several speech-model files. Unit tests do not load the models or access the microphone.
uv.lock is the source of truth for development, CI, and production runtime
dependencies. The plugin bootstrap installs the hashed requirements.lock
export so user environments resolve the same versions. After an intentional
lockfile change, regenerate that export with:
uv export --locked --no-dev --no-emit-project --no-annotate --no-header \
--output-file requirements.lock
Run uv lock --check before opening a pull request. CI also verifies that the
committed export still exactly matches uv.lock.
To inspect the checkout's MCP tools without installing either host plugin, run:
./dev inspector
This uses an isolated .cadence-code-dev/ data directory. Opening the Inspector
can install the Python dependencies, but model weights are not downloaded until
you call voice_start.
To test the complete Claude Code flow from the checkout without installing a plugin or marketplace, run:
./dev claude
Then invoke /cadence-code:start-talking. Claude Code loads the checkout directly
with --plugin-dir, while Cadence Code keeps its development environment and
configuration under .cadence-code-dev/claude/.
Use ./dev claude --fresh to exercise first-run model selection again. It
clears only the development configuration and onboarding marker, retaining the
private venv so dependency setup does not repeat.
Codex can exercise the same checkout without installing its plugin or adding a marketplace:
./dev codex
Then invoke $start-talking to start a conversation, $voice-settings to choose
models, $jump-in after stopping an active turn, or $wrap-up to end the
conversation. The launcher
supplies the local MCP server through one-session Codex overrides, and the
repository exposes all canonical skills through .agents/skills/. No
user-level Codex configuration is changed.
Use ./dev codex --fresh to repeat first-run model selection without rebuilding
the development venv.
When you need to discard every local-development venv and configuration, first close Claude Code, Codex, and MCP Inspector sessions using Cadence Code, then run:
./dev reset
The command moves only .cadence-code-dev/ to macOS Trash. It does not touch an
installed plugin's data or the speech libraries' shared model caches.
Making a change
- Fork the repository and create a short-lived branch from
main. - Keep the patch focused. Avoid unrelated refactors or formatting churn.
- Add or update tests for behavior changes.
- Update user-facing documentation when configuration or behavior changes.
- Run the locked unit and plugin checks, including
./dev check, before opening a pull request.
For changes involving audio devices, model loading, or the MCP lifecycle, also run the narrowest relevant manual check on Apple Silicon:
cadence-code doctor
cadence-code listen-test
A full voice-mode change should be exercised through
voice_start/voice_speak/voice_interrupt/voice_listen/voice_stop in a
real Claude Code session. Note what you tested in the pull request; do not
attach recordings unless everyone captured in them has consented.
Pull requests
Pull requests should explain the problem, the chosen approach, and how the change was verified. Small pull requests are easier to review and merge.
All automated checks must pass. A maintainer review is required, and review conversations must be resolved before merge. Maintainers may ask for a change to be split or simplified when that makes the project easier to maintain.
Reporting security problems
Do not open a public issue for a suspected vulnerability. Follow the private reporting instructions in SECURITY.md.