Chapter 51 - Social
51
Nostr Implementation Possibility - Hex № 51

Lists

One catalog of list events: mute lists, bookmarks, relay lists, sets, and the rules for keeping items private.

1 Overview

Users collect things: people, notes, relays, hashtags, emojis, apps. This NIP defines the list: an event whose tags hold references to those things. A list can point to anything.

There are two families. A standard list is a normal replaceable event. A user has at most one list per kind. A set is an addressable event with a d tag. A user can have many sets per kind, one per d value.

Each item in a list is public or private. Public items live in the event tags array. Private items live in the content field, encrypted with NIP-44. Everyone can read the public items. Only the author can read the private items.

Hint!

When you add a new item to an existing list, append it to the end of the array. The list then stays in chronological order. Clients SHOULD follow this rule.

2 Public and Private Items

Public items are normal tags in the event tags array. Private items use a hidden second tags array. Build it like this:

  1. Collect the private items as a JSON array. It mimics the structure of the event tags array.
  2. Stringify the array.
  3. Encrypt the string with the NIP-44 scheme. Compute the shared key from the author's own public and private key.
  4. Store the ciphertext in event.content.
Encryption process - pseudocode
private_items = [
  ["p", "07caba282f76441955b695551c3c5c742e5b9202a3784780f8086fdcdc1da3a9"],
  ["a", "a55c15f5e41d5aebd236eca5e0142789c5385703f1a7485aa4b38d94fd18dcc4"],
]
base64blob = nip44.encrypt(json.encode_to_string(private_items))
event.content = base64blob
Warning!

An earlier version of this NIP encrypted private items with NIP-04. That method is now deprecated. For backward compatibility, a client can detect the scheme: search the ciphertext for the string "iv". If it is present, decrypt with NIP-04. Otherwise decrypt with NIP-44.

Public items plain tags Private items JSON tags array NIP-44 encrypt key: own pub+priv List event .tags = public .content = ciphertext
Fig. 51-1 — Two paths into one event. Public items stay readable tags. Private items become one encrypted blob in content.

3 Standard Lists

Standard lists use normal replaceable events. A user may have only a single list of each kind. These lists have special meaning. Clients may rely on them to augment a user's profile or browsing experience.

For example, the mute list can contain the public keys of spammers and bad actors. The user does not want to see them in feeds or receive notifications from them.

Standard list kinds
NameKindDescriptionExpected tag items
Follow list3Microblogging basic follow list, see NIP-02.p pubkeys, with optional relay hint and petname
Mute list10000Things the user does not want to see in their feeds.p pubkeys - t hashtags - word lowercase string - e threads
Pinned notes10001Events the user intends to showcase in their profile page.e kind:1 notes
Read/write relays10002Where a user publishes to and where they expect mentions.See NIP-65.
Bookmarks10003Uncategorized, "global" list of things a user wants to save.e kind:1 notes - a kind:30023 articles
Communities10004NIP-72 communities the user belongs to.a kind:34550 community definitions
Public chats10005NIP-28 chat channels the user is in.e kind:40 channel definitions
Blocked relays10006Relays clients should never connect to.relay relay URLs
Search relays10007Relays clients should use when performing search queries.relay relay URLs
Profile badges10008NIP-58 badges a user has accepted and chosen to display.a kind:30009 badge definitions and e kind:8 badge awards, and a kind:30008 badge set
Simple groups10009NIP-29 groups the user is in.group NIP-29 group id + relay URL + optional group name - r for each relay in use
Favorite follow sets10011User favorite follow sets.a kind:30000 follow set
Relay feeds10012User favorite browsable relays (and relay sets).relay relay URLs and a kind:30002 relay set
Private relays10013(nip44-encrypted) NIP-37 private relays (drafts).relay relay URL
Interests10015Topics a user may be interested in and pointers.t hashtags and a kind:30015 interest set
Media follows10020Multimedia (photos, short video) follow list.p pubkeys, with optional relay hint and petname
Emojis10030User preferred emojis and pointers to emoji sets.emoji see NIP-30 - a kind:30030 emoji set
DM relays10050Where to receive NIP-17 direct messages.relay see NIP-17
Blossom servers10063Servers where to upload and look for images and other blobs.server see NIP-B7
Good wiki authors10101NIP-54 user recommended wiki authors.p pubkeys
Good wiki relays10102NIP-54 relays deemed to only host useful articles.relay relay URLs
Git authors10017Code follow list: people who produce NIP-34 events.p pubkeys, with optional relay hint and petname
Git repositories10018NIP-34 followed repositories.a kind:30617 repository announcement event
Favorite podcasts10054Podcasts a user wants to bookmark as favorites.p NIP-F4 podcast pubkeys - url RSS/XML podcast URLs
Authored podcasts10064Podcasts the user authors.p NIP-F4 podcast pubkeys

4 Sets

