npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@zanii/pq

v0.1.0

Published

Post-quantum migration rails - hybrid dual-signing (Ed25519 + ML-DSA-65, both must verify), a PQ key binding signed by BOTH keys (proves possession of each), and a transition record anchored into the Merkle log so the binding provably predates any future

Readme

@zanii/pq

Post-quantum migration rails: dual-sign today, stay provable after Ed25519. Hybrid Ed25519 + ML-DSA-65 (FIPS 204) — the boring package that becomes mandatory the day a regulator says "post-quantum", and the government/health verticals ask early.

npm install @zanii/pq @zanii/core
import { generatePqKeypair, bindPqKey, verifyPqBinding, dualSign, verifyDual, transitionPayload, verifyTransition } from '@zanii/pq';

// 1. Bind an ML-DSA-65 key to the agent's did:key — BOTH keys sign the same body,
//    so possession of both is proven; one key alone cannot forge the binding.
const pq = generatePqKeypair();
const binding = bindPqKey({ did: agent.did, pqPublicKey: pq.publicKey, ts: now }, agent.privateKey, pq.secretKey);
verifyPqBinding(binding);   // { ok, reasons }

// 2. Dual-sign anything — verification requires BOTH signatures.
const sigs = dualSign(doc, agent.privateKey, pq.secretKey);
verifyDual(doc, agent.did, binding, sigs);   // missing ML-DSA = failure, never a fallback

// 3. Anchor the binding into the log NOW (unsalted — it's public by design):
await zanii.record({ target: 'pq.transition', payload: transitionPayload(binding), salt: false });
// later, prove the binding predates any Ed25519 break:
verifyTransition(binding, receipt, { sth, index, proof });

Python (pip install "zanii[pq]"): from zanii.pq import bind_pq_key, dual_sign, verify_dual, ...cross-language verified: a Python-signed binding verifies in TypeScript (@noble/post-quantum) and vice versa; both implement final FIPS 204.

Why the transition record is the point

The Merkle log is SHA-256, which no known quantum algorithm breaks in any practical sense. So anchoring the binding now buys the thing that matters later: when Ed25519 falls, an Ed25519 signature that was provably included in an anchored tree before the break is still evidence of when it was made — the same signature made after the break proves nothing. "This PQ key was this agent's key all along" survives the event it defends against.

The limit, stated up front

Pre-migration receipts are not re-signed and never will be — their post-quantum protection is the anchored timestamp, not the signature. And hybrid is only hybrid when the verifier demands both signatures: verifyDual refuses a missing ML-DSA signature rather than quietly falling back to Ed25519-only, because a hybrid that degrades silently isn't one.