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-08-09 07:26:51 -0300
committerGitHub <noreply@github.com>2023-08-09 07:26:51 -0300
commit5026747008c0a84c14079c39807296eebd409c36 (patch)
treeadbc9bf9038d776d74ad7fdd62f7b49132f5a1db
parent9fa9045d19b93f4cbac231bff39558108a6e82ae (diff)
parentce7e6b2100918648ec4341c5fe517d076e8d225c (diff)
Merge branch 'master' into vending-machine
-rw-r--r--01.md8
-rw-r--r--12.md2
-rw-r--r--14.md4
-rw-r--r--23.md6
-rw-r--r--25.md24
-rw-r--r--48.md60
-rw-r--r--52.md209
-rw-r--r--53.md125
-rw-r--r--56.md13
-rw-r--r--57.md14
-rw-r--r--65.md6
-rw-r--r--72.md101
-rw-r--r--99.md83
-rw-r--r--README.md43
14 files changed, 671 insertions, 27 deletions
diff --git a/01.md b/01.md
index 2ff81eb..50e9c9c 100644
--- a/01.md
+++ b/01.md
@@ -55,7 +55,7 @@ Clients can send 3 types of messages, which must be JSON arrays, according to th
55 * `["REQ", <subscription_id>, <filters JSON>...]`, used to request events and subscribe to new updates. 55 * `["REQ", <subscription_id>, <filters JSON>...]`, used to request events and subscribe to new updates.
56 * `["CLOSE", <subscription_id>]`, used to stop previous subscriptions. 56 * `["CLOSE", <subscription_id>]`, used to stop previous subscriptions.
57 57
58`<subscription_id>` is an arbitrary, non-empty string of max length 64 chars, that should be used to represent a subscription. 58`<subscription_id>` is an arbitrary, non-empty string of max length 64 chars, that should be used to represent a subscription. Relays should manage `<subscription_id>`s independently for each WebSocket connection; even if `<subscription_id>`s are the same string, they should be treated as different subscriptions for different connections.
59 59
60`<filters>` is a JSON object that determines what events will be sent in that subscription, it can have the following attributes: 60`<filters>` is a JSON object that determines what events will be sent in that subscription, it can have the following attributes:
61 61
@@ -78,11 +78,13 @@ Filter attributes containing lists (such as `ids`, `kinds`, or `#e`) are JSON ar
78 78
79The `ids` and `authors` lists contain lowercase hexadecimal strings, which may either be an exact 64-character match, or a prefix of the event value. A prefix match is when the filter string is an exact string prefix of the event value. The use of prefixes allows for more compact filters where a large number of values are queried, and can provide some privacy for clients that may not want to disclose the exact authors or events they are searching for. 79The `ids` and `authors` lists contain lowercase hexadecimal strings, which may either be an exact 64-character match, or a prefix of the event value. A prefix match is when the filter string is an exact string prefix of the event value. The use of prefixes allows for more compact filters where a large number of values are queried, and can provide some privacy for clients that may not want to disclose the exact authors or events they are searching for.
80 80
81The `since` and `until` properties can be used to specify the time range of events returned in the subscription. If a filter includes the `since` property, events with `created_at` greater than or equal to `since` are considered to match the filter. The `until` property is similar except that `created_at` must be less than or equal to `until`. In short, an event matches a filter if `since <= created_at <= until` holds.
82
81All conditions of a filter that are specified must match for an event for it to pass the filter, i.e., multiple conditions are interpreted as `&&` conditions. 83All conditions of a filter that are specified must match for an event for it to pass the filter, i.e., multiple conditions are interpreted as `&&` conditions.
82 84
83A `REQ` message may contain multiple filters. In this case, events that match any of the filters are to be returned, i.e., multiple filters are to be interpreted as `||` conditions. 85A `REQ` message may contain multiple filters. In this case, events that match any of the filters are to be returned, i.e., multiple filters are to be interpreted as `||` conditions.
84 86
85The `limit` property of a filter is only valid for the initial query and can be ignored afterward. When `limit: n` is present it is assumed that the events returned in the initial query will be the latest `n` events. It is safe to return less events than `limit` specifies, but it is expected that relays do not return (much) more events than requested so clients don't get unnecessarily overwhelmed by data. 87The `limit` property of a filter is only valid for the initial query and can be ignored afterward. When `limit: n` is present it is assumed that the events returned in the initial query will be the last `n` events ordered by the `created_at`. It is safe to return less events than `limit` specifies, but it is expected that relays do not return (much) more events than requested so clients don't get unnecessarily overwhelmed by data.
86 88
87### From relay to client: sending events and notices 89### From relay to client: sending events and notices
88 90
@@ -107,7 +109,7 @@ A relay may choose to treat different message kinds differently, and it may or m
107## Other Notes: 109## Other Notes:
108 110
109- Clients should not open more than one websocket to each relay. One channel can support an unlimited number of subscriptions, so clients should do that. 111- Clients should not open more than one websocket to each relay. One channel can support an unlimited number of subscriptions, so clients should do that.
110- The `tags` array can store a tag identifier as the first element of each subarray, plus arbitrary information afterward (always as strings). This NIP defines `"p"` — meaning "pubkey", which points to a pubkey of someone that is referred to in the event —, and `"e"` — meaning "event", which points to the id of an event this event is quoting, replying to or referring to somehow. See [NIP-10](10.md) for a detailed description of "e" and "p" tags. 112- The `tags` array can store a case-sensitive tag name as the first element of each subarray, plus arbitrary information afterward (always as strings). This NIP defines `"p"` — meaning "pubkey", which points to a pubkey of someone that is referred to in the event —, and `"e"` — meaning "event", which points to the id of an event this event is quoting, replying to or referring to somehow. See [NIP-10](10.md) for a detailed description of "e" and "p" tags.
111- The `<recommended relay URL>` item present on the `"e"` and `"p"` tags is an optional (could be set to `""`) URL of a relay the client could attempt to connect to fetch the tagged event or other events from a tagged profile. It MAY be ignored, but it exists to increase censorship resistance and make the spread of relay addresses more seamless across clients. 113- The `<recommended relay URL>` item present on the `"e"` and `"p"` tags is an optional (could be set to `""`) URL of a relay the client could attempt to connect to fetch the tagged event or other events from a tagged profile. It MAY be ignored, but it exists to increase censorship resistance and make the spread of relay addresses more seamless across clients.
112- Clients should use the created_at field to judge the age of a metadata event and completely replace older metadata events with newer metadata events regardless of the order in which they arrive. Clients should not merge any filled fields within older metadata events into empty fields of newer metadata events. 114- Clients should use the created_at field to judge the age of a metadata event and completely replace older metadata events with newer metadata events regardless of the order in which they arrive. Clients should not merge any filled fields within older metadata events into empty fields of newer metadata events.
113- When a websocket is closed by the relay with a status code 4000 that means the client shouldn't try to connect again. 115- When a websocket is closed by the relay with a status code 4000 that means the client shouldn't try to connect again.
diff --git a/12.md b/12.md
index 74c9d81..7d1f46e 100644
--- a/12.md
+++ b/12.md
@@ -8,7 +8,7 @@ Generic Tag Queries
8 8
9Relays may support subscriptions over arbitrary tags. `NIP-01` requires relays to respond to queries for `e` and `p` tags. This NIP allows any single-letter tag present in an event to be queried. 9Relays may support subscriptions over arbitrary tags. `NIP-01` requires relays to respond to queries for `e` and `p` tags. This NIP allows any single-letter tag present in an event to be queried.
10 10
11The `<filters>` object described in `NIP-01` is expanded to contain arbitrary keys with a `#` prefix. Any single-letter key in a filter beginning with `#` is a tag query, and MUST have a value of an array of strings. The filter condition matches if the event has a tag with the same name, and there is at least one tag value in common with the filter and event. The tag name is the letter without the `#`, and the tag value is the second element. Subsequent elements are ignored for the purposes of tag queries. 11The `<filters>` object described in `NIP-01` is expanded to contain arbitrary keys with a `#` prefix. Any single-letter key in a filter beginning with `#` is a tag query, and MUST have a value of an array of strings. The filter condition matches if the event has a tag with the same name, and there is at least one tag value in common with the filter and event. The tag name is the letter without the `#`, and the tag value is the second element. Subsequent elements are ignored for the purposes of tag queries. Note that tag names are case-sensitive.
12 12
13Example Subscription Filter 13Example Subscription Filter
14--------------------------- 14---------------------------
diff --git a/14.md b/14.md
index 0b37e8a..7384394 100644
--- a/14.md
+++ b/14.md
@@ -1,8 +1,8 @@
1NIP-14 1NIP-14
2====== 2======
3 3
4Subject tag in Text events. 4Subject tag in Text events
5--------------------------- 5--------------------------
6 6
7`draft` `optional` `author:unclebobmartin` 7`draft` `optional` `author:unclebobmartin`
8 8
diff --git a/23.md b/23.md
index 4291228..7a06b0e 100644
--- a/23.md
+++ b/23.md
@@ -12,7 +12,11 @@ This NIP defines `kind:30023` (a parameterized replaceable event according to [N
12 12
13### Format 13### Format
14 14
15The `.content` of these events should be a string text in Markdown syntax. 15The `.content` of these events should be a string text in Markdown syntax. To maximize compatibility and readability between different clients and devices, any client that is creating long form notes:
16
17- MUST NOT hard line-break paragraphs of text, such as arbitrary line breaks at 80 column boundaries.
18
19- MUST NOT support adding HTML to Markdown.
16 20
17### Metadata 21### Metadata
18 22
diff --git a/25.md b/25.md
index f74bcc0..86ce763 100644
--- a/25.md
+++ b/25.md
@@ -18,7 +18,7 @@ downvote or dislike on a post. A client MAY also choose to tally likes against
18dislikes in a reddit-like system of upvotes and downvotes, or display them as 18dislikes in a reddit-like system of upvotes and downvotes, or display them as
19separate tallies. 19separate tallies.
20 20
21The `content` MAY be an emoji, in this case it MAY be interpreted as a "like" or "dislike", 21The `content` MAY be an emoji, or [NIP-30](30.md) custom emoji in this case it MAY be interpreted as a "like" or "dislike",
22or the client MAY display this emoji reaction on the post. 22or the client MAY display this emoji reaction on the post.
23 23
24Tags 24Tags
@@ -47,3 +47,25 @@ func make_like_event(pubkey: String, privkey: String, liked: NostrEvent) -> Nost
47 ev.sign(privkey: privkey) 47 ev.sign(privkey: privkey)
48 return ev 48 return ev
49} 49}
50```
51
52Custom Emoji Reaction
53---------------------
54
55The client may specify a custom emoji ([NIP-30](30.md)) `:shortcode:` in the
56reaction content. The client should refer to the emoji tag and render the
57content as an emoji if shortcode is specified.
58
59```json
60{
61 "kind": 7,
62 "content": ":soapbox:",
63 "tags": [
64 ["emoji", "soapbox", "https://gleasonator.com/emoji/Gleasonator/soapbox.png"]
65 ],
66 "pubkey": "79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6",
67 "created_at": 1682790000
68}
69```
70
71The content can be set only one `:shortcode:`. And emoji tag should be one.
diff --git a/48.md b/48.md
new file mode 100644
index 0000000..8f22781
--- /dev/null
+++ b/48.md
@@ -0,0 +1,60 @@
1NIP-48
2======
3
4Proxy Tags
5----------
6
7`draft` `optional` `author:alexgleason`
8
9Nostr events bridged from other protocols such as ActivityPub can link back to the source object by including a `"proxy"` tag, in the form:
10
11```
12["proxy", <id>, <protocol>]
13```
14
15Where:
16
17- `<id>` is the ID of the source object. The ID format varies depending on the protocol. The ID must be universally unique, regardless of the protocol.
18- `<protocol>` is the name of the protocol, e.g. `"activitypub"`.
19
20Clients may use this information to reconcile duplicated content bridged from other protocols, or to display a link to the source object.
21
22Proxy tags may be added to any event kind, and doing so indicates that the event did not originate on the Nostr protocol, and instead originated elsewhere on the web.
23
24### Supported protocols
25
26This list may be extended in the future.
27
28| Protocol | ID format | Example |
29| -------- | --------- | ------- |
30| `activitypub` | URL | `https://gleasonator.com/objects/9f524868-c1a0-4ee7-ad51-aaa23d68b526` |
31| `atproto` | AT URI | `at://did:plc:zhbjlbmir5dganqhueg7y4i3/app.bsky.feed.post/3jt5hlibeol2i` |
32| `rss` | URL with guid fragment | `https://soapbox.pub/rss/feed.xml#https%3A%2F%2Fsoapbox.pub%2Fblog%2Fmostr-fediverse-nostr-bridge` |
33| `web` | URL | `https://twitter.com/jack/status/20` |
34
35### Examples
36
37ActivityPub object:
38
39```json
40{
41 "kind": 1,
42 "content": "I'm vegan btw",
43 "tags": [
44 [
45 "proxy",
46 "https://gleasonator.com/objects/8f6fac53-4f66-4c6e-ac7d-92e5e78c3e79",
47 "activitypub"
48 ]
49 ],
50 "pubkey": "79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6",
51 "created_at": 1691091365,
52 "id": "55920b758b9c7b17854b6e3d44e6a02a83d1cb49e1227e75a30426dea94d4cb2",
53 "sig": "a72f12c08f18e85d98fb92ae89e2fe63e48b8864c5e10fbdd5335f3c9f936397a6b0a7350efe251f8168b1601d7012d4a6d0ee6eec958067cf22a14f5a5ea579"
54}
55```
56
57### See also
58
59- [FEP-fffd: Proxy Objects](https://codeberg.org/fediverse/fep/src/branch/main/fep/fffd/fep-fffd.md)
60- [Mostr bridge](https://mostr.pub/) \ No newline at end of file
diff --git a/52.md b/52.md
new file mode 100644
index 0000000..c601412
--- /dev/null
+++ b/52.md
@@ -0,0 +1,209 @@
1NIP-52
2======
3
4Calendar Events
5---------------
6
7`draft` `optional` `author:tyiu`
8
9This specification defines calendar events representing an occurrence at a specific moment or between moments. These calendar events are replaceable and referenceable per [NIP-33](33.md) and deletable per [NIP-09](09.md).
10
11Unlike the term `calendar event` specific to this NIP, the term `event` is used broadly in all the NIPs to describe any Nostr event. The distinction is being made here to discern between the two terms.
12
13## Calendar Events
14
15There are two types of calendar events represented by different kinds: date-based and time-based calendar events. Calendar events are not required to be part of a [calendar](#calendar).
16
17### Date-Based Calendar Event
18
19This kind of calendar event starts on a date and ends before a different date in the future. Its use is appropriate for all-day or multi-day events where time and time zone hold no significance. e.g., anniversary, public holidays, vacation days.
20
21#### Format
22
23The format uses a parameterized replaceable event kind `31922`.
24
25The `.content` of these events is optional and should be a detailed description of the calendar event.
26
27The list of tags are as follows:
28* `d` (required) universally unique identifier (UUID). Generated by the client creating the calendar event.
29* `name` (required) name of the calendar event
30* `start` (required) inclusive start date in ISO 8601 format (YYYY-MM-DD). Must be less than `end`, if it exists.
31* `end` (optional) exclusive end date in ISO 8601 format (YYYY-MM-DD). If omitted, the calendar event ends on the same date as `start`.
32* `location` (optional) location of the calendar event. e.g. address, GPS coordinates, meeting room name, link to video call
33* `g` (optional) [geohash](https://en.wikipedia.org/wiki/Geohash) to associate calendar event with a searchable physical location as suggested as an example by [NIP-12](12.md)
34* `p` (optional, repeated) 32-bytes hex pubkey of a participant, optional recommended relay URL, and participant's role in the meeting
35* `t` (optional, repeated) hashtag to categorize calendar event
36* `r` (optional, repeated) references / links to web pages, documents, video calls, recorded videos, etc.
37
38```json
39{
40 "id": <32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>,
41 "pubkey": <32-bytes lowercase hex-encoded public key of the event creator>,
42 "created_at": <Unix timestamp in seconds>,
43 "kind": "31922",
44 "content": "<description of calendar event>",
45 "tags": [
46 ["d", "<UUID>"],
47
48 ["name", "<name of calendar event>"],
49
50 // Dates
51 ["start", "<YYYY-MM-DD>"],
52 ["end", "<YYYY-MM-DD>"],
53
54 // Location
55 ["location", "<location>"],
56 ["g", "<geohash>"],
57
58 // Participants
59 ["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "<role>"],
60 ["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "<role>"],
61
62 // Hashtags
63 ["t", "<tag>"],
64 ["t", "<tag>"],
65
66 // Reference links
67 ["r", "<url>"],
68 ["r", "<url>"]
69 ]
70}
71```
72
73### Time-Based Calendar Event
74
75This kind of calendar event spans between a start time and end time.
76
77#### Format
78
79The format uses a parameterized replaceable event kind `31923`.
80
81The `.content` of these events is optional and should be a detailed description of the calendar event.
82
83The list of tags are as follows:
84* `d` (required) universally unique identifier (UUID). Generated by the client creating the calendar event.
85* `name` (required) name of the calendar event
86* `start` (required) inclusive start Unix timestamp in seconds. Must be less than `end`, if it exists.
87* `end` (optional) exclusive end Unix timestamp in seconds. If omitted, the calendar event ends instantaneously.
88* `start_tzid` (optional) time zone of the start timestamp, as defined by the IANA Time Zone Database. e.g., `America/Costa_Rica`
89* `end_tzid` (optional) time zone of the end timestamp, as defined by the IANA Time Zone Database. e.g., `America/Costa_Rica`. If omitted and `start_tzid` is provided, the time zone of the end timestamp is the same as the start timestamp.
90* `location` (optional) location of the calendar event. e.g. address, GPS coordinates, meeting room name, link to video call
91* `g` (optional) [geohash](https://en.wikipedia.org/wiki/Geohash) to associate calendar event with a searchable physical location as suggested as an example by [NIP-12](12.md)
92* `p` (optional, repeated) 32-bytes hex pubkey of a participant, optional recommended relay URL, and participant's role in the meeting
93* `t` (optional, repeated) hashtag to categorize calendar event
94* `r` (optional, repeated) references / links to web pages, documents, video calls, recorded videos, etc.
95
96```json
97{
98 "id": <32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>,
99 "pubkey": <32-bytes lowercase hex-encoded public key of the event creator>,
100 "created_at": <Unix timestamp in seconds>,
101 "kind": "31923",
102 "content": "<description of calendar event>",
103 "tags": [
104 ["d", "<UUID>"],
105
106 ["name", "<name of calendar event>"],
107
108 // Timestamps
109 ["start", "<Unix timestamp in seconds>"],
110 ["end", "<Unix timestamp in seconds>"],
111
112 ["start_tzid", "<IANA Time Zone Database identifier>"],
113 ["end_tzid", "<IANA Time Zone Database identifier>"],
114
115 // Location
116 ["location", "<location>"],
117 ["g", "<geohash>"],
118
119 // Participants
120 ["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "<role>"],
121 ["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>", "<role>"],
122
123 // Hashtags
124 ["t", "<tag>"],
125 ["t", "<tag>"],
126
127 // Reference links
128 ["r", "<url>"],
129 ["r", "<url>"]
130 ]
131}
132```
133
134## Calendar
135
136A calendar is a collection of calendar events, represented as a custom replaceable list event using kind `31924`. A user can have multiple calendars. One may create a calendar to segment calendar events for specific purposes. e.g., personal, work, travel, meetups, and conferences.
137
138### Format
139
140The format uses a custom replaceable list of kind `31924` with a list of tags as described below:
141* `d` (required) calendar name
142* `a` (repeated) reference tag to kind `31922` or `31923` calendar event being responded to per [NIP-33](33.md)
143
144```json
145{
146 "kind": 31924,
147 "tags": [
148 ["d", "<calendar name>"],
149 ["a", "<31922 or 31923>:<calendar event author pubkey>:<d-identifier of calendar event>", "<optional relay url>"],
150 ["a", "<31922 or 31923>:<calendar event author pubkey>:<d-identifier of calendar event>", "<optional relay url>"]
151 ]
152}
153```
154
155## Calendar Event RSVP
156
157A calendar event RSVP is a response to a calendar event to indicate a user's attendance intention.
158
159If a calendar event tags a pubkey, that can be interpreted as the calendar event creator inviting that user to attend. Clients MAY choose to prompt the user to RSVP for the calendar event.
160
161Any user may RSVP, even if they were not tagged on the calendar event. Clients MAY choose to prompt the calendar event creator to invite the user who RSVP'd. Clients also MAY choose to ignore these RSVPs.
162
163This NIP is intentionally not defining who is authorized to attend a calendar event if the user who RSVP'd has not been tagged. It is up to the calendar event creator to determine the semantics.
164
165This NIP is also intentionally not defining what happens if a calendar event changes after an RSVP is submitted.
166
167### Format
168
169The format uses a parameterized replaceable event kind `31925`.
170
171The `.content` of these events is optional and should be a free-form note that adds more context to this calendar event response.
172
173The list of tags are as follows:
174* `a` (required) reference tag to kind `31922` or `31923` calendar event being responded to per [NIP-33](33.md)
175* `d` (required) universally unique identifier. Generated by the client creating the calendar event RSVP.
176* `L` (required) label namespace of `status` per [NIP-32](32.md)
177* `l` (required) label of `accepted`, `declined`, or `tentative` under the label namespace of `status` per [NIP-32](32.md). Determines attendance status to the referenced calendar event.
178* `L` (optional) label namespace of `freebusy` per [NIP-32](32.md). Exists if and only if corresponding `l` tag under the same label namespace exists.
179* `l` (optional) label of `free` or `busy` under the label namespace of `freebusy` per [NIP-32](32.md). Determines if the user would be free or busy for the duration of the calendar event. This tag must be omitted or ignored if the `status` label is set to `declined`. Exists if and only if corresponding `l` tag under the same label namespace exists.
180
181```json
182{
183 "id": <32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>,
184 "pubkey": <32-bytes lowercase hex-encoded public key of the event creator>,
185 "created_at": <Unix timestamp in seconds>,
186 "kind": "31925",
187 "content": "<note>",
188 "tags": [
189 ["a", "<31922 or 31923>:<calendar event author pubkey>:<d-identifier of calendar event>", "<optional relay url>"],
190 ["d", "<UUID>"],
191 ["L", "status"],
192 ["l", "<accepted/declined/tentative>", "status"],
193 ["L", "freebusy"],
194 ["l", "<free/busy>", "freebusy"]
195 ]
196}
197```
198
199## Unsolved Limitations
200
201* No private events
202
203## Intentionally Unsupported Scenarios
204
205### Recurring Calendar Events
206
207Recurring calendar events come with a lot of complexity, making it difficult for software and humans to deal with. This complexity includes time zone differences between invitees, daylight savings, leap years, multiple calendar systems, one-off changes in schedule or other metadata, etc.
208
209This NIP intentionally omits support for recurring calendar events and pushes that complexity up to clients to manually implement if they desire. i.e., individual calendar events with duplicated metadata represent recurring calendar events.
diff --git a/53.md b/53.md
new file mode 100644
index 0000000..c5f2704
--- /dev/null
+++ b/53.md
@@ -0,0 +1,125 @@
1NIP-53
2======
3
4Live Activities
5---------------
6
7`draft` `optional` `author:vitorpamplona` `author:v0l`
8
9## Abstract
10
11Service providers want to offer live activities to the Nostr network in such a way that participants can easily logged and queried by clients. This NIP describes a general framework to advertise the involvement of pubkeys in such live activities.
12
13# Live Event
14
15A special event with `kind:30311` "Live Event" is defined as a [NIP-33: Parameterized Replaceable Events](33.md) of public `p` tags. Each `p` tag SHOULD have a **displayable** marker name for the current role (e.g. `Host`, `Speaker`, `Participant`) of the user in the event and the relay information MAY be empty. This event will be constantly updated as participants join and leave the activity.
16
17For example:
18
19```js
20{
21 "kind": 30311,
22 "tags": [
23 ["d", "<unique identifier>"],
24 ["title", "<name of the event>"],
25 ["summary", "<description>"],
26 ["image", "<preview image url>"],
27 ["t", "hashtag"]
28 ["streaming", "<url>"],
29 ["recording", "<url>"], // used to place the edited video once the activity is over
30 ["starts", "<unix timestamp in seconds>"],
31 ["ends", "<unix timestamp in seconds>"],
32 ["status", "<planned, live, ended>"],
33 ["current_participants", "<number>"],
34 ["total_participants", "<number>"],
35 ["p", "91cf9..4e5ca", "wss://provider1.com/", "Host", "<proof>"],
36 ["p", "14aeb..8dad4", "wss://provider2.com/nostr", "Speaker"],
37 ["p", "612ae..e610f", "ws://provider3.com/ws", "Participant"],
38 ["relays", "wss://one.com", "wss://two.com", ...]
39 ],
40 "content": "",
41 ...other fields
42}
43```
44
45A distinct `d` tag should be used for each activity. All other tags are optional.
46
47Providers SHOULD keep the participant list small (e.g. under 1000 users) and, when limits are reached, Providers SHOULD select which participants get named in the event. Clients should not expect a comprehensive list. Once the activity ends, the event can be deleted or updated to summarize the activity and provide async content (e.g. recording of the event).
48
49Clients are expected to subscribe to `kind:30311` events in general or for given follow lists and statuses. Clients MAY display participants' roles in activities as well as access points to join the activity.
50
51Live Activity management clients are expected to constantly update `kind:30311` during the event. Clients MAY choose to consider `status=live` events after 1hr without any update as `ended`. The `starts` and `ends` timestamp SHOULD be updated when the status changes to and from `live`
52
53The activity MUST be linked to using the NIP-19 naddr code along with the "a" tag (see [NIP-33](33.md) and [NIP-19](19.md)).
54
55## Proof of Agreement to Participate
56
57Event owners can add proof as the 5th term in each `p` tag to clarify the participant's agreement in joining the event. The proof is a signed SHA256 of the complete `a` Tag of the event (`kind:pubkey:dTag`) by each `p`'s private key, encoded in hex.
58
59Clients MAY only display participants if the proof is available or MAY display participants as "invited" if the proof is not available.
60
61This feature is important to avoid malicious event owners adding large account holders to the event, without their knowledge, to lure their followers into the malicious owner's trap.
62
63# Live Chat Message
64
65Event `kind:1311` is live chat's channel message. Clients MUST include the `a` tag of the activity with a `root` marker. Other Kind-1 tags such as `reply` and `mention` can also be used.
66
67```js
68{
69 "id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>",
70 "pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>",
71 "created_at": "<Unix timestamp in seconds>",
72 "kind": 1311,
73 "tags": [
74 ["a", "30311:<Community event author pubkey>:<d-identifier of the community>", "<Optional relay url>", "root"],
75 ],
76 "content": "Zaps to live streams is beautiful."
77}
78```
79
80# Use Cases
81
82Common use cases include meeting rooms/workshops, watch-together activities, or event spaces, such as [live.snort.social](https://live.snort.social) and [nostrnests.com](https://nostrnests.com).
83
84# Example
85
86Live Streaming
87
88```json
89{
90 "id": "57f28dbc264990e2c61e80a883862f7c114019804208b14da0bff81371e484d2",
91 "pubkey": "1597246ac22f7d1375041054f2a4986bd971d8d196d7997e48973263ac9879ec",
92 "created_at": 1687182672,
93 "kind": 30311,
94 "tags": [
95 ["d", "demo-cf-stream"],
96 ["title", "Adult Swim Metalocalypse"],
97 ["summary", "Live stream from IPTV-ORG collection"],
98 ["streaming", "https://adultswim-vodlive.cdn.turner.com/live/metalocalypse/stream.m3u8"],
99 ["starts", "1687182672"]
100 ["status", "live"],
101 ["t", "animation"],
102 ["t", "iptv"],
103 ["image", "https://i.imgur.com/CaKq6Mt.png"]
104 ],
105 "content": "",
106 "sig": "5bc7a60f5688effa5287244a24768cbe0dcd854436090abc3bef172f7f5db1410af4277508dbafc4f70a754a891c90ce3b966a7bc47e7c1eb71ff57640f3d389"
107}
108```
109
110Live Streaming chat message
111
112```json
113{
114 "id": "97aa81798ee6c5637f7b21a411f89e10244e195aa91cb341bf49f718e36c8188",
115 "pubkey": "3f770d65d3a764a9c5cb503ae123e62ec7598ad035d836e2a810f3877a745b24",
116 "created_at": 1687286726,
117 "kind": 1311,
118 "tags": [
119 ["a", "30311:1597246ac22f7d1375041054f2a4986bd971d8d196d7997e48973263ac9879ec:demo-cf-stream", "", "root"]
120 ],
121 "content": "Zaps to live streams is beautiful.",
122 "sig": "997f62ddfc0827c121043074d50cfce7a528e978c575722748629a4137c45b75bdbc84170bedc723ef0a5a4c3daebf1fef2e93f5e2ddb98e5d685d022c30b622"
123}
124````
125
diff --git a/56.md b/56.md
index 42174fb..259118d 100644
--- a/56.md
+++ b/56.md
@@ -10,7 +10,7 @@ Reporting
10A report is a `kind 1984` note that is used to report other notes for spam, 10A report is a `kind 1984` note that is used to report other notes for spam,
11illegal and explicit content. 11illegal and explicit content.
12 12
13The content MAY contain additional information submitted by the entity 13The `content` MAY contain additional information submitted by the entity
14reporting the content. 14reporting the content.
15 15
16Tags 16Tags
@@ -42,9 +42,9 @@ Example events
42{ 42{
43 "kind": 1984, 43 "kind": 1984,
44 "tags": [ 44 "tags": [
45 ["p", <pubkey>, "nudity"] 45 ["p", <pubkey>, "nudity"],
46 ["L", "social.nos.ontology"], 46 ["L", "social.nos.ontology"],
47 ["l", "NS-nud", "social.nos.ontology"], 47 ["l", "NS-nud", "social.nos.ontology"]
48 ], 48 ],
49 "content": "", 49 "content": "",
50 ... 50 ...
@@ -63,10 +63,9 @@ Example events
63{ 63{
64 "kind": 1984, 64 "kind": 1984,
65 "tags": [ 65 "tags": [
66 ["p", <impersonator pubkey>, "impersonation"], 66 ["p", <impersonator pubkey>, "impersonation"]
67 ["p", <victim pubkey>]
68 ], 67 ],
69 "content": "Profile is imitating #[1]", 68 "content": "Profile is impersonating nostr:<victim bech32 pubkey>",
70 ... 69 ...
71} 70}
72``` 71```
@@ -75,7 +74,7 @@ Client behavior
75--------------- 74---------------
76 75
77Clients can use reports from friends to make moderation decisions if they 76Clients can use reports from friends to make moderation decisions if they
78choose to. For instance, if 3+ of your friends report a profile as explicit, 77choose to. For instance, if 3+ of your friends report a profile for `nudity`,
79clients can have an option to automatically blur photos from said account. 78clients can have an option to automatically blur photos from said account.
80 79
81 80
diff --git a/57.md b/57.md
index 438a0f8..ace4a03 100644
--- a/57.md
+++ b/57.md
@@ -126,7 +126,7 @@ When receiving a payment, the following steps are executed:
126 126
127The following should be true of the `zap receipt` event: 127The following should be true of the `zap receipt` event:
128 128
129- The content SHOULD be empty. 129- The `content` SHOULD be empty.
130- The `created_at` date SHOULD be set to the invoice `paid_at` date for idempotency. 130- The `created_at` date SHOULD be set to the invoice `paid_at` date for idempotency.
131- `tags` MUST include the `p` tag AND optional `e` tag from the `zap request`. 131- `tags` MUST include the `p` tag AND optional `e` tag from the `zap request`.
132- The `zap receipt` MUST have a `bolt11` tag containing the description hash bolt11 invoice. 132- The `zap receipt` MUST have a `bolt11` tag containing the description hash bolt11 invoice.
@@ -166,18 +166,22 @@ A client can retrieve `zap receipt`s on events and pubkeys using a NIP-01 filter
166- The `invoiceAmount` contained in the `bolt11` tag of the `zap receipt` MUST equal the `amount` tag of the `zap request` (if present). 166- The `invoiceAmount` contained in the `bolt11` tag of the `zap receipt` MUST equal the `amount` tag of the `zap request` (if present).
167- The `lnurl` tag of the `zap request` (if present) SHOULD equal the recipient's `lnurl`. 167- The `lnurl` tag of the `zap request` (if present) SHOULD equal the recipient's `lnurl`.
168 168
169### Appendix G: `zap` tag on zapped event 169### Appendix G: `zap` tag on other events
170 170
171When an event includes a `zap` tag, clients SHOULD calculate the lnurl pay request based on its value instead of the profile's field. An optional third argument on the tag specifies the type of value, either `lud06` or `lud16`. 171When an event includes one or more `zap` tags, clients wishing to zap it SHOULD calculate the lnurl pay request based on the tags value instead of the event author's profile field. The tag's second argument is the `hex` string of the receiver's pub key and the third argument is the relay to download the receiver's metadata (Kind-0). An optional fourth parameter specifies the weight (a generalization of a percentage) assigned to the respective receiver. Clients should parse all weights, calculate a sum, and then a percentage to each receiver. If weights are not present, CLIENTS should equally divide the zap amount to all receivers. If weights are only partially present, receivers without a weight should not be zapped (`weight = 0`).
172 172
173```json 173```js
174{ 174{
175 "tags": [ 175 "tags": [
176 [ "zap", "pablo@f7z.io", "lud16" ] 176 [ "zap", "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2", "wss://nostr.oxtr.dev", "1" ], // 25%
177 [ "zap", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52", "wss://nostr.wine/", "1" ], // 25%
178 [ "zap", "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c", "wss://nos.lol/", "2" ] // 50%
177 ] 179 ]
178} 180}
179``` 181```
180 182
183Clients MAY display the zap split configuration in the note.
184
181## Future Work 185## Future Work
182 186
183Zaps can be extended to be more private by encrypting `zap request` notes to the target user, but for simplicity it has been left out of this initial draft. 187Zaps can be extended to be more private by encrypting `zap request` notes to the target user, but for simplicity it has been left out of this initial draft.
diff --git a/65.md b/65.md
index 4c7a6a5..55f9ff0 100644
--- a/65.md
+++ b/65.md
@@ -10,7 +10,7 @@ A special replaceable event meaning "Relay List Metadata" is defined as an event
10 10
11The primary purpose of this relay list is to advertise to others, not for configuring one's client. 11The primary purpose of this relay list is to advertise to others, not for configuring one's client.
12 12
13The content is not used and SHOULD be an empty string. 13The `content` is not used and SHOULD be an empty string.
14 14
15The `r` tags can have a second parameter as either `read` or `write`. If it is omitted, it means the author uses the relay for both purposes. 15The `r` tags can have a second parameter as either `read` or `write`. If it is omitted, it means the author uses the relay for both purposes.
16 16
@@ -53,12 +53,12 @@ Authors may post events outside of the feed that they wish their followers to fo
53It is suggested that relays allow any user to write their own kind `10002` event (optionally with AUTH to verify it is their own) even if they are not otherwise subscribed to the relay because 53It is suggested that relays allow any user to write their own kind `10002` event (optionally with AUTH to verify it is their own) even if they are not otherwise subscribed to the relay because
54 54
55 - finding where someone posts is rather important 55 - finding where someone posts is rather important
56 - these events do not have content that needs management 56 - these events do not have `content` that needs management
57 - relays only need to store one replaceable event per pubkey to offer this service 57 - relays only need to store one replaceable event per pubkey to offer this service
58 58
59### Why not in kind `0` Metadata 59### Why not in kind `0` Metadata
60 60
61Even though this is user related metadata, it is a separate event from kind `0` in order to keep it small (as it should be widely spread) and to not have content that may require moderation by relay operators so that it is more acceptable to relays. 61Even though this is user related metadata, it is a separate event from kind `0` in order to keep it small (as it should be widely spread) and to not have `content` that may require moderation by relay operators so that it is more acceptable to relays.
62 62
63### Example 63### Example
64 64
diff --git a/72.md b/72.md
new file mode 100644
index 0000000..750b076
--- /dev/null
+++ b/72.md
@@ -0,0 +1,101 @@
1NIP-72
2======
3
4Moderated Communities (Reddit Style)
5------------------------------------
6
7`draft` `optional` `author:vitorpamplona` `author:arthurfranca`
8
9The goal of this NIP is to create moderator-approved public communities around a topic. It defines the replaceable event `kind:34550` to define the community and the current list of moderators/administrators. Users that want to post into the community, simply tag any Nostr event with the community's `a` tag (See [NIP-33](33.md)). Moderators issue an approval event `kind:4550` that links the community with the new post.
10
11# Community Definition
12
13`Kind:34550` SHOULD include any field that helps define the community and the set of moderators. `relay` tags MAY be used to describe the preferred relay to download requests and approvals.
14
15```json
16{
17 "id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>",
18 "pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>",
19 "created_at": <Unix timestamp in seconds>,
20 "kind": 34550,
21 "tags": [
22 ["d", "<Community name>"],
23 ["description", "<Community description>"],
24 ["image", "<Community image url>", "<Width>x<Height>"],
25
26 //.. other tags relevant to defining the community
27
28 // moderators
29 ["p", "<32-bytes hex of a pubkey1>", "<optional recommended relay URL>", "moderator"],
30 ["p", "<32-bytes hex of a pubkey2>", "<optional recommended relay URL>", "moderator"],
31 ["p", "<32-bytes hex of a pubkey3>", "<optional recommended relay URL>", "moderator"],
32
33 // relays used by the community (w/optional marker)
34 ["relay", "<relay hosting author kind 0>", "author"],
35 ["relay", "<relay where to send and receive requests>", "requests"],
36 ["relay", "<relay where to send and receive approvals>", "approvals"],
37 ["relay", "<relay where to post requests to and fetch approvals from>"]
38 ]
39}
40```
41
42# New Post Request
43
44Any Nostr event can be a post request. Clients MUST add the community's `a` tag to the new post event in order to be presented for the moderator's approval.
45
46```json
47{
48 "id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>",
49 "pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>",
50 "created_at": <Unix timestamp in seconds>,
51 "kind": 1,
52 "tags": [
53 ["a", "34550:<Community event author pubkey>:<d-identifier of the community>", "<Optional relay url>"],
54 ],
55 "content": "<My content>"
56}
57```
58
59Community management clients MAY filter all mentions to a given `kind:34550` event and request moderators to approve each submission. Moderators MAY delete his/her approval of a post at any time using event deletions (See [NIP-09](09.md)).
60
61# Post Approval by moderators
62
63The post-approval event MUST include `a` tags of the communities the moderator is posting into (one or more), the `e` tag of the post and `p` tag of the author of the post (for approval notificaitons). The event SHOULD also include the stringified `post request` event inside the `.content` ([NIP-18-style](18.md)) and a `k` tag with the original post's event kind to allow filtering of approved posts by kind.
64
65```json
66{
67 "id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>",
68 "pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>",
69 "created_at": <Unix timestamp in seconds>,
70 "kind": 4550,
71 "tags": [
72 ["a", "34550:<Community event author pubkey>:<d-identifier of the community>", "<Optional relay url>"],
73 ["e", "<Post Request ID>", "<Optional relay url>"],
74 ["p", "<Post Request Author ID>", "<Optional relay url>"],
75 ["k", "<New Post Request kind>"],
76 ],
77 "content": "<New Post Request JSON>"
78}
79```
80
81It's recommended that multiple moderators approve posts to avoid deleting them from the community when a moderator is removed from the owner's list. In case the full list of moderators must be rotated, the new moderator set must sign new approvals for posts in the past or the community will restart. The owner can also periodically copy and re-sign of each moderator's approval events to make sure posts don't dissapear with moderators.
82
83Post Approvals of replaceable events can be created in three ways: (i) by tagging the replaceable event as an `e` tag if moderators want to approve each individual change to the repleceable event; (ii) by tagging the replaceable event as an `a` tag if the moderator authorizes the replaceable event author to make changes without additional approvals and (iii) by tagging the replaceable event with both its `e` and `a` tag which empowers clients to display the original and updated versions of the event, with appropriate remarks in the UI. Since relays are instructed to delete old versions of a replaceable event, the `.content` of an `e`-approval MUST have the specific version of the event or Clients might not be able to find that version of the content anywhere.
84
85Clients SHOULD evaluate any non-`34550:*` `a` tag as posts to be included in all `34550:*` `a` tags.
86
87# Displaying
88
89Community clients SHOULD display posts that have been approved by at least 1 moderator or by the community owner.
90
91The following filter displays the approved posts.
92
93```js
94{
95 "authors": ["<Author pubkey>", "<Moderator1 pubkey>", "<Moderator2 pubkey>", "<Moderator3 pubkey>", ...],
96 "kinds": [4550],
97 "#a": ["34550:<Community event author pubkey>:<d-identifier of the community>"],
98}
99```
100
101Clients MAY hide approvals by blocked moderators at the user's request.
diff --git a/99.md b/99.md
new file mode 100644
index 0000000..274e5af
--- /dev/null
+++ b/99.md
@@ -0,0 +1,83 @@
1# NIP-99
2
3## Classified Listings
4
5`draft` `optional` `author:erskingardner`
6
7This NIP defines `kind:30402`: a parameterized replaceable event to describe classified listings that list any arbitrary product, service, or other thing for sale or offer and includes enough structured metadata to make them useful.
8
9The category of classifieds includes a very broad range of physical goods, services, work opportunities, rentals, free giveaways, personals, etc. and is distinct from the more strictly structured marketplaces defined in [NIP-15](https://github.com/nostr-protocol/nips/blob/master/15.md) that often sell many units of specific products through very specific channels.
10
11The structure of these events is very similar to [NIP-23](https://github.com/nostr-protocol/nips/blob/master/23.md) long-form content events.
12
13### Draft / Inactive Listings
14
15`kind:30403` has the same structure as `kind:30402` and is used to save draft or inactive classified listings.
16
17### Content
18
19The `.content` field should be a description of what is being offered and by whom. These events should be a string in Markdown syntax.
20
21### Author
22
23The `.pubkey` field of these events are treated as the party creating the listing.
24
25### Metadata
26
27- For "tags"/"hashtags" (i.e. categories or keywords of relevance for the listing) the `"t"` event tag should be used, as per [NIP-12](https://github.com/nostr-protocol/nips/blob/master/12.md).
28- For images, whether included in the markdown content or not, clients SHOULD use `image` tags as described in [NIP-58](https://github.com/nostr-protocol/nips/blob/master/58.md). This allows clients to display images in carousel format more easily.
29
30The following tags, used for structured metadata, are standardized and SHOULD be included. Other tags may be added as necessary.
31
32- `"title"`, a title for the listing
33- `"summary"`, for short tagline or summary for the listing
34- `"published_at"`, for the timestamp (in unix seconds – converted to string) of the first time the listing was published.
35- `"location"`, for the location.
36- `"price"`, for the price of the thing being listed. This is an array in the format `[ "price", "<number>", "<currency>", "<frequency>" ]`.
37 - `"price"` is the name of the tag
38 - `"<number>"` is the amount in numeric format (but included in the tag as a string)
39 - `"<currency>"` is the currency unit in 3-character ISO 4217 format or ISO 4217-like currency code (e.g. `"btc"`, `"eth"`).
40 - `"<frequency>"` is optional and can be used to describe recurring payments. SHOULD be in noun format (hour, day, week, month, year, etc.)
41
42#### `price` examples
43
44- $50 one-time payment `["price", "50", "USD"]`
45- €15 per month `["price", "15", "EUR", "month"]`
46- £50,000 per year `["price", "50000", "GBP", "year"]`
47
48Other standard tags that might be useful.
49
50- `"g"`, a geohash for more precise location
51
52## Example Event
53
54```json
55{
56 "kind": 30402,
57 "created_at": 1675642635,
58 // Markdown content
59 "content": "Lorem [ipsum][nostr:nevent1qqst8cujky046negxgwwm5ynqwn53t8aqjr6afd8g59nfqwxpdhylpcpzamhxue69uhhyetvv9ujuetcv9khqmr99e3k7mg8arnc9] dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\nRead more at nostr:naddr1qqzkjurnw4ksz9thwden5te0wfjkccte9ehx7um5wghx7un8qgs2d90kkcq3nk2jry62dyf50k0h36rhpdtd594my40w9pkal876jxgrqsqqqa28pccpzu.",
60 "tags": [
61 ["d", "lorem-ipsum"],
62 ["title", "Lorem Ipsum"],
63 ["published_at", "1296962229"],
64 ["t", "electronics"],
65 ["image", "https://url.to.img", "256x256"],
66 ["summary", "More lorem ipsum that is a little more than the title"],
67 ["location", "NYC"],
68 ["price", "100", "USD"],
69 [
70 "e",
71 "b3e392b11f5d4f28321cedd09303a748acfd0487aea5a7450b3481c60b6e4f87",
72 "wss://relay.example.com"
73 ],
74 [
75 "a",
76 "30023:a695f6b60119d9521934a691347d9f78e8770b56da16bb255ee286ddf9fda919:ipsum",
77 "wss://relay.nostr.org"
78 ]
79 ],
80 "pubkey": "...",
81 "id": "..."
82}
83```
diff --git a/README.md b/README.md
index ebfd359..a3e19f5 100644
--- a/README.md
+++ b/README.md
@@ -32,13 +32,13 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
32- [NIP-11: Relay Information Document](11.md) 32- [NIP-11: Relay Information Document](11.md)
33- [NIP-12: Generic Tag Queries](12.md) 33- [NIP-12: Generic Tag Queries](12.md)
34- [NIP-13: Proof of Work](13.md) 34- [NIP-13: Proof of Work](13.md)
35- [NIP-14: Subject tag in text events.](14.md) 35- [NIP-14: Subject tag in text events](14.md)
36- [NIP-15: Nostr Marketplace (for resilient marketplaces)](15.md) 36- [NIP-15: Nostr Marketplace (for resilient marketplaces)](15.md)
37- [NIP-16: Event Treatment](16.md) 37- [NIP-16: Event Treatment](16.md)
38- [NIP-18: Reposts](18.md) 38- [NIP-18: Reposts](18.md)
39- [NIP-19: bech32-encoded entities](19.md) 39- [NIP-19: bech32-encoded entities](19.md)
40- [NIP-20: Command Results](20.md) 40- [NIP-20: Command Results](20.md)
41- [NIP-21: `nostr:` URL scheme](21.md) 41- [NIP-21: `nostr:` URI scheme](21.md)
42- [NIP-22: Event `created_at` Limits](22.md) 42- [NIP-22: Event `created_at` Limits](22.md)
43- [NIP-23: Long-form Content](23.md) 43- [NIP-23: Long-form Content](23.md)
44- [NIP-25: Reactions](25.md) 44- [NIP-25: Reactions](25.md)
@@ -56,17 +56,22 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
56- [NIP-45: Counting results](45.md) 56- [NIP-45: Counting results](45.md)
57- [NIP-46: Nostr Connect](46.md) 57- [NIP-46: Nostr Connect](46.md)
58- [NIP-47: Wallet Connect](47.md) 58- [NIP-47: Wallet Connect](47.md)
59- [NIP-48: Proxy Tags](48.md)
59- [NIP-50: Keywords filter](50.md) 60- [NIP-50: Keywords filter](50.md)
60- [NIP-51: Lists](51.md) 61- [NIP-51: Lists](51.md)
62- [NIP-52: Calendar Events](52.md)
63- [NIP-53: Live Activities](53.md)
61- [NIP-56: Reporting](56.md) 64- [NIP-56: Reporting](56.md)
62- [NIP-57: Lightning Zaps](57.md) 65- [NIP-57: Lightning Zaps](57.md)
63- [NIP-58: Badges](58.md) 66- [NIP-58: Badges](58.md)
64- [NIP-65: Relay List Metadata](65.md) 67- [NIP-65: Relay List Metadata](65.md)
68- [NIP-72: Moderated Communities](72.md)
65- [NIP-78: Application-specific data](78.md) 69- [NIP-78: Application-specific data](78.md)
66- [NIP-89: Recommended Application Handlers](89.md) 70- [NIP-89: Recommended Application Handlers](89.md)
67- [NIP-90: Data Vending Machines](90.md) 71- [NIP-90: Data Vending Machines](90.md)
68- [NIP-94: File Metadata](94.md) 72- [NIP-94: File Metadata](94.md)
69- [NIP-98: HTTP Auth](98.md) 73- [NIP-98: HTTP Auth](98.md)
74- [NIP-99: Classified Listings](99.md)
70 75
71## Event Kinds 76## Event Kinds
72 77
@@ -88,8 +93,10 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
88| `43` | Channel Hide Message | [28](28.md) | 93| `43` | Channel Hide Message | [28](28.md) |
89| `44` | Channel Mute User | [28](28.md) | 94| `44` | Channel Mute User | [28](28.md) |
90| `1063` | File Metadata | [94](94.md) | 95| `1063` | File Metadata | [94](94.md) |
96| `1311` | Live Chat Message | [53](53.md) |
91| `1984` | Reporting | [56](56.md) | 97| `1984` | Reporting | [56](56.md) |
92| `1985` | Label | [32](32.md) | 98| `1985` | Label | [32](32.md) |
99| `4550` | Community Post Approval | [72](72.md) |
93| `9734` | Zap Request | [57](57.md) | 100| `9734` | Zap Request | [57](57.md) |
94| `9735` | Zap | [57](57.md) | 101| `9735` | Zap | [57](57.md) |
95| `10000` | Mute List | [51](51.md) | 102| `10000` | Mute List | [51](51.md) |
@@ -108,9 +115,18 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
108| `30017` | Create or update a stall | [15](15.md) | 115| `30017` | Create or update a stall | [15](15.md) |
109| `30018` | Create or update a product | [15](15.md) | 116| `30018` | Create or update a product | [15](15.md) |
110| `30023` | Long-form Content | [23](23.md) | 117| `30023` | Long-form Content | [23](23.md) |
118| `30024` | Draft Long-form Content | [23](23.md) |
111| `30078` | Application-specific Data | [78](78.md) | 119| `30078` | Application-specific Data | [78](78.md) |
120| `30311` | Live Event | [53](53.md) |
121| `30402` | Classified Listing | [99](99.md) |
122| `30403` | Draft Classified Listing | [99](99.md) |
123| `31922` | Date-Based Calendar Event | [52](52.md) |
124| `31923` | Time-Based Calendar Event | [52](52.md) |
125| `31924` | Calendar | [52](52.md) |
126| `31925` | Calendar Event RSVP | [52](52.md) |
112| `31989` | Handler recommendation | [89](89.md) | 127| `31989` | Handler recommendation | [89](89.md) |
113| `31990` | Handler information | [89](89.md) | 128| `31990` | Handler information | [89](89.md) |
129| `34550` | Community Definition | [72](72.md) |
114| `65000` | Job Feedback | [90](90.md) | 130| `65000` | Job Feedback | [90](90.md) |
115| `65001` | Job Result | [90](90.md) | 131| `65001` | Job Result | [90](90.md) |
116 132
@@ -159,8 +175,9 @@ When experimenting with kinds, keep in mind the classification introduced by [NI
159| `alt` | Alt tag | -- | [31](31.md) | 175| `alt` | Alt tag | -- | [31](31.md) |
160| `d` | identifier | -- | [33](33.md) | 176| `d` | identifier | -- | [33](33.md) |
161| `e` | event id (hex) | relay URL, marker | [1](01.md), [10](10.md) | 177| `e` | event id (hex) | relay URL, marker | [1](01.md), [10](10.md) |
162| `g` | geohash | -- | [12](12.md) | 178| `g` | geohash | -- | [12](12.md), [52](52.md) |
163| `i` | identity | proof | [39](39.md) | 179| `i` | identity | proof | [39](39.md) |
180| `k` | kind number (string) | -- | [18](18.md), [72](72.md) |
164| `l` | label, label namespace | annotations | [32](32.md) | 181| `l` | label, label namespace | annotations | [32](32.md) |
165| `L` | label namespace | -- | [32](32.md) | 182| `L` | label namespace | -- | [32](32.md) |
166| `p` | pubkey (hex) | relay URL | [1](01.md) | 183| `p` | pubkey (hex) | relay URL | [1](01.md) |
@@ -173,13 +190,16 @@ When experimenting with kinds, keep in mind the classification introduced by [NI
173| `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) | 190| `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) |
174| `description` | badge description | -- | [58](58.md) | 191| `description` | badge description | -- | [58](58.md) |
175| `description` | invoice description | -- | [57](57.md) | 192| `description` | invoice description | -- | [57](57.md) |
176| `emoji` | shortcode | image URL | [30](30.md) | 193| `emoji` | shortcode, image URL | -- | [30](30.md) |
177| `expiration` | unix timestamp (string) | -- | [40](40.md) | 194| `expiration` | unix timestamp (string) | -- | [40](40.md) |
178| `image` | image URL | dimensions in pixels | [23](23.md), [58](58.md) | 195| `image` | image URL | dimensions in pixels | [23](23.md), [58](58.md) |
179| `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) | 196| `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) |
197| `location` | location string | -- | [52](52.md), [99](99.md) |
180| `name` | badge name | -- | [58](58.md) | 198| `name` | badge name | -- | [58](58.md) |
181| `nonce` | random | -- | [13](13.md) | 199| `nonce` | random | -- | [13](13.md) |
182| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) | 200| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) |
201| `price` | price | currency, frequency | [99](99.md) |
202| `proxy` | external ID | protocol | [48](48.md) |
183| `published_at` | unix timestamp (string) | -- | [23](23.md) | 203| `published_at` | unix timestamp (string) | -- | [23](23.md) |
184| `relay` | relay url | -- | [42](42.md) | 204| `relay` | relay url | -- | [42](42.md) |
185| `relays` | relay list | -- | [57](57.md) | 205| `relays` | relay list | -- | [57](57.md) |
@@ -197,6 +217,21 @@ When experimenting with kinds, keep in mind the classification introduced by [NI
1974. There should be no more than one way of doing the same thing. 2174. There should be no more than one way of doing the same thing.
1985. Other rules will be made up when necessary. 2185. Other rules will be made up when necessary.
199 219
220## Mailing Lists
221
222The nostr ecosystem is getting large with many different organizations, relays
223and clients. Following the nips repo on github is becoming more difficult and
224noisy. To coordinate on protocol development outside of github, there are
225mailing lists where you can work on NIPs before submitting them here:
226
227* [w3c nostr community group][w3-nostr] - [public-nostr@w3.org][mailto-w3] - requires signup
228* [nostr-protocol google group][nostr-google-group] - [nostr-protocol@googlegroups.com][mailto-google] - no signup required
229
230[w3-nostr]: https://www.w3.org/community/nostr/
231[mailto-w3]: mailto:public-nostr@w3.org
232[nostr-google-group]: https://groups.google.com/g/nostr-protocol
233[mailto-google]: mailto:nostr-protocol@googlegroups.com
234
200## License 235## License
201 236
202All NIPs are public domain. 237All NIPs are public domain.