upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfiatjaf_ <fiatjaf@gmail.com>2023-11-19 14:47:02 -0300
committerGitHub <noreply@github.com>2023-11-19 14:47:02 -0300
commit7822a8b12670312aff104ddc03066425882f739d (patch)
treea5ace5de95655b19c85265b34c3a525fb6e1b90c
parentea6d277c7ceaf21aec077e521c2251bb03f6e651 (diff)
parent33a719f34507bf2cbc6717eb5e4b9464daaad23a (diff)
Merge pull request #880 from nostr-protocol/save-nip-51
-rw-r--r--51.md189
-rw-r--r--README.md134
2 files changed, 148 insertions, 175 deletions
diff --git a/51.md b/51.md
index a8a8e95..f5a9a74 100644
--- a/51.md
+++ b/51.md
@@ -6,148 +6,107 @@ Lists
6 6
7`draft` `optional` 7`draft` `optional`
8 8
9A "list" event is defined as having a list of public and/or private tags. Public tags will be listed in the event `tags`. Private tags will be encrypted in the event `content`. Encryption for private tags will use [NIP-04 - Encrypted Direct Message](04.md) encryption, using the list author's private and public key for the shared secret. A distinct event kind should be used for each list type created. 9This NIP defines lists of things that users can create. Lists can contain references to anything, and these references can be **public** or **private**.
10 10
11If a list should only be defined once per user (like the "mute" list) the list is declared as a _replaceable event_. These lists may be referred to as "replaceable lists". Otherwise, the list is a _parameterized replaceable event_ and the list name will be used as the `d` tag. These lists may be referred to as "parameterized replaceable lists". 11Public items in a list are specified in the event `tags` array, while private items are specified in a JSON array that mimics the structure of the event `tags` array, but stringified and encrypted using the same scheme from [NIP-04](04.md) (the shared key is computed using the author's public and private key) and stored in the `.content`.
12 12
13## Replaceable List Event Example 13## Types of lists
14 14
15Lets say a user wants to create a 'Mute' list and has keys: 15## Standard lists
16```
17priv: fb505c65d4df950f5d28c9e4d285ee12ffaf315deef1fc24e3c7cd1e7e35f2b1
18pub: b1a5c93edcc8d586566fde53a20bdb50049a97b15483cb763854e57016e0fa3d
19```
20The user wants to publicly include these users:
21 16
22```json 17Standard lists use non-parameterized replaceable events, meaning users may only have a single list of each kind. They have special meaning and clients may rely on them to augment a user's profile or browsing experience.
23["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"],
24["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"]
25```
26and privately include these users (below is the JSON that would be encrypted and placed in the event content):
27 18
28```json 19For example, _mute lists_ can contain the public keys of spammers and bad actors users don't want to see in their feeds or receive annoying notifications from.
29[
30 ["p", "9ec7a778167afb1d30c4833de9322da0c08ba71a69e1911d5578d3144bb56437"],
31 ["p", "8c0da4862130283ff9e67d889df264177a508974e2feb96de139804ea66d6168"]
32]
33```
34 20
35Then the user would create a 'Mute' list event like below: 21| name | kind | description | expected tag items |
22| --- | --- | --- | --- |
23| Mute list | 10000 | things the user doesn't want to see in their feeds | `"p"` (pubkeys), `"t"` (hashtags), `"word"` (lowercase string), `"e"` (threads) |
24| Pinned notes | 10001 | events the user intends to showcase in their profile page | `"e"` (kind:1 notes) |
25| Bookmarks | 10003 | uncategorized, "global" list of things a user wants to save | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r" (URLs)` |
26| Communities | 10004 | [NIP-72](72.md) communities the user belongs to | `"a"` (kind:34550 community definitions) |
27| Public chats | 10005 | [NIP-28](28.md) chat channels the user is in | `"e"` (kind:40 channel definitions) |
28| Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) |
29| Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) |
30| Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a" (kind:30015 interest set)` |
31| Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) |
36 32
37```json 33## Sets
38{
39 "kind": 10000,
40 "tags": [
41 ["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"],
42 ["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"],
43 ],
44 "content": "VezuSvWak++ASjFMRqBPWS3mK5pZ0vRLL325iuIL4S+r8n9z+DuMau5vMElz1tGC/UqCDmbzE2kwplafaFo/FnIZMdEj4pdxgptyBV1ifZpH3TEF6OMjEtqbYRRqnxgIXsuOSXaerWgpi0pm+raHQPseoELQI/SZ1cvtFqEUCXdXpa5AYaSd+quEuthAEw7V1jP+5TDRCEC8jiLosBVhCtaPpLcrm8HydMYJ2XB6Ixs=?iv=/rtV49RFm0XyFEwG62Eo9A==",
45 ...other fields
46}
47```
48 34
35Sets are lists with well-defined meaning that can enhance the functionality and the UI of clients that rely on them. Unlike standard lists, users are expected to have more than one set of each kind, therefore each of them must be assigned a different `"d"` identifier.
49 36
50## Parameterized Replaceable List Event Example 37For example, _relay sets_ can be displayed in a dropdown UI to give users the option to switch to which relays they will publish an event or from which relays they will read the replies to an event; _curation sets_ can be used by apps to showcase curations made by others tagged to different topics.
51 38
52Lets say a user wants to create a 'Categorized People' list of `nostr` people and has keys: 39Aside from their main identifier, the `"d"` tag, sets can optionally have a `"title"`, an `"image"` and a `"description"` tags that can be used to enhance their UI.
53```
54priv: fb505c65d4df950f5d28c9e4d285ee12ffaf315deef1fc24e3c7cd1e7e35f2b1
55pub: b1a5c93edcc8d586566fde53a20bdb50049a97b15483cb763854e57016e0fa3d
56```
57The user wants to publicly include these users:
58 40
59```json 41| name | kind | description | expected tag items |
60["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"], 42| --- | --- | --- | --- |
61["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"] 43| Follow sets | 30000 | categorized groups of users a client may choose to check out in different circumstances | `"p"` (pubkeys) |
62``` 44| Relay sets | 30002 | user-defined relay groups the user can easily pick and choose from during various operations | `"relay"` (relay URLs) |
63and privately include these users (below is the JSON that would be encrypted and placed in the event content): 45| Bookmark sets | 30003 | user-defined bookmarks categories , for when bookmarks must be in labeled separate groups | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r" (URLs)` |
46| Curation sets | 30004 | groups of articles picked by users as interesting and/or belonging to the same category | `"a"` (kind:30023 articles), `"e"` (kind:1 notes) |
47| Interest sets | 30015 | interest topics represented by a bunch of "hashtags" | `"t"` (hashtags) |
48| Emoji sets | 30030 | categorized emoji groups | `"emoji"` (see [NIP-30](30.md)) |
64 49
65```json 50## Deprecated standard lists
66[ 51
67 ["p", "9ec7a778167afb1d30c4833de9322da0c08ba71a69e1911d5578d3144bb56437"], 52Some clients have used these lists in the past, but they should work on transitioning to the [standard formats](#standard-lists) above.
68 ["p", "8c0da4862130283ff9e67d889df264177a508974e2feb96de139804ea66d6168"] 53
69] 54| kind | "d" tag | use instead |
70``` 55| --- | --- | --- |
56| 30000 | `"mute"` | kind 10000 _mute list_ |
57| 30001 | `"pin"` | kind 10001 _pin list_ |
58| 30001 | `"bookmark"` | kind 10003 _bookmarks list_ |
59| 30001 | `"communities"` | kind 10004 _communities list_ |
60
61## Examples
71 62
72Then the user would create a 'Categorized People' list event like below: 63### A _mute list_ with some public items and some encrypted items
73 64
74```json 65```json
75{ 66{
76 "kind": 30000, 67 "id": "a92a316b75e44cfdc19986c634049158d4206fcc0b7b9c7ccbcdabe28beebcd0",
68 "pubkey": "854043ae8f1f97430ca8c1f1a090bdde6488bd5115c7a45307a2a212750ae4cb",
69 "created_at": 1699597889,
70 "kind": 10000,
77 "tags": [ 71 "tags": [
78 ["d", "nostr"], 72 ["p", "07caba282f76441955b695551c3c5c742e5b9202a3784780f8086fdcdc1da3a9"],
79 ["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"], 73 ["p", "a55c15f5e41d5aebd236eca5e0142789c5385703f1a7485aa4b38d94fd18dcc4"]
80 ["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"],
81 ], 74 ],
82 "content": "VezuSvWak++ASjFMRqBPWS3mK5pZ0vRLL325iuIL4S+r8n9z+DuMau5vMElz1tGC/UqCDmbzE2kwplafaFo/FnIZMdEj4pdxgptyBV1ifZpH3TEF6OMjEtqbYRRqnxgIXsuOSXaerWgpi0pm+raHQPseoELQI/SZ1cvtFqEUCXdXpa5AYaSd+quEuthAEw7V1jP+5TDRCEC8jiLosBVhCtaPpLcrm8HydMYJ2XB6Ixs=?iv=/rtV49RFm0XyFEwG62Eo9A==", 75 "content": "TJob1dQrf2ndsmdbeGU+05HT5GMnBSx3fx8QdDY/g3NvCa7klfzgaQCmRZuo1d3WQjHDOjzSY1+MgTK5WjewFFumCcOZniWtOMSga9tJk1ky00tLoUUzyLnb1v9x95h/iT/KpkICJyAwUZ+LoJBUzLrK52wNTMt8M5jSLvCkRx8C0BmEwA/00pjOp4eRndy19H4WUUehhjfV2/VV/k4hMAjJ7Bb5Hp9xdmzmCLX9+64+MyeIQQjQAHPj8dkSsRahP7KS3MgMpjaF8nL48Bg5suZMxJayXGVp3BLtgRZx5z5nOk9xyrYk+71e2tnP9IDvSMkiSe76BcMct+m7kGVrRcavDI4n62goNNh25IpghT+a1OjjkpXt9me5wmaL7fxffV1pchdm+A7KJKIUU3kLC7QbUifF22EucRA9xiEyxETusNludBXN24O3llTbOy4vYFsq35BeZl4v1Cse7n2htZicVkItMz3wjzj1q1I1VqbnorNXFgllkRZn4/YXfTG/RMnoK/bDogRapOV+XToZ+IvsN0BqwKSUDx+ydKpci6htDRF2WDRkU+VQMqwM0CoLzy2H6A2cqyMMMD9SLRRzBg==?iv=S3rFeFr1gsYqmQA7bNnNTQ==",
83 ...other fields 76 "sig": "1173822c53261f8cffe7efbf43ba4a97a9198b3e402c2a1df130f42a8985a2d0d3430f4de350db184141e45ca844ab4e5364ea80f11d720e36357e1853dba6ca"
84} 77}
85``` 78```
86 79
87Lets say a user wants to create a 'Categorized Bookmarks' list of `bookmarks` and has keys: 80### A _curation set_ of articles and notes about yaks
88```
89priv: fb505c65d4df950f5d28c9e4d285ee12ffaf315deef1fc24e3c7cd1e7e35f2b1
90pub: b1a5c93edcc8d586566fde53a20bdb50049a97b15483cb763854e57016e0fa3d
91```
92The user wants to publicly include these bookmarks:
93
94```json
95["e", "5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36", "wss://nostr.example.com"],
96["a", "30023:f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca:abcd", "wss://nostr.example.com"],
97["r", "https://github.com/nostr-protocol/nostr", "Nostr repository"],
98```
99and privately include these bookmarks (below is the JSON that would be encrypted and placed in the event content):
100 81
101```json
102[
103 ["r", "https://my-private.bookmark", "My private bookmark"],
104 ["a", "30001:f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca:abcd", "wss://nostr.example.com"],
105]
106``` 82```
107
108Then the user would create a 'Categorized Bookmarks' list event like below:
109
110```json
111{ 83{
112 "kind": 30001, 84 "id": "567b41fc9060c758c4216fe5f8d3df7c57daad7ae757fa4606f0c39d4dd220ef",
85 "pubkey": "d6dc95542e18b8b7aec2f14610f55c335abebec76f3db9e58c254661d0593a0c",
86 "created_at": 1695327657,
87 "kind": 30004,
113 "tags": [ 88 "tags": [
114 ["d", "bookmarks"], 89 ["d", "jvdy9i4"],
115 ["e", "5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36", "wss://nostr.example.com"], 90 ["name", "Yaks"],
116 ["a", "30023:f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca:abcd", "wss://nostr.example.com"], 91 ["picture", "https://cdn.britannica.com/40/188540-050-9AC748DE/Yak-Himalayas-Nepal.jpg"],
117 ["r", "https://github.com/nostr-protocol/nostr", "Nostr repository"], 92 ["about", "The domestic yak, also known as the Tartary ox, grunting ox, or hairy cattle, is a species of long-haired domesticated cattle found throughout the Himalayan region of the Indian subcontinent, the Tibetan Plateau, Gilgit-Baltistan, Tajikistan and as far north as Mongolia and Siberia."],
93 ["a", "30023:26dc95542e18b8b7aec2f14610f55c335abebec76f3db9e58c254661d0593a0c:95ODQzw3ajNoZ8SyMDOzQ"],
94 ["a", "30023:54af95542e18b8b7aec2f14610f55c335abebec76f3db9e58c254661d0593a0c:1-MYP8dAhramH9J5gJWKx"],
95 ["a", "30023:f8fe95542e18b8b7aec2f14610f55c335abebec76f3db9e58c254661d0593a0c:D2Tbd38bGrFvU0bIbvSMt"],
96 ["e", "d78ba0d5dce22bfff9db0a9e996c9ef27e2c91051de0c4e1da340e0326b4941e"]
118 ], 97 ],
119 "content": "y3AyaLJfnmYr9x9Od9o4aYrmL9+Ynmsim5y2ONrU0urOTq+V81CyAthQ2mUOWE9xwGgrizhY7ILdQwWhy6FK0sA33GHtC0egUJw1zIdknPe7BZjznD570yk/8RXYgGyDKdexME+RMYykrnYFxq1+y/h00kmJg4u+Gpn+ZjmVhNYxl9b+TiBOAXG9UxnK/H0AmUqDpcldn6+j1/AiStwYZhD1UZ3jzDIk2qcCDy7MlGnYhSP+kNmG+2b0T/D1L0Z7?iv=PGJJfPE84gacAh7T0e6duQ==", 98 "content": "",
120 ...other fields 99 "sig": "a9a4e2192eede77e6c9d24ddfab95ba3ff7c03fbd07ad011fff245abea431fb4d3787c2d04aad001cb039cb8de91d83ce30e9a94f82ac3c5a2372aa1294a96bd"
121} 100}
122``` 101```
123 102
124## List Event Kinds 103## Encryption process pseudocode
125
126| kind | list type |
127| ------ | ----------------------- |
128| 10000 | Mute |
129| 10001 | Pin |
130| 30000 | Categorized People |
131| 30001 | Categorized Bookmarks |
132| 30002 | Categorized Relay Sets |
133 104
134 105```scala
135### Mute List 106val private_items = [
136 107 ["p", "07caba282f76441955b695551c3c5c742e5b9202a3784780f8086fdcdc1da3a9"],
137An event with kind `10000` is defined as a replaceable list event for listing content a user wants to mute. Any standardized tag can be included in a Mute List. 108 ["a", "a55c15f5e41d5aebd236eca5e0142789c5385703f1a7485aa4b38d94fd18dcc4"],
138 109]
139### Pin List 110val base64blob = nip04.encrypt(json.encode_to_string(private_items))
140 111event.content = base64blob
141An event with kind `10001` is defined as a replaceable list event for listing content a user wants to pin. Any standardized tag can be included in a Pin List. 112```
142
143### Categorized People List
144
145An event with kind `30000` is defined as a parameterized replaceable list event for categorizing people. The 'd' parameter for this event holds the category name of the list. The tags included in these lists MUST follow the format of kind 3 events as defined in [NIP-02 - Contact List and Petnames](02.md).
146
147### Categorized Bookmarks List
148
149An event of kind `30001` is defined as a parameterized replaceable list event for categorizing bookmarks. The 'd' parameter for this event holds the category name of the list. The bookmark lists may contain metadata tags such as 'title', 'image', 'summary' as defined in [NIP-23 - Long-form Content](23.md). Any standardized tag can be included in a Categorized Bookmark List.
150
151### Categorized Relay Set
152
153An event of kind `30002` is defined as a parameterized replaceable list event for categorizing relays. The 'd' parameter for this event holds the category name of the list. The relays lists may contain metadata tags such as 'title', 'image', 'summary' as defined in [NIP-23 - Long-form Content](23.md). These sets can be used by clients in order to determine which relays to query in different scenarios.
diff --git a/README.md b/README.md
index 8e970ea..b8b98d9 100644
--- a/README.md
+++ b/README.md
@@ -76,66 +76,80 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
76- [NIP-99: Classified Listings](99.md) 76- [NIP-99: Classified Listings](99.md)
77 77
78## Event Kinds 78## Event Kinds
79| kind | description | NIP | 79| kind | description | NIP |
80| ------------- | -------------------------- | ----------- | 80| ------------- | -------------------------- | ----------- |
81| `0` | Metadata | [1](01.md) | 81| `0` | Metadata | [1](01.md) |
82| `1` | Short Text Note | [1](01.md) | 82| `1` | Short Text Note | [1](01.md) |
83| `2` | Recommend Relay | | 83| `2` | Recommend Relay | |
84| `3` | Contacts | [2](02.md) | 84| `3` | Contacts | [2](02.md) |
85| `4` | Encrypted Direct Messages | [4](04.md) | 85| `4` | Encrypted Direct Messages | [4](04.md) |
86| `5` | Event Deletion | [9](09.md) | 86| `5` | Event Deletion | [9](09.md) |
87| `6` | Repost | [18](18.md) | 87| `6` | Repost | [18](18.md) |
88| `7` | Reaction | [25](25.md) | 88| `7` | Reaction | [25](25.md) |
89| `8` | Badge Award | [58](58.md) | 89| `8` | Badge Award | [58](58.md) |
90| `16` | Generic Repost | [18](18.md) | 90| `16` | Generic Repost | [18](18.md) |
91| `40` | Channel Creation | [28](28.md) | 91| `40` | Channel Creation | [28](28.md) |
92| `41` | Channel Metadata | [28](28.md) | 92| `41` | Channel Metadata | [28](28.md) |
93| `42` | Channel Message | [28](28.md) | 93| `42` | Channel Message | [28](28.md) |
94| `43` | Channel Hide Message | [28](28.md) | 94| `43` | Channel Hide Message | [28](28.md) |
95| `44` | Channel Mute User | [28](28.md) | 95| `44` | Channel Mute User | [28](28.md) |
96| `1063` | File Metadata | [94](94.md) | 96| `1063` | File Metadata | [94](94.md) |
97| `1311` | Live Chat Message | [53](53.md) | 97| `1311` | Live Chat Message | [53](53.md) |
98| `1040` | OpenTimestamps | [03](03.md) | 98| `1040` | OpenTimestamps | [03](03.md) |
99| `1971` | Problem Tracker | [1971](https://github.com/nostrocket/NIPS/blob/main/Problems.md) | 99| `1971` | Problem Tracker | [nostrocket-1971][nostrocket-1971] |
100| `1984` | Reporting | [56](56.md) | 100| `1984` | Reporting | [56](56.md) |
101| `1985` | Label | [32](32.md) | 101| `1985` | Label | [32](32.md) |
102| `4550` | Community Post Approval | [72](72.md) | 102| `4550` | Community Post Approval | [72](72.md) |
103| `5000`-`5999` | Job Request | [90](90.md) | 103| `5000`-`5999` | Job Request | [90](90.md) |
104| `6000`-`6999` | Job Result | [90](90.md) | 104| `6000`-`6999` | Job Result | [90](90.md) |
105| `7000` | Job Feedback | [90](90.md) | 105| `7000` | Job Feedback | [90](90.md) |
106| `9041` | Zap Goal | [75](75.md) | 106| `9041` | Zap Goal | [75](75.md) |
107| `9734` | Zap Request | [57](57.md) | 107| `9734` | Zap Request | [57](57.md) |
108| `9735` | Zap | [57](57.md) | 108| `9735` | Zap | [57](57.md) |
109| `9802` | Highlights | [84](84.md) | 109| `9802` | Highlights | [84](84.md) |
110| `10000` | Mute List | [51](51.md) | 110| `10000` | Mute list | [51](51.md) |
111| `10001` | Pin List | [51](51.md) | 111| `10001` | Pin list | [51](51.md) |
112| `10002` | Relay List Metadata | [65](65.md) | 112| `10002` | Relay List Metadata | [65](65.md) |
113| `13194` | Wallet Info | [47](47.md) | 113| `10003` | Bookmark list | [51](51.md) |
114| `22242` | Client Authentication | [42](42.md) | 114| `10004` | Communities list | [51](51.md) |
115| `23194` | Wallet Request | [47](47.md) | 115| `10005` | Public chats list | [51](51.md) |
116| `23195` | Wallet Response | [47](47.md) | 116| `10006` | Blocked relays list | [51](51.md) |
117| `24133` | Nostr Connect | [46](46.md) | 117| `10007` | Search relays list | [51](51.md) |
118| `27235` | HTTP Auth | [98](98.md) | 118| `10015` | Interests list | [51](51.md) |
119| `30000` | Categorized People List | [51](51.md) | 119| `10030` | User emoji list | [51](51.md) |
120| `30001` | Categorized Bookmark List | [51](51.md) | 120| `13194` | Wallet Info | [47](47.md) |
121| `30008` | Profile Badges | [58](58.md) | 121| `22242` | Client Authentication | [42](42.md) |
122| `30009` | Badge Definition | [58](58.md) | 122| `23194` | Wallet Request | [47](47.md) |
123| `30017` | Create or update a stall | [15](15.md) | 123| `23195` | Wallet Response | [47](47.md) |
124| `30018` | Create or update a product | [15](15.md) | 124| `24133` | Nostr Connect | [46](46.md) |
125| `30023` | Long-form Content | [23](23.md) | 125| `27235` | HTTP Auth | [98](98.md) |
126| `30024` | Draft Long-form Content | [23](23.md) | 126| `30000` | Follow sets | [51](51.md) |
127| `30078` | Application-specific Data | [78](78.md) | 127| `30001` | Generic lists | [51](51.md) |
128| `30311` | Live Event | [53](53.md) | 128| `30002` | Relay sets | [51](51.md) |
129| `30315` | User Statuses | [38](38.md) | 129| `30003` | Bookmark sets | [51](51.md) |
130| `30402` | Classified Listing | [99](99.md) | 130| `30004` | Curation sets | [51](51.md) |
131| `30403` | Draft Classified Listing | [99](99.md) | 131| `30008` | Profile Badges | [58](58.md) |
132| `31922` | Date-Based Calendar Event | [52](52.md) | 132| `30009` | Badge Definition | [58](58.md) |
133| `31923` | Time-Based Calendar Event | [52](52.md) | 133| `30015` | Interest sets | [51](51.md) |
134| `31924` | Calendar | [52](52.md) | 134| `30030` | Emoji sets | [51](51.md) |
135| `31925` | Calendar Event RSVP | [52](52.md) | 135| `30017` | Create or update a stall | [15](15.md) |
136| `31989` | Handler recommendation | [89](89.md) | 136| `30018` | Create or update a product | [15](15.md) |
137| `31990` | Handler information | [89](89.md) | 137| `30023` | Long-form Content | [23](23.md) |
138| `34550` | Community Definition | [72](72.md) | 138| `30024` | Draft Long-form Content | [23](23.md) |
139| `30078` | Application-specific Data | [78](78.md) |
140| `30311` | Live Event | [53](53.md) |
141| `30315` | User Statuses | [38](38.md) |
142| `30402` | Classified Listing | [99](99.md) |
143| `30403` | Draft Classified Listing | [99](99.md) |
144| `31922` | Date-Based Calendar Event | [52](52.md) |
145| `31923` | Time-Based Calendar Event | [52](52.md) |
146| `31924` | Calendar | [52](52.md) |
147| `31925` | Calendar Event RSVP | [52](52.md) |
148| `31989` | Handler recommendation | [89](89.md) |
149| `31990` | Handler information | [89](89.md) |
150| `34550` | Community Definition | [72](72.md) |
151
152[nostrocket-1971]: https://github.com/nostrocket/NIPS/blob/main/Problems.md
139 153
140## Message types 154## Message types
141 155