Sets are lists with well-defined meaning. They can enhance the functionality and the UI of clients that rely on them. Unlike standard lists, a user is expected to have more than one set of each kind. Therefore each set must have a different d tag identifier.

For example, relay sets can appear in a dropdown UI. The user picks which relays to publish to, or which relays to read replies from. Curation sets let apps showcase curations made by others, tagged to different topics.

Aside from the main d identifier, a set can carry three optional tags that enhance its UI: title, image, and description.

Standard list (replaceable) kind 10000 one per user Sets (addressable) kind 30000 d="friends" kind 30000 d="devs" kind 30000 d="artists" ← at most one event per kind and pubkey many events, keyed by d value
Fig. 51-2 — Lists versus sets. A standard list replaces itself. Sets coexist, one per d value.
Set kinds
NameKindDescriptionExpected tag items
Follow sets30000Categorized groups of users a client may choose to check out in different circumstances.p pubkeys
Relay sets30002User-defined relay groups the user can easily pick and choose from during various operations.relay relay URLs
Bookmark sets30003User-defined bookmark categories, for when bookmarks must be in labeled separate groups.e kind:1 notes - a kind:30023 articles
Curation sets30004Groups of articles picked by users as interesting and/or belonging to the same category.a kind:30023 articles - e kind:1 notes
Curation sets30005Groups of videos picked by users as interesting and/or belonging to the same category.e kind:21 videos
Curation sets30006Groups of pictures picked by users as interesting and/or belonging to the same category.e kind:20 pictures
Kind mute sets30007Mute pubkeys by kinds. The d tag MUST be the kind string.p pubkeys
Badge sets30008NIP-58 categorized groups of badges.a kind:30009 badge definitions and e kind:8 badge awards
Interest sets30015Interest topics represented by a bunch of "hashtags".t hashtags
Emoji sets30030Categorized emoji groups.emoji see NIP-30
Release artifact sets30063Group of artifacts of a software release.e kind:1063 file metadata events - a software application event
App curation sets30267References to multiple software applications.a software application event
Calendar31924A set of events categorized in any way.a calendar event (see NIP-52)
Starter packs39089A named set of profiles to be shared around, with the goal of being followed together.p pubkeys
Media starter packs39092Same as starter packs, but specific to multimedia (photos, short video) clients.p pubkeys

5 Deprecated Standard Lists

Some clients used the rows below in the past. They should transition to the standard list kinds in section 3.

Warning!

Do not create new lists with these kind + d tag combinations. Read them only for backward compatibility. Write the replacement kind instead.

Deprecated kind + d-tag combinations
Kindd tagUse instead
30000muteKind 10000 mute list.
30001pinKind 10001 pin list.
30001bookmarkKind 10003 bookmarks list.
30001communitiesKind 10004 communities list.
Tech Note

The mute list example in the source spec carries a ciphertext that ends in ?iv=…. That marks it as legacy NIP-04 encryption, which the same spec deprecates. New events must use NIP-44; the example survives only to show the backward-compatibility detection. Also note the standard list table is not fully sorted: kinds 10017, 10018, 10054, and 10064 appear after 10101/10102 in the source. The order carries no meaning.

6 Worked Examples

Four real list events follow. The first is a standard list with mixed public and private items. The other three are sets.

A mute list with public and encrypted items

Two muted pubkeys are public tags. More items hide inside content. Only the author can decrypt them.

Event - kind 10000 mute list
{
  "id": "a92a316b75e44cfd…8beebcd0",
  "pubkey": "854043ae8f1f9743…2750ae4cb",
  "created_at": 1699597889,
  "kind": 10000,
  "tags": [
    ["p", "07caba282f764419…cdc1da3a9"],
    ["p", "a55c15f5e41d5aeb…4fd18dcc4"]
  ],
  "content": "TJob1dQrf2ndsmdbeGU+05HT5GMnBSx3fx8QdDY/g3NvCa7klfzgaQCmRZuo1d3W…
              …4vYFsq35BeZl4v1Cse7n2htZicVkItMz3wjzj1q1I1VqbnorNXFgllkRZn4/
              YXfTG/RMnoK/bDogRapOV+XToZ+IvsN0BqwKSUDx+ydKpci6htDRF2WDRkU+
              VQMqwM0CoLzy2H6A2cqyMMMD9SLRRzBg==?iv=S3rFeFr1gsYqmQA7bNnNTQ==",
  "sig": "1173822c53261f8c…853dba6ca"
}
-- the "?iv=" suffix marks legacy NIP-04 ciphertext; new events use NIP-44 --

A curation set of articles and notes about yaks

A kind 30004 set. The d tag makes it addressable. The title, image, and description tags feed the UI.

