From 2f2dead4cc08671b761f5e40f9a38cc32bcb26c5 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 14 Mar 2024 08:38:37 -0400 Subject: [PATCH 01/55] Adds draft event. --- 35.md | 25 +++++++++++++++++++++++++ README.md | 2 ++ 2 files changed, 27 insertions(+) create mode 100644 35.md diff --git a/35.md b/35.md new file mode 100644 index 00000000..ba2c7869 --- /dev/null +++ b/35.md @@ -0,0 +1,25 @@ +NIP-35 +====== + +Draft Events +------------ + +`draft` `optional` + +This NIP defines kind `31234` as a private draft event for any other event kind. + +The draft event is JSON-stringified, [NIP44-encrypted](44.md) to the owner's public key and placed inside the `.content` of the event. + +An additional `k` tag identifies the kind of the draft event. + +```js +{ + "kind": 31234, + "tags": [ + ["d", ""], + ["k", ""], + ], + "content": nip44Encrypt(JSON.stringify(draft_event)), + // other fields +} +``` \ No newline at end of file diff --git a/README.md b/README.md index 90a63949..dce4aaf2 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-31: Dealing with Unknown Events](31.md) - [NIP-32: Labeling](32.md) - [NIP-34: `git` stuff](34.md) +- [NIP-35: Draft Events](35.md) - [NIP-36: Sensitive Content](36.md) - [NIP-38: User Statuses](38.md) - [NIP-39: External Identities in Profiles](39.md) @@ -167,6 +168,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `30402` | Classified Listing | [99](99.md) | | `30403` | Draft Classified Listing | [99](99.md) | | `30617` | Repository announcements | [34](34.md) | +| `31234` | Draft Event | [35](35.md) | | `31922` | Date-Based Calendar Event | [52](52.md) | | `31923` | Time-Based Calendar Event | [52](52.md) | | `31924` | Calendar | [52](52.md) | From f96ccc6e351be0b42d8b8395cc5b2de72f7f8e75 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 14 Mar 2024 08:52:58 -0400 Subject: [PATCH 02/55] Improved wording. --- 35.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/35.md b/35.md index ba2c7869..beff6754 100644 --- a/35.md +++ b/35.md @@ -6,9 +6,9 @@ Draft Events `draft` `optional` -This NIP defines kind `31234` as a private draft event for any other event kind. +This NIP defines kind `31234` as a private wrap for drafts of any other event kind. -The draft event is JSON-stringified, [NIP44-encrypted](44.md) to the owner's public key and placed inside the `.content` of the event. +The draft event is JSON-stringified, [NIP44-encrypted](44.md) to the signer's public key and placed inside the `.content` of the event. An additional `k` tag identifies the kind of the draft event. From f7f060303d25f081b1250761aff7522560270ddb Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 14 Mar 2024 14:07:23 -0400 Subject: [PATCH 03/55] Adds anchor events. --- 35.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/35.md b/35.md index beff6754..476ae36d 100644 --- a/35.md +++ b/35.md @@ -18,8 +18,12 @@ An additional `k` tag identifies the kind of the draft event. "tags": [ ["d", ""], ["k", ""], + ["e", "", ""], + ["a", "", ""], ], "content": nip44Encrypt(JSON.stringify(draft_event)), // other fields } -``` \ No newline at end of file +``` + +Tags `e` and `a` identify one or more anchor events, such as parent events on replies. From 0ed2f63f223f03a171d1aa5c31dbec6bd68ffb6b Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 29 Mar 2024 11:39:19 -0400 Subject: [PATCH 04/55] Getting drafts to be deleted even without relays supporting deletion events. --- 35.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/35.md b/35.md index 476ae36d..4bec44be 100644 --- a/35.md +++ b/35.md @@ -26,4 +26,6 @@ An additional `k` tag identifies the kind of the draft event. } ``` +A blanked `.content` means this draft has been deleted by a client but relays still have the event. + Tags `e` and `a` identify one or more anchor events, such as parent events on replies. From 00b2e0a5cb819f9b2e8135f08d29ee94607d83b6 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 30 May 2024 15:27:59 -0400 Subject: [PATCH 05/55] Adds private outbox relays. --- 35.md | 19 +++++++++++++++++++ README.md | 1 + 2 files changed, 20 insertions(+) diff --git a/35.md b/35.md index 4bec44be..45663dd8 100644 --- a/35.md +++ b/35.md @@ -29,3 +29,22 @@ An additional `k` tag identifies the kind of the draft event. A blanked `.content` means this draft has been deleted by a client but relays still have the event. Tags `e` and `a` identify one or more anchor events, such as parent events on replies. + +## Relay List for Private Content + +Kind `10013` indicates the user's preferred relays to store private events like Drafts. The event MUST include a list of `relay` URLs in private tags. Private tags are JSON Stringified, NIP-44-encrypted to the signer's keys and placed inside the .content of the event. + +```js +{ + "kind": 10013, + "tags": [], + "content": nip44Encrypt(JSON.stringify([ + ["relay", "wss://myrelay.mydomain.com"] + ])) + //...other fields +} +``` + +Relays listed in this event SHOULD be authed and only allow downloads to events signed by the authed user. + +Clients SHOULD publish kind `10013` events to the author's [NIP-65](65.md) `write` relays. diff --git a/README.md b/README.md index dce4aaf2..6cd47788 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10006` | Blocked relays list | [51](51.md) | | `10007` | Search relays list | [51](51.md) | | `10009` | User groups | [51](51.md), [29](29.md) | +| `10013` | Private Relays | [35](35.md) | `10015` | Interests list | [51](51.md) | | `10030` | User emoji list | [51](51.md) | | `10096` | File storage server list | [96](96.md) | From 48674e563865b1cb7bb3c5c7869d20055446f408 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 30 May 2024 15:31:33 -0400 Subject: [PATCH 06/55] moves from NIP-35 to NIP-37 --- 35.md => 37.md | 2 +- README.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename 35.md => 37.md (99%) diff --git a/35.md b/37.md similarity index 99% rename from 35.md rename to 37.md index 45663dd8..1ade59d8 100644 --- a/35.md +++ b/37.md @@ -1,4 +1,4 @@ -NIP-35 +NIP-37 ====== Draft Events diff --git a/README.md b/README.md index 6cd47788..b4626aaf 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-31: Dealing with Unknown Events](31.md) - [NIP-32: Labeling](32.md) - [NIP-34: `git` stuff](34.md) -- [NIP-35: Draft Events](35.md) - [NIP-36: Sensitive Content](36.md) +- [NIP-37: Draft Events](37.md) - [NIP-38: User Statuses](38.md) - [NIP-39: External Identities in Profiles](39.md) - [NIP-40: Expiration Timestamp](40.md) @@ -136,7 +136,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10006` | Blocked relays list | [51](51.md) | | `10007` | Search relays list | [51](51.md) | | `10009` | User groups | [51](51.md), [29](29.md) | -| `10013` | Private Relays | [35](35.md) +| `10013` | Private Relays | [35](37.md) | | `10015` | Interests list | [51](51.md) | | `10030` | User emoji list | [51](51.md) | | `10096` | File storage server list | [96](96.md) | @@ -169,7 +169,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `30402` | Classified Listing | [99](99.md) | | `30403` | Draft Classified Listing | [99](99.md) | | `30617` | Repository announcements | [34](34.md) | -| `31234` | Draft Event | [35](35.md) | +| `31234` | Draft Event | [35](37.md) | | `31922` | Date-Based Calendar Event | [52](52.md) | | `31923` | Time-Based Calendar Event | [52](52.md) | | `31924` | Calendar | [52](52.md) | From 32b9f3f40f2b7842fbcad08a041d9a2205b23de8 Mon Sep 17 00:00:00 2001 From: Roland Bewick Date: Fri, 21 Jun 2024 17:22:32 +0700 Subject: [PATCH 07/55] feat: NIP-47 notifications --- 47.md | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 116 insertions(+), 12 deletions(-) diff --git a/47.md b/47.md index 90338477..97b06ab3 100644 --- a/47.md +++ b/47.md @@ -8,32 +8,42 @@ Nostr Wallet Connect ## Rationale -This NIP describes a way for clients to access a remote Lightning wallet through a standardized protocol. Custodians may implement this, or the user may run a bridge that bridges their wallet/node and the Nostr Wallet Connect protocol. +This NIP describes a way for clients to access a remote lightning wallet through a standardized protocol. Custodians may implement this, or the user may run a bridge that bridges their wallet/node and the Nostr Wallet Connect protocol. ## Terms -* **client**: Nostr app on any platform that wants to pay Lightning invoices. -* **user**: The person using the **client**, and want's to connect their wallet app to their **client**. +* **client**: Nostr app on any platform that wants to interact with a lightning wallet. +* **user**: The person using the **client**, and wants to connect their wallet to their **client**. * **wallet service**: Nostr app that typically runs on an always-on computer (eg. in the cloud or on a Raspberry Pi). This app has access to the APIs of the wallets it serves. ## Theory of Operation - 1. **Users** who wish to use this NIP to send lightning payments to other nostr users must first acquire a special "connection" URI from their NIP-47 compliant wallet application. The wallet application may provide this URI using a QR screen, or a pasteable string, or some other means. + 1. **Users** who wish to use this NIP to allow **client(s)** to interact with their wallet must first acquire a special "connection" URI from their NIP-47 compliant wallet application. The wallet application may provide this URI using a QR screen, or a pasteable string, or some other means. - 2. The **user** should then copy this URI into their **client(s)** by pasting, or scanning the QR, etc. The **client(s)** should save this URI and use it later whenever the **user** makes a payment. The **client** should then request an `info` (13194) event from the relay(s) specified in the URI. The **wallet service** will have sent that event to those relays earlier, and the relays will hold it as a replaceable event. + 2. The **user** should then copy this URI into their **client(s)** by pasting, or scanning the QR, etc. The **client(s)** should save this URI and use it later whenever the **user** (or the **client** on the user's behalf) wants to interact with the wallet. The **client** should then request an `info` (13194) event from the relay(s) specified in the URI. The **wallet service** will have sent that event to those relays earlier, and the relays will hold it as a replaceable event. 3. When the **user** initiates a payment their nostr **client** create a `pay_invoice` request, encrypts it using a token from the URI, and sends it (kind 23194) to the relay(s) specified in the connection URI. The **wallet service** will be listening on those relays and will decrypt the request and then contact the **user's** wallet application to send the payment. The **wallet service** will know how to talk to the wallet application because the connection URI specified relay(s) that have access to the wallet app API. - 4. Once the payment is complete the **wallet service** will send an encrypted `response` (kind 23195) to the **user** over the relay(s) in the URI. + 4. Once the payment is complete the **wallet service** will send an encrypted `response` (kind 23195) to the **user** over the relay(s) in the URI. + + 5. The **wallet service** may send encrypted notifications (kind 23196) of wallet events (such as a received payment) to the **client**. ## Events -There are three event kinds: +There are four event kinds: - `NIP-47 info event`: 13194 - `NIP-47 request`: 23194 - `NIP-47 response`: 23195 +- `NIP-47 notification event`: 23196 -The info event should be a replaceable event that is published by the **wallet service** on the relay to indicate which commands it supports. The content should be -a plaintext string with the supported commands, space-separated, eg. `pay_invoice get_balance`. Only the `pay_invoice` command is described in this NIP, but other commands might be defined in different NIPs. +### Info Event + +The info event should be a replaceable event that is published by the **wallet service** on the relay to indicate which capabilities it supports. + +The content should be a plaintext string with the supported capabilities space-separated, eg. `pay_invoice get_balance notifications`. + +If the **wallet service** supports notifications, the info event SHOULD contain a `notifications` tag with the supported notification types space-separated, eg. `payment_received payment_sent`. + +### Request and Response Events Both the request and response events SHOULD contain one `p` tag, containing the public key of the **wallet service** if this is a request, and the public key of the **user** if this is a response. The response event SHOULD contain an `e` tag with the id of the request event it is responding to. Optionally, a request can have an `expiration` tag that has a unix timestamp in seconds. If the request is received after this timestamp, it should be ignored. @@ -68,6 +78,22 @@ The `result_type` field MUST contain the name of the method that this event is r The `error` field MUST contain a `message` field with a human readable error message and a `code` field with the error code if the command was not successful. If the command was successful, the `error` field must be null. +### Notification Events + +The notification event SHOULD contain one `p` tag, the public key of the **user**. + +The content of notifications is encrypted with [NIP04](https://github.com/nostr-protocol/nips/blob/master/04.md), and is a JSON-RPCish object with a semi-fixed structure: + +```jsonc +{ + "notification_type": "payment_received", //indicates the structure of the notification field + "notification": { + "payment_hash": "0123456789abcdef..." // notification-related data + } +} +``` + + ### Error codes - `RATE_LIMITED`: The client is sending commands too fast. It should retry in a few seconds. - `NOT_IMPLEMENTED`: The command is not known or is intentionally not implemented. @@ -120,7 +146,8 @@ Response: { "result_type": "pay_invoice", "result": { - "preimage": "0123456789abcdef..." // preimage of the payment + "preimage": "0123456789abcdef...", // preimage of the payment + "fees_paid": 123, // value in msats, optional } } ``` @@ -155,7 +182,8 @@ payment hash of the invoice should be used. { "result_type": "multi_pay_invoice", "result": { - "preimage": "0123456789abcdef..." // preimage of the payment + "preimage": "0123456789abcdef...", // preimage of the payment + "fees_paid": 123, // value in msats, optional } } ``` @@ -189,6 +217,7 @@ Response: "result_type": "pay_keysend", "result": { "preimage": "0123456789abcdef...", // preimage of the payment + "fees_paid": 123, // value in msats, optional } } ``` @@ -225,7 +254,8 @@ pubkey should be used. { "result_type": "multi_pay_keysend", "result": { - "preimage": "0123456789abcdef..." // preimage of the payment + "preimage": "0123456789abcdef...", // preimage of the payment + "fees_paid": 123, // value in msats, optional } } ``` @@ -396,6 +426,59 @@ Response: "block_height": 1, "block_hash": "hex string", "methods": ["pay_invoice", "get_balance", "make_invoice", "lookup_invoice", "list_transactions", "get_info"], // list of supported methods for this connection + "notifications": ["payment_received", "payment_sent"], // list of supported notifications for this connection, optional. + } +} +``` + +## Notifications + +### `payment_received` + +Description: A payment was successfully received by the wallet. + +Notification: +```jsonc +{ + "notification_type": "payment_received", + "notification": { + "type": "incoming", + "invoice": "string", // encoded invoice + "description": "string", // invoice's description, optional + "description_hash": "string", // invoice's description hash, optional + "preimage": "string", // payment's preimage + "payment_hash": "string", // Payment hash for the payment + "amount": 123, // value in msats + "fees_paid": 123, // value in msats + "created_at": unixtimestamp, // invoice/payment creation time + "expires_at": unixtimestamp, // invoice expiration time, optional if not applicable + "settled_at": unixtimestamp, // invoice/payment settlement time + "metadata": {} // generic metadata that can be used to add things like zap/boostagram details for a payer name/comment/etc. + } +} +``` + +### `payment_sent` + +Description: A payment was successfully sent by the wallet. + +Notification: +```jsonc +{ + "notification_type": "payment_sent", + "notification": { + "type": "outgoing", + "invoice": "string", // encoded invoice + "description": "string", // invoice's description, optional + "description_hash": "string", // invoice's description hash, optional + "preimage": "string", // payment's preimage + "payment_hash": "string", // Payment hash for the payment + "amount": 123, // value in msats + "fees_paid": 123, // value in msats + "created_at": unixtimestamp, // invoice/payment creation time + "expires_at": unixtimestamp, // invoice expiration time, optional if not applicable + "settled_at": unixtimestamp, // invoice/payment settlement time + "metadata": {} // generic metadata that can be used to add things like zap/boostagram details for a payer name/comment/etc. } } ``` @@ -409,3 +492,24 @@ Response: ## Using a dedicated relay This NIP does not specify any requirements on the type of relays used. However, if the user is using a custodial service it might make sense to use a relay that is hosted by the custodial service. The relay may then enforce authentication to prevent metadata leaks. Not depending on a 3rd party relay would also improve reliability in this case. + +## Appendix + +### Example NIP-47 info event + +```jsonc +{ + "id": "df467db0a9f9ec77ffe6f561811714ccaa2e26051c20f58f33c3d66d6c2b4d1c", + "pubkey": "c04ccd5c82fc1ea3499b9c6a5c0a7ab627fbe00a0116110d4c750faeaecba1e2", + "created_at": 1713883677, + "kind": 13194, + "tags": [ + [ + "notifications", + "payment_received payment_sent" + ] + ], + "content": "pay_invoice pay_keysend get_balance get_info make_invoice lookup_invoice list_transactions multi_pay_invoice multi_pay_keysend sign_message notifications", + "sig": "31f57b369459b5306a5353aa9e03be7fbde169bc881c3233625605dd12f53548179def16b9fe1137e6465d7e4d5bb27ce81fd6e75908c46b06269f4233c845d8" +} +``` From 66c5cc637f118add2d2cade2210d21da7e25917b Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 27 Oct 2024 19:43:43 -0400 Subject: [PATCH 08/55] Instagram feeds --- 68.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 68.md diff --git a/68.md b/68.md new file mode 100644 index 00000000..22509e06 --- /dev/null +++ b/68.md @@ -0,0 +1,70 @@ +NIP-68 +====== + +Picture-first feeds +------------------- + +`draft` `optional` + +This NIP defines event kind `20` for picture-first clients. Images must be self-contained. They are hosted externally and referenced using `imeta` tags + +Unlike a `kind 1` event with a pircture attached, Picture events are meant to contain all additional metadata concerning the subject media and to be surfaced in picture-specific clients rather than general micro-blogging clients. The thought is for events of this kind to be referenced in a Instagram/Flickr/Snapshat/9gag like nostr client where the picture itself is at the center of the experience. + +## Picture Events + +Picture events contain a `title` tag and description in the `.content`. + +They may contain multiple images to be displayed as a single post. + +```jsonc +{ + "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": , + "kind": 20, + "content": "", + "tags": [ + ["title", ""], + + // Picture Data + [ + "imeta", + "url https://nostr.build/i/my-image.jpg", + "m image/jpeg", + "blurhash eVF$^OI:${M{o#*0-nNFxakD-?xVM}WEWB%iNKxvR-oetmo#R-aen$", + "dim 3024x4032", + "alt A scenic photo overlooking the coast of Costa Rica", + "x ", + "fallback https://nostrcheck.me/alt1.jpg", + "fallback https://void.cat/alt1.jpg" + ], + [ + "imeta", + "url https://nostr.build/i/my-image2.jpg", + "m image/jpeg", + "blurhash eVF$^OI:${M{o#*0-nNFxakD-?xVM}WEWB%iNKxvR-oetmo#R-aen$", + "dim 3024x4032", + "alt Another scenic photo overlooking the coast of Costa Rica", + "x ", + "fallback https://nostrcheck.me/alt2.jpg", + "fallback https://void.cat/alt2.jpg", + + "annotate-user <32-bytes hex of a pubkey>::" // Tag users in specific locations in the picture + ], + + ["content-warning", ""], // if NSFW + + // Tagged users + ["p", "<32-bytes hex of a pubkey>", ""], + ["p", "<32-bytes hex of a pubkey>", ""], + + // Hashtags + ["t", ""], + ["t", ""], + ] +} +``` + +The `imeta` tag `annotate-user` places a user link in the specific position in the image. + +Picture events might be used with [NIP-71](71.md)'s kind `34236` to display short vertical videos in the same feed. \ No newline at end of file From 9517ac6f5dfac58bd7237777680c557bd518dc84 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 27 Oct 2024 20:30:27 -0400 Subject: [PATCH 09/55] Enforces certain media types --- 68.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/68.md b/68.md index 22509e06..dcc56f13 100644 --- a/68.md +++ b/68.md @@ -58,6 +58,9 @@ They may contain multiple images to be displayed as a single post. ["p", "<32-bytes hex of a pubkey>", ""], ["p", "<32-bytes hex of a pubkey>", ""], + // Specify the media type for filters to allow clients to filter by supported kinds + ["m", "image/jpeg"] + // Hashtags ["t", ""], ["t", ""], @@ -67,4 +70,12 @@ 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: +- `image/apng`: Animated Portable Network Graphics (APNG) +- `image/avif`: AV1 Image File Format (AVIF) +- `image/gif`: Graphics Interchange Format (GIF) +- `image/jpeg`: Joint Photographic Expert Group image (JPEG) +- `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. \ No newline at end of file From 5c7aad212ea44605d64e360be89ea5a1d843a3f8 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 28 Oct 2024 15:51:54 -0400 Subject: [PATCH 10/55] Adds language tag for images that contain text. --- 68.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/68.md b/68.md index dcc56f13..0ba4459b 100644 --- a/68.md +++ b/68.md @@ -64,6 +64,10 @@ They may contain multiple images to be displayed as a single post. // Hashtags ["t", ""], ["t", ""], + + // When text is written in the image, add the tag to represent the language + ["L", "ISO-639-1"], + ["l", "en", "ISO-639-1"] ] } ``` From 82291c6afda8498ac6f4ddb1d14289f9edb8f8ae Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 30 Oct 2024 11:50:21 -0400 Subject: [PATCH 11/55] adds location --- 68.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/68.md b/68.md index 0ba4459b..8a878484 100644 --- a/68.md +++ b/68.md @@ -65,6 +65,10 @@ They may contain multiple images to be displayed as a single post. ["t", ""], ["t", ""], + // location + ["location", ""], // city name, state, country + ["g", ""], + // When text is written in the image, add the tag to represent the language ["L", "ISO-639-1"], ["l", "en", "ISO-639-1"] From a8dfdff753a30f0845d6b9729cdbae3ad37a3f8e Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 15 Nov 2024 08:15:30 -0500 Subject: [PATCH 12/55] Adds x tag to index by sha256 Co-authored-by: Pablo Fernandez --- 68.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/68.md b/68.md index 8a878484..29507126 100644 --- a/68.md +++ b/68.md @@ -59,7 +59,8 @@ They may contain multiple images to be displayed as a single post. ["p", "<32-bytes hex of a pubkey>", ""], // Specify the media type for filters to allow clients to filter by supported kinds - ["m", "image/jpeg"] + ["m", "image/jpeg"], + ["x", ""] // Hashtags ["t", ""], From dfd2c2b8ca86821485f9bbcd3b1397e211c294e5 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 15 Nov 2024 08:28:54 -0500 Subject: [PATCH 13/55] Minor changes to simplify the text --- 68.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/68.md b/68.md index 29507126..6c1e7d2d 100644 --- a/68.md +++ b/68.md @@ -6,9 +6,9 @@ Picture-first feeds `draft` `optional` -This NIP defines event kind `20` for picture-first clients. Images must be self-contained. They are hosted externally and referenced using `imeta` tags +This NIP defines event kind `20` for picture-first clients. Images must be self-contained. They are hosted externally and referenced using `imeta` tags. -Unlike a `kind 1` event with a pircture attached, Picture events are meant to contain all additional metadata concerning the subject media and to be surfaced in picture-specific clients rather than general micro-blogging clients. The thought is for events of this kind to be referenced in a Instagram/Flickr/Snapshat/9gag like nostr client where the picture itself is at the center of the experience. +The idea is for this type of event to cater to Nostr clients resembling platforms like Instagram, Flickr, Snapchat, or 9GAG, where the picture itself takes center stage in the user experience. ## Picture Events @@ -60,6 +60,8 @@ They may contain multiple images to be displayed as a single post. // Specify the media type for filters to allow clients to filter by supported kinds ["m", "image/jpeg"], + + // Hashes of each image to make them queryable ["x", ""] // Hashtags @@ -87,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. \ No newline at end of file +Picture events might be used with [NIP-71](71.md)'s kind `34236` to display short vertical videos in the same feed. From bbcea0c86175fd344132964345944d3479c3d4d0 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 19 Nov 2024 21:20:20 -0500 Subject: [PATCH 14/55] adds pronouns --- 24.md | 1 + 1 file changed, 1 insertion(+) diff --git a/24.md b/24.md index 1afa7c7a..d65d9ced 100644 --- a/24.md +++ b/24.md @@ -17,6 +17,7 @@ These are extra fields not specified in NIP-01 that may be present in the string - `website`: a web URL related in any way to the event author. - `banner`: an URL to a wide (~1024x768) picture to be optionally displayed in the background of a profile screen. - `bot`: a boolean to clarify that the content is entirely or partially the result of automation, such as with chatbots or newsfeeds. + - `pronouns`: a string representing the preferred way to refer to this person. ### Deprecated fields From 1e47fd75572704b84cf484ce52394fc7ea7d4067 Mon Sep 17 00:00:00 2001 From: hodlbod Date: Thu, 21 Nov 2024 06:55:23 -0800 Subject: [PATCH 15/55] Break out chat and threads from nip 29 (#1591) --- 29.md | 34 +--------------------------------- 7D.md | 34 ++++++++++++++++++++++++++++++++++ C7.md | 29 +++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 33 deletions(-) create mode 100644 7D.md create mode 100644 C7.md diff --git a/29.md b/29.md index a1164332..a2c8ef26 100644 --- a/29.md +++ b/29.md @@ -64,39 +64,7 @@ These are the events expected to be found in NIP-29 groups. ### Normal user-created events -These events generally can be sent by all members of a group and they require the `h` tag to be present so they're attached to a specific group. - -- _chat message_ (`kind:9`) - -This is the basic unit of a _chat message_ sent to a group. - -```jsonc - "kind": 9, - "content": "hello my friends lovers of pizza", - "tags": [ - ["h", ""], - ["previous", "", "", /*...*/] - ] - // other fields... -``` - -- _thread root post_ (`kind:11`) - -This is the basic unit of a forum-like root thread post sent to a group. - -```jsonc - "kind": 11, - "content": "hello my friends lovers of pizza", - "tags": [ - ["h", ""], - ["previous", "", "", /*...*/] - ] - // other fields... -``` - -- _other events_: - -Groups may also accept other events, like [NIP-22](22.md) comments as threaded replies to both chats messages and threads, long-form articles, calendar, livestreams, market announcements and so on. These should be as defined in their respective NIPs, with the addition of the `h` tag. +Groups may accept any event kind, including chats, threads, long-form articles, calendar, livestreams, market announcements and so on. These should be as defined in their respective NIPs, with the addition of the `h` tag. ### User-related group management events diff --git a/7D.md b/7D.md new file mode 100644 index 00000000..d8509a6c --- /dev/null +++ b/7D.md @@ -0,0 +1,34 @@ +NIP-7D +====== + +Threads +------- + +`draft` `optional` + +A thread is a `kind 11` event. Threads SHOULD include a `subject` with a summary +of the thread's topic. + +```json +{ + "kind": 11, + "content": "Good morning", + "tags": [ + ["subject", "GM"] + ] +} +``` + +Replies to `kind 11` MUST use [NIP-22](./22.md) `kind 1111` comments. Replies should +always be to the root `kind 11` to avoid arbitrarily nested reply hierarchies. + +```json +{ + "kind": 1111, + "content": "Cool beans", + "tags": [ + ["K", "11"], + ["E", , , ] + ] +} +``` diff --git a/C7.md b/C7.md new file mode 100644 index 00000000..0d94f18b --- /dev/null +++ b/C7.md @@ -0,0 +1,29 @@ +NIP-C7 +====== + +Chats +----- + +`draft` `optional` + +A chat message is a `kind 9` event. + +```json +{ + "kind": 9, + "content": "GM", + "tags": [] +} +``` + +A reply to a `kind 9` is an additional `kind 9` which quotes the parent using a `q` tag. + +```json +{ + "kind": 9, + "content": "nostr:nevent1...\nyes", + "tags": [ + ["q", , , ] + ] +} +``` From 03c64a6e959ae91b727bcaea8198d08ee4860359 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Thu, 21 Nov 2024 12:11:13 -0300 Subject: [PATCH 16/55] nip24: revert improperly merged joke. this reverts https://github.com/nostr-protocol/nips/pull/1590 --- 24.md | 1 - 1 file changed, 1 deletion(-) diff --git a/24.md b/24.md index d65d9ced..1afa7c7a 100644 --- a/24.md +++ b/24.md @@ -17,7 +17,6 @@ These are extra fields not specified in NIP-01 that may be present in the string - `website`: a web URL related in any way to the event author. - `banner`: an URL to a wide (~1024x768) picture to be optionally displayed in the background of a profile screen. - `bot`: a boolean to clarify that the content is entirely or partially the result of automation, such as with chatbots or newsfeeds. - - `pronouns`: a string representing the preferred way to refer to this person. ### Deprecated fields From ef1746dd2cea9ec5d62d00f16f0fd5695d895d0b Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Thu, 21 Nov 2024 12:11:32 -0300 Subject: [PATCH 17/55] nip24: clarify nip purpose. --- 24.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/24.md b/24.md index 1afa7c7a..df3a9323 100644 --- a/24.md +++ b/24.md @@ -6,7 +6,7 @@ Extra metadata fields and tags `draft` `optional` -This NIP defines extra optional fields added to events. +This NIP keeps track of extra optional fields that can added to events which are not defined anywhere else but have become _de facto_ standards and other minor implementation possibilities that do not deserve their own NIP and do not have a place in other NIPs. kind 0 ====== From 7976f8ab777a2bb6359ed64171309b4a0663bdf4 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Thu, 21 Nov 2024 08:48:32 -0800 Subject: [PATCH 18/55] Clarify nostrconnect metadata --- 46.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/46.md b/46.md index ce6764da..824059c1 100644 --- a/46.md +++ b/46.md @@ -45,15 +45,25 @@ _remote-signer_ provides connection token in the form: bunker://?relay=&relay=&secret= ``` -_user_ passes this token to _client_, which then sends `connect` request to _remote-signer_ via the specified relays. Optional secret can be used for single successfully established connection only, _remote-signer_ SHOULD ignore new attempts to establish connection with old secret. +_user_ passes this token to _client_, which then sends `connect` request to _remote-signer_ via the specified relays. Optional secret can be used for single successfully established connection only, _remote-signer_ SHOULD ignore new attempts to establish connection with old secret. ### Direct connection initiated by the _client_ -_client_ provides a connection token in the form: +_client_ provides a connection token using `nostrconnect://` as the protocol, and `client-pubkey` as the origin. Additional information should be passed as query parameters: + +- `relay` (required) - one or more relay urls on which the _client_ is listening for responses from the _remote-signer_. +- `secret` (required) - a short random string that the _remote-signer_ should return as the `result` field of its response. +- `perms` (optional) - a comma-separated list of permissions the _client_ is requesting be approved by the _remote-signer_ +- `name` (optional) - the name of the _client_ application +- `url` (optional) - the canonical url of the _client_ application +- `image` (optional) - a small image representing the _client_ application + +Here's an example: ``` -nostrconnect://?relay=&metadata=&secret= +nostrconnect://83f3b2ae6aa368e8275397b9c26cf550101d63ebaab900d19dd4a4429f5ad8f5?relay=wss%3A%2F%2Frelay1.example.com&perms=nip44_encrypt%2Cnip44_decrypt%2Csign_event%3A13%2Csign_event%3A14%2Csign_event%3A1059&name=My+Client&secret=0s8j2djs&relay=wss%3A%2F%2Frelay2.example2.com ``` + _user_ passes this token to _remote-signer_, which then sends `connect` *response* event to the `client-pubkey` via the specified relays. Client discovers `remote-signer-pubkey` from connect response author. `secret` value MUST be provided to avoid connection spoofing, _client_ MUST validate the `secret` returned by `connect` response. ## Request Events `kind: 24133` From d09b51246d7d5757b5e78ef1cc18e8925561d42f Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 22 Nov 2024 14:09:12 -0800 Subject: [PATCH 19/55] Tweak group join requests to include user feedback --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/29.md b/29.md index a2c8ef26..93dc3d29 100644 --- a/29.md +++ b/29.md @@ -72,7 +72,7 @@ These are events that can be sent by users to manage their situation in a group, - *join request* (`kind:9021`) -Any user can send one of these events to the relay in order to be automatically or manually added to the group. If the group is `open` the relay will automatically issue a `kind:9000` in response adding this user. Otherwise group admins may choose to query for these requests and act upon them. +Any user can send a kind `9021` event to the relay in order to request admission to the group. Relays MUST reject the request if the user has not been added to the group. The accompanying error message SHOULD explain whether the rejection is final, if the request is pending review, or if some other special handling is relevant (e.g. if payment is required). If a user is already a member, the event MUST be accepted. ```json { From 4d47b38dbc0c2e09d235972f59a4338a7bb37cc0 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Sat, 23 Nov 2024 07:09:25 -0800 Subject: [PATCH 20/55] Switch to rejecting duplicate joins --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/29.md b/29.md index 93dc3d29..7705c6db 100644 --- a/29.md +++ b/29.md @@ -72,7 +72,7 @@ These are events that can be sent by users to manage their situation in a group, - *join request* (`kind:9021`) -Any user can send a kind `9021` event to the relay in order to request admission to the group. Relays MUST reject the request if the user has not been added to the group. The accompanying error message SHOULD explain whether the rejection is final, if the request is pending review, or if some other special handling is relevant (e.g. if payment is required). If a user is already a member, the event MUST be accepted. +Any user can send a kind `9021` event to the relay in order to request admission to the group. Relays MUST reject the request if the user has not been added to the group. The accompanying error message SHOULD explain whether the rejection is final, if the request is pending review, or if some other special handling is relevant (e.g. if payment is required). If a user is already a member, the event MUST be rejected with `duplicate: ` as the error message prefix. ```json { From 43767e1e531de51874889b4eab905409192c404e Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 22 Nov 2024 13:55:23 -0800 Subject: [PATCH 21/55] Add support for naming unmanaged groups --- 29.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/29.md b/29.md index a2c8ef26..331047f7 100644 --- a/29.md +++ b/29.md @@ -22,15 +22,15 @@ Relays are supposed to generate the events that describe group metadata and grou A group may be identified by a string in the format `'`. For example, a group with _id_ `abcdef` hosted at the relay `wss://groups.nostr.com` would be identified by the string `groups.nostr.com'abcdef`. -Group identifiers must be strings restricted to the characters `a-z0-9-_`. +Group identifiers must be strings restricted to the characters `a-z0-9-_`, and SHOULD be random in order to avoid name collisions. -When encountering just the `` without the `'`, clients can choose to connect to the group with id `_`, which is a special top-level group dedicated to relay-local discussions. - -Group identifiers in most cases should be random or pseudo-random, as that mitigates message replay confusion and ensures they can be migrated or forked to other relays easily without risking conflicting with other groups using the same id in these new relays. This isn't a hard rule, as, for example, in `unmanaged` and/or ephemeral relays groups might not want to migrate ever, so they might not care about this. Notably, the `_` relay-local group isn't expected to be migrated ever. +When encountering just the `` without the `'`, clients MAY infer `_` as the group id, which is a special top-level group dedicated to relay-local discussions. ## The `h` tag -Events sent by users to groups (chat messages, text notes, moderation events etc) must have an `h` tag with the value set to the group _id_. +Events sent by users to groups (chat messages, text notes, moderation events etc) MUST have an `h` tag with the value set to the group _id_. + +`h` tags MAY include the group's name as the second argument. This allows `unmanaged` groups to be assigned human-readable names without relay support. ## Timeline references @@ -241,4 +241,4 @@ A definition for `kind:10009` was included in [NIP-51](51.md) that allows client ### Using `unmanaged` relays -To prevent event leakage, replay and confusion, when using `unmanaged` relays, clients should include the [NIP-70](70.md) `-` tag, as just the `previous` tag won't be checked by other `unmanaged` relays. +To prevent event leakage, when using `unmanaged` relays, clients should include the [NIP-70](70.md) `-` tag, as just the `previous` tag won't be checked by other `unmanaged` relays. From 0e44178961b36909338d3dca37ed3cba4a41e7f6 Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Tue, 26 Nov 2024 00:34:00 +0900 Subject: [PATCH 22/55] update related to NIP-29. --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cbd45cfb..5d1a47dc 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-96: HTTP File Storage Integration](96.md) - [NIP-98: HTTP Auth](98.md) - [NIP-99: Classified Listings](99.md) +- [NIP-7D: Threads](7D.md) +- [NIP-C7: Chats](C7.md) ## Event Kinds @@ -107,9 +109,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `6` | Repost | [18](18.md) | | `7` | Reaction | [25](25.md) | | `8` | Badge Award | [58](58.md) | -| `9` | Group Chat Message | [29](29.md) | +| `9` | Chat Message | [C7](C7.md) | | `10` | Group Chat Threaded Reply | 29 (deprecated) | -| `11` | Group Thread | [29](29.md) | +| `11` | Thread | [7D](7D.md) | | `12` | Group Thread Reply | 29 (deprecated) | | `13` | Seal | [59](59.md) | | `14` | Direct Message | [17](17.md) | From 73f65133fcdcbf9f4d27cc7097963797c6250cd7 Mon Sep 17 00:00:00 2001 From: fiatjaf_ Date: Mon, 25 Nov 2024 13:21:47 -0300 Subject: [PATCH 23/55] add NIP-86: Relay Management API (#1325) Co-authored-by: Alex Gleason --- 86.md | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 91 insertions(+) create mode 100644 86.md diff --git a/86.md b/86.md new file mode 100644 index 00000000..6f64eee7 --- /dev/null +++ b/86.md @@ -0,0 +1,90 @@ +NIP-86 +====== + +Relay Management API +-------------------- + +`draft` `optional` + +Relays may provide an API for performing management tasks. This is made available as a JSON-RPC-like request-response protocol over HTTP, on the same URI as the relay's websocket. + +When a relay receives an HTTP(s) request with a `Content-Type` header of `application/nostr+json+rpc` to a URI supporting WebSocket upgrades, it should parse the request as a JSON document with the following fields: + +```json +{ + "method": "", + "params": ["", "", ""] +} +``` + +Then it should return a response in the format + +```json +{ + "result": {"": ""}, + "error": "" +} +``` + +This is the list of **methods** that may be supported: + +* `supportedmethods`: + - params: `[]` + - result: `["", "", ...]` (an array with the names of all the other supported methods) +* `banpubkey`: + - params: `["<32-byte-hex-public-key>", ""]` + - result: `true` (a boolean always set to `true`) +* `listbannedpubkeys`: + - params: `[]` + - result: `[{"pubkey": "<32-byte-hex>", "reason": ""}, ...]`, an array of objects +* `allowpubkey`: + - params: `["<32-byte-hex-public-key>", ""]` + - result: `true` (a boolean always set to `true`) +* `listallowedpubkeys`: + - params: `[]` + - result: `[{"pubkey": "<32-byte-hex>", "reason": ""}, ...]`, an array of objects +* `listeventsneedingmoderation`: + - params: `[]` + - result: `[{"id": "<32-byte-hex>", "reason": ""}]`, an array of objects +* `allowevent`: + - params: `["<32-byte-hex-event-id>", ""]` + - result: `true` (a boolean always set to `true`) +* `banevent`: + - params: `["<32-byte-hex-event-id>", ""]` + - result: `true` (a boolean always set to `true`) +* `listbannedevents`: + - params: `[]` + - result: `[{"id": "<32-byte hex>", "reason": ""}, ...]`, an array of objects +* `changerelayname`: + - params: `[""]` + - result: `true` (a boolean always set to `true`) +* `changerelaydescription`: + - params: `[""]` + - result: `true` (a boolean always set to `true`) +* `changerelayicon`: + - params: `[""]` + - result: `true` (a boolean always set to `true`) +* `allowkind`: + - params: `[]` + - result: `true` (a boolean always set to `true`) +* `disallowkind`: + - params: `[]` + - result: `true` (a boolean always set to `true`) +* `listallowedkinds`: + - params: `[]` + - result: `[, ...]`, an array of numbers +* `blockip`: + - params: `["", ""]` + - result: `true` (a boolean always set to `true`) +* `unblockip`: + - params: `[""]` + - result: `true` (a boolean always set to `true`) +* `listblockedips`: + - params: `[]` + - result: `[{"ip": "", "reason": ""}, ...]`, an array of objects + +### Authorization + +The request must contain an `Authorization` header with a valid [NIP-98](./98.md) event, except the `payload` tag is required. The `u` tag is the relay URL. + +If `Authorization` is not provided or is invalid, the endpoint should return a 401 response. diff --git a/README.md b/README.md index 5d1a47dc..9ef9fec3 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-75: Zap Goals](75.md) - [NIP-78: Application-specific data](78.md) - [NIP-84: Highlights](84.md) +- [NIP-86: Relay Management API](86.md) - [NIP-89: Recommended Application Handlers](89.md) - [NIP-90: Data Vending Machines](90.md) - [NIP-92: Media Attachments](92.md) From 64624a62eac4b2ee3e6b9da34c1aa77a33e20852 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 22 Nov 2024 13:58:49 -0800 Subject: [PATCH 24/55] Add r to kind 10009 --- 51.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/51.md b/51.md index 3792d7fe..4c0b1f47 100644 --- a/51.md +++ b/51.md @@ -29,7 +29,7 @@ For example, _mute list_ can contain the public keys of spammers and bad actors | 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 ids + mandatory relay URL) | +| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group id + relay URL), `"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)) | From 821614aee1f0d7e6f618c5df6e626ea5981a906b Mon Sep 17 00:00:00 2001 From: Jesus Christ <120573631+Gudnessuche@users.noreply.github.com> Date: Wed, 27 Nov 2024 14:43:00 +0000 Subject: [PATCH 25/55] multi_pay_invoice method Response error (grammatical) The response section that explained how the multi_pay_invoice method worked had a grammatical error of explaining the differentiation between requests. changed ".....contains an d tag" to "...contains a d tag" --- 47.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/47.md b/47.md index 71cd0763..d1030a47 100644 --- a/47.md +++ b/47.md @@ -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 an `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 From 6acf1c780a3fb348c6e5684f9eef3e98ffb3d156 Mon Sep 17 00:00:00 2001 From: stl1988 <35177539+stl1988@users.noreply.github.com> Date: Wed, 27 Nov 2024 23:28:50 +0100 Subject: [PATCH 26/55] Update README.md Add NIP-68 to the list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9ef9fec3..d362e6a1 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-61: Nutzaps](61.md) - [NIP-64: Chess (PGN)](64.md) - [NIP-65: Relay List Metadata](65.md) +- [NIP-68: Picture-first feeds](68.md) - [NIP-69: Peer-to-peer Order events](69.md) - [NIP-70: Protected Events](70.md) - [NIP-71: Video Events](71.md) From aa2342bd9da9dcef382fbaf4c73060767b3eeab1 Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Thu, 28 Nov 2024 20:24:01 +0900 Subject: [PATCH 27/55] Update BREAKING.md (#1615) --- BREAKING.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/BREAKING.md b/BREAKING.md index b4bd53d7..c7ae2dfe 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -5,6 +5,11 @@ reverse chronological order. | Date | Commit | NIP | Change | | ----------- | --------- | -------- | ------ | +| 2024-11-12 | [2838e3bd](https://github.com/nostr-protocol/nips/commit/2838e3bd) | [NIP-29](29.md) | `kind: 12` and `kind: 10` were removed (use `kind: 1111` instead) | +| 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [NIP-46](46.md) | NIP-05 login was removed | +| 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [NIP-46](46.md) | `create_account` method was removed | +| 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [NIP-46](46.md) | `connect` params and result were changed | +| 2024-10-29 | [f1e8d2c4](https://github.com/nostr-protocol/nips/commit/f1e8d2c4) | [NIP-46](46.md) | bunker URL should use `remote-signer-key` | | 2024-10-15 | [1cda2dcc](https://github.com/nostr-protocol/nips/commit/1cda2dcc) | [NIP-71](71.md) | some tags were replaced with `imeta` tag | | 2024-10-15 | [1cda2dcc](https://github.com/nostr-protocol/nips/commit/1cda2dcc) | [NIP-71](71.md) | `kind: 34237` was dropped | | 2024-10-07 | [7bb8997b](https://github.com/nostr-protocol/nips/commit/7bb8997b) | [NIP-55](55.md) | some fields and passing data were changed | @@ -60,4 +65,3 @@ Breaking changes prior to 2023-03-01 are not yet documented. - If it isn't clear that a change is breaking or not, we list it. - The date is the date it was merged, not necessarily the date of the commit. - From 0352f8487db8046542bbc04ba02e6153d34968be Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Thu, 28 Nov 2024 23:45:47 +0900 Subject: [PATCH 28/55] remove "NIP-" prefixes. --- BREAKING.md | 106 ++++++++++++++++++++++++++-------------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/BREAKING.md b/BREAKING.md index c7ae2dfe..40391e05 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -5,59 +5,59 @@ reverse chronological order. | Date | Commit | NIP | Change | | ----------- | --------- | -------- | ------ | -| 2024-11-12 | [2838e3bd](https://github.com/nostr-protocol/nips/commit/2838e3bd) | [NIP-29](29.md) | `kind: 12` and `kind: 10` were removed (use `kind: 1111` instead) | -| 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [NIP-46](46.md) | NIP-05 login was removed | -| 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [NIP-46](46.md) | `create_account` method was removed | -| 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [NIP-46](46.md) | `connect` params and result were changed | -| 2024-10-29 | [f1e8d2c4](https://github.com/nostr-protocol/nips/commit/f1e8d2c4) | [NIP-46](46.md) | bunker URL should use `remote-signer-key` | -| 2024-10-15 | [1cda2dcc](https://github.com/nostr-protocol/nips/commit/1cda2dcc) | [NIP-71](71.md) | some tags were replaced with `imeta` tag | -| 2024-10-15 | [1cda2dcc](https://github.com/nostr-protocol/nips/commit/1cda2dcc) | [NIP-71](71.md) | `kind: 34237` was dropped | -| 2024-10-07 | [7bb8997b](https://github.com/nostr-protocol/nips/commit/7bb8997b) | [NIP-55](55.md) | some fields and passing data were changed | -| 2024-08-18 | [3aff37bd](https://github.com/nostr-protocol/nips/commit/3aff37bd) | [NIP-54](54.md) | content should be Asciidoc | -| 2024-07-31 | [3ea2f1a4](https://github.com/nostr-protocol/nips/commit/3ea2f1a4) | [NIP-45](45.md) | [444ad28d](https://github.com/nostr-protocol/nips/commit/444ad28d) was reverted | -| 2024-07-30 | [444ad28d](https://github.com/nostr-protocol/nips/commit/444ad28d) | [NIP-45](45.md) | NIP-45 was deprecated | -| 2024-07-26 | [ecee40df](https://github.com/nostr-protocol/nips/commit/ecee40df) | [NIP-19](19.md) | `nrelay` was deprecated | -| 2024-07-23 | [0227a2cd](https://github.com/nostr-protocol/nips/commit/0227a2cd) | [NIP-01](01.md) | events should be sorted by id after created_at | -| 2024-06-06 | [58e94b20](https://github.com/nostr-protocol/nips/commit/58e94b20) | [NIP-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) | [NIP-55](55.md) | NIP number was changed | -| 2024-05-25 | [5d1d1c17](https://github.com/nostr-protocol/nips/commit/5d1d1c17) | [NIP-71](71.md) | 'aes-256-gcm' tag was removed | -| 2024-05-07 | [8073c848](https://github.com/nostr-protocol/nips/commit/8073c848) | [NIP-25](25.md) | e-tags were changed to not include entire thread | -| 2024-04-30 | [bad88262](https://github.com/nostr-protocol/nips/commit/bad88262) | [NIP-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) | [NIP-18](18.md) | quote repost should use `q` tag | -| 2024-02-21 | [c6cd655c](https://github.com/nostr-protocol/nips/commit/c6cd655c) | [NIP-46](46.md) | Params were stringified | -| 2024-02-16 | [cbec02ab](https://github.com/nostr-protocol/nips/commit/cbec02ab) | [NIP-49](49.md) | Password first normalized to NFKC | -| 2024-02-15 | [afbb8dd0](https://github.com/nostr-protocol/nips/commit/afbb8dd0) | [NIP-39](39.md) | PGP identity was removed | -| 2024-02-07 | [d3dad114](https://github.com/nostr-protocol/nips/commit/d3dad114) | [NIP-46](46.md) | Connection token format was changed | -| 2024-01-30 | [1a2b21b6](https://github.com/nostr-protocol/nips/commit/1a2b21b6) | [NIP-59](59.md) | 'p' tag became optional | -| 2023-01-27 | [c2f34817](https://github.com/nostr-protocol/nips/commit/c2f34817) | [NIP-47](47.md) | optional expiration tag should be honored | -| 2024-01-10 | [3d8652ea](https://github.com/nostr-protocol/nips/commit/3d8652ea) | [NIP-02](02.md) | list entries should be chronological | -| 2024-01-10 | [3d8652ea](https://github.com/nostr-protocol/nips/commit/3d8652ea) | [NIP-51](51.md) | list entries should be chronological | -| 2023-12-30 | [29869821](https://github.com/nostr-protocol/nips/commit/29869821) | [NIP-52](52.md) | 'name' tag was removed (use 'title' tag instead) | -| 2023-12-27 | [17c67ef5](https://github.com/nostr-protocol/nips/commit/17c67ef5) | [NIP-94](94.md) | 'aes-256-gcm' tag was removed | -| 2023-12-03 | [0ba45895](https://github.com/nostr-protocol/nips/commit/0ba45895) | [NIP-01](01.md) | WebSocket status code `4000` was replaced by 'CLOSED' message | -| 2023-11-28 | [6de35f9e](https://github.com/nostr-protocol/nips/commit/6de35f9e) | [NIP-89](89.md) | 'client' tag value was changed | -| 2023-11-20 | [7822a8b1](https://github.com/nostr-protocol/nips/commit/7822a8b1) | [NIP-51](51.md) | `kind: 30000` and `kind: 30001` were deprecated | -| 2023-11-11 | [cbdca1e9](https://github.com/nostr-protocol/nips/commit/cbdca1e9) | [NIP-84](84.md) | 'range' tag was removed | -| 2023-11-10 | [c945d8bd](https://github.com/nostr-protocol/nips/commit/c945d8bd) | [NIP-32](32.md) | 'l' tag annotations was removed | -| 2023-11-07 | [108b7f16](https://github.com/nostr-protocol/nips/commit/108b7f16) | [NIP-01](01.md) | 'OK' message must have 4 items | -| 2023-10-17 | [cf672b76](https://github.com/nostr-protocol/nips/commit/cf672b76) | [NIP-03](03.md) | 'block' tag was removed | -| 2023-09-29 | [7dc6385f](https://github.com/nostr-protocol/nips/commit/7dc6385f) | [NIP-57](57.md) | optional 'a' tag was included in `zap receipt` | -| 2023-08-21 | [89915e02](https://github.com/nostr-protocol/nips/commit/89915e02) | [NIP-11](11.md) | 'min_prefix' was removed | -| 2023-08-20 | [37c4375e](https://github.com/nostr-protocol/nips/commit/37c4375e) | [NIP-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) | [NIP-15](15.md) | 'countries' tag was renamed to 'regions' | -| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [NIP-12](12.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 | -| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [NIP-16](16.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 | -| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [NIP-20](20.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 | -| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [NIP-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) | [NIP-25](25.md) | empty `content` should be considered as "+" | -| 2023-08-01 | [5d63b157](https://github.com/nostr-protocol/nips/commit/5d63b157) | [NIP-57](57.md) | 'zap' tag was changed | -| 2023-07-15 | [d1814405](https://github.com/nostr-protocol/nips/commit/d1814405) | [NIP-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) | [NIP-25](25.md) | custom emoji was supported | -| 2023-06-18 | [83cbd3e1](https://github.com/nostr-protocol/nips/commit/83cbd3e1) | [NIP-11](11.md) | 'image' was renamed to 'icon' | -| 2023-04-13 | [bf0a0da6](https://github.com/nostr-protocol/nips/commit/bf0a0da6) | [NIP-15](15.md) | different NIP was re-added as NIP-15 | -| 2023-04-09 | [fb5b7c73](https://github.com/nostr-protocol/nips/commit/fb5b7c73) | [NIP-15](15.md) | NIP-15 was merged into NIP-01 | -| 2023-03-29 | [599e1313](https://github.com/nostr-protocol/nips/commit/599e1313) | [NIP-18](18.md) | NIP-18 was bring back | -| 2023-03-15 | [e1004d3d](https://github.com/nostr-protocol/nips/commit/e1004d3d) | [NIP-19](19.md) | `1: relay` was changed to optionally | +| 2024-11-12 | [2838e3bd](https://github.com/nostr-protocol/nips/commit/2838e3bd) | [29](29.md) | `kind: 12` and `kind: 10` were removed (use `kind: 1111` instead) | +| 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [46](46.md) | NIP-05 login was removed | +| 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [46](46.md) | `create_account` method was removed | +| 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [46](46.md) | `connect` params and result were changed | +| 2024-10-29 | [f1e8d2c4](https://github.com/nostr-protocol/nips/commit/f1e8d2c4) | [46](46.md) | bunker URL should use `remote-signer-key` | +| 2024-10-15 | [1cda2dcc](https://github.com/nostr-protocol/nips/commit/1cda2dcc) | [71](71.md) | some tags were replaced with `imeta` tag | +| 2024-10-15 | [1cda2dcc](https://github.com/nostr-protocol/nips/commit/1cda2dcc) | [71](71.md) | `kind: 34237` was dropped | +| 2024-10-07 | [7bb8997b](https://github.com/nostr-protocol/nips/commit/7bb8997b) | [55](55.md) | some fields and passing data were changed | +| 2024-08-18 | [3aff37bd](https://github.com/nostr-protocol/nips/commit/3aff37bd) | [54](54.md) | content should be Asciidoc | +| 2024-07-31 | [3ea2f1a4](https://github.com/nostr-protocol/nips/commit/3ea2f1a4) | [45](45.md) | [444ad28d](https://github.com/nostr-protocol/nips/commit/444ad28d) was reverted | +| 2024-07-30 | [444ad28d](https://github.com/nostr-protocol/nips/commit/444ad28d) | [45](45.md) | NIP-45 was deprecated | +| 2024-07-26 | [ecee40df](https://github.com/nostr-protocol/nips/commit/ecee40df) | [19](19.md) | `nrelay` was deprecated | +| 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-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-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 | +| 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) | list entries should be chronological | +| 2024-01-10 | [3d8652ea](https://github.com/nostr-protocol/nips/commit/3d8652ea) | [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-11-20 | [7822a8b1](https://github.com/nostr-protocol/nips/commit/7822a8b1) | [51](51.md) | `kind: 30000` and `kind: 30001` were deprecated | +| 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-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [12](12.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 | +| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [16](16.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 | +| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [20](20.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 | +| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [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-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-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 | +| 2023-03-15 | [e1004d3d](https://github.com/nostr-protocol/nips/commit/e1004d3d) | [19](19.md) | `1: relay` was changed to optionally | Breaking changes prior to 2023-03-01 are not yet documented. From 2ffd8ec36360512c5f5087519b667434b4dc7832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=8E=9F=E6=99=B4=E5=A4=AA?= Date: Fri, 29 Nov 2024 14:40:11 +0000 Subject: [PATCH 29/55] use example domain --- 46.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/46.md b/46.md index 824059c1..7f8859f6 100644 --- a/46.md +++ b/46.md @@ -213,7 +213,7 @@ _remote-signer_ MAY publish it's metadata by using [NIP-05](05.md) and [NIP-89]( }, "nip46": { "relays": ["wss://relay1","wss://relay2"...], - "nostrconnect_url": "https://remote-signer-domain.com/" + "nostrconnect_url": "https://remote-signer-domain.example/" } } ``` From fe1fe75caecfaaf0dcd675fb706a91347c9b3c80 Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Sat, 30 Nov 2024 15:57:50 +0900 Subject: [PATCH 30/55] mark kind 30001 as deprecated. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d362e6a1..61fdbe8e 100644 --- a/README.md +++ b/README.md @@ -183,7 +183,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `24242` | Blobs stored on mediaservers | [Blossom][blossom] | | `27235` | HTTP Auth | [98](98.md) | | `30000` | Follow sets | [51](51.md) | -| `30001` | Generic lists | [51](51.md) | +| `30001` | Generic lists | 51 (deprecated) | | `30002` | Relay sets | [51](51.md) | | `30003` | Bookmark sets | [51](51.md) | | `30004` | Curation sets | [51](51.md) | From 54c0c1352d73595b99b568248b87fe4542d30141 Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Sun, 1 Dec 2024 00:15:39 +0900 Subject: [PATCH 31/55] BREAKING.md: fix change of 7822a8b1 --- BREAKING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BREAKING.md b/BREAKING.md index 40391e05..39be5a0f 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -36,7 +36,8 @@ reverse chronological order. | 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: 30000` and `kind: 30001` were deprecated | +| 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 | From 33efff81a6909da9a85e81d296a711810f1848a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=8E=9F=E6=99=B4=E5=A4=AA?= Date: Wed, 4 Dec 2024 14:30:42 +0000 Subject: [PATCH 32/55] NIP-44: Proper base64 explanation "Encoding algorithm" instead of "compression algorithm" --- 44.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/44.md b/44.md index 8f781b85..b70acb2b 100644 --- a/44.md +++ b/44.md @@ -63,7 +63,7 @@ NIP-44 version 2 has the following design characteristics: - SHA256 is used instead of SHA3 or BLAKE because it is already used in nostr. Also BLAKE's speed advantage is smaller in non-parallel environments. - A custom padding scheme is used instead of padmé because it provides better leakage reduction for small messages. -- Base64 encoding is used instead of another compression algorithm because it is widely available, and is already used in nostr. +- Base64 encoding is used instead of another encoding algorithm because it is widely available, and is already used in nostr. ### Encryption From 2776a2aa143e88295421bfc960e12adfcae5f8f8 Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Fri, 6 Dec 2024 00:58:50 +0900 Subject: [PATCH 33/55] add `P` tag to README. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 61fdbe8e..9107bd79 100644 --- a/README.md +++ b/README.md @@ -282,6 +282,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `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) | | `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) | From 6d16019e9e98807b23b7ae1faf5edeead7ddee7a Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Thu, 5 Dec 2024 16:59:18 -0300 Subject: [PATCH 34/55] nip46: abandon nip04 entirely and just use nip44. --- 46.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/46.md b/46.md index 7f8859f6..d1706285 100644 --- a/46.md +++ b/46.md @@ -72,12 +72,12 @@ _user_ passes this token to _remote-signer_, which then sends `connect` *respons { "kind": 24133, "pubkey": , - "content": )>, + "content": )>, "tags": [["p", ]], } ``` -The `content` field is a JSON-RPC-like message that is [NIP-04](04.md) encrypted and has the following structure: +The `content` field is a JSON-RPC-like message that is [NIP-44](44.md) encrypted and has the following structure: ```jsonc { @@ -109,7 +109,7 @@ Each of the following are methods that the _client_ sends to the _remote-signer_ ### Requested permissions -The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip04_encrypt,sign_event:4` meaning permissions to call `nip04_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later. Same permission format may be used for `perms` field of `metadata` in `nostrconnect://` string. +The `connect` method may be provided with `optional_requested_permissions` for user convenience. The permissions are a comma-separated list of `method[:params]`, i.e. `nip44_encrypt,sign_event:4` meaning permissions to call `nip44_encrypt` and to call `sign_event` with `kind:4`. Optional parameter for `sign_event` is the kind number, parameters for other methods are to be defined later. Same permission format may be used for `perms` field of `metadata` in `nostrconnect://` string. ## Response Events `kind:24133` @@ -118,13 +118,13 @@ The `connect` method may be provided with `optional_requested_permissions` for u "id": , "kind": 24133, "pubkey": , - "content": )>, + "content": )>, "tags": [["p", ]], "created_at": } ``` -The `content` field is a JSON-RPC-like message that is [NIP-04](04.md) encrypted and has the following structure: +The `content` field is a JSON-RPC-like message that is [NIP-44](44.md) encrypted and has the following structure: ```json { @@ -150,7 +150,7 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](04.md) encrypted { "kind": 24133, "pubkey": "eff37350d839ce3707332348af4549a96051bd695d3223af4aabce4993531d86", - "content": nip04({ + "content": nip44({ "id": , "method": "sign_event", "params": [json_stringified(<{ @@ -170,7 +170,7 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](04.md) encrypted { "kind": 24133, "pubkey": "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52", - "content": nip04({ + "content": nip44({ "id": , "result": json_stringified() }), @@ -224,4 +224,4 @@ The `` MAY be used to verify the domain from _remote-s _remote-signer_ MAY publish a NIP-89 `kind: 31990` event with `k` tag of `24133`, which MAY also include one or more `relay` tags and MAY include `nostrconnect_url` tag. The semantics of `relay` and `nostrconnect_url` tags are the same as in the section above. -_client_ MAY improve UX by discovering _remote-signers_ using their `kind: 31990` events. _client_ MAY then pre-generate `nostrconnect://` strings for the _remote-signers_, and SHOULD in that case verify that `kind: 31990` event's author is mentioned in signer's `nostr.json?name=_` file as ``. +_client_ MAY improve UX by discovering _remote-signers_ using their `kind: 31990` events. _client_ MAY then pre-generate `nostrconnect://` strings for the _remote-signers_, and SHOULD in that case verify that `kind: 31990` event's author is mentioned in signer's `nostr.json?name=_` file as ``. From a92d2e2edd3251067ab8787ecf10ee2dffe2b85f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=8E=9F=E6=99=B4=E5=A4=AA?= Date: Fri, 6 Dec 2024 11:26:23 +0000 Subject: [PATCH 35/55] Clarify the units --- 44.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/44.md b/44.md index b70acb2b..8f27fede 100644 --- a/44.md +++ b/44.md @@ -86,7 +86,7 @@ NIP-44 version 2 has the following design characteristics: - Content must be encoded from UTF-8 into byte array - Validate plaintext length. Minimum is 1 byte, maximum is 65535 bytes - Padding format is: `[plaintext_length: u16][plaintext][zero_bytes]` - - Padding algorithm is related to powers-of-two, with min padded msg size of 32 + - Padding algorithm is related to powers-of-two, with min padded msg size of 32bytes - Plaintext length is encoded in big-endian as first 2 bytes of the padded blob 5. Encrypt padded content - Use ChaCha20, with key and nonce from step 3 @@ -148,8 +148,8 @@ validation rules, refer to BIP-340. - `x[i:j]`, where `x` is a byte array and `i, j <= 0` returns a `(j - i)`-byte array with a copy of the `i`-th byte (inclusive) to the `j`-th byte (exclusive) of `x`. - Constants `c`: - - `min_plaintext_size` is 1. 1b msg is padded to 32b. - - `max_plaintext_size` is 65535 (64kb - 1). It is padded to 65536. + - `min_plaintext_size` is 1. 1bytes msg is padded to 32bytes. + - `max_plaintext_size` is 65535 (64kB - 1). It is padded to 65536bytes. - Functions - `base64_encode(string)` and `base64_decode(bytes)` are Base64 ([RFC 4648](https://datatracker.ietf.org/doc/html/rfc4648), with padding) - `concat` refers to byte array concatenation From 936616b3c00c83679496ca610910901968917859 Mon Sep 17 00:00:00 2001 From: mono <102149418+TsukemonoGit@users.noreply.github.com> Date: Sat, 7 Dec 2024 07:43:52 +0900 Subject: [PATCH 36/55] Update README.md add Event Kinds kind:20 Picture-first feeds --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9107bd79..34dfc1b2 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `14` | Direct Message | [17](17.md) | | `16` | Generic Repost | [18](18.md) | | `17` | Reaction to a website | [25](25.md) | +| `20` | Picture-first feeds | [68](68.md) | | `40` | Channel Creation | [28](28.md) | | `41` | Channel Metadata | [28](28.md) | | `42` | Channel Message | [28](28.md) | From a2be191ecd0b882ed388a564b5e57b1ca25cbdb4 Mon Sep 17 00:00:00 2001 From: mono <102149418+TsukemonoGit@users.noreply.github.com> Date: Sat, 7 Dec 2024 07:45:25 +0900 Subject: [PATCH 37/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 34dfc1b2..eb6fd94a 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `14` | Direct Message | [17](17.md) | | `16` | Generic Repost | [18](18.md) | | `17` | Reaction to a website | [25](25.md) | -| `20` | Picture-first feeds | [68](68.md) | +| `20` | Picture | [68](68.md) | | `40` | Channel Creation | [28](28.md) | | `41` | Channel Metadata | [28](28.md) | | `42` | Channel Message | [28](28.md) | From b04922586ead1a0009716b86cc97d4790a5657d0 Mon Sep 17 00:00:00 2001 From: Jesus Christ <120573631+Gudnessuche@users.noreply.github.com> Date: Sun, 8 Dec 2024 12:34:34 +0000 Subject: [PATCH 38/55] Update 90.md Added a period to show the end of "Protocol Flow" explanation --- 90.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/90.md b/90.md index 696ebd59..1d69b0ff 100644 --- a/90.md +++ b/90.md @@ -185,7 +185,7 @@ Any job feedback event MIGHT include results in the `.content` field, as describ * Customer publishes a job request (e.g. `kind:5000` speech-to-text). * Service Providers MAY submit `kind:7000` job-feedback events (e.g. `payment-required`, `processing`, `error`, etc.). * Upon completion, the service provider publishes the result of the job with a `kind:6000` job-result event. -* At any point, if there is an `amount` pending to be paid as instructed by the service provider, the user can pay the included `bolt11` or zap the job result event the service provider has sent to the user +* At any point, if there is an `amount` pending to be paid as instructed by the service provider, the user can pay the included `bolt11` or zap the job result event the service provider has sent to the user. Job feedback (`kind:7000`) and Job Results (`kind:6000-6999`) events MAY include an `amount` tag, this can be interpreted as a suggestion to pay. Service Providers MUST use the `payment-required` feedback event to signal that a payment is required and no further actions will be performed until the payment is sent. From d71887a8e29821212f765b3cdf69c25df1415271 Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Mon, 9 Dec 2024 13:19:16 +0900 Subject: [PATCH 39/55] BREAKING.md: merge duplicate lines --- BREAKING.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/BREAKING.md b/BREAKING.md index 39be5a0f..f083ca0e 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -30,8 +30,7 @@ reverse chronological order. | 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 | | 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) | list entries should be chronological | -| 2024-01-10 | [3d8652ea](https://github.com/nostr-protocol/nips/commit/3d8652ea) | [51](51.md) | list entries should be chronological | +| 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 | @@ -46,10 +45,7 @@ reverse chronological order. | 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-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [12](12.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 | -| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [16](16.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 | -| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [20](20.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 | -| 2023-08-14 | [72bb8a12](https://github.com/nostr-protocol/nips/commit/72bb8a12) | [33](33.md) | NIP-12, 16, 20 and 33 were merged into NIP-01 | +| 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-07-15 | [d1814405](https://github.com/nostr-protocol/nips/commit/d1814405) | [01](01.md) | `since` and `until` filters should be `since <= created_at <= until` | From b94ad00ac7da6f4d54f1920c824487410fa904b7 Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Mon, 9 Dec 2024 13:29:10 +0900 Subject: [PATCH 40/55] BREAKING.md: add NIP-46 change --- BREAKING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/BREAKING.md b/BREAKING.md index f083ca0e..77900d33 100644 --- a/BREAKING.md +++ b/BREAKING.md @@ -5,6 +5,7 @@ reverse chronological order. | Date | Commit | NIP | Change | | ----------- | --------- | -------- | ------ | +| 2024-12-05 | [6d16019e](https://github.com/nostr-protocol/nips/commit/6d16019e) | [46](46.md) | message encryption was changed to NIP-44 | | 2024-11-12 | [2838e3bd](https://github.com/nostr-protocol/nips/commit/2838e3bd) | [29](29.md) | `kind: 12` and `kind: 10` were removed (use `kind: 1111` instead) | | 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [46](46.md) | NIP-05 login was removed | | 2024-11-12 | [926a51e7](https://github.com/nostr-protocol/nips/commit/926a51e7) | [46](46.md) | `create_account` method was removed | From 624b989f9f3b0c07d338ec42765351c24f2123cf Mon Sep 17 00:00:00 2001 From: Josh Brown Date: Mon, 9 Dec 2024 10:00:04 -0500 Subject: [PATCH 41/55] clarify that Standard lists and Sets are both types of lists with heading level --- 51.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/51.md b/51.md index 4c0b1f47..90b56ce5 100644 --- a/51.md +++ b/51.md @@ -14,7 +14,7 @@ When new items are added to an existing list, clients SHOULD append them to the ## Types of lists -## Standard lists +### Standard lists Standard lists use normal replaceable events, meaning users may only have a single list of each kind. They have special meaning and clients may rely on them to augment a user's profile or browsing experience. @@ -36,7 +36,7 @@ For example, _mute list_ can contain the public keys of spammers and bad actors | 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 +### Sets Sets are lists with well-defined meaning that can enhance the functionality and the UI of clients that rely on them. Unlike standard lists, users are expected to have more than one set of each kind, therefore each of them must be assigned a different `"d"` identifier. @@ -56,7 +56,7 @@ Aside from their main identifier, the `"d"` tag, sets can optionally have a `"ti | 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"` | -## Deprecated standard lists +### Deprecated standard lists Some clients have used these lists in the past, but they should work on transitioning to the [standard formats](#standard-lists) above. From e942427f8fcf316f4ade52838005910a650270af Mon Sep 17 00:00:00 2001 From: Jesus Christ <120573631+Gudnessuche@users.noreply.github.com> Date: Mon, 9 Dec 2024 15:13:59 +0000 Subject: [PATCH 42/55] nip17: specify order (#1637) Order specificity is implied better. --- 17.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/17.md b/17.md index 72f40c47..f091a969 100644 --- a/17.md +++ b/17.md @@ -133,7 +133,7 @@ When sending a message to anyone, clients must then connect to the relays in the This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`. -The two final GiftWraps, one to the receiver and the other to the sender, are: +The two final GiftWraps, one to the receiver and the other to the sender, respectively, are: ```json { From ed128aef46306dc390b9dfb8efc2e7ea9815d344 Mon Sep 17 00:00:00 2001 From: franzap <_@franzap.com> Date: Tue, 10 Dec 2024 15:02:54 -0300 Subject: [PATCH 43/55] App curation sets, minor fixes to release artifact sets --- 51.md | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/51.md b/51.md index 90b56ce5..d762499e 100644 --- a/51.md +++ b/51.md @@ -54,7 +54,8 @@ Aside from their main identifier, the `"d"` tag, sets can optionally have a `"ti | Kind mute sets | 30007 | mute pubkeys by kinds
`"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"` | +| 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 From a1ca7a194b6d8f249b7437c0082682c2a7c074ab Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Tue, 10 Dec 2024 14:11:43 -0800 Subject: [PATCH 44/55] Change strategy for naming groups --- 29.md | 4 ++-- 51.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/29.md b/29.md index 331047f7..8711cc94 100644 --- a/29.md +++ b/29.md @@ -30,8 +30,6 @@ When encountering just the `` without the `'`, clients MAY infer Events sent by users to groups (chat messages, text notes, moderation events etc) MUST have an `h` tag with the value set to the group _id_. -`h` tags MAY include the group's name as the second argument. This allows `unmanaged` groups to be assigned human-readable names without relay support. - ## Timeline references In order to not be used out of context, events sent to these groups may contain references to previous events seen from the same relay in the `previous` tag. The choice of which previous events to pick belongs to the clients. The references are to be made using the first 8 characters (4 bytes) of any event in the last 50 events seen by the user in the relay, excluding events by themselves. There can be any number of references (including zero), but it's recommended that clients include at least 3 and that relays enforce this. @@ -242,3 +240,5 @@ A definition for `kind:10009` was included in [NIP-51](51.md) that allows client ### Using `unmanaged` relays To prevent event leakage, when using `unmanaged` relays, clients should include the [NIP-70](70.md) `-` tag, as just the `previous` tag won't be checked by other `unmanaged` relays. + +Groups MAY be named without relay support by adding a `name` to the corresponding tag in a user's `kind 10009` group list. diff --git a/51.md b/51.md index 90b56ce5..23d5b999 100644 --- a/51.md +++ b/51.md @@ -29,7 +29,7 @@ For example, _mute list_ can contain the public keys of spammers and bad actors | 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), `"r"` for each relay in use | +| 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)) | From 306be43fabf7a95b3eef9d5363e1c3411055337f Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 19 Dec 2024 10:16:57 -0500 Subject: [PATCH 45/55] removes new line --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f203edd5..55de8422 100644 --- a/README.md +++ b/README.md @@ -231,7 +231,6 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `39000-9` | Group metadata events | [29](29.md) | [NUD: Custom Feeds]: https://wikifreedia.xyz/cip-01/ - [nostrocket]: https://github.com/nostrocket/NIPS/blob/main/Problems.md [lnpub]: https://github.com/shocknet/Lightning.Pub/blob/master/proto/autogenerated/client.md [cornychat-slideset]: https://cornychat.com/datatypes#kind30388slideset From 97bf5266d7760094ec55a66fe18d549de385768b Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Fri, 20 Dec 2024 09:11:37 +0900 Subject: [PATCH 46/55] add kind 10013 to list. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 55de8422..e71a13e7 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10006` | Blocked relays list | [51](51.md) | | `10007` | Search relays list | [51](51.md) | | `10009` | User groups | [51](51.md), [29](29.md) | +| `10013` | Draft relays | [37](37.md) | | `10015` | Interests list | [51](51.md) | | `10019` | Nutzap Mint Recommendation | [61](61.md) | | `10030` | User emoji list | [51](51.md) | From 7e150faed4ccadfdcdc81265a406c4b6cdd39047 Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Sat, 21 Dec 2024 01:34:43 +0900 Subject: [PATCH 47/55] nip44: update some nits. --- 44.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/44.md b/44.md index 8f27fede..a7c13f12 100644 --- a/44.md +++ b/44.md @@ -8,11 +8,11 @@ Encrypted Payloads (Versioned) The NIP introduces a new data format for keypair-based encryption. This NIP is versioned to allow multiple algorithm choices to exist simultaneously. This format may be used for -many things, but MUST be used in the context of a signed event as described in NIP 01. +many things, but MUST be used in the context of a signed event as described in NIP-01. *Note*: this format DOES NOT define any `kind`s related to a new direct messaging standard, only the encryption required to define one. It SHOULD NOT be used as a drop-in replacement -for NIP 04 payloads. +for NIP-04 payloads. ## Versions @@ -41,7 +41,7 @@ On its own, messages sent using this scheme have a number of important shortcomi - No post-compromise security: when a key is compromised, it is possible to decrypt all future conversations - No post-quantum security: a powerful quantum computer would be able to decrypt the messages - IP address leak: user IP may be seen by relays and all intermediaries between user and relay -- Date leak: `created_at` is public, since it is a part of NIP 01 event +- Date leak: `created_at` is public, since it is a part of NIP-01 event - Limited message size leak: padding only partially obscures true message length - No attachments: they are not supported @@ -86,7 +86,7 @@ NIP-44 version 2 has the following design characteristics: - Content must be encoded from UTF-8 into byte array - Validate plaintext length. Minimum is 1 byte, maximum is 65535 bytes - Padding format is: `[plaintext_length: u16][plaintext][zero_bytes]` - - Padding algorithm is related to powers-of-two, with min padded msg size of 32bytes + - Padding algorithm is related to powers-of-two, with min padded msg size of 32 bytes - Plaintext length is encoded in big-endian as first 2 bytes of the padded blob 5. Encrypt padded content - Use ChaCha20, with key and nonce from step 3 @@ -148,8 +148,8 @@ validation rules, refer to BIP-340. - `x[i:j]`, where `x` is a byte array and `i, j <= 0` returns a `(j - i)`-byte array with a copy of the `i`-th byte (inclusive) to the `j`-th byte (exclusive) of `x`. - Constants `c`: - - `min_plaintext_size` is 1. 1bytes msg is padded to 32bytes. - - `max_plaintext_size` is 65535 (64kB - 1). It is padded to 65536bytes. + - `min_plaintext_size` is 1. 1 byte msg is padded to 32 bytes. + - `max_plaintext_size` is 65535 (64kB - 1). It is padded to 65536 bytes. - Functions - `base64_encode(string)` and `base64_decode(bytes)` are Base64 ([RFC 4648](https://datatracker.ietf.org/doc/html/rfc4648), with padding) - `concat` refers to byte array concatenation From 9d4f2b42b4491035472c8b5bc3d185f45c41bb45 Mon Sep 17 00:00:00 2001 From: Taha Date: Sun, 22 Dec 2024 21:11:24 -0500 Subject: [PATCH 48/55] add some missing words to readme (#1656) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e71a13e7..11d9386a 100644 --- a/README.md +++ b/README.md @@ -344,9 +344,9 @@ Please update these lists when proposing new NIPs. ## Is this repository a centralizing factor? -To promote interoperability, we standards that everybody can follow, and we need them to define a **single way of doing each thing** without ever hurting **backwards-compatibility**, and for that purpose there is no way around getting everybody to agree on the same thing and keep a centralized index of these standards. However the fact that such index exists doesn't hurt the decentralization of Nostr. _At any point the central index can be challenged if it is failing to fulfill the needs of the protocol_ and it can migrate to other places and be maintained by other people. +To promote interoperability, we need standards that everybody can follow, and we need them to define a **single way of doing each thing** without ever hurting **backwards-compatibility**, and for that purpose there is no way around getting everybody to agree on the same thing and keep a centralized index of these standards. However the fact that such an index exists doesn't hurt the decentralization of Nostr. _At any point the central index can be challenged if it is failing to fulfill the needs of the protocol_ and it can migrate to other places and be maintained by other people. -It can even fork into multiple and then some clients would go one way, others would go another way, and some clients would adhere to both competing standards. This would hurt the simplicity, openness and interoperability of Nostr a little, but everything would still work in the short term. +It can even fork into multiple versions, and then some clients would go one way, others would go another way, and some clients would adhere to both competing standards. This would hurt the simplicity, openness and interoperability of Nostr a little, but everything would still work in the short term. There is a list of notable Nostr software developers who have commit access to this repository, but that exists mostly for practical reasons, as by the nature of the thing we're dealing with the repository owner can revoke membership and rewrite history as they want -- and if these actions are unjustified or perceived as bad or evil the community must react. From 71ca3f27f3833c4e240921bf105c4268919158e5 Mon Sep 17 00:00:00 2001 From: Kay Date: Thu, 26 Dec 2024 13:14:28 +0000 Subject: [PATCH 49/55] fix broken link. --- 32.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/32.md b/32.md index a99e52a3..202200af 100644 --- a/32.md +++ b/32.md @@ -157,7 +157,7 @@ considered open for public use, and not proprietary. In other words, if there is namespace that fits your use case, use it even if it points to someone else's domain name. Vocabularies MAY choose to fully qualify all labels within a namespace (for example, -`["l", "com.example.vocabulary:my-label"]`. This may be preferred when defining more +`["l", "com.example.vocabulary:my-label"]`). This may be preferred when defining more formal vocabularies that should not be confused with another namespace when querying without an `L` tag. For these vocabularies, all labels SHOULD include the namespace (rather than mixing qualified and unqualified labels). @@ -173,4 +173,4 @@ Appendix: Known Ontologies Below is a non-exhaustive list of ontologies currently in widespread use. -- [social.ontolo.categories](https://ontolo.social/) +- [social ontology categories](https://github.com/CLARIAH/awesome-humanities-ontologies) From 9acad1c62c21c53b727e7025e0627c3c2d31e0fa Mon Sep 17 00:00:00 2001 From: Kay Date: Thu, 26 Dec 2024 14:08:13 +0000 Subject: [PATCH 50/55] fix nip-46 and nip-47 names are changed. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 11d9386a..c9f43a2b 100644 --- a/README.md +++ b/README.md @@ -61,8 +61,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-42: Authentication of clients to relays](42.md) - [NIP-44: Versioned Encryption](44.md) - [NIP-45: Counting results](45.md) -- [NIP-46: Nostr Connect](46.md) -- [NIP-47: Wallet Connect](47.md) +- [NIP-46: Nostr Remote Signing](46.md) +- [NIP-47: Nostr Wallet Connect](47.md) - [NIP-48: Proxy Tags](48.md) - [NIP-49: Private Key Encryption](49.md) - [NIP-50: Search Capability](50.md) From e3911cc9e6078b90db52d61685f0742eda5a3cef Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Fri, 27 Dec 2024 06:52:15 +0900 Subject: [PATCH 51/55] rename NIP-44 in readme. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c9f43a2b..f6225580 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-39: External Identities in Profiles](39.md) - [NIP-40: Expiration Timestamp](40.md) - [NIP-42: Authentication of clients to relays](42.md) -- [NIP-44: Versioned Encryption](44.md) +- [NIP-44: Encrypted Payloads (Versioned)](44.md) - [NIP-45: Counting results](45.md) - [NIP-46: Nostr Remote Signing](46.md) - [NIP-47: Nostr Wallet Connect](47.md) From b88f716eef4feaf1d123562bf61bdb2aa47e6ac1 Mon Sep 17 00:00:00 2001 From: Kay Date: Thu, 26 Dec 2024 22:13:22 +0000 Subject: [PATCH 52/55] fix typo in nip-94. --- 94.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/94.md b/94.md index 021cc4c3..4cd7c826 100644 --- a/94.md +++ b/94.md @@ -10,7 +10,7 @@ The purpose of this NIP is to allow an organization and classification of shared ## Event format -This NIP specifies the use of the `1063` event type, having in `content` a description of the file content, and a list of tags described below: +This NIP specifies the use of the `1063` event kind, having in `content` a description of the file content, and a list of tags described below: * `url` the url to download the file * `m` a string indicating the data type of the file. The [MIME types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) format must be used, and they should be lowercase. From 7622cdc9c07d9a99e4bd3e8bb6cf8c15cb7f56c5 Mon Sep 17 00:00:00 2001 From: pablof7z Date: Sat, 28 Dec 2024 10:50:31 +0000 Subject: [PATCH 53/55] adds P and p tags --- 22.md | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/22.md b/22.md index f11925fa..905e0b43 100644 --- a/22.md +++ b/22.md @@ -13,6 +13,9 @@ It uses `kind:1111` with plaintext `.content` (no HTML, Markdown, or other forma Comments MUST point to the root scope using uppercase tag names (e.g. `K`, `E`, `A` or `I`) and MUST point to the parent item with lowercase ones (e.g. `k`, `e`, `a` or `i`). +Comments MUST point to the authors when one is available (i.e. tagging a nostr event). `P` for the root scope +and `p` for the author of the parent item. + ```jsonc { kind: 1111, @@ -23,10 +26,16 @@ and MUST point to the parent item with lowercase ones (e.g. `k`, `e`, `a` or `i` // the root item kind ["K", ""], + // pubkey of the author of the root scope event + ["P", "", "relay-url-hint"], + // parent item: event addresses, event ids, or i-tags. ["", "", "", ""], // parent item kind - ["k", ""] + ["k", ""], + + // parent item pubkey + ["p", "", "relay-url-hint"] ] // other fields } @@ -46,11 +55,6 @@ 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). -If the parent item is an event, a `p` tag set to the parent event's author SHOULD be added. - -```json -["p", "", ""] -``` ## Examples @@ -65,13 +69,17 @@ A comment on a blog post looks like this: ["A", "30023:3c9849383bdea883b0bd16fece1ed36d37e37cdde3ce43b17ea4e9192ec11289:f9347ca7", "wss://example.relay"], // the root kind ["K", "30023"], + // author of root event + ["P", "3c9849383bdea883b0bd16fece1ed36d37e37cdde3ce43b17ea4e9192ec11289", "wss://example.relay"] // the parent event address (same as root for top-level comments) ["a", "30023:3c9849383bdea883b0bd16fece1ed36d37e37cdde3ce43b17ea4e9192ec11289:f9347ca7", "wss://example.relay"], // when the parent event is replaceable or addressable, also include an `e` tag referencing its id ["e", "5b4fc7fed15672fefe65d2426f67197b71ccc82aa0cc8a9e94f683eb78e07651", "wss://example.relay"], // the parent event kind - ["k", "30023"] + ["k", "30023"], + // author of the parent event + ["p", "3c9849383bdea883b0bd16fece1ed36d37e37cdde3ce43b17ea4e9192ec11289", "wss://example.relay"] ] // other fields } @@ -88,11 +96,14 @@ A comment on a [NIP-94](94.md) file looks like this: ["E", "768ac8720cdeb59227cf95e98b66560ef03d8bc9a90d721779e76e68fb42f5e6", "wss://example.relay", "3721e07b079525289877c366ccab47112bdff3d1b44758ca333feb2dbbbbe5bb"], // the root kind ["K", "1063"], + // author of the root event + ["P", "3721e07b079525289877c366ccab47112bdff3d1b44758ca333feb2dbbbbe5bb"], // the parent event id (same as root for top-level comments) ["e", "768ac8720cdeb59227cf95e98b66560ef03d8bc9a90d721779e76e68fb42f5e6", "wss://example.relay", "3721e07b079525289877c366ccab47112bdff3d1b44758ca333feb2dbbbbe5bb"], // the parent kind - ["k", "1063"] + ["k", "1063"], + ["p", "3721e07b079525289877c366ccab47112bdff3d1b44758ca333feb2dbbbbe5bb"] ] // other fields } @@ -109,11 +120,13 @@ A reply to a comment looks like this: ["E", "768ac8720cdeb59227cf95e98b66560ef03d8bc9a90d721779e76e68fb42f5e6", "wss://example.relay", "fd913cd6fa9edb8405750cd02a8bbe16e158b8676c0e69fdc27436cc4a54cc9a"], // the root kind ["K", "1063"], + ["P", "fd913cd6fa9edb8405750cd02a8bbe16e158b8676c0e69fdc27436cc4a54cc9a"], // the parent event ["e", "5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36", "wss://example.relay", "93ef2ebaaf9554661f33e79949007900bbc535d239a4c801c33a4d67d3e7f546"], // the parent kind - ["k", "1111"] + ["k", "1111"], + ["p", "93ef2ebaaf9554661f33e79949007900bbc535d239a4c801c33a4d67d3e7f546"] ] // other fields } @@ -178,7 +191,9 @@ A reply to a podcast comment: ["e", "80c48d992a38f9c445b943a9c9f1010b396676013443765750431a9004bdac05", "wss://example.relay", "252f10c83610ebca1a059c0bae8255eba2f95be4d1d7bcfa89d7248a82d9f111"], // the parent comment kind ["k", "1111"] + ["p", "252f10c83610ebca1a059c0bae8255eba2f95be4d1d7bcfa89d7248a82d9f111"] ] // other fields } ``` + From cd09e6c9d8f5eadd33486aee7f7b4fb56791e4b6 Mon Sep 17 00:00:00 2001 From: jdabs <6774432+jdabs@users.noreply.github.com> Date: Wed, 1 Jan 2025 11:09:21 -0500 Subject: [PATCH 54/55] 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. --- 47.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/47.md b/47.md index d1030a47..932c2632 100644 --- a/47.md +++ b/47.md @@ -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 From 936befbf9bcc1ec710497673339a2877192c67a2 Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Thu, 2 Jan 2025 23:53:33 +0900 Subject: [PATCH 55/55] add NIP-22 link to `P` and `p` tags. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f6225580..251340da 100644 --- a/README.md +++ b/README.md @@ -285,8 +285,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) |