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

choir documentation

Getting started lives in the top-level README. Everything else is here, indexed by what you are trying to do.

Every page here is also compiled into the API documentation: each one is pulled into the crate that implements it with #![doc = include_str!], so cargo doc renders this prose beside the types it describes. That is not a convenience — it is what keeps these pages honest. The release gate runs cargo doc with -D warnings, so a Rust example in any of these files that stops compiling fails the build.

API documentation →

The node itself →

Build both halves together with choir docs, which renders the book and puts rustdoc inside it at /api/. From a checkout without the CLI installed: cargo run -p choir-cli -- docs --open.

The comment above is a marker, not stray markup: choir docs replaces it with a link to the node when the publishing workflow supplies that address (D76).

Start here

You wantRead
To know what this is and whether you want itWhy choir exists
How the pieces fitArchitecture
To run a nodeRunning a node
To use a nodeThe CLI and HTTP API
To get a change reviewed and landedThe contribution workflow
Something is brokenTroubleshooting

Operating a node

PageCovers
Running a nodeStarting the daemon, every policy file, the supervised macOS install
AuthorizationACLs (D29), repository ownership (D42), landing basis (D43), key rotation (D44), credential self-service (D36)
Rate limits, quotas and fairnessRequest log and rate limits (D33), per-user quotas (D37), the sequencer’s in-flight window
WebhooksOutbound ref-landed deliveries (D32)
Observability and repairThe decision journal, choir repair, what each derived record is for
Transports and the browser surfaceGit over HTTPS and SSH (D31), the read-only page (D28), repository browsing (D30)

Two runbooks sit beside these, for the two operations that are procedures rather than configuration:

Using a node

PageCovers
The CLI and HTTP APIEvery command and endpoint, generated from one table
The contribution workflowWorkspace to landed ref, and the review rules that bite in practice
Agent templatesDrop-in harness snippets for Claude Code, Codex and Cursor
AGENTS.mdThe same surface written for an agent that has never seen choir

Reference

PageCovers
TroubleshootingSymptoms, causes, fixes
ERRORS.mdEvery rejection code and its repair hint — generated from the node’s own table
SYNC.mdCatching up on a log, and replaying a page’s hash chain and signatures so what the node served is checkable
DECISIONS.mdWhat each D<n> in the code means, and which are one-way doors
Bridge permissionsThe minimum GitHub App grants, and what must not be granted

Which of these is generated

Editing a generated file by hand is wasted work: the release gate compares it against its source and fails when they differ. Regenerate with cargo run -p choir-cli --example gen-surface.

GeneratedSource
The surface block in using/cli.mdcrates/choir-cli/src/surface.rs
theme/choir-tokens.css, the book’s palettecrates/choir-node/src/ui.css
The cheat-sheet block in the READMEcrates/choir-cli/src/surface.rs
AGENTS.md, /llms.txt, /api/schemacrates/choir-cli/src/surface.rs
ERRORS.mdcrates/choir-node/src/reject.rs
The command lists in templates/crates/choir-cli/src/surface.rs

Everything else on this page is written by hand and is fair game to edit.