The prover, live
Every idea in this catalog compiles down to something like this: a few lines of Noir, an UltraHonk proof, and a verifier that learns only what the circuit chose to make public. No server, no account, no upload.
Loading the live prover…
What it costs
| load | 90s | compiler + prover wasm, tens of MB, then HTTP-cached |
| compile | seconds | Noir source → ACIR, in memory |
| witness | 30s | cheap for a small circuit |
| prove | 180s | UltraHonk, one thread — dominates everything |
| verify | 60s | fast, but still bounded |
Each phase carries its own timeout. An unbounded await is indistinguishable from a silently hung WebAssembly instantiation.
The two traps
- Never pre-bundle the proving stack. Add all three packages to optimizeDeps.exclude or esbuild rewrites the wasm-bindgen glue and instantiation hangs with no error.
- Serve noir_wasm’s browser bundle verbatim. Re-processing it emits const Infinity = Infinity, so the compiler throws “Cannot access ’j’ before initialization” — in production only.
Both are wired into this project’s vite.config.ts, with the reasoning in the comments. The three packages are pinned together: noir_wasm and noir_js on the same beta, bb.js on a version that speaks their ACIR.