content: Empty string or deprecated JSON relay preferences: {"wss://relay.damus.io": {"read": true, "write": true}}
Kind 3 is the contact list (follow list). The tags array contains one 'p' tag per followed pubkey, with optional relay hint and petname. Replaceable – only the latest kind 3 per pubkey is kept. The entire follow list is replaced atomically. Used by clients to build home feeds (kind 1 events from followed pubkeys).
Details
Kind 3 (contact list) is a replaceable event containing the complete list of pubkeys the author follows.
Tag format: ["p", "pubkey", "relay-url", "petname"] pubkey: hex-encoded public key of the followed user relay-url: optional hint of which relay has events from this user petname: optional local nickname (not widely used)
Atomic replacement: the entire contact list is replaced each time. There is no "follow" or "unfollow" command – you publish a new kind 3 with the updated list. This means adding one follower requires re-publishing all follows.
Feed construction: clients use kind 3 to build the home feed. They fetch kind 3 for the logged-in user, extract all followed pubkeys, then subscribe to kind 1 events from those pubkeys across relays.
Privacy: contact lists are public. Anyone can see who you follow. There is no private follow list in base Nostr (NIP-51 lists offer partial workarounds with encrypted entries).
Relay discovery: the relay hints in kind 3 p tags help clients discover which relays to query for each followed user's events – important for decentralized relay topology.
Required Event Fields
Examples
{
"kind": 3,
"tags": [
["p", "pubkey-of-alice", "wss://relay.damus.io", "alice"],
["p", "pubkey-of-bob", "wss://nos.lol", "bob"],
["p", "pubkey-of-carol", "wss://relay.snort.social"]
],
"content": "",
"id": "...",
"sig": "..."
}