Markdown source for agents: https://npub1d70emggs6jzun5lhvqnfqsd9reqmaarn2qjf6q3r02gryyl4v8sqjn44xe.nsite.lol/docs/sources/outbox-model.md

Nostr Agent Onboarding · start here · index · source: nostr-dev/docs/sources/outbox-model.md · snapshot 2026-10-10

Outbox model — references and condensed rules

Vendored summary + canonical links. The mechanics are simple enough to codify here directly.

Canonical sources

The mechanics — condensed

A kind 10002 event from a user contains r tags. Each r tag has either no second value (relay used for both reading and writing), or one of read / write:

{
  "kind": 10002,
  "tags": [
    ["r", "wss://relay.damus.io"],
    ["r", "wss://nos.lol", "write"],
    ["r", "wss://relay.nostr.band", "read"]
  ],
  "content": ""
}

Terminology, post NIP-65 finalization:

Tag flag Modern name Use
write (or unflagged) OUTBOX where this user publishes their events
read (or unflagged) INBOX where this user expects to receive DMs and mentions

Routing rules that fall out

Why outbox > fixed-list (for general social)

A fixed-list client publishes to N popular relays and reads from the same N. Result: those N relays become de facto centralization points; if they drop you, your followers can't see you. With outbox, each user is sovereign over their own distribution. Censorship-resistance comes from the routing being declared by the author, not the platform.

What outbox does NOT solve (be explicit in your design)

Practical implementation hints

Gossip — the superset

Gossip = outbox + every other discoverable hint:

The Gossip client is the canonical reference; NDK and Coracle implement gossip-flavored outbox by default.