Compare commits

...

32 Commits

Author SHA1 Message Date
fiatjaf_
14d3801485 Merge branch 'master' into video-events-regular 2025-01-30 23:21:21 -03:00
daniele
f440eac3dc Remove reference to 'username' and update descriptions in metadata (#1726) 2025-01-30 13:49:06 -08:00
P. Reis
7370729472 NIP-60: jsonconc -> jsonc (#1727) 2025-01-30 05:45:35 -08:00
k.
54b431e701 Add x tag to NIP-56 (#1669) 2025-01-29 13:15:18 +03:00
P. Reis
993c8a025e parameterized replaceable -> addressable (#1722) 2025-01-29 09:26:41 +09:00
Pablo Fernandez
36c48ca128 NIP-60: more consistent state transition (#1720) 2025-01-28 16:26:21 -03:00
Kieran
70db801bb7 Update 92.md (#1721) 2025-01-28 06:37:54 -08:00
Asai Toshiya
a7f30b1eb2 add kind 32267 to list. (#1698) 2025-01-28 12:33:53 +09:00
Asai Toshiya
1b521d019a BREAKING.md: single quote -> back quote. 2025-01-23 21:39:23 +09:00
fiatjaf
5eb515ceb9 fix mentions in other NIPs and README. 2025-01-21 17:21:17 -03:00
fiatjaf
23884854ad add note about cavaliership. 2025-01-21 11:48:24 -03:00
fiatjaf
23ac7d9f7a rename from "horizontal" and "vertical" to "normal" and "short". 2025-01-21 11:46:03 -03:00
fiatjaf
b0ab83f04d nip71: make video events regular. 2025-01-20 16:24:31 -03:00
Asai Toshiya
cc3fbab153 fix "PRE" to "addressable event". (#1697) 2025-01-17 21:27:06 -03:00
Dan Gershony
3f11c00fb9 Update nip 59 typo (#1687) 2025-01-14 09:56:13 -08:00
Asai Toshiya
190122fd8d update kind 1 link. (#1686) 2025-01-14 06:13:39 -08:00
abhay-raizada
0782ebe0bc Reinstate NIP-88: Polls on Nostr (#1507) 2025-01-13 21:25:30 -03:00
P. Reis
512caf7fcd NIP-61: fix unfinished sentence (#1683) 2025-01-13 15:42:58 -08:00
hodlbod
6c62751e57 Warn against using 1111 to reply to kind 1 (#1680)
Co-authored-by: Jon Staab <shtaab@gmail.com>
2025-01-13 16:24:04 -03:00
Vitor Pamplona
0e3d1cd5d8 Moves Kind:1 definition to NIP-10 (#1076)
Co-authored-by: Michael J <37635304+buttercat1791@users.noreply.github.com>
2025-01-13 09:04:46 -08:00
T.Shinohara
5b6ca881e2 add t-tags in kind 41 (#1673) 2025-01-13 11:37:53 -03:00
Pablo Fernandez
0f376a7aa4 Merge pull request #1679 from nostr-protocol/reposted-70s
Don't stringify magic-wanded protected events in reposts
2025-01-13 14:35:56 +00:00
Pablo Fernandez
d96f6f852a Update 18.md
Co-authored-by: hodlbod <jstaab@protonmail.com>
2025-01-13 14:35:10 +00:00
Asai Toshiya
76fd221ff1 add kind 30267 to list. 2025-01-10 23:39:08 +09:00
pablof7z
1f8bbbfb50 specify magic-wanded protected events should not be stringified in a repost 2025-01-10 08:27:14 -06:00
Asai Toshiya
2561566af7 nip51: format tables. 2025-01-08 20:28:46 +09:00
Pablo Fernandez
c91098af86 Merge pull request #1640 from franzaps/application-sets
Update NIP-51 for software applications
2025-01-02 21:04:36 +00:00
Asai Toshiya
936befbf9b add NIP-22 link to P and p tags. 2025-01-02 23:53:33 +09:00
hodlbod
e42aae6184 Merge pull request #1666 from jdabs/master
Grammar updates to 47.md
2025-01-01 08:14:47 -08:00
jdabs
cd09e6c9d8 Grammar updates to 47.md
Minor grammatical edits for clarity.
- "It's" to "its" to show the possessive case intended instead of the contraction
- Correct article from "an" to "a" for the following d letter (consonant sound)
- Minor edit to fix comma splices with a semicolon ( ; ) to clarify two independent thoughts. Somewhat optional, but it clarifies the two long sentences. Period can instead be used instead as a new sentence.
2025-01-01 11:09:21 -05:00
Pablo Fernandez
42370a3d30 Merge pull request #1664 from nostr-protocol/p-tags-22
Add P-tags and p-tags to NIP-22
2024-12-31 15:38:35 +00:00
franzap
ed128aef46 App curation sets, minor fixes to release artifact sets 2024-12-10 15:02:54 -03:00
17 changed files with 302 additions and 107 deletions

7
01.md
View File

@@ -85,10 +85,11 @@ As a convention, all single-letter (only english alphabet letters: a-z, A-Z) key
### Kinds
Kinds specify how clients should interpret the meaning of each event and the other fields of each event (e.g. an `"r"` tag may have a meaning in an event of kind 1 and an entirely different meaning in an event of kind 10002). Each NIP may define the meaning of a set of kinds that weren't defined elsewhere. This NIP defines two basic kinds:
Kinds specify how clients should interpret the meaning of each event and the other fields of each event (e.g. an `"r"` tag may have a meaning in an event of kind 1 and an entirely different meaning in an event of kind 10002). Each NIP may define the meaning of a set of kinds that weren't defined elsewhere. [NIP-10](10.md), for instance, especifies the `kind:1` text note for social media applications.
- `0`: **user metadata**: the `content` is set to a stringified JSON object `{name: <username>, about: <string>, picture: <url, string>}` describing the user who created the event. [Extra metadata fields](24.md#kind-0) may be set. A relay may delete older events once it gets a new one for the same pubkey.
- `1`: **text note**: the `content` is set to the **plaintext** content of a note (anything the user wants to say). Content that must be parsed, such as Markdown and HTML, should not be used. Clients should also not parse content as those.
This NIP defines one basic kind:
- `0`: **user metadata**: the `content` is set to a stringified JSON object `{name: <nickname or full name>, about: <short bio>, picture: <url of the image>}` describing the user who created the event. [Extra metadata fields](24.md#kind-0) may be set. A relay may delete older events once it gets a new one for the same pubkey.
And also a convention for kind ranges that allow for easier experimentation and flexibility of relay implementation:

16
10.md
View File

@@ -1,14 +1,22 @@
NIP-10
======
On "e" and "p" tags in Text Events (kind 1)
-------------------------------------------
Text Notes and Threads
----------------------
`draft` `optional`
This NIP defines `kind:1` as a simple plaintext note.
## Abstract
This NIP describes how to use "e" and "p" tags in text events, especially those that are replies to other text events. It helps clients thread the replies into a tree rooted at the original event.
This NIP describes how to use "e" and "p" tags in text events, especially those that are replies to other text events. It helps clients thread the replies into a tree rooted at the original event.
The `.content` property contains some human-readable text.
`e` and `p` tags can be used to define note threads, replies and mentions.
Markup languages such as markdown and HTML SHOULD NOT be used.
## Marked "e" tags (PREFERRED)
`["e", <event-id>, <relay-url>, <marker>, <pubkey>]`

2
18.md
View File

@@ -10,6 +10,7 @@ A repost is a `kind 6` event that is used to signal to followers
that a `kind 1` text note is worth reading.
The `content` of a repost event is _the stringified JSON of the reposted note_. It MAY also be empty, but that is not recommended.
Reposts of [NIP-70](70.md)-protected events SHOULD always have an empty `content`.
The repost event MUST include an `e` tag with the `id` of the note that is
being reposted. That tag MUST include a relay URL as its third entry
@@ -41,3 +42,4 @@ as a "generic repost", that can include any kind of event inside other than
`kind 16` reposts SHOULD contain a `k` tag with the stringified kind number
of the reposted event as its value.

2
22.md
View File

@@ -56,6 +56,8 @@ Their uppercase versions use the same type of values but relate to the root item
`p` tags SHOULD be used when mentioning pubkeys in the `.content` with [NIP-21](21.md).
Comments MUST NOT be used to reply to kind 1 notes. [NIP-10](10.md) should instead be followed.
## Examples
A comment on a blog post looks like this:

9
28.md
View File

@@ -52,10 +52,17 @@ Clients MAY add additional metadata fields.
Clients SHOULD use [NIP-10](10.md) marked "e" tags to recommend a relay.
It is also possible to set the category name using the "t" tag. This category name can be searched and filtered.
```jsonc
{
"content": "{\"name\": \"Updated Demo Channel\", \"about\": \"Updating a test channel.\", \"picture\": \"https://placekitten.com/201/201\", \"relays\": [\"wss://nos.lol\", \"wss://nostr.mom\"]}",
"tags": [["e", <channel_create_event_id>, <relay-url>]],
"tags": [
["e", <channel_create_event_id>, <relay-url>, "root"],
["t", <category_name-1>],
["t", <category_name-2>],
["t", <category_name-3>],
],
// other fields...
}
```

6
47.md
View File

@@ -107,7 +107,7 @@ The content of notifications is encrypted with [NIP04](https://github.com/nostr-
## Nostr Wallet Connect URI
**client** discovers **wallet service** by scanning a QR code, handling a deeplink or pasting in a URI.
The **wallet service** generates this connection URI with protocol `nostr+walletconnect://` and base path it's hex-encoded `pubkey` with the following query string parameters:
The **wallet service** generates this connection URI with protocol `nostr+walletconnect://` and base path its hex-encoded `pubkey` with the following query string parameters:
- `relay` Required. URL of the relay where the **wallet service** is connected and will be listening for events. May be more than one.
- `secret` Required. 32-byte randomly generated hex encoded string. The **client** MUST use this to sign events and encrypt payloads when communicating with the **wallet service**.
@@ -175,7 +175,7 @@ Request:
Response:
For every invoice in the request, a separate response event is sent. To differentiate between the responses, each
response event contains a `d` tag with the id of the invoice it is responding to, if no id was given, then the
response event contains a `d` tag with the id of the invoice it is responding to; if no id was given, then the
payment hash of the invoice should be used.
```jsonc
@@ -247,7 +247,7 @@ Request:
Response:
For every keysend in the request, a separate response event is sent. To differentiate between the responses, each
response event contains an `d` tag with the id of the keysend it is responding to, if no id was given, then the
response event contains a `d` tag with the id of the keysend it is responding to; if no id was given, then the
pubkey should be used.
```jsonc

82
51.md
View File

@@ -20,21 +20,21 @@ Standard lists use normal replaceable events, meaning users may only have a sing
For example, _mute list_ can contain the public keys of spammers and bad actors users don't want to see in their feeds or receive annoying notifications from.
| name | kind | description | expected tag items |
| --- | --- | --- | --- |
| Mute list | 10000 | things the user doesn't want to see in their feeds | `"p"` (pubkeys), `"t"` (hashtags), `"word"` (lowercase string), `"e"` (threads) |
| Pinned notes | 10001 | events the user intends to showcase in their profile page | `"e"` (kind:1 notes) |
| Bookmarks | 10003 | uncategorized, "global" list of things a user wants to save | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r"` (URLs) |
| Communities | 10004 | [NIP-72](72.md) communities the user belongs to | `"a"` (kind:34550 community definitions) |
| Public chats | 10005 | [NIP-28](28.md) chat channels the user is in | `"e"` (kind:40 channel definitions) |
| Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) |
| Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) |
| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group id + relay URL + optional group name), `"r"` for each relay in use |
| Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a"` (kind:30015 interest set) |
| Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) |
| DM relays | 10050 | Where to receive [NIP-17](17.md) direct messages | `"relay"` (see [NIP-17](17.md)) |
| Good wiki authors | 10101 | [NIP-54](54.md) user recommended wiki authors | `"p"` (pubkeys) |
| Good wiki relays | 10102 | [NIP-54](54.md) relays deemed to only host useful articles | `"relay"` (relay URLs) |
| name | kind | description | expected tag items |
| --- | --- | --- | --- |
| Mute list | 10000 | things the user doesn't want to see in their feeds | `"p"` (pubkeys), `"t"` (hashtags), `"word"` (lowercase string), `"e"` (threads) |
| Pinned notes | 10001 | events the user intends to showcase in their profile page | `"e"` (kind:1 notes) |
| Bookmarks | 10003 | uncategorized, "global" list of things a user wants to save | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r"` (URLs) |
| Communities | 10004 | [NIP-72](72.md) communities the user belongs to | `"a"` (kind:34550 community definitions) |
| Public chats | 10005 | [NIP-28](28.md) chat channels the user is in | `"e"` (kind:40 channel definitions) |
| Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) |
| Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) |
| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group id + relay URL + optional group name), `"r"` for each relay in use |
| Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a"` (kind:30015 interest set) |
| Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) |
| DM relays | 10050 | Where to receive [NIP-17](17.md) direct messages | `"relay"` (see [NIP-17](17.md)) |
| Good wiki authors | 10101 | [NIP-54](54.md) user recommended wiki authors | `"p"` (pubkeys) |
| Good wiki relays | 10102 | [NIP-54](54.md) relays deemed to only host useful articles | `"relay"` (relay URLs) |
### Sets
@@ -44,17 +44,18 @@ For example, _relay sets_ can be displayed in a dropdown UI to give users the op
Aside 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.
| name | kind | description | expected tag items |
| --- | --- | --- | --- |
| Follow sets | 30000 | categorized groups of users a client may choose to check out in different circumstances | `"p"` (pubkeys) |
| Relay sets | 30002 | user-defined relay groups the user can easily pick and choose from during various operations | `"relay"` (relay URLs) |
| 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) |
| 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) |
| Curation sets | 30005 | groups of videos picked by users as interesting and/or belonging to the same category | `"a"` (kind:34235 videos) |
| Kind mute sets | 30007 | mute pubkeys by kinds<br>`"d"` tag MUST be the kind string | `"p"` (pubkeys) |
| Interest sets | 30015 | interest topics represented by a bunch of "hashtags" | `"t"` (hashtags) |
| Emoji sets | 30030 | categorized emoji groups | `"emoji"` (see [NIP-30](30.md)) |
| Release artifact sets | 30063 | groups of files of a software release | `"e"` (kind:1063 [file metadata](94.md) events), `"i"` (application identifier, typically reverse domain notation), `"version"` |
| name | kind | description | expected tag items |
| --- | --- | --- | --- |
| Follow sets | 30000 | categorized groups of users a client may choose to check out in different circumstances | `"p"` (pubkeys) |
| Relay sets | 30002 | user-defined relay groups the user can easily pick and choose from during various operations | `"relay"` (relay URLs) |
| 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) |
| 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) |
| Curation sets | 30005 | groups of videos picked by users as interesting and/or belonging to the same category | `"a"` (kind:21 videos) |
| Kind mute sets | 30007 | mute pubkeys by kinds<br>`"d"` tag MUST be the kind string | `"p"` (pubkeys) |
| Interest sets | 30015 | interest topics represented by a bunch of "hashtags" | `"t"` (hashtags) |
| Emoji sets | 30030 | categorized emoji groups | `"emoji"` (see [NIP-30](30.md)) |
| Release artifact sets | 30063 | group of artifacts of a software release | `"e"` (kind:1063 [file metadata](94.md) events), `"a"` (software application event) |
| App curation sets | 30267 | references to multiple software applications | `"a"` (software application event) |
### Deprecated standard lists
@@ -117,22 +118,39 @@ Some clients have used these lists in the past, but they should work on transiti
"pubkey": "d6dc95542e18b8b7aec2f14610f55c335abebec76f3db9e58c254661d0593a0c",
"created_at": 1695327657,
"kind": 30063,
"content": "Release notes in markdown",
"tags": [
["d", "ak8dy3v7"],
["i", "com.example.app"],
["version", "0.0.1"],
["title", "Example App"],
["image", "http://cdn.site/p/com.example.app/icon.png"],
["d", "com.example.app@0.0.1"],
["e", "d78ba0d5dce22bfff9db0a9e996c9ef27e2c91051de0c4e1da340e0326b4941e"], // Windows exe
["e", "f27e2c91051de0c4e1da0d5dce22bfff9db0a9340e0326b4941ed78bae996c9e"], // MacOS dmg
["e", "9d24ddfab95ba3ff7c03fbd07ad011fff245abea431fb4d3787c2d04aad02332"], // Linux AppImage
["e", "340e0326b340e0326b4941ed78ba340e0326b4941ed78ba340e0326b49ed78ba"] // PWA
["e", "340e0326b340e0326b4941ed78ba340e0326b4941ed78ba340e0326b49ed78ba"], // PWA
["a", "32267:d6dc95542e18b8b7aec2f14610f55c335abebec76f3db9e58c254661d0593a0c:com.example.app"] // Reference to parent software application
],
"content": "Example App is a decentralized marketplace for apps",
"sig": "a9a4e2192eede77e6c9d24ddfab95ba3ff7c03fbd07ad011fff245abea431fb4d3787c2d04aad001cb039cb8de91d83ce30e9a94f82ac3c5a2372aa1294a96bd"
}
```
### An _app curation set_
```jsonc
{
"id": "d8037fa866eb5acd2159960b3ada7284172f7d687b5289cc72a96ca2b431b611",
"pubkey": "78ce6faa72264387284e647ba6938995735ec8c7d5c5a65737e55130f026307d",
"sig": "c1ce0a04521c020ae7485307cd86285530c1f778766a3fd594d662a73e7c28f307d7cd9a9ab642ae749fce62abbabb3a32facfe8d19a21fba551b60fae863d95",
"kind": 30267,
"created_at": 1729302793,
"content": "My nostr app selection",
"tags": [
["d", "nostr"],
["a", "32267:7579076d9aff0a4cfdefa7e2045f2486c7e5d8bc63bfc6b45397233e1bbfcb19:com.example.app1"],
["a", "32267:045f2486c7e5d8bc63bfc6b45397233e1bbfcb197579076d9aff0a4cfdefa7e2:net.example.app2"],
["a", "32267:264387284e647ba6938995735ec8c7d5c5a6f026307d78ce6faa725737e55130:pl.code.app3"]
]
}
```
## Encryption process pseudocode
```scala

27
56.md
View File

@@ -22,7 +22,7 @@ are reporting.
If reporting a note, an `e` tag MUST also be included referencing the note id.
A `report type` string MUST be included as the 3rd entry to the `e` or `p` tag
A `report type` string MUST be included as the 3rd entry to the `e`, `p` or `x` tag
being reported, which consists of the following report types:
- `nudity` - depictions of nudity, porn, etc.
@@ -33,7 +33,9 @@ being reported, which consists of the following report types:
- `impersonation` - someone pretending to be someone else
- `other` - for reports that don't fit in the above categories
Some report tags only make sense for profile reports, such as `impersonation`
Some report tags only make sense for profile reports, such as `impersonation`.
- `x` tags SHOULD be info hash of a blob which is intended to be report. when the `x` tag is represented client MUST include an `e` tag which is the id of the event that contains the mentioned blob. also, additionally these events can contain a `server` tag to point to media servers which may contain the mentioned media.
`l` and `L` tags MAY be also be used as defined in [NIP-32](32.md) to support
further qualification and querying.
@@ -45,7 +47,7 @@ Example events
{
"kind": 1984,
"tags": [
["p", <pubkey>, "nudity"],
["p", "<pubkey>", "nudity"],
["L", "social.nos.ontology"],
["l", "NS-nud", "social.nos.ontology"]
],
@@ -58,8 +60,8 @@ Example events
{
"kind": 1984,
"tags": [
["e", <eventId>, "illegal"],
["p", <pubkey>]
["e", "<eventId>", "illegal"],
["p", "<pubkey>"]
],
"content": "He's insulting the king!",
// other fields...
@@ -70,13 +72,26 @@ Example events
{
"kind": 1984,
"tags": [
["p", <impersonator pubkey>, "impersonation"]
["p", "<impersonator pubkey>", "impersonation"]
],
"content": "Profile is impersonating nostr:<victim bech32 pubkey>",
// other fields...
}
```
```jsonc
{
"kind": 1984,
"tags": [
["x", "<blob hash>", "malware"],
["e", "<event id which contains the blob on x tag>", "malware"],
["server", "https://you-may-find-the-blob-here.com/path-to-url.ext"]
],
"content": "This file contains malware software in it.",
// other fields...
}
```
Client behavior
---------------

2
59.md
View File

@@ -53,7 +53,7 @@ without the receiver's or the sender's private key. The only public information
}
```
Tags MUST must always be empty in a `kind:13`. The inner event MUST always be unsigned.
Tags MUST always be empty in a `kind:13`. The inner event MUST always be unsigned.
## 3. Gift Wrap Event Kind

29
60.md
View File

@@ -39,7 +39,7 @@ This NIP doesn't deal with users' *receiving* money from someone else, it's just
}
```
The wallet event is a parameterized replaceable event `kind:37375`.
The wallet event is an addressable event `kind:37375`.
Tags:
* `d` - wallet ID.
@@ -54,10 +54,10 @@ Tags:
Any tag, other than the `d` tag, can be [[NIP-44]] encrypted into the `.content` field.
### Deleting a wallet event
Due to PRE being hard to delete, if a user wants to delete a wallet, they should empty the event and keep just the `d` identifier and add a `deleted` tag.
Due to addressable event being hard to delete, if a user wants to delete a wallet, they should empty the event and keep just the `d` identifier and add a `deleted` tag.
## Token Event
Token events are used to record the unspent proofs that come from the mint.
Token events are used to record unspent proofs.
There can be multiple `kind:7375` events for the same mint, and multiple proofs inside each `kind:7375` event.
@@ -73,7 +73,9 @@ There can be multiple `kind:7375` events for the same mint, and multiple proofs
"secret": "z+zyxAVLRqN9lEjxuNPSyRJzEstbl69Jc1vtimvtkPg=",
"C": "0241d98a8197ef238a192d47edf191a9de78b657308937b4f7dd0aa53beae72c46"
}
]
],
// tokens that were destroyed in the creation of this token
"del": [ "token-id-1" ]
}),
"tags": [
[ "a", "37375:<pubkey>:my-wallet" ]
@@ -81,8 +83,11 @@ There can be multiple `kind:7375` events for the same mint, and multiple proofs
}
```
`.content` is a [[NIP-44]] encrypted payload storing the mint and the unencoded proofs.
* `a` an optional tag linking the token to a specific wallet.
* `a` an optional tag linking the token to a specific wallet.
* `.content` is a [[NIP-44]] encrypted payload:
* `mint`: The mint the proofs belong to.
* `proofs`: unecoded proofs
* `del`: token-ids that were destroyed by the creation of this token. This assists with state transitions.
### Spending proofs
When one or more proofs of a token are spent, the token event should be [[NIP-09]]-deleted and, if some proofs are unspent from the same token event, a new token event should be created rolling over the unspent proofs and adding any change outputs to the new token event.
@@ -96,7 +101,7 @@ Clients SHOULD publish `kind:7376` events to create a transaction history when t
"content": nip44_encrypt([
[ "direction", "in" ], // in = received, out = sent
[ "amount", "1", "sat" ],
[ "e", "<event-id-of-spent-token>", "<relay-hint>", "created" ],
[ "e", "<event-id-of-created-token>", "<relay-hint>", "created" ],
]),
"tags": [
[ "a", "37375:<pubkey>:my-wallet" ],
@@ -129,7 +134,7 @@ While the client is fetching (and perhaps validating) proofs it can use the opti
## Spending token
If Alice spends 4 sats from this token event
```jsonconc
```jsonc
{
"kind": 7375,
"id": "event-id-1",
@@ -150,7 +155,7 @@ If Alice spends 4 sats from this token event
Her client:
* MUST roll over the unspent proofs:
```jsonconc
```jsonc
{
"kind": 7375,
"id": "event-id-2",
@@ -160,7 +165,8 @@ Her client:
{ "id": "1", "amount": 1 },
{ "id": "2", "amount": 2 },
{ "id": "4", "amount": 8 },
]
],
"del": [ "event-id-1" ]
}),
"tags": [
[ "a", "37375:<pubkey>:my-wallet" ]
@@ -168,8 +174,9 @@ Her client:
}
```
* MUST delete event `event-id-1`
* SHOULD add the `event-id-1` to the `del` array of deleted token-ids.
* SHOULD create a `kind:7376` event to record the spend
```jsonconc
```jsonc
{
"kind": 7376,
"content": nip44_encrypt([

4
61.md
View File

@@ -70,7 +70,7 @@ WIP: Clients SHOULD embed a DLEQ proof in the nutzap event to make it possible t
* The sender fetches the recipient's `kind:10019`.
* The sender mints/swaps ecash on one of the recipient's listed mints.
* The sender p2pk locks to the recipient's specified pubkey in their
* The sender p2pk locks to the recipient's specified pubkey in their `kind:10019`
# Receiving nutzaps
@@ -129,4 +129,4 @@ For this scenarios clients can:
* add a `pubkey` tag to the `kind:10019` (indicating which pubkey senders should P2PK to)
* store the private key in the `kind:37375` event in the nip44-encrypted `content` field.
This is to avoid depending on NIP-07/46 adaptations to sign cashu payloads.
This is to avoid depending on NIP-07/46 adaptations to sign cashu payloads.

6
68.md
View File

@@ -12,7 +12,7 @@ The idea is for this type of event to cater to Nostr clients resembling platform
## Picture Events
Picture events contain a `title` tag and description in the `.content`.
Picture events contain a `title` tag and description in the `.content`.
They may contain multiple images to be displayed as a single post.
@@ -81,7 +81,7 @@ They may contain multiple images to be displayed as a single post.
The `imeta` tag `annotate-user` places a user link in the specific position in the image.
Only the following media types are accepted:
Only the following media types are accepted:
- `image/apng`: Animated Portable Network Graphics (APNG)
- `image/avif`: AV1 Image File Format (AVIF)
- `image/gif`: Graphics Interchange Format (GIF)
@@ -89,4 +89,4 @@ Only the following media types are accepted:
- `image/png`: Portable Network Graphics (PNG)
- `image/webp`: Web Picture format (WEBP)
Picture events might be used with [NIP-71](71.md)'s kind `34236` to display short vertical videos in the same feed.
Picture events might be used with [NIP-71](71.md)'s kind `22` to display short vertical videos in the same feed.

32
71.md
View File

@@ -6,17 +6,19 @@ Video Events
`draft` `optional`
This specification defines video events representing a dedicated post of externally hosted content. These video events are _addressable_ and delete-requestable per [NIP-09](09.md).
This specification defines _video_ events representing a dedicated post of externally hosted content.
Unlike a `kind 1` event with a video attached, Video Events are meant to contain all additional metadata concerning the subject media and to be surfaced in video-specific clients rather than general micro-blogging clients. The thought is for events of this kind to be referenced in a Netflix, YouTube, or TikTok like nostr client where the video itself is at the center of the experience.
Unlike a `kind:1` event with a video attached, video events are meant to contain all additional metadata concerning the subject media and to be surfaced in video-specific clients rather than general micro-blogging clients. The thought is for events of this kind to be referenced in a Netflix, YouTube, or TikTok like nostr client where the video itself is at the center of the experience.
## Video Events
There are two types of video events represented by different kinds: horizontal and vertical video events. This is meant to allow clients to cater to each as the viewing experience for horizontal (landscape) videos is often different than that of vertical (portrait) videos (Stories, Reels, Shorts, etc).
There are two types of video events represented by different kinds: _normal_ and _short_ video events. This is meant to allow clients to cater to each as the viewing experience for longer, mostly horizontal (landscape) videos is often different than that of short-form, mostly vertical (portrait), videos ("stories", "reels", "shorts" etc).
Nothing except cavaliership and common sense prevents a _short_ video from being long, or a _normal_ video from being vertical, and that may or may not be justified, it's mostly a stylistic qualitative difference, not a question of actual raw size.
#### Format
The format uses an _addressable event_ kind `34235` for horizontal videos and `34236` for vertical videos.
The format uses a _regular event_ kind `21` for _normal_ videos and `22` for _short_ videos.
The `.content` of these events is a summary or description on the video content.
@@ -27,7 +29,7 @@ Each `imeta` tag can be used to specify a variant of the video by the `dim` & `m
Example:
```json
[
["imeta",
["imeta",
"dim 1920x1080",
"url https://myvideo.com/1080/12345.mp4",
"x 3093509d1e0bc604ff60cb9286f4cd7c781553bc8991937befaacfdc28ec5cdc",
@@ -38,7 +40,7 @@ Example:
"fallback https://andanotherserver.com/1080/12345.mp4",
"service nip96",
],
["imeta",
["imeta",
"dim 1280x720",
"url https://myvideo.com/720/12345.mp4",
"x e1d4f808dae475ed32fb23ce52ef8ac82e3cc760702fca10d62d382d2da3697d",
@@ -49,7 +51,7 @@ Example:
"fallback https://andanotherserver.com/720/12345.mp4",
"service nip96",
],
["imeta",
["imeta",
"dim 1280x720",
"url https://myvideo.com/720/12345.m3u8",
"x 704e720af2697f5d6a198ad377789d462054b6e8d790f8a3903afbc1e044014f",
@@ -86,17 +88,15 @@ Additionally `service nip96` may be included to allow clients to search the auth
"id": <32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>,
"pubkey": <32-bytes lowercase hex-encoded public key of the event creator>,
"created_at": <Unix timestamp in seconds>,
"kind": 34235 | 34236,
"kind": 21 | 22,
"content": "<summary / description of video>",
"tags": [
["d", "<UUID>"],
["title", "<title of video>"],
["published_at", "<unix timestamp>"],
["alt", <description>],
// Video Data
["imeta",
// video Data
["imeta",
"dim 1920x1080",
"url https://myvideo.com/1080/12345.mp4",
"x 3093509d1e0bc604ff60cb9286f4cd7c781553bc8991937befaacfdc28ec5cdc",
@@ -113,17 +113,17 @@ Additionally `service nip96` may be included to allow clients to search the auth
["content-warning", "<reason>"],
["segment", <start>, <end>, "<title>", "<thumbnail URL>"],
// Participants
// participants
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>"],
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>"],
// Hashtags
// hashtags
["t", "<tag>"],
["t", "<tag>"],
// Reference links
// reference links
["r", "<url>"],
["r", "<url>"]
]
}
```
```

130
88.md Normal file
View File

@@ -0,0 +1,130 @@
# NIP-88
## Polls
`draft` `optional`
This NIP defines the event scheme that describe Polls on nostr.
## Events
### Poll Event
The poll event is defined as a `kind:1068` event.
- **content** key holds the label for the poll.
Major tags in the poll event are:
- **option**: The option tags contain an OptionId(any alphanumeric) field, followed by an option label field.
- **relay**: One or multiple tags that the poll is expecting respondents to respond on.
- **polltype**: can be "singlechoice" or "multiplechoice". Polls that do not have a polltype should be considered a "singlechoice" poll.
- **endsAt**: signifying at which unix timestamp the poll is meant to end.
Example Event
```json
{
"content": "Pineapple on pizza",
"created_at": 1719888496,
"id": "9d1b6b9562e66f2ecf35eb0a3c2decc736c47fddb13d6fb8f87185a153ea3634",
"kind": 1068,
"pubkey": "dee45a23c4f1d93f3a2043650c5081e4ac14a778e0acbef03de3768e4f81ac7b",
"sig": "7fa93bf3c430eaef784b0dacc217d3cd5eff1c520e7ef5d961381bc0f014dde6286618048d924808e54d1be03f2f2c2f0f8b5c9c2082a4480caf45a565ca9797",
"tags": [
["option", "qj518h583", "Yay"],
["option", "gga6cdnqj", "Nay"],
["relay", "<relay url1>"],
["relay", "<relay url2>"],
["polltype", "singlechoice"],
["endsAt", "<unix timestamp in seconds>"]
]
}
```
### Responses
The response event is a `kind:1018` event. It contains an e tag with the poll event it is referencing, followed by one or more response tags.
- **response** : The tag contains "response" as it's first positional argument followed by the option Id selected.
The responses are meant to be published to the relays specified in the poll event.
Example Response Event
```json
{
"content": "",
"created_at": 1720097117,
"id": "60a005e32e9596c3f544a841a9bc4e46d3020ca3650d6a739c95c1568e33f6d8",
"kind": 1018,
"pubkey": "1bc70a0148b3f316da33fe7e89f23e3e71ac4ff998027ec712b905cd24f6a411",
"sig": "30071a633c65db8f3a075c7a8de757fbd8ce65e3607f4ba287fe6d7fbf839a380f94ff4e826fbba593f6faaa13683b7ea9114ade140720ecf4927010ebf3e44f",
"tags": [
["e", "1fc80cf813f1af33d5a435862b7ef7fb96b47e68a48f1abcadf8081f5a545550"],
["response", "gga6cdnqj"],
["response", "m3agjsdq1"]
]
}
```
### Poll Types
The polltype setting dictates how multiple response tags are handled in the `kind:1018` event.
- **polltype: singlechoice**: The first response tag is to be considered the actual response.
- **polltype: multiplechoice**: The first response tag pointing to each id is considered the actual response, without considering the order of the response tags.
### Counting Results
Results can be queried by fetching `kind:1018` events from the relays specified in the poll.
The results displayed should only be 1 vote event per pubkey.
In case of multiple events for a pubkey, the event with the largest timestamp within the poll limits should be considered.
Example for querying polls.
```ts
const fetchVoteEvents = (filterPubkeys: string[]) => {
let resultFilter: Filter = {
"#e": [pollEvent.id],
kinds: [1018],
};
if (filterPubkeys?.length) {
resultFilter.authors = filterPubkeys;
}
if (pollExpiration) {
resultFilter.until = Number(pollExpiration);
}
pool.subscribeMany(relays, [resultFilter], {
onevent: handleResultEvent,
});
};
```
Example for maintaining OneVotePerPubkey
```ts
const oneVotePerPubkey = (events: Event[]) => {
const eventMap = new Map<string, Event>();
events.forEach((event) => {
if (
!eventMap.has(event.pubkey) ||
event.created_at > eventMap.get(event.pubkey)!.created_at
) {
eventMap.set(event.pubkey, event);
}
});
return Array.from(eventMap.values());
};
```
### Relays
It is advisable for poll authors to use relays that do not allow backdated events and do not honor kind:5 (delete) requests for vote events in order to maintain the integrity of poll results after the poll has ended.
### Curation
The clients may configure fetching results by specific people. This can be achieved by creating `kind:30000` follow sets, and fetching results only from the follow set.
Clients can also employ other curation algorithms, like Proof Of Work and Web of Trust scores for result curations.

4
92.md
View File

@@ -6,10 +6,10 @@ Media Attachments
Media attachments (images, videos, and other files) may be added to events by including a URL in the event content, along with a matching `imeta` tag.
`imeta` ("inline metadata") tags add information about media URLs in the event's content. Each `imeta` tag SHOULD match a URL in the event content. Clients may replace imeta URLs with rich previews.
`imeta` ("inline metadata") tags MAY add information about media URLs in the event's content. Each `imeta` tag SHOULD match a URL in the event content. Clients MAY replace imeta URLs with rich previews.
The `imeta` tag is variadic, and each entry is a space-delimited key/value pair.
Each `imeta` tag MUST have a `url`, and at least one other field. `imeta` may include
Each `imeta` tag MUST have a `url`, and at least one other field. `imeta` MAY include
any field specified by [NIP 94](./94.md). There SHOULD be only one `imeta` tag per URL.
## Example

View File

@@ -21,37 +21,37 @@ reverse chronological order.
| 2024-07-23 | [0227a2cd](https://github.com/nostr-protocol/nips/commit/0227a2cd) | [01](01.md) | events should be sorted by id after created_at |
| 2024-06-06 | [58e94b20](https://github.com/nostr-protocol/nips/commit/58e94b20) | [25](25.md) | [8073c848](https://github.com/nostr-protocol/nips/commit/8073c848) was reverted |
| 2024-06-06 | [a6dfc7b5](https://github.com/nostr-protocol/nips/commit/a6dfc7b5) | [55](55.md) | NIP number was changed |
| 2024-05-25 | [5d1d1c17](https://github.com/nostr-protocol/nips/commit/5d1d1c17) | [71](71.md) | 'aes-256-gcm' tag was removed |
| 2024-05-25 | [5d1d1c17](https://github.com/nostr-protocol/nips/commit/5d1d1c17) | [71](71.md) | `aes-256-gcm` tag was removed |
| 2024-05-07 | [8073c848](https://github.com/nostr-protocol/nips/commit/8073c848) | [25](25.md) | e-tags were changed to not include entire thread |
| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [34](34.md) | 'earliest-unique-commit' tag was removed (use 'r' tag instead) |
| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [34](34.md) | `earliest-unique-commit` tag was removed (use `r` tag instead) |
| 2024-02-25 | [4a171cb0](https://github.com/nostr-protocol/nips/commit/4a171cb0) | [18](18.md) | quote repost should use `q` tag |
| 2024-02-21 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [46](46.md) | Params were stringified |
| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [49](49.md) | Password first normalized to NFKC |
| 2024-02-15 | [afbb8dd0](https://github.com/nostr-protocol/nips/commit/afbb8dd0) | [39](39.md) | PGP identity was removed |
| 2024-02-07 | [d3dad114](https://github.com/nostr-protocol/nips/commit/d3dad114) | [46](46.md) | Connection token format was changed |
| 2024-01-30 | [1a2b21b6](https://github.com/nostr-protocol/nips/commit/1a2b21b6) | [59](59.md) | 'p' tag became optional |
| 2024-01-30 | [1a2b21b6](https://github.com/nostr-protocol/nips/commit/1a2b21b6) | [59](59.md) | `p` tag became optional |
| 2023-01-27 | [c2f34817](https://github.com/nostr-protocol/nips/commit/c2f34817) | [47](47.md) | optional expiration tag should be honored |
| 2024-01-10 | [3d8652ea](https://github.com/nostr-protocol/nips/commit/3d8652ea) | [02](02.md), [51](51.md) | list entries should be chronological |
| 2023-12-30 | [29869821](https://github.com/nostr-protocol/nips/commit/29869821) | [52](52.md) | 'name' tag was removed (use 'title' tag instead) |
| 2023-12-27 | [17c67ef5](https://github.com/nostr-protocol/nips/commit/17c67ef5) | [94](94.md) | 'aes-256-gcm' tag was removed |
| 2023-12-03 | [0ba45895](https://github.com/nostr-protocol/nips/commit/0ba45895) | [01](01.md) | WebSocket status code `4000` was replaced by 'CLOSED' message |
| 2023-11-28 | [6de35f9e](https://github.com/nostr-protocol/nips/commit/6de35f9e) | [89](89.md) | 'client' tag value was changed |
| 2023-12-30 | [29869821](https://github.com/nostr-protocol/nips/commit/29869821) | [52](52.md) | `name` tag was removed (use `title` tag instead) |
| 2023-12-27 | [17c67ef5](https://github.com/nostr-protocol/nips/commit/17c67ef5) | [94](94.md) | `aes-256-gcm` tag was removed |
| 2023-12-03 | [0ba45895](https://github.com/nostr-protocol/nips/commit/0ba45895) | [01](01.md) | WebSocket status code `4000` was replaced by `CLOSED` message |
| 2023-11-28 | [6de35f9e](https://github.com/nostr-protocol/nips/commit/6de35f9e) | [89](89.md) | `client` tag value was changed |
| 2023-11-20 | [7822a8b1](https://github.com/nostr-protocol/nips/commit/7822a8b1) | [51](51.md) | `kind: 30001` was deprecated |
| 2023-11-20 | [7822a8b1](https://github.com/nostr-protocol/nips/commit/7822a8b1) | [51](51.md) | the meaning of `kind: 30000` was changed |
| 2023-11-11 | [cbdca1e9](https://github.com/nostr-protocol/nips/commit/cbdca1e9) | [84](84.md) | 'range' tag was removed |
| 2023-11-10 | [c945d8bd](https://github.com/nostr-protocol/nips/commit/c945d8bd) | [32](32.md) | 'l' tag annotations was removed |
| 2023-11-07 | [108b7f16](https://github.com/nostr-protocol/nips/commit/108b7f16) | [01](01.md) | 'OK' message must have 4 items |
| 2023-10-17 | [cf672b76](https://github.com/nostr-protocol/nips/commit/cf672b76) | [03](03.md) | 'block' tag was removed |
| 2023-09-29 | [7dc6385f](https://github.com/nostr-protocol/nips/commit/7dc6385f) | [57](57.md) | optional 'a' tag was included in `zap receipt` |
| 2023-08-21 | [89915e02](https://github.com/nostr-protocol/nips/commit/89915e02) | [11](11.md) | 'min_prefix' was removed |
| 2023-11-11 | [cbdca1e9](https://github.com/nostr-protocol/nips/commit/cbdca1e9) | [84](84.md) | `range` tag was removed |
| 2023-11-10 | [c945d8bd](https://github.com/nostr-protocol/nips/commit/c945d8bd) | [32](32.md) | `l` tag annotations was removed |
| 2023-11-07 | [108b7f16](https://github.com/nostr-protocol/nips/commit/108b7f16) | [01](01.md) | `OK` message must have 4 items |
| 2023-10-17 | [cf672b76](https://github.com/nostr-protocol/nips/commit/cf672b76) | [03](03.md) | `block` tag was removed |
| 2023-09-29 | [7dc6385f](https://github.com/nostr-protocol/nips/commit/7dc6385f) | [57](57.md) | optional `a` tag was included in `zap receipt` |
| 2023-08-21 | [89915e02](https://github.com/nostr-protocol/nips/commit/89915e02) | [11](11.md) | `min_prefix` was removed |
| 2023-08-20 | [37c4375e](https://github.com/nostr-protocol/nips/commit/37c4375e) | [01](01.md) | replaceable events with same timestamp should be retained event with lowest id |
| 2023-08-15 | [88ee873c](https://github.com/nostr-protocol/nips/commit/88ee873c) | [15](15.md) | 'countries' tag was renamed to 'regions' |
| 2023-08-15 | [88ee873c](https://github.com/nostr-protocol/nips/commit/88ee873c) | [15](15.md) | `countries` tag was renamed to `regions` |
| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [12](12.md), [16](16.md), [20](20.md), [33](33.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 |
| 2023-08-11 | [d87f8617](https://github.com/nostr-protocol/nips/commit/d87f8617) | [25](25.md) | empty `content` should be considered as "+" |
| 2023-08-01 | [5d63b157](https://github.com/nostr-protocol/nips/commit/5d63b157) | [57](57.md) | 'zap' tag was changed |
| 2023-08-01 | [5d63b157](https://github.com/nostr-protocol/nips/commit/5d63b157) | [57](57.md) | `zap` tag was changed |
| 2023-07-15 | [d1814405](https://github.com/nostr-protocol/nips/commit/d1814405) | [01](01.md) | `since` and `until` filters should be `since <= created_at <= until` |
| 2023-07-12 | [a1cd2bd8](https://github.com/nostr-protocol/nips/commit/a1cd2bd8) | [25](25.md) | custom emoji was supported |
| 2023-06-18 | [83cbd3e1](https://github.com/nostr-protocol/nips/commit/83cbd3e1) | [11](11.md) | 'image' was renamed to 'icon' |
| 2023-06-18 | [83cbd3e1](https://github.com/nostr-protocol/nips/commit/83cbd3e1) | [11](11.md) | `image` was renamed to `icon` |
| 2023-04-13 | [bf0a0da6](https://github.com/nostr-protocol/nips/commit/bf0a0da6) | [15](15.md) | different NIP was re-added as NIP-15 |
| 2023-04-09 | [fb5b7c73](https://github.com/nostr-protocol/nips/commit/fb5b7c73) | [15](15.md) | NIP-15 was merged into NIP-01 |
| 2023-03-29 | [599e1313](https://github.com/nostr-protocol/nips/commit/599e1313) | [18](18.md) | NIP-18 was bring back |

View File

@@ -31,7 +31,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-07: `window.nostr` capability for web browsers](07.md)
- [NIP-08: Handling Mentions](08.md) --- **unrecommended**: deprecated in favor of [NIP-27](27.md)
- [NIP-09: Event Deletion Request](09.md)
- [NIP-10: Conventions for clients' use of `e` and `p` tags in text events](10.md)
- [NIP-10: Text Notes and Threads](10.md)
- [NIP-11: Relay Information Document](11.md)
- [NIP-13: Proof of Work](13.md)
- [NIP-14: Subject tag in text events](14.md)
@@ -89,6 +89,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-78: Application-specific data](78.md)
- [NIP-84: Highlights](84.md)
- [NIP-86: Relay Management API](86.md)
- [NIP-88: Polls](88.md)
- [NIP-89: Recommended Application Handlers](89.md)
- [NIP-90: Data Vending Machines](90.md)
- [NIP-92: Media Attachments](92.md)
@@ -104,7 +105,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| kind | description | NIP |
| ------------- | ------------------------------- | -------------------------------------- |
| `0` | User Metadata | [01](01.md) |
| `1` | Short Text Note | [01](01.md) |
| `1` | Short Text Note | [10](10.md) |
| `2` | Recommend Relay | 01 (deprecated) |
| `3` | Follows | [02](02.md) |
| `4` | Encrypted Direct Messages | [04](04.md) |
@@ -121,6 +122,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `16` | Generic Repost | [18](18.md) |
| `17` | Reaction to a website | [25](25.md) |
| `20` | Picture | [68](68.md) |
| `21` | Video Event | [71](71.md) |
| `22` | Short-form Portrait Video Event | [71](71.md) |
| `40` | Channel Creation | [28](28.md) |
| `41` | Channel Metadata | [28](28.md) |
| `42` | Channel Message | [28](28.md) |
@@ -128,11 +131,13 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `44` | Channel Mute User | [28](28.md) |
| `64` | Chess (PGN) | [64](64.md) |
| `818` | Merge Requests | [54](54.md) |
| `1018` | Poll Response | [88](88.md) |
| `1021` | Bid | [15](15.md) |
| `1022` | Bid confirmation | [15](15.md) |
| `1040` | OpenTimestamps | [03](03.md) |
| `1059` | Gift Wrap | [59](59.md) |
| `1063` | File Metadata | [94](94.md) |
| `1068` | Poll | [88](88.md) |
| `1111` | Comment | [22](22.md) |
| `1311` | Live Chat Message | [53](53.md) |
| `1617` | Patches | [34](34.md) |
@@ -206,6 +211,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `30041` | Modular Article Content | [NKBIP-01] |
| `30063` | Release artifact sets | [51](51.md) |
| `30078` | Application-specific Data | [78](78.md) |
| `30267` | App curation sets | [51](51.md) |
| `30311` | Live Event | [53](53.md) |
| `30315` | User Statuses | [38](38.md) |
| `30388` | Slide Set | [Corny Chat][cornychat-slideset] |
@@ -223,9 +229,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `31924` | Calendar | [52](52.md) |
| `31925` | Calendar Event RSVP | [52](52.md) |
| `31989` | Handler recommendation | [89](89.md) |
| `31990` | Handler information | [89](89.md) |
| `34235` | Video Event | [71](71.md) |
| `34236` | Short-form Portrait Video Event | [71](71.md) |
| `31990` | Handler information | [89](89.md) | |
| `32267` | Software Application | | |
| `34550` | Community Definition | [72](72.md) |
| `37375` | Cashu Wallet Event | [60](60.md) |
| `38383` | Peer-to-peer Order events | [69](69.md) |
@@ -285,8 +290,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `l` | label, label namespace | -- | [32](32.md) |
| `L` | label namespace | -- | [32](32.md) |
| `m` | MIME type | -- | [94](94.md) |
| `p` | pubkey (hex) | relay URL, petname | [01](01.md), [02](02.md) |
| `P` | pubkey (hex) | -- | [57](57.md) |
| `p` | pubkey (hex) | relay URL, petname | [01](01.md), [02](02.md), [22](22.md) |
| `P` | pubkey (hex) | -- | [22](22.md), [57](57.md) |
| `q` | event id (hex) | relay URL, pubkey (hex) | [18](18.md) |
| `r` | a reference (URL, etc) | -- | [24](24.md), [25](25.md) |
| `r` | relay url | marker | [65](65.md) |