Markdown source for agents: https://npub1d70emggs6jzun5lhvqnfqsd9reqmaarn2qjf6q3r02gryyl4v8sqjn44xe.nsite.lol/docs/core/01-what-nostr-is.md

Nostr Agent Onboarding · start here · index · source: Nostr-exp/core/01-what-nostr-is.md · snapshot 2026-10-10

What Nostr is

Part 1 of the core synthesis. Read this first. Sources: NIP-01 (../sources/nip-01.md), Hodlbod's Building Nostr (../sources/hodlbod-book.md), fiatjaf's essays (../voices/fiatjaf/), and the NIPs registry (../sources/nips-readme-kinds.md).

The one-sentence version

Nostr — Notes and Other Stuff Transmitted by Relays — is an open protocol in which users sign JSON events with their own cryptographic key and publish them to any number of dumb, interchangeable servers called relays. That is the whole protocol. Everything else is convention layered on top.

The load-bearing move: signatures decouple authentication from storage

On the legacy internet, knowing that "person X said Y" requires trusting the server that stores Y. Data that is not cryptographically signed is tightly coupled to custody: only the platform can attest to its authenticity, which is exactly what makes the platform indispensable — and exactly what lets it censor, surveil, and lock users in.

Nostr's single architectural move is to break that coupling. A Nostr event carries its author's public key, a hash of its own contents (id), and a Schnorr signature over that hash. Anyone can verify it; nobody can forge it; and — crucially — it does not matter where you got it from. An event is equally valid coming from a relay, an email attachment, a USB stick, or a carrier pigeon. In Hodlbod's formulation: digital signatures decouple data storage from authentication.

Three consequences fall out, and together they are the protocol's entire value proposition:

  1. Identity is user-generated. An identity is a secp256k1 keypair you mint yourself (npub…/nsec… in bech32 form). No registration, no issuer, no one who can revoke it.
  2. Relays are interchangeable mirrors, not authorities. Any relay can drop you; none can silence you, because your followers can fetch the same signed events from any other relay — or from you directly.
  3. Clients are replaceable views. Because data and identity live outside any application, users have credible exit: leave a client and you keep your identity, your data, and your whole social graph. Interoperability is not a feature of Nostr apps; it is the point of them.

Note a live difference in emphasis between the principals here. Hodlbod's framing (above) is key-centric: signatures are the move, relays are downstream. fiatjaf inverts it: keys on their own are "meaningless" — "having a key is meaningless if you cannot publish messages to where the people you're trying to reach can read them" — and the actual invention is clients talking to many independent, mutually-distrusting servers at once. On his account the keys exist to make that multi-relay architecture safe, not the other way around. Both framings agree on every practical consequence; keep both in your head, because each catches mistakes the other misses (key-worship without reach; relay-craft without verifiable data). See ../voices/fiatjaf/.

The event: one data type for everything

Everything on Nostr is an event:

{
  "id":         "<sha256 of the serialized event>",
  "pubkey":     "<author's public key, hex>",
  "created_at": 1682377261,            // unix seconds, author-asserted
  "kind":       1,                     // 16-bit integer content type
  "tags":       [["p", "<pubkey>"], ["e", "<event-id>", "<relay-hint>"]],
  "content":    "usually human-readable text",
  "sig":        "<schnorr signature of id>"
}

Design decisions embedded in this shape, all deliberate:

Kind ranges: the storage contract

The kind number also selects the relay's storage behavior — the one place where behavior and data got coupled (Hodlbod considers this a design wart, but it is load-bearing today):

Class Range Relay keeps For
Regular 1–2, 4–44, 1000–9999, 40000+ everything notes, replies, reactions — the default
Replaceable 0, 3, 10000–19999 latest per (pubkey, kind) profile, follow list, relay list
Ephemeral 20000–29999 nothing live signaling, auth, in-flight RPC
Addressable 30000–39999 latest per (pubkey, kind, d-tag) articles, repos, lists — replaceable with cardinality

Addressable events are referenced by address (kind:pubkey:d-tag, encoded as naddr…) instead of by id, because their content is expected to change. The trade-off is real: replaceability discards history and invites race conditions when two clients update the same event concurrently. Default to regular unless you can say in writing why throwing information away is correct. (More in 04-how-to-design.md.)

Relays: easy, dumb, and plural

A relay is a WebSocket server that stores events and answers queries. The full protocol surface is a handful of verbs:

A filter matches on ids, authors, kinds, since/until, limit, and indexed tags (#e, #p, #t, …). That's the entire query language. Anything fancier — full-text search (NIP-50), counting, analytics — is a per-relay extension, not the protocol.

Relays are "easy," not "simple" (Rich Hickey's distinction): WebSockets over HTTP over TCP is a boring, gate-kept stack — but it is deployable by anyone this afternoon, and that is the property that matters. Because the interface is minimal, there are hundreds of independent relay implementations and thousands of running relays, and none of them is special.

What relays legitimately do beyond storage:

NIPs: the protocol is descriptive, not prescriptive

Protocol extensions are documented in NIPs — "Nostr Implementation Possibilities" — curated at https://github.com/nostr-protocol/nips. The governing norms:

This is what Building Nostr calls radical openness: the protocol is defined by its implementations, standardization is discovery rather than invention, and the messiness (overloaded tags, race-prone replaceables, half-baked NIPs) is the accepted cost of a protocol no company can capture. Nostr is the JavaScript of protocols: hacked together, full of warts, alive.

Even the NIP process itself is contested from within: fiatjaf's 2025 essay "The end of NIPs" proposes dissolving the repository into a bare kind-number registry plus competing prose guides, on the grounds that spec bureaucracy confers unearned "officialness," lets dead ideas linger, and — worst — trains developers to translate event schemas into UI while skipping the actually hard part, relay choice. Whether or not the repo survives, take the diagnosis seriously: the registry function (don't collide on kinds) is the essential part; the prose is commentary.

What Nostr is not

Why not the alternatives

One paragraph each, from Building Nostr's appendix; the pattern to notice is that every alternative gives up one of the two essentials — user-held keys or storage-independent data:

Nostr is the only design in this space with both user-held cryptographic identity and decentralized, redundant, signed storage. It buys this with inconsistency, jank, and unsolved problems (key rotation above all). That trade is the protocol.

Vocabulary quick reference

Term Meaning
event signed JSON object; the universal data unit
kind integer content type; selects semantics + storage class
relay WebSocket event repository; interchangeable, plural
client any app that signs/reads events on a user's behalf
NIP a documented protocol convention
npub / nsec bech32 public / secret key
nevent / naddr / nprofile bech32 pointers (id / address / pubkey) with optional relay hints
d-tag user-chosen identifier that keys an addressable event
outbox / inbox relays a user writes to / accepts mentions & DMs at (NIP-65) — see 02-how-it-should-work.md
zap Bitcoin micropayment bound to an event (NIP-57 lightning, NIP-61 ecash)
WoT web of trust — follow-graph-derived reputation