Get started
Getting started
Install the toolchain and go from an empty repo to a governed push with signed evidence. Budget about 90 minutes for the full path.
Install the tools
Each tool is a single static Go binary (the plugins add a small adapter). Install what you need — they compose, but each works on its own.
zegit (zg)
Install from a release archive, or build from source, then point it at your Control Plane:
zg version
export ZEGIT_CP_URL=https://zegit.io # omit for local IAM modemeerkat (mk)
The repo is private, so authenticate gh once — mk update reuses that token:
gh auth login
TAG=v0.4.0
PLATFORM=darwin_arm64 # darwin_amd64 / linux_amd64 / linux_arm64
mkdir -p ~/.local/bin
gh release download "$TAG" --repo zegit-zoo/meerkat \
-p "meerkat_${TAG#v}_${PLATFORM}.tar.gz" --output - \
| tar -xz -C ~/.local/bin meerkat
ln -sf meerkat ~/.local/bin/mk
meerkat versionmongoose
Build from source and export a provider key:
export ANTHROPIC_API_KEY=sk-ant-...
go build -o mongoose ./cmd/mongoose
./mongoose run "list the Go files here and summarise each"Install location matters for self-update
Install mk into a user-owned directory like ~/.local/bin (or /opt/homebrew/bin on Apple Silicon). mk update can then swap the binary without sudo.
Your first governed push
This is the core loop: validate locally, which signs an Attestation of Validation (AoV) for the exact commit, then push — the gateway verifies the signed evidence instead of re-running CI.
Authenticate
A passkey ceremony issues a short-lived signing certificate.
zg auth login zg auth status # identity, role, expiryInitialize the repo
Writes
.zegit/config.yaml, aZEGITFILE, and apre-pushhook.cd my-repo zg initValidate
Runs your pipeline, evaluates policy, and on success signs an AoV into
refs/zegit/aov/<commit>.git add -A && git commit -m "feature" zg validatePush
The pre-push hook pushes the AoV ref alongside your branch; the gateway accepts or rejects.
git push gateway main
Exit codes are a contract
zg validate returns 0 for ALLOW, 10 for REQUIRE_REVIEW, and 20 for BLOCK. Wire these into CI rather than grepping output.
Your first governed release
Releases go through a Tag Request — a quorum gate. The creator's own approval never counts toward quorum (unless the repo opts into AoV self-approval), so you need a second authorized identity.
zg tr create v0.1.0 --commit HEAD
# a second owner/maintainer approves (fresh passkey touch):
zg tr approve v0.1.0
zg tr finalize v0.1.0 # writes the signed tag once quorum is met
git push gateway refs/tags/v0.1.0Produce a CRA Evidence Bundle
Every release tag can be turned into a signed, offline-verifiable bundle:
zg evidence bundle --tag v0.1.0 --out v0.1.0-bundle.zip
zg evidence verify-bundle v0.1.0-bundle.zip --trust-root root.crtArchive the zip and the Root CA certificate together — that pair verifies with no network access, years later. See CRA & compliance.
Where to go next
Authoritative reference, generated from the component repos. Spot something stale? Tell us.