Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Getting started

Use the Rust toolchain pinned in rust-toolchain.toml, with its wasm32-unknown-unknown and x86_64-unknown-linux-musl targets: daemon builds with embedded-ui embed a dashboard built for the first, and every daemon build embeds a health probe built for the second. Nix is optional; nix develop provides a reproducible development shell and the flake contains deployable packages. macOS supports the CLI on Apple Silicon: use just validate-cli for CLI development and nix build .#cli for the Apple Silicon Nix package. See macOS support for development and connecting to a Linux daemon. The full Linux validation command is:

just

just formats sources, then checks lints, compilation, tests, documentation tests, dependency licenses, dependency boundaries, browser compilation, the Playwright browser tests (run just setup-playwright first), the documentation, and the freshness of the checked-in OpenAPI specification, generated client, and manifest JSON Schema. It does not modify generated files. Regenerate all three artifacts in dependency order with:

just generate

See automated validation for the CI jobs and contract coverage for where tests live.

Client generation is implemented in Rust with Progenitor. Ordinary Cargo builds use the checked-in client without compiling the generator. See client generation for the shared contract mappings and the handwritten requests.

The optional privileged Docker qualification uses an isolated Docker-in-Docker daemon:

just docker-test

Both just test and just docker-test use nextest and emit JUnit XML at target/nextest/<profile>/junit.xml (default locally). CI selects separate ci and docker-ci profiles, runs all selected tests even after failures, and preserves reports as workflow artifacts when tests fail. Doc and browser checks use separate runners and are not included in these nextest reports.

The reproducible Nix package can be built with nix build; use nix develop for the development shell.