Skip to main content

Clone and install

Install Python 3.13+, uv, Bun, and Docker with Compose. The development stack uses ports 5432, 8000, 8080, and 5000; stop any service already using them. Clone the repository and install its dependencies:

Start the development environment

Load the development catalog:
Start each service in its own terminal: Finish local setup through the webapp origin:
The development control plane applies migrations and creates .airmux/dataplane.key when needed. Keep that key with its local database.

Develop and verify

Create a branch for your change. Add a behavior test, make the change, and run the checks for the affected area. For a full local check:
Control-plane unit tests can run without Docker using uv run pytest apps/control-plane/tests/unit. Integration tests use the Postgres service started above. For inference request-path changes, run uv run pytest tests/acceptance/full_stack/scenarios and verify a real request through the local gateway.

Contribute a change

Before editing, read CONTRIBUTING.md, AGENTS.md, and any relevant design record. Update generated contracts when their source changes, and commit generated outputs with the change. Open a pull request against main with a concise summary of user impact and the checks you ran. Draft and ready pull requests run the same fast checks. Main CI runs the broader checks after merge. Address review feedback and merge after the required CI and security checks pass.

Publish a release

The root VERSION file is the public package version. Publish Release requires the full SHA of the version pull request’s merge commit on main. It checks Main CI and Security for that exact commit. The other workspace projects stay at 0.0.0.

Checklist

  1. Run Actions → Prepare Release on main, then merge its pull request
  2. Wait for Main CI and Security to pass
  3. Run Actions → Publish Release on main with the version PR’s merge commit SHA; wait for it to finish
  4. Check the GitHub release, PyPI package, and GHCR version and latest tags
Prepare Release opens a pull request that changes VERSION. Publish Release confirms that the supplied commit changed VERSION and has not already been tagged. It uses the validated Python and container artifacts from that commit’s successful Main CI run; it does not rebuild them. It checks installation and live providers before creating the tag, then publishes and verifies the package and image. The release environment supplies provider credentials and RELEASE_GITHUB_TOKEN; PyPI uses its trusted publisher for release.yml.

If a release fails

Install a local build

Build and install an unreleased checkout, then run its portable installation smoke test outside the repository:
The airmux command is then available outside the repository.