Event - kind 30004 curation set
{
  "id": "567b41fc9060c758…4dd220ef",
  "pubkey": "d6dc95542e18b8b7…d0593a0c",
  "created_at": 1695327657,
  "kind": 30004,
  "tags": [
    ["d", "jvdy9i4"],
    ["title", "Yaks"],
    ["image", "https://cdn.britannica.com/40/…/Yak-Himalayas-Nepal.jpg"],
    ["description", "The domestic yak, also known as the Tartary ox, …"],
    ["a", "30023:26dc95542e18b8b7…d0593a0c:95ODQzw3ajNoZ8SyMDOzQ"],
    ["a", "30023:54af95542e18b8b7…d0593a0c:1-MYP8dAhramH9J5gJWKx"],
    ["a", "30023:f8fe95542e18b8b7…d0593a0c:D2Tbd38bGrFvU0bIbvSMt"],
    ["e", "d78ba0d5dce22bff…326b4941e"]
  ],
  "content": "",
  "sig": "a9a4e2192eede77e…1294a96bd"
}

A release artifact set of an example app

A kind 30063 set. Each e tag points to one kind 1063 file metadata event. The a tag points to the parent software application event.

Event - kind 30063 release artifact set
{
  "id": "567b41fc9060c758…4dd220ef",
  "pubkey": "d6dc95542e18b8b7…d0593a0c",
  "created_at": 1695327657,
  "kind": 30063,
  "content": "Release notes in markdown",
  "tags": [
    ["d", "com.example.app@0.0.1"],
    ["e", "d78ba0d5dce22bff…326b4941e"],  // Windows exe
    ["e", "f27e2c91051de0c4…ed78bae996c9e"],  // MacOS dmg
    ["e", "9d24ddfab95ba3ff…04aad02332"],  // Linux AppImage
    ["e", "340e0326b340e032…b49ed78ba"],  // PWA
    ["a", "32267:d6dc95542e18b8b7…d0593a0c:com.example.app"]  // parent software application
  ],
  "sig": "a9a4e2192eede77e…1294a96bd"
}

An app curation set

A kind 30267 set. Each a tag references one kind 32267 software application event.

Event - kind 30267 app curation set
{
  "id": "d8037fa866eb5acd…2b431b611",
  "pubkey": "78ce6faa72264387…f026307d",
  "sig": "c1ce0a04521c020a…fae863d95",
  "kind": 30267,
  "created_at": 1729302793,
  "content": "My nostr app selection",
  "tags": [
    ["d", "nostr"],
    ["a", "32267:7579076d9aff0a4c…1bbfcb19:com.example.app1"],
    ["a", "32267:045f2486c7e5d8bc…9aff0a4cfdefa7e2:net.example.app2"],
    ["a", "32267:264387284e647ba6…725737e55130:pl.code.app3"]
  ]
}

7 Version History

NIP-51 grows whenever the network invents a new thing worth collecting. It started as a family of small list NIPs that merged into one page on day one. Notable changes, newest first:

  • 20262026-07Added kind 10011 favorite follow sets; clarified kind 10013 private relays with NIP-37.
  • 20262026-03/05Added Blossom servers (10063), NIP-34 git authors and repositories (10017, 10018), and NIP-F4 podcast lists (10054, 10064). Profile badges moved to kind 10008; badge sets 30008 arrived.
  • 20252025-08/12Switched private-item encryption to NIP-44 and deprecated NIP-04. Removed hashtag and URL tags from bookmarks. Added picture curation sets (30006); video curation sets (30005) switched to e tags.
  • 20252025-02/05Added starter packs (39089, 39092), relay feeds (10012), media follows (10020), and the kind 10002 relay list row.
  • 20242024Added kind mute sets (30007), wiki lists (10101, 10102), simple groups (10009), release artifact sets (30063), app curation sets (30267), and DM relays (10050). "Parameterized replaceable" became "addressable".
  • 20232023-11The big rewrite: lists split from sets, kind 30001 deprecated, and mute words, blocked relays, search relays, interests, emojis, and more lists added. The append-to-end rule arrived weeks later.
  • 20232023-04/08Typo fixes and an extended kind 30001 description, later removed.
  • Origin2023-03-09monlovesmango opened NIP-51 "Lists" (PR #183). The same day fiatjaf merged the separate 51x list NIPs into this single document.

Original Proposal - Credits

Authormonlovesmango
First commit2023-03-09 — “NIP-51 Lists (#183)”
Pull requestnostr-protocol/nips#183
Statusdraft - optional
Source51.md on GitHub - full change history

8 See Also

  • NIP-01 — replaceable and addressable events; the storage classes lists depend on.
  • NIP-02 — the kind 3 follow list, the oldest standard list.
  • NIP-44 — the encryption scheme for private list items.
  • NIP-04 — the deprecated legacy encryption still found in old lists.
  • NIP-65 — the kind 10002 read/write relay list in detail.
  • NIP-17 — direct messages and the kind 10050 DM relay list.
  • NIP-58 — badges, shown through the kind 10008 profile badges list.
  • NIP-52 — calendar events, collected by the kind 31924 calendar set.