An AnonCreds VDR organizations can govern.
Kanon is a W3C-compliant AnonCreds VDR that runs on any EVM chain. Drop it into Credo — your wallets and verifiers work unmodified. Add zero-knowledge presentations where you need them.
Organizations, not just keys
Issuers move through a real governance lifecycle on-chain — registered, approved, suspended, reactivated. Identity with a chain of custody.
See governance →Drop-in AnonCreds VDR
Credo agents and anoncreds-rs wallets work unmodified. Issuance and revocation are tracked on-chain; the verifier looks status up after the standard verifyProof.
How presentation works →Optional zero-knowledge
When unlinkability matters — age proofs, anonymous voting — switch the same credential to a Groth16 SNARK presentation. Verifier learns nothing else.
Standards & interop →Issue, present, revoke — most of it happens off-chain.
Credentials are signed off-chain, status lives on-chain.
An approved org registers a schema and credential definition, then issues AnonCreds credentials the normal way. A Credo event listener writes one status entry per credential into AnonCredsStatusRegistry. The credential body never touches the chain.
Standard AnonCreds — plus an on-chain status check.
The wallet sends a vanilla AnonCreds presentation. The verifier runs verifyProof via anoncreds-rs, extracts the disclosed kanonCredId, then calls isRevoked on AnonCredsStatusRegistry. Both must pass. Mode B swaps the AnonCreds proof for a Groth16 SNARK when unlinkability matters.
Compare the two modes →One transaction. Verifiers see it on the next call.
An org member calls revokeCredential(credDefId, credIdHash) on AnonCredsStatusRegistry. The status flips to Revoked, an event is emitted, and every verifier's next isRevoked check returns true. No tails files, no accumulator updates, no witness math.
A typed SDK, from registration to verification.
The @credo-ts/kanon plugin wraps the AnonCreds VDR interface, subscribes to issuance events, and AND-gates the verifier with an on-chain status check. Point it at any EVM RPC.
Run the quickstart →import { KanonModule } from "@credo-ts/kanon"; // Drop Kanon into a Credo agent as the AnonCreds VDR const agent = new Agent({ modules: { anoncreds: new AnonCredsModule({ registries: [kanonRegistry] }), kanon: new KanonModule({ networks: [{ network: "besu", rpcUrl, privateKey }], // or any EVM RPC anonCredsStatusRegistryAddress: "0x…", }), }, }); // verifyProof now ANDs the on-chain isRevoked check
Built for regulated issuance.
How Kanon compares
An honest, side-by-side read — we’re generous to the alternatives.