Prebuilt binaries
Prebuilt for Linux (x64/arm64), macOS (Apple Silicon) and Windows (x64) — grab the latest archive on GitHub, unpack, and put both binaries on your PATH.
Get it on GitHub ↗
From source
cargo install decern-cli decern-server
Or clone and build with the pinned toolchain from rust-toolchain.toml.
# 1 · prove all invariants hold over every input (cvc5)
decern prove
# 2 · run the PDP (writes a tamper-evident ledger)
decern-serve --ledger /tmp/decern.jsonl --trust-proxy &
# 3 · decide over HTTP (AuthZEN-shaped) — corp reads a claim it owns
curl -s localhost:8080/access/v1/evaluation -H 'content-type: application/json' -d '{
"subject": {"type":"Principal","id":"corp"},
"action": {"name":"Read"},
"resource": {"type":"Resource","id":"claim1"}
}'
# 4 · verify the ledger (hash chain + every signature)
decern verify --ledger /tmp/decern.jsonl \
--pubkey "$(curl -s localhost:8080/pubkey | jq -r .kid)"
Sovereign · one process
--ledger <PATH>
One ledger file. Binds loopback by default; starting requires the caller posture to be named — bearer validation, or a declared front.
Hosted · one host
--sharded <DIR>
Several server processes share one ledger — one hash chain per tenant — coordinated by a file lock. Unix only.
Hosted · many hosts
--sharded postgres://…
Advisory-lock head store for replicas across hosts. Build with --features postgres; the URL is never logged.
Integrations & clients
The MCP server (examples/mcp) has been run end to end against a real MCP client, not curl, with allow, deny and step-up all read back correctly by the model. Alongside it, a forward-auth shim for NGINX, Traefik and Envoy (examples/ext_authz_adapter) puts the same decision point in front of a gateway. Call a running decern-serve directly from an application with a thin AuthZEN client — uv add decern (Python), npm install decern (TypeScript) or go get (Go).