Getting Started

Add privacy-preserving ZK verification to any app. Client-side Groth16 proofs — secrets never leave the device.

Runnable examples in examples/ — copy-pasteable browser widget integration and a Node server-side proxy. Self-contained, no monorepo setup.

Choose Your Integration

Three ways to add zero-knowledge verification. All proofs are generated client-side — secrets never leave the user's device.

SDK (npm)

Full control. Import into any JS/TS project.

npm install zkrune-sdk snarkjs
 
import { generateProof, verifyProofRemote } from 'zkrune-sdk';
 
const result = await generateProof({
  templateId: 'age-verification',
  inputs: {
    birthYear: '1990',
    currentYear: '2026',
    minimumAge: '18',
  },
});
 
const { isValid } = await verifyProofRemote({
  circuitName: 'age-verification',
  proof: result.proof.groth16Proof,
  publicSignals: result.proof.publicSignals,
});

Widget (script tag)

Drop-in. No bundler needed.

<script src="https://cdn.jsdelivr.net/npm/zkrune-widget@latest/dist/zkrune-widget.global.js"></script>
 
<div id="zk"></div>
<script>
  ZkRuneWidget.init({
    container: '#zk',
    theme: 'dark',
    onResult: (r) => console.log(r.verified)
  });
</script>

Verify API

Server-side verification against trusted keys.

POST https://zkrune.com/api/verify-proof
 
{
  "circuitName": "age-verification",
  "proof": { "pi_a": [...], ... },
  "publicSignals": ["1"]
}
 
// Response:
// { "isValid": true, "timing": 2 }

Which One Should I Use?

CriteriaSDKWidgetVerify API
Bundler requiredYesNoNo
Proof generationClientClientN/A (verify only)
UI includedNoYesNo
CustomizationFullTheme + configFull
Best fordApps, custom UIBlogs, landing pagesBackend verification

On this page