What counts as an identity? Before an agent can answer “who am I,” something has to define what a valid answer looks like. The pillars supply the answers; this defines what a valid answer has to satisfy.
Most Nostr identity tooling models a human with a keypair. An agent needs more, and needs it solved the same way every time. This is a definition, not a framework: the six elements a conforming agentic identity solves for, plus a zero-dependency package that checks conformance.
An agent that acts in the world needs a key it holds itself, a presence it owns, a way to be seen and reached before it can act, and a face that survives without a server hosting it. Every implementation solves these, badly, differently, and incompatibly.
Naming the elements means an agentic identity means the same thing across implementations. The standard says what; you keep discretion over how, which relay, which storage, which login, which wallet. A human, in this model, is simply the well-behaved subset: same six elements, one of them wired to an email magic link instead of a wallet.
| § | Element | What it means |
|---|---|---|
| 1 | Identity root | The identity IS a Nostr keypair. The holder controls the nsec; the platform never custodies an owned key. The npub is the stable anchor. |
| 2 | Two tiers | computed (platform-derived, inert) and owned (self-custodied, can act). The distinction is custody. The standard is silent on pricing. |
| 3 | Profile | Handle + metadata as a signed kind-0 event. Owned identities bind a NIP-05 on a controlled domain. |
| 4 | Vhaiku | A visualization computed deterministically from the key identity art is code, not media. No CDN, no PNG to rot. |
| 5 | Act-outward gate | The single rule this standard enforces. An identity may act outward only when it is owned + self-custody + verified + funded. |
| 6 | Passwordless auth | Magic link, QR bearer, or passkey. Never a stored password. Enumeration-safe, re-loaded per request so revocation is instant. |
One predicate governs every outward action, sending an email, placing a call, publishing on someone's behalf. It is an authorization and abuse-control boundary: an identity nobody has vouched for can be seen and reached, but never acts.
import { canActOutward } from 'nostr-agentic-identity';
if (canActOutward(identity)) {
// send the email / place the call / publish on its behalf
}
// owned + self-custody + verified + funded, strict ===
// a computed identity is structurally unable to pass
Enforce it non-forgeably. Evaluate the gate against an identity re-loaded from your store of record. Never against a caller-supplied or deserialized object. The capability-bearing fields are the whole security boundary.
import { isConformant } from 'nostr-agentic-identity';
const { ok, issues } = isConformant(identity);
// ok: boolean
// issues: string[]: every structural rule the identity violates
// pure, no I/O, safe to run anywhere, including the browser
| Export | Maps to | What |
|---|---|---|
AgenticIdentity | §1–§4 | the identity type |
Tier, TIERS | §2 | 'computed' | 'owned' |
Custody, CUSTODIES | §2 | 'platform' | 'self' |
canActOutward(id) | §5 | the gate, strict === |
isConformant(id) | §1–§5 | structural checker → { ok, issues[] } |
describeStandard() | all | the six elements, as data |
Zero runtime dependencies. ESM + CommonJS + .d.ts, plus a browser
bundle. It does not mint keys, talk to relays, render vhaikus, or log anyone in, those are
heavier implementations that live under the standard. This is the lightest possible
peer: a checker, not a composer.
| Not a heavy dependency | How you store, relay, sign, send and pay is yours. Conforming implementations inject their I/O. |
| Not an open anonymous mint | Outward capability requires accountability established first. How you establish it is your choice. |
| Not custody | An owned nsec is handed to the holder once and never retained. |
| Not a business model | Silent on pricing, packaging and tiering economics. Two conforming implementations may make opposite commercial choices. |
| Not human-vs-agent | One model. A human is the subset that logs in with a magic link instead of holding its own wallet. |
The standard is implementable from the SPEC alone. Building blocks that already exist, if you want them:
| nostr-nsec-seedphrase | keys, minting and seed derivation (§1) |
| nostr-crypto-utils | the crypto primitives |
| nostr-auth-middleware | passwordless auth (§6) |
| nostr-dm-magiclink-utils | magic links over Nostr DMs (§6) |
Visualization (§4) has no privileged implementation, any deterministic, code-derived generator conforms.