{"id":"20ad2e5a9714ed7714d66022b1baaea1123887ea15d19d92b6f460f7f4e21deb","pubkey":"2b39b4ffe62933df970e19366c22c1e092f953f83fcfed754e0f04d5a3b459f9","created_at":1781353189,"kind":30817,"tags":[["d","nip-02"],["title","NIP-02: Follow List"],["summary","Kind 3, the follow list: one p tag per followed key, each carrying an optional relay hint and petname."],["s","final"],["t","nostr"],["t","nip"],["k","3","Follows"],["alt","A specification: NIP-02: Follow List"],["client","openspecs-import"],["published_at","1651402137"],["proxy","https://github.com/nostr-protocol/nips/blob/656cecc7c0a815b6a2b218d3b5d6f078b3f4dbab/02.md","web"],["x","39ddbd840c4c955c290160363a7d5c4b6cea8fe14b07bffee56262f72ad7438a"]],"content":"NIP-02\n======\n\nFollow List\n-----------\n\n`final` `optional`\n\nA special event with kind `3`, meaning \"follow list\" is defined as having a list of `p` tags, one for each of the followed/known profiles one is following.\n\nEach tag entry should contain the key for the profile, a relay URL where events from that key can be found (can be set to an empty string if not needed), and a local name (or \"petname\") for that profile (can also be set to an empty string or not provided), i.e., `[\"p\", <32-bytes hex key>, <main relay URL>, <petname>]`.\n\nThe `.content` is not used.\n\nFor example:\n\n```yaml\n{\n  \"kind\": 3,\n  \"tags\": [\n    [\"p\", \"91cf9..4e5ca\", \"wss://alicerelay.com/\", \"alice\"],\n    [\"p\", \"14aeb..8dad4\", \"wss://bobrelay.com/nostr\", \"bob\"],\n    [\"p\", \"612ae..e610f\", \"ws://carolrelay.com/ws\", \"carol\"]\n  ],\n  \"content\": \"\",\n  // other fields...\n}\n```\n\nEvery new following list that gets published overwrites the past ones, so it should contain all entries. Relays and clients SHOULD delete past following lists as soon as they receive a new one.\n\nWhenever new follows are added to an existing list, clients SHOULD append them to the end of the list, so they are stored in chronological order.\n\n## Uses\n\n### Follow list backup\n\nIf one believes a relay will store their events for sufficient time, they can use this kind-3 event to backup their following list and recover on a different device.\n\n### Profile discovery and context augmentation\n\nA client may rely on the kind-3 event to display a list of followed people by profiles one is browsing; make lists of suggestions on who to follow based on the follow lists of other people one might be following or browsing; or show the data in other contexts.\n\n### Relay sharing\n\nA client may publish a follow list with good relays for each of their follows so other clients may use these to update their internal relay lists if needed, increasing censorship-resistance.\n\n### Petname scheme\n\nThe data from these follow lists can be used by clients to construct local [\"petname\"](http://www.skyhunter.com/marcs/petnames/IntroPetNames.html) tables derived from other people's follow lists. This alleviates the need for global human-readable names. For example:\n\nA user has an internal follow list that says\n\n```json\n[\n  [\"p\", \"21df6d143fb96c2ec9d63726bf9edc71\", \"\", \"erin\"]\n]\n```\n\nAnd receives two follow lists, one from `21df6d143fb96c2ec9d63726bf9edc71` that says\n\n```json\n[\n  [\"p\", \"a8bb3d884d5d90b413d9891fe4c4e46d\", \"\", \"david\"]\n]\n```\n\nand another from `a8bb3d884d5d90b413d9891fe4c4e46d` that says\n\n```json\n[\n  [\"p\", \"f57f54057d2a7af0efecc8b0b66f5708\", \"\", \"frank\"]\n]\n```\n\nWhen the user sees `21df6d143fb96c2ec9d63726bf9edc71` the client can show _erin_ instead;\nWhen the user sees `a8bb3d884d5d90b413d9891fe4c4e46d` the client can show _david.erin_ instead;\nWhen the user sees `f57f54057d2a7af0efecc8b0b66f5708` the client can show _frank.david.erin_ instead.\n","sig":"79b62ba2f32b625f5efe9aca2665b64c629063a69aef562c43af929f9f1f867cff3149a8ce0fbb5af23695538938cd561894df3f29b7e42e56f1ec474eb38ea4"}