After months of development and community testing, we're excited to announce that o1js 2.15.0 ships with the native prover as a stable feature. This is the single biggest performance upgrade in o1js history - and you can adopt it without changing a single line of your circuit code!
Why a native prover?
Until now, o1js ran all of the heavy lifting through WebAssembly. WASM is great for portability, it's what lets o1js run in browsers, but it comes with real constraints in server environments. The 4GB memory ceiling limits circuit size. Its 32-bit address space and compiler overhead also leave significant performance on the table. Developers building server-side provers or complex recursive programs have been running into these limitations for a while.
The native prover solves this by swapping the WASM bindings layer for direct native Rust execution when you're running in server environments. It’s the same cryptographic backend (Kimchi), same constraint system, same proofs - just faster.
What you get
2-2.5x faster proving
By running the Kimchi prover natively in Node.js, o1js avoids the overhead of the WASM proving path and delivers substantially faster proof generation, especially for larger circuits.
No more 4GB memory limit
The WASM memory ceiling is gone. Your prover can now access as much system memory as it needs, unlocking circuits that were previously impossible to prove client-side.
Larger circuits with chunking
The native prover supports chunked proving for larger circuits, letting you work with constraint systems of up to 2^18 rows - a significant step up for developers building complex ZkPrograms.
No circuit code change
This is the part we're most proud of. The native prover is API-compatible with the existing WASM prover. Your circuits, your ZkPrograms, your smart contracts: they all work exactly as before. You just install the native bindings package via npm alongside o1js, select the backend programmatically, and it automatically uses the faster backend!
How to use it
Getting started is deliberately straightforward. Install the native bindings alongside o1js:
npm install o1js@2.15.0 @o1js/native
If you need to explicitly control which backend is used, you can do so via the o1js configuration:
import { setBackend } from 'o1js';
// Force native
setBackend('native');
// Fall back to WASM - default
setBackend('wasm')
Note: The native prover is a Node.js feature. Browser environments continue to use the WASM backend, which remains fully supported.
Who should upgrade
If you're building zkApps, ZkPrograms or any server-side proving infrastructure with o1js, upgrading is a no-brainer. The performance improvement is immediate and requires no migration effort. CI pipelines, test suites, and development workflows all benefit from the faster proving times.
If you've been blocked by memory limits on larger circuits, 2.15.0 unblocks you as well.
What's next
The native prover is a foundation for more performance work ahead. We're continuing to optimize the proving pipeline and exploring further speedups. Stay tuned for updates and join the conversation in the #zkapps-developers channel on Discord.
Check out: https://www.o1js.dev/native-prover
Upgrade today:
npm install o1js@2.15.0 @o1js/native
Happy proving!

