Run the quickstart
Five-minute path: prepare, prove, verify the basic example on your machine.
ProveKit is a zero knowledge Spartan + WHIR based proof system. You write a circuit in Noir; ProveKit compiles it to R1CS, generates WHIR proofs from your inputs, and verifies those proofs from Rust, WebAssembly, mobile, or via a Groth16 outer proof for on-chain settlement.
A zero-knowledge proof lets one party (the prover) convince another (the verifier) that a statement is true, without revealing the data that makes the statement true.
A few statements ProveKit can help you prove:
The workflow is the same shape every time:
ProveKit owns steps 2–4 and the runtime that runs them on every platform you ship to. You bring the Noir circuit; ProveKit handles the rest.
ProveKit is a workspace of focused Rust crates plus tooling. Each piece has one job:
| Crate / tool | Job |
|---|---|
provekit-r1cs-compiler | Lower Noir’s ACIR into R1CS, with specialized handling for Poseidon2, SHA-256 compression, range checks, multi-scalar multiplication. |
provekit-prover | Solve the witness in layers, commit via Merkle hashing, and produce the WHIR proof via Spartan-style sumcheck. |
provekit-verifier | Replay the Fiat-Shamir transcript, run sumcheck verification, and bind the public inputs. |
provekit-cli | The command-line entry point. Subcommands: prepare, prove, verify, plus inspection and recursive-verifier export. |
provekit-wasm | Browser and Node.js bindings using wasm-bindgen-rayon for in-browser parallel proving when SharedArrayBuffer is available. |
provekit-ffi | C ABI for Swift, Kotlin, Python, and any host that can call a shared library. Includes an mmap-backed allocator for mobile circuits that exceed RAM. |
verifier-server | An Axum HTTP service that downloads artifacts and orchestrates verification with configurable concurrency and timeouts. |
recursive-verifier/ | A Go/gnark module that wraps a ProveKit proof in Groth16 so it can be verified by an EVM contract. |
skyscraper | A custom BN254 hash engine with SIMD-accelerated field arithmetic. |
Two pages matter on day one: Artifact lifecycle for how .pkp / .pkv / proof.np are paired and versioned, and Security and trust model for what verification does and doesn’t say about authorization.
The checked-in noir-examples/basic circuit proves you know two field elements that hash (via Poseidon2) to a known commitment:
use dep::poseidon2;
fn main(plains: [Field; 2], result: pub Field) { let hash = poseidon2::bn254::hash_2(plains); assert(hash == result);}plains stays private; only the prover sees it. result is the public input that goes into the proof. A successful verification means the prover knows two field elements that hash to result, and the verifier learns the prover does, without learning plains.
That tiny circuit is the same shape as much bigger ones: identity attestation, set membership, off-chain computation, range proofs. Once you can build, prove, and verify this one, every other circuit follows the same workflow.
Run the quickstart
Five-minute path: prepare, prove, verify the basic example on your machine.
See the pipeline
The full proving and verification flow from Noir source to recursive export.
Pick an integration
Decide where ProveKit runs in your system: CLI, Rust, WASM, FFI, HTTP service, or recursive.
Browse examples
A catalog of Noir circuits shipped with the repo, from hash primitives to passport verification.