Contributions are welcome — bug reports, feature requests, docs, and pull requests. Here's how to get involved.
make build # debug build
make test # unit tests (needs full Xcode)
make release # release build
make lint # swift-format (if installed)
make guest-agent # cross-compile the hot-reload agent
make clean # remove build artifactsTests run in CI on macOS with full Xcode (XCTest is not shipped with
CommandLineTools). The XPC protocol is not a stable public API — client and
container-apiserver ship in lockstep; bump containerVersion in
Package.swift when updating the runtime.
In short:
make build # debug build
make test # unit tests (needs full Xcode)
make lint # swift-format
make run ARGS="docker ps" # run the CLI headlessRequirements:
- macOS 15+ on Apple Silicon (arm64).
- Full Xcode — XCTest is not shipped with CommandLineTools, so
make testand the test targets require Xcode. - apple/container installed and running
(
container-apiserver). The XPC protocol is pinned to 1.2.2 inPackage.swift— client and runtime ship in lockstep.
Open an issue with:
- A clear title and description of the problem.
- Steps to reproduce, including your macOS version and
apple/containerversion. - The output of
docker versionanddocker selftestif relevant.
main— stable releases. Each successful push builds the.pkgand publishes it as a GitHub Release.develop— integration branch. Open pull requests againstdevelop.
- Run
make lint(swift-format) before committing; CI enforces it. - Match the surrounding code — same naming, comment density, and structure.
- Keep changes focused: one logical change per pull request.
- Add or update tests for the code you change. Test targets live in
Tests/. - Make sure
make testpasses locally (requires Xcode). CI runs the full suite (build, test, lint, CodeQL) on every push and pull request.
- Write clear, imperative commit messages that describe the change.
- Keep the history clean — amend or rebase locally before pushing.
Releases are cut from main by the CI: a push to main builds the .pkg and
publishes it as a stable GitHub Release (v1.0.0.<run>). After a release,
refresh the Homebrew cask with:
./Scripts/update-cask.sh v1.0.0.<run>