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

@ministryofmany/identity

v0.3.0

Published

Pure Semaphore v4 identity layer: deterministic per-app-secret -> per-context Identity derivation (one Ministry-delivered branch yields an unlinkable distinct commitment per context), a zero-dependency ./link entry for the OIDC-fragment anon handoff (capt

Readme

@ministryofmany/identity

Pure Semaphore v4 identity layer: one backed-up 32-byte device seed yields a distinct, unlinkable Identity per context (deriveIdentity(seed, contextId)), plus a PBKDF2 + AES-GCM seed vault, a BIP-39 mnemonic backup, and the per-device commitment lifecycle/revocation contract the membership layer consumes. No Semaphore v3 or RLN in the dependency closure.

Ministry anon handoff (minister-link)

For RPs whose device seed comes from Ministry (anon-identity master spec sections 8.4 and 9) instead of local generation:

import {
  extractMinisterAppSecret,
  deriveDeviceSeedFromMinister,
  deriveIdentity,
} from "@ministryofmany/identity";

// On the OIDC callback LANDING page, before any other script touches the URL:
const appSecret = extractMinisterAppSecret(); // reads + SCRUBS #minister_anon=v1.<b64url>
if (appSecret === null) {
  // fail-closed: login worked, no anonymous identity arrived -
  // show your "connect your anonymous identity" state, never invent a secret.
} else {
  const deviceSeed = await deriveDeviceSeedFromMinister(appSecret, rpMixSecret);
  const identity = await deriveIdentity(deviceSeed, contextId); // existing chain, unchanged
}

Integration rules (spec 9.3): run the extract-and-scrub before any analytics or third-party JS; no client-side redirect anywhere in the callback chain (a location.assign, meta refresh, or router navigation destroys the fragment - only server-side 3xx hops preserve it); never send the per-app secret or the device seed to any server; cache at most the mixed device seed, never the raw per-app secret.

rpMixSecret is identity-determining - do not lose it, do not rotate it

device_seed = HKDF-SHA-256(ikm = per_app_secret, salt = rp_mix_secret, info = "minister/anon/rp-mix/v1", L = 32). The mix secret is the HKDF salt, so losing or regenerating it silently forks every user's identity in your app - every commitment, membership, and nullifier orphans, every prior post becomes unownable, and no error fires anywhere (spec invariant I9). Discipline:

  • Provision once at launch: >= 32 CSPRNG bytes (suggested env var ANON_RP_MIX_SECRET), served to your signed-in page by your own server - never baked into a public bundle.
  • Back it up immediately with the same durability as your database.
  • Immutable post-launch. Exclude it from every secret-rotation runbook; there is no legitimate rotation, only the fork.
  • Write your recovery story (where the backup lives, who restores it) before the integration ships.

Ministry never holds this value - that separation is the point: a compromise exfiltrating seeds from ministry.id still cannot reproduce your app's identities without your mix secret.