QUICKSTART

One file. Any language.

kaitrace never parses your code. It hashes the source, runs the build you declare in a pinned container, and signs the result, so the only thing that changes between stacks is the build command in kaitrace.toml.

1 Declare the build

Drop a kaitrace.toml at your repo root.

# kaitrace.toml
[build]
image = "golang:1.23"
command = "go build -trimpath -o app ./... && go test ./..."
outputs = ["app"]
lockfiles = ["go.sum"]
# kaitrace.toml
[build]
image = "rust:1.83"
command = "cargo build --release && cargo test"
outputs = ["target/release/app"]
lockfiles = ["Cargo.lock"]
# kaitrace.toml
[build]
image = "node:22"
command = "npm ci && npm run build && npm test"
outputs = ["dist/bundle.js"]
lockfiles = ["package-lock.json"]
# kaitrace.toml
[build]
image = "python:3.12"
command = "pip install -r requirements.txt && pytest"
outputs = []
lockfiles = ["requirements.txt"]

2 Work with signed evidence

From here the workflow is identical, whatever the language.

~/your-project · kai
# once: identity + policy
$ kai keygen
$ kai repo-init --require-approvals 1

# per change: sign, build, review, merge
$ kai propose --description "add rate limiter"
$ kai build
$ kai review <proposal> --approve
$ kai anchor <proposal>
branch main anchored — rulebook satisfied

3 Let anyone check it

Evidence travels with the code. verify checks a claim offline; confirm re-runs the build and compares output hashes.

anywhere · kai
$ kai verify <attestation>
signature OK · inputs match · outputs present
$ kai confirm <attestation>
RESULT: MATCH — build independently reproduced

Builds run in a network-off container (Docker or Podman). Private repos add --private --encrypt at init: content is encrypted at rest and mirrors serve only ciphertext. Full reference lives in the CLI guide, shipping with the tool.