Signet

April 12, 2026 · View on GitHub

GitHub Sponsors

Decentralised identity verification for Nostr.

Signet is an open protocol that enables users to prove claims about their identity — age, parenthood, professional status — using zero-knowledge proofs, without revealing personal data or relying on a central authority.

What It Does

  • 4 verification tiers: self-declared → web-of-trust → professional adult → professional adult+child
  • Signet IQ (0-200, where 100 = government standard): weighted by professional verification > in-person vouches > online vouches > account age
  • Verifier anti-corruption: 6 layers of accountability for professional verifiers
  • ZKP age proofs: prove "child aged 8-12" without revealing exact date of birth
  • Blue checkmarks for Nostr: decentralised, cryptographic social proof for everyone
  • Community policies: any relay, client, or community sets their own minimum verification requirements

Why

Nostr has no identity layer. Anyone can claim to be anyone. This matters for child safety (a predator can create a fake child account), for trust (no way to prove "I met this person"), and for regulation (age verification laws are coming worldwide).

Signet solves this without centralised data collection. A professional verifies your identity in person. A ZKP credential attests to the result. No personal data is stored. No database to breach.

Quick Start

npm install signet-protocol

Display a verification badge for any Nostr user (Level 1 — a weekend to integrate):

import { computeBadge, buildBadgeFilters, meetsMinimumTier } from 'signet-protocol';

const filters = buildBadgeFilters(['<hex-pubkey>']);
const events = await fetchFromRelay(filters);
const badge = computeBadge('<hex-pubkey>', events, { verifySignatures: true });

// badge.tier => 3, badge.score => 106, badge.displayLabel => "Verified (Tier 3)"
if (meetsMinimumTier(badge, 2)) {
  // allow posting in verified-only community
}

See Signet in 5 Minutes for a full developer overview, or the full flow example for all 4 tiers, trust scoring, policies, and verifier lifecycle.

Protocol

The full specification is at spec/protocol.md.

Event Kinds

All identity attestations use a single NIP-VA kind (31000), differentiated by type tag:

KindType TagNamePurpose
31000credentialVerification CredentialAttests to a subject's verification tier
31000vouchVouch AttestationPeer vouch for another user
30078Community Verification PolicyMinimum verification requirements (NIP-78)
31000verifierVerifier CredentialProfessional declares verifier status
31000challengeVerifier ChallengeChallenge a verifier's legitimacy
31000revocationVerifier RevocationCommunity confirms challenge, revokes verifier
31000identity-bridgeIdentity BridgeLink two keypairs via ring signature
31000delegationDelegationGuardian or agent delegation with scoped permission
30482ElectionVoting extension: define an election
30483BallotVoting extension: cast an anonymous ballot
30484Election ResultVoting extension: publish tallied result

Crypto Stack

Layer 1: Schnorr (secp256k1) — zero new dependencies
         Credential signing, Merkle selective disclosure,
         ring signatures for issuer privacy, MuSig2

Layer 2: Bulletproofs (secp256k1) — age range proofs
         ~700 byte proofs, no trusted setup

Layer 3: General-purpose ZK (future, if needed)
         Complex threshold proofs, recursive composition

Status

v1.0.0 — spec complete, TypeScript library implemented, reference apps functional. Seeking community feedback.

All identity attestations use kind 31000 (NIP-VA, Verifiable Attestations), differentiated by type tag.

Implementation

This repo includes:

  • src/ — TypeScript protocol library (signet-protocol on npm)

Signet is a standalone protocol. Any Nostr client can implement it independently.

Regulatory Compatibility

Signet is designed to satisfy identity verification requirements across jurisdictions:

RegulationPosition
UK Online Safety ActTier 4 exceeds Ofcom's "highly effective age assurance" standard
US COPPANo PII collected — exceeds FTC's March 2026 flexibility policy
EU eIDAS 2.0Compatible with selective disclosure direction
ISO/IEC 27566-1:2025Compatible with outcomes-based age assurance framework
Australia under-16 banProves age range without central verification

Contributing

Feedback, NIP discussion, and contributions are welcome. Open an issue or submit a PR.

Part of the ForgeSworn Toolkit

ForgeSworn builds open-source cryptographic identity, payments, and coordination tools for Nostr.

LibraryWhat it does
nsec-treeDeterministic sub-identity derivation
ring-sigSAG/LSAG ring signatures on secp256k1
range-proofPedersen commitment range proofs
canary-kitCoercion-resistant spoken verification
spoken-tokenHuman-speakable verification tokens
toll-boothL402 payment middleware
geohash-kitGeohash toolkit with polygon coverage
nostr-attestationsNIP-VA verifiable attestations
dominionEpoch-based encrypted access control
nostr-veilPrivacy-preserving Web of Trust

Licence

MIT