All Products
FoundationPublic Alpha

Provenance SDK

Attested provenance. Sign, chain, verify. Every language, every granularity.

Who it's for
Developers building applications that need cryptographic proof of data origin and transformation.
Get started
Download the WASM SDK and sign your first receipt in under 5 minutes.

The attested provenance layer beneath every DRM3 product. Ed25519 signing, chainable receipts, Merkle rollups, and a verifier that lets any third party confirm a receipt against the published keys, offline. Every receipt carries the signer's name, permanently. Available as a Rust crate, WASM package for Cloudflare Workers and browsers, and Elixir NIF.

Receipts are chainable. Every receipt can point to its parent, forming a provenance chain from raw source through every transformation to the final output. Walk backward from any output to verify the full lineage.

Three granularity levels. Row-level gives you a signed receipt on every individual data point. Merkle rollups batch row receipts into a single tree root for efficiency. Session-level signs over the entire batch with query context. You choose the granularity: fine-grained internally for audit readiness, coarser-grained for data leaving your system.

Deterministic key derivation. Each product gets its own Ed25519 signing key at a unique path. DomainDrift signs DNS scans, Signals signs data fetches, MorScan signs price snapshots. Every signer record is published at status.drm3.network and anchored on-chain; the live registry is the source of truth.

Capabilities

Ed25519 signing and verification

Chainable receipts (provenance DAGs)

Three granularity levels: row, Merkle, session

Merkle tree rollups for batch attestation

Canonical JSON (NFC Unicode, sorted keys, deterministic hashing)

Compatible with Rust, Elixir, TypeScript, WASM, browsers

Deterministic key derivation per product

Live signer registry with per-key lifecycle status, anchored on-chain

On-chain anchoring (optional)

Install It

The SDK is published, MIT licensed, and installable today. Browser and Workers use the WASM package; Node and Bun use the native binding; Rust consumers take the signed release from GitHub.

npm install @drm3labs-oss/provenance # browser + Cloudflare Workers (WASM)
npm install @drm3labs-oss/provenance-node # Node / Bun

Packages: @drm3labs-oss/provenance and @drm3labs-oss/provenance-node on npm. Verify what you install: every release is signed, and the receipt is published beside the download.

How It Works

Say you have a workflow that fetches three search results, summarizes them with an AI prompt, then stores the output in a database. Each step signs over its inputs and outputs. The receipt from step 1 becomes the parent of step 2. The receipt from step 2 becomes the parent of step 3. A consumer who reads the database gets the final receipt and can walk the chain backward to verify every step.

Step 1: Fetch
const fetchKey = SigningKey.load('myapp/fetch');

const receipt = Receipt.create('search.fetch')
  .inputs({ query: 'morpheus AI inference', sources: 3 })
  .outputs({ results, _meta: { service: 'myapp', signer: 'myapp/fetch' } })
  .sign(fetchKey);
// receipt.id → rcpt_a1b2c3...
Step 2: Summarize (chains to step 1)
const aiKey = SigningKey.load('myapp/ai');

const summary = Receipt.create('ai.summarize')
  .inputs({ model: 'llama-3.3-70b', prompt_hash: '...' })
  .outputs({ summary: text, tokens: 847, _meta: { ... } })
  .parent(receipt.id())   // ← chains to the fetch receipt
  .sign(aiKey);
Step 3: Store (chains to step 2)
const storeKey = SigningKey.load('myapp/store');

const stored = Receipt.create('db.insert')
  .inputs({ table: 'summaries', row_id: 'sum_001' })
  .outputs({ row_hash: '...', _meta: { ... } })
  .parent(summary.id())  // ← chains to the AI receipt
  .sign(storeKey);

Three steps, three receipts, one chain. A consumer who reads the stored summary gets stored and can walk backward: store → summarize → fetch. Every step independently verifiable. The data stays with you. The receipts travel with it.

Merkle Rollup

When you sign thousands of entities (the signals pipeline signs 500+ per NASDAQ listings fetch), row-level receipts roll up into a Merkle tree. One tree root proves the entire batch. Prove any single entity without revealing the others.

// Build Merkle tree from row receipts
let chain = Chain.create();
for (const r of rowReceipts) {
  chain = chain.add(Receipt.fromJson(r));
}
const tree = chain.build();
const root = tree.merkleRoot();  // sha256:7a1f3e...

// Prove entity #42 is in the batch
const proof = tree.merkleProof(42);
proof.verify(rowReceipts[42].hash(), root);  // ✓

Verify Against the Registry

Every DRM3 signer is published. Fetch the public key registry, match the receipt's public_key to a known signer, and verify the Ed25519 signature yourself, right in your browser. Our name is on every key.

// Fetch the signer registry
const keys = await fetch('https://status.drm3.network/.well-known/drm3-keys.json');
const registry = await keys.json();

// Find the signer
const signer = registry.keys.find(k => k.public_key === receipt.public_key);
// → { path: "connor/worker", product: "Connor", algorithm: "Ed25519" }

// Verify the signature
const valid = Receipt.fromJson(receiptJson).verify();  // ✓ or throws

Live Provenance Receipt

Every operation produces a receipt like this one, fetched live just now from the network. Ed25519-signed at the moment of execution.

Live Ed25519 Receiptfrom Provenance SDK
Receiptrcpt_6b5776204c6c1605Actionblockchain.priceTimestamp2026-07-27T13:50:39.147ZOutput hashsha256:943d34e05f5f1a6560d298d1160e5eed29b0e3975ad2c0e4bd39f86da0b317ddPublic keyed25519:0e527e8231e412dc11520aa7c36a1c573953cde6ad8f0052fcff0b7420b67ae3Signatureed25519:2d7375415de5dc7f9045e064b33ceb775be25ccaf0b0a85d4e5caf5e8e25e6620aefa3f7ccaa3f1e443dfcd3ea78ce33659e6f09e20cea91fc993533cceb2109
Ed25519 signedVerify signer