From ccd02f2612292825e7f7caf0edb41dfc5f33f91e Mon Sep 17 00:00:00 2001 From: Cody Tseng Date: Fri, 9 May 2025 09:50:12 +0800 Subject: NIP-51: favorite relays (#1848) --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index b665f70..5f46f0c 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,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) | +| `10012` | Favorite relays list | [51](51.md) | | `10013` | Private event relay list | [37](37.md) | | `10015` | Interests list | [51](51.md) | | `10019` | Nutzap Mint Recommendation | [61](61.md) | -- cgit v1.2.3 From 873afc5fb823f58c3b7f29c5090f9c56172623f2 Mon Sep 17 00:00:00 2001 From: AsaiToshiya Date: Fri, 9 May 2025 20:07:23 +0900 Subject: add follow packs to README. --- README.md | 3 +++ 1 file changed, 3 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index 5f46f0c..d4d8419 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10013` | Private event relay list | [37](37.md) | | `10015` | Interests list | [51](51.md) | | `10019` | Nutzap Mint Recommendation | [61](61.md) | +| `10020` | Media follows | [51](51.md) | | `10030` | User emoji list | [51](51.md) | | `10050` | Relay list to receive DMs | [51](51.md), [17](17.md) | | `10063` | User server list | [Blossom][blossom] | @@ -250,6 +251,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `34550` | Community Definition | [72](72.md) | | `38383` | Peer-to-peer Order events | [69](69.md) | | `39000-9` | Group metadata events | [29](29.md) | +| `39089` | Starter packs | [51](51.md) | +| `39092` | Media starter packs | [51](51.md) | | `39701` | Web bookmarks | [B0](B0.md) | [NUD: Custom Feeds]: https://wikifreedia.xyz/cip-01/ -- cgit v1.2.3 From cddab6d244c4536e8197b77fbc4c8681284f56be Mon Sep 17 00:00:00 2001 From: Michael Dilger Date: Tue, 27 May 2025 22:48:23 +1200 Subject: Add NIP-77 to the README (#1939) --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index d4d8419..397eceb 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-72: Moderated Communities](72.md) - [NIP-73: External Content IDs](73.md) - [NIP-75: Zap Goals](75.md) +- [NIP-77: Negentropy Syncing](77.md) - [NIP-78: Application-specific data](78.md) - [NIP-7D: Threads](7D.md) - [NIP-84: Highlights](84.md) -- cgit v1.2.3 From 1afb6da049e57dd628ef46a3b0f90300653a66ee Mon Sep 17 00:00:00 2001 From: benthecarman <15256660+benthecarman@users.noreply.github.com> Date: Wed, 16 Jul 2025 06:13:09 -0500 Subject: NIP-87: Ecash Mint Discoverability (#1110) Co-authored-by: Pablo Fernandez --- 87.md | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 9 ++-- 2 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 87.md (limited to 'README.md') diff --git a/87.md b/87.md new file mode 100644 index 0000000..c6701d5 --- /dev/null +++ b/87.md @@ -0,0 +1,142 @@ +NIP-87 +====== + +Ecash Mint Discoverability +-------------------------------- + +`draft` `optional` + +This NIP describes `kind:38173`, `kind:38172` and `kind:38000`: a way to discover ecash mints, their capabilities, and people who recommend them. + +## Rationale + +Nostr's discoverability and transparent event interaction is one of its most interesting/novel mechanics. +This NIP provides a simple way for users to discover ecash mints recommended by other users and to interact with them. + +### Parties involved + +There are three actors to this workflow: + +* An ecash mint operator, announces their mint and its capabilities. + * Publishes `kind:38173` or `kind:38172`, detailing how to connect to it and its capabilities. +* user A, who recommends an ecash mint + * Publishes `kind:38000` +* user B, who seeks a recommendation for an ecash mint + * Queries for `kind:38000` and, based on results, queries for `kind:38173`/`kind:38172` + +## Events + +### Recommendation event +```json +{ + "kind": 38000, + "pubkey": , + "tags": [ + ["k", "38173"], + ["d", ""], + ["u", ], + ["a", "38173:fedimint-pubkey:", "wss://relay1"] + ], + "content": "I trust this mint with my life" +} +``` + +The recommendation event is a parameterized-replacable event so that a user can change edit their recommendation without creating a new event. + +The `d` tag in `kind:38000` is the `kind:38173`/`kind:38172` event identifier this event is recommending, if no event exists, the `d` tag can still be calculated from the mint's pubkey/id. +The `k` tag is the kind number that corresponds to the event kind that the user is recommending, in this case `kind:38173` for fedimints and `kind:38172` for cashu mints. + +Optional `u` tags can be added to give a recommend way to connect to the mint. +The value of the tag is the URL or invite code of the ecash mint. +Multiple `u` tags can appear on the same `kind:38000`. + +`a` tags are used to point to the `kind:38173`/`kind:38172` event of the ecash mint. +The first value of the tag is the `kind:38173`/`kind:38172` event identifier, the second value of the tag is a relay hint. +This is used to correctly point to the mint's `kind:38173`/`kind:38172` event in case there are duplicates claiming to be the same mint. + +The content can be used to give a review. + +## Ecash Mint Information + +Cashu mints SHOULD publish `kind:38172` events to announce their capabilities and how to connect to them. + +For cashu mints, the `u` tag SHOULD be the URL to the cashu mint and it should list the nuts that the cashu mint supports. + +The `d` tag SHOULD be the mint's pubkey (found when querying `/v1/info`), this way users can query by pubkey and find the mint announcement. + +An `n` tag SHOULD be added to signify the network the cashu mint is on (either `mainnet`, `testnet`, `signet`, or `regtest`) + +```json +{ + "kind": 38172, + "pubkey": "", + "content": "", + "tags": [ + ["d", ], + ["u", "https://cashu.example.com"], + ["nuts", "1,2,3,4,5,6,7"], + ["n", "mainnet"] + ] +} +``` + +Fedimints SHOULD publish `kind:38173` events to announce their capabilities and how to connect to them. + +For fedimints, it should list all known fedimint invite codes in `u` tags and it should list the modules it supports. + +The `d` tag SHOULD be the federation id, this way users can query by federation id and find the fedimint announcement. + +An `n` tag SHOULD be added to signify the network the fedimint is on (either `mainnet`, `testnet`, `signet`, or `regtest`) + +```json +{ + "kind": 38173, + "pubkey": "", + "content": "", + "tags": [ + ["d", ], + ["u", "fed11abc.."], + ["u", "fed11xyz.."], + ["modules", "lightning,wallet,mint"], + ["n", "signet"] + ] +} +``` + +* `content` is an optional `metadata`-like stringified JSON object, as described in NIP-01. This content is useful when the pubkey creating the `kind:38173` is not a normal user. If `content` is empty, the `kind:0` of the pubkey should be used to display mint information (e.g. name, picture, web, LUD16, etc.) + +## Example + +### User A recommends some mints +User A might be a user of a cashu mint. Using a client, user A publishes an event recommending the cashu mint they use. + +```json +{ + "kind": 38000, + "tags": [ + ["u", "fed11abc..", "fedimint"], + ["u", "https://cashu.example.com", "cashu"], + ["a", "38173:fedimint-pubkey:", "wss://relay1", "fedimint"], + ["a", "38172:cashu-mint-pubkey:", "wss://relay2", "cashu"] + ], + ... +} +``` + +### User B finds a mint +User B wants to use an ecash wallet, they need to find a mint. + +User B's wallet client queries for `kind:38000` events, looking for recommendations for ecash mints. + +```json +["REQ", , [{ "kinds": [38000], "authors": [, ], "#k": ["38173"] }]] +``` + +User B, who follows User A, sees that `kind:38000` event and tries to connect to the corresponding mints. + +### Alternative query bypassing `kind:38000` +Alternatively, users might choose to query directly for `kind:38173` for an event kind. Clients SHOULD be careful doing this and use spam-prevention mechanisms or querying high-quality restricted relays to avoid directing users to malicious handlers. + +```json +["REQ", , [{ "kinds": [38173], "authors": [...] }]] +``` diff --git a/README.md b/README.md index 397eceb..ff7e9bb 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-7D: Threads](7D.md) - [NIP-84: Highlights](84.md) - [NIP-86: Relay Management API](86.md) +- [NIP-87: Ecash Mint Discoverability](87.md) - [NIP-88: Polls](88.md) - [NIP-89: Recommended Application Handlers](89.md) - [NIP-90: Data Vending Machines](90.md) @@ -107,7 +108,6 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-C7: Chats](C7.md) ## Event Kinds - | kind | description | NIP | | ------------- | ------------------------------- | -------------------------------------- | | `0` | User Metadata | [01](01.md) | @@ -200,6 +200,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10166` | Relay Monitor Announcement | [66](66.md) | | `13194` | Wallet Info | [47](47.md) | | `17375` | Cashu Wallet Event | [60](60.md) | +| `17375` | Ecash Mint Recommendation | [87](87.md) | | `21000` | Lightning Pub RPC | [Lightning.Pub][lnpub] | | `22242` | Client Authentication | [42](42.md) | | `23194` | Wallet Request | [47](47.md) | @@ -247,9 +248,11 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `31924` | Calendar | [52](52.md) | | `31925` | Calendar Event RSVP | [52](52.md) | | `31989` | Handler recommendation | [89](89.md) | -| `31990` | Handler information | [89](89.md) | | -| `32267` | Software Application | | | +| `31990` | Handler information | [89](89.md) | +| `32267` | Software Application | | | `34550` | Community Definition | [72](72.md) | +| `38172` | Cashu Mint Announcement | [87](87.md) | +| `38173` | Fedimint Announcement | [87](87.md) | | `38383` | Peer-to-peer Order events | [69](69.md) | | `39000-9` | Group metadata events | [29](29.md) | | `39089` | Starter packs | [51](51.md) | -- cgit v1.2.3 From 074b8eeb0194804ea7fa9d6e695c3d9e9c62e153 Mon Sep 17 00:00:00 2001 From: AsaiToshiya Date: Sat, 19 Jul 2025 01:17:44 +0900 Subject: add kinds 10312, 30312 and 30313 (from nip53) --- README.md | 3 +++ 1 file changed, 3 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index ff7e9bb..1292056 100644 --- a/README.md +++ b/README.md @@ -198,6 +198,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10063` | User server list | [Blossom][blossom] | | `10096` | File storage server list | [96](96.md) | | `10166` | Relay Monitor Announcement | [66](66.md) | +| `10312` | Room Presence | [53](53.md) | | `13194` | Wallet Info | [47](47.md) | | `17375` | Cashu Wallet Event | [60](60.md) | | `17375` | Ecash Mint Recommendation | [87](87.md) | @@ -232,6 +233,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `30166` | Relay Discovery | [66](66.md) | | `30267` | App curation sets | [51](51.md) | | `30311` | Live Event | [53](53.md) | +| `30312` | Interactive Room | [53](53.md) | +| `30313` | Conference Event | [53](53.md) | | `30315` | User Statuses | [38](38.md) | | `30388` | Slide Set | [Corny Chat][cornychat-slideset] | | `30402` | Classified Listing | [99](99.md) | -- cgit v1.2.3 From e50f37a527ace39cc3057827d52295c6b6de1112 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 23 Jul 2025 22:31:55 +0200 Subject: NIP-A0: Voice Messages (#1984) --- A0.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 3 +++ 2 files changed, 63 insertions(+) create mode 100644 A0.md (limited to 'README.md') diff --git a/A0.md b/A0.md new file mode 100644 index 0000000..f5d711b --- /dev/null +++ b/A0.md @@ -0,0 +1,60 @@ +NIP-A0 +====== + +Voice Messages +----------- + +**Status:** Draft + +This NIP defines new events `kind: 1222` for root messages and `kind: 1244` for reply messages to be used for short voice messages, typically up to 60 seconds in length. + +## Specification + +### Event Kind `1222` and Kind `1244` + +The `kind: 1222` event is defined as follows: + +- `content`: MUST be a URL pointing directly to an audio file. + - The audio file SHOULD be in `audio/webm` format. Clients MAY support other common audio formats like `audio/ogg`, `audio/mp4` (m4a), or `audio/mpeg` (mp3), but `audio/webm` is recommended for broad compatibility and efficiency. + - The audio duration SHOULD be no longer than 60 seconds. Clients publishing `kind: 1222` events SHOULD enforce this limit or provide a clear warning to the user if exceeded. +- `tags`: + - Tags MAY be included as per other NIPs (e.g., `t` for hashtags, `g` for geohash, etc.). + + The `kind: 1244` event is defined as follows: + +- To be used for replies, `kind: 1244` events MUST follow the structure of `NIP-22`. +- `content`: MUST be a URL pointing directly to an audio file. + - The audio file SHOULD be in `audio/webm` format. Clients MAY support other common audio formats like `audio/ogg`, `audio/mp4` (m4a), or `audio/mpeg` (mp3), but `audio/webm` is recommended for broad compatibility and efficiency. + - The audio duration SHOULD be no longer than 60 seconds. Clients publishing `kind: 1222` events SHOULD enforce this limit or provide a clear warning to the user if exceeded. +- `tags`: + - Tags MAY be included as per other NIPs (e.g., `t` for hashtags, `g` for geohash, etc.). + + +## Visual representation with `imeta` (NIP-92) tag (optional) + +The following imeta (NIP-92) tags MAY be included so clients can render a visual preview without having to download the audio file first: + +- `waveform`: amplitude values over time, space separated, less than 100 values should be enough to render a nice visual +- `duration`: audio length in seconds + +## Examples + +### Root Voice Message Example + +```json +{ + "content": "https://blossom.primal.net/5fe7df0e46ee6b14b5a8b8b92939e84e3ca5e3950eb630299742325d5ed9891b.mp4", + "created_at": 1752501052, + "id": "...", + "kind": 1222, + "pubkey": "...", + "sig": "...", + "tags": [ + [ + "imeta", + "url https://blossom.primal.net/5fe7df0e46ee6b14b5a8b8b92939e84e3ca5e3950eb630299742325d5ed9891b.mp4", + "waveform 0 0.05 0.27 0.08 0.01 0.01 0.01 0.03 0.38 1.5 0.49 0.02 0.28 0.04 0.01 0 0 0.39 0.22 0.16 0.05 0.06 0.55 0.01 0.06 0.01 0 0 0.02 0.61 0.02 0.07 0.01 0.21 0.09 0.12 0.63 0.01 0.02 0.02 0.42 0.02 0.68 0.05 0.02 0.05 0.02 0 0 0 0", + "duration 8" + ] + ] +} \ No newline at end of file diff --git a/README.md b/README.md index 1292056..ad8c2c9 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,7 @@ 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-A1: Voice Messages](A0.md) - [NIP-B0: Web Bookmarks](B0.md) - [NIP-B7: Blossom](B7.md) - [NIP-C0: Code Snippets](C0.md) @@ -151,6 +152,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `1063` | File Metadata | [94](94.md) | | `1068` | Poll | [88](88.md) | | `1111` | Comment | [22](22.md) | +| `1222` | Voice Message | [A0](A0.md) | +| `1244` | Voice Message Comment | [A0](A0.md) | | `1311` | Live Chat Message | [53](53.md) | | `1337` | Code Snippet | [C0](C0.md) | | `1617` | Patches | [34](34.md) | -- cgit v1.2.3 From 9be455bf57117dcf5779feb79fd16ef808316b5c Mon Sep 17 00:00:00 2001 From: AsaiToshiya Date: Thu, 24 Jul 2025 23:04:12 +0900 Subject: fix A0 nip number --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index ad8c2c9..e82f754 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ 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-A1: Voice Messages](A0.md) +- [NIP-A0: Voice Messages](A0.md) - [NIP-B0: Web Bookmarks](B0.md) - [NIP-B7: Blossom](B7.md) - [NIP-C0: Code Snippets](C0.md) -- cgit v1.2.3 From e6de76f76b2ef46d7535ef3c9c77812c6d40b32c Mon Sep 17 00:00:00 2001 From: AsaiToshiya Date: Wed, 30 Jul 2025 03:28:29 +0900 Subject: remove duplicate kind (#1995) --- README.md | 1 - 1 file changed, 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index e82f754..d2dcbfe 100644 --- a/README.md +++ b/README.md @@ -204,7 +204,6 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10312` | Room Presence | [53](53.md) | | `13194` | Wallet Info | [47](47.md) | | `17375` | Cashu Wallet Event | [60](60.md) | -| `17375` | Ecash Mint Recommendation | [87](87.md) | | `21000` | Lightning Pub RPC | [Lightning.Pub][lnpub] | | `22242` | Client Authentication | [42](42.md) | | `23194` | Wallet Request | [47](47.md) | -- cgit v1.2.3 From e33f5cd38ff485519425006ed5f68015ff9de4a9 Mon Sep 17 00:00:00 2001 From: hodlbod Date: Fri, 1 Aug 2025 19:39:33 +0000 Subject: Add geocaching kinds (#1977) Co-authored-by: Jon Staab --- README.md | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index d2dcbfe..fb78832 100644 --- a/README.md +++ b/README.md @@ -175,6 +175,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `7374` | Reserved Cashu Wallet Tokens | [60](60.md) | | `7375` | Cashu Wallet Tokens | [60](60.md) | | `7376` | Cashu Wallet History | [60](60.md) | +| `7516` | Geocache log | [geocaching](geocaching) | +| `7517` | Geocache proof of find | [geocaching](geocaching) | | `9000`-`9030` | Group Control Events | [29](29.md) | | `9041` | Zap Goal | [75](75.md) | | `9321` | Nutzap | [61](61.md) | @@ -258,6 +260,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `34550` | Community Definition | [72](72.md) | | `38172` | Cashu Mint Announcement | [87](87.md) | | `38173` | Fedimint Announcement | [87](87.md) | +| `37516` | Geocache listing | [geocaching](geocaching) | | `38383` | Peer-to-peer Order events | [69](69.md) | | `39000-9` | Group metadata events | [29](29.md) | | `39089` | Starter packs | [51](51.md) | @@ -275,6 +278,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos [NKBIP-03]: https://wikistr.com/nkbip-03*fd208ee8c8f283780a9552896e4823cc9dc6bfd442063889577106940fd927c1 [blossom]: https://github.com/hzrd149/blossom [Tidal-nostr]: https://wikistr.com/tidal-nostr +[geocaching]: https://nostrhub.io/naddr1qvzqqqrcvypzppscgyy746fhmrt0nq955z6xmf80pkvrat0yq0hpknqtd00z8z68qqgkwet0vdskx6rfdenj6etkv4h8guc6gs5y5 ## Message types -- cgit v1.2.3 From 252f746010cebafb3f98720ec5e8fb2634f70b77 Mon Sep 17 00:00:00 2001 From: Yoji Shidara Date: Wed, 13 Aug 2025 18:07:45 +0900 Subject: NIP-26: Fix typos (#2013) --- 26.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'README.md') diff --git a/26.md b/26.md index 050041b..645ec44 100644 --- a/26.md +++ b/26.md @@ -1,4 +1,4 @@ -> __Warning__ `unrecommended`: adds unecessary burden for little gain +> __Warning__ `unrecommended`: adds unnecessary burden for little gain NIP-26 ======= diff --git a/README.md b/README.md index fb78832..0357b29 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-23: Long-form Content](23.md) - [NIP-24: Extra metadata fields and tags](24.md) - [NIP-25: Reactions](25.md) -- [NIP-26: Delegated Event Signing](26.md) --- **unrecommended**: adds unecessary burden for little gain +- [NIP-26: Delegated Event Signing](26.md) --- **unrecommended**: adds unnecessary burden for little gain - [NIP-27: Text Note References](27.md) - [NIP-28: Public Chat](28.md) - [NIP-29: Relay-based Groups](29.md) -- cgit v1.2.3 From 645986da49e78c19d86f06bafe38f8330605235a Mon Sep 17 00:00:00 2001 From: Yoji Shidara Date: Tue, 19 Aug 2025 02:16:23 +0900 Subject: README: Fix brackets to use references correctly (#2026) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index 0357b29..d5951b1 100644 --- a/README.md +++ b/README.md @@ -175,8 +175,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `7374` | Reserved Cashu Wallet Tokens | [60](60.md) | | `7375` | Cashu Wallet Tokens | [60](60.md) | | `7376` | Cashu Wallet History | [60](60.md) | -| `7516` | Geocache log | [geocaching](geocaching) | -| `7517` | Geocache proof of find | [geocaching](geocaching) | +| `7516` | Geocache log | [geocaching][geocaching] | +| `7517` | Geocache proof of find | [geocaching][geocaching] | | `9000`-`9030` | Group Control Events | [29](29.md) | | `9041` | Zap Goal | [75](75.md) | | `9321` | Nutzap | [61](61.md) | -- cgit v1.2.3 From 212f52a90a40ec03b948d0ab905ddb19f07443f4 Mon Sep 17 00:00:00 2001 From: hodlbod Date: Mon, 18 Aug 2025 10:32:18 -0700 Subject: Add kinds used by nostr epoxy (#1976) Co-authored-by: Jon Staab --- README.md | 3 +++ 1 file changed, 3 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index d5951b1..a91d757 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10096` | File storage server list | [96](96.md) | | `10166` | Relay Monitor Announcement | [66](66.md) | | `10312` | Room Presence | [53](53.md) | +| `10377` | Proxy Announcement | [Nostr Epoxy][nostr-epoxy] | +| `11111` | Transport Method Announcement | [Nostr Epoxy][nostr-epoxy] | | `13194` | Wallet Info | [47](47.md) | | `17375` | Cashu Wallet Event | [60](60.md) | | `21000` | Lightning Pub RPC | [Lightning.Pub][lnpub] | @@ -279,6 +281,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos [blossom]: https://github.com/hzrd149/blossom [Tidal-nostr]: https://wikistr.com/tidal-nostr [geocaching]: https://nostrhub.io/naddr1qvzqqqrcvypzppscgyy746fhmrt0nq955z6xmf80pkvrat0yq0hpknqtd00z8z68qqgkwet0vdskx6rfdenj6etkv4h8guc6gs5y5 +[nostr-epoxy]: https://github.com/Origami74/nostr-epoxy-reverse-proxy ## Message types -- cgit v1.2.3 From 4b14bf831f4aa018b33b19614ab4b7f96633d16c Mon Sep 17 00:00:00 2001 From: Awiteb Date: Mon, 18 Aug 2025 21:11:50 +0300 Subject: nip34: Add `HEAD` tag to the README (#2017) --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index a91d757..2b305a9 100644 --- a/README.md +++ b/README.md @@ -354,6 +354,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `expiration` | unix timestamp (string) | -- | [40](40.md) | | `file` | full path (string) | -- | [35](35.md) | | `goal` | event id (hex) | relay URL | [75](75.md) | +| `HEAD` | `ref: refs/heads/` | | [34](34.md) | | `image` | image URL | dimensions in pixels | [23](23.md), [52](52.md), [58](58.md) | | `imeta` | inline metadata | -- | [92](92.md) | | `license` | License of the shared content | -- | [C0](C0.md) | -- cgit v1.2.3 From 581452e8459e84caef8fa080eb8d7940468754fb Mon Sep 17 00:00:00 2001 From: Jeff Gardner <202880+erskingardner@users.noreply.github.com> Date: Wed, 27 Aug 2025 18:03:06 +0200 Subject: Add NIP-EE: E2EE messaging using MLS (#1427) --- EE.md | 288 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 289 insertions(+) create mode 100644 EE.md (limited to 'README.md') diff --git a/EE.md b/EE.md new file mode 100644 index 0000000..976df98 --- /dev/null +++ b/EE.md @@ -0,0 +1,288 @@ +# NIP-EE + +## E2EE Messaging using the Messaging Layer Security (MLS) Protocol + +`draft` `optional` + +This NIP standardizes how to use the [MLS Protocol](https://www.rfc-editor.org/rfc/rfc9420.html) with Nostr for efficient and E2EE (end-to-end encrypted) direct and group messaging. + +## Context + +Originally, one-to-one direct messages (DMs) in Nostr happened via the scheme defined in [NIP-04](04.md). This NIP is not recommended because, while it encrypts the content of the message (provides decent confidentiality), it leaks significant amounts of metadata about the parties involved in the conversation (completely lacks privacy). + +With the addition of [NIP-44](44.md), we have an updated encryption scheme that improves confidentiality guarantees but stops short of defining a new scheme for doing direct messages using this encryption scheme. Hence, makes little to no difference to privacy. + +Most recently, [NIP-17](17.md) combines [NIP-44](44.md) encryption with [NIP-59](59.md) gift-wrapping to hide the encrypted direct message inside another set of events to ensure that it's impossible to see who is talking to who and when messages passed between the users. This largely solves the metadata leakage problem; while it's still possible to see that a user is receiving gift-wrapped events, you can't tell from whom and what kind of events are within the gift-wrap outer event. This gives some degree of deniability/repudiation but doesn't solve forward secrecy or post compromise security. That is to say, if a user's private key (or the calculated conversation key shared between two users used to encrypt messages) is compromised, the attacker will have full access to all past and future DMs sent between those users. + +In addition, neither [NIP-04](04.md) or [NIP-17](17.md) attempt to solve the problem of group messages. + +### Why is this important? + +Without proper E2EE, Nostr cannot be used as the protocol for secure messaging clients. While clients like Signal do a fantastic job with E2EE, they still rely on centralized servers and as a result can be shut down by a powerful (i.e. state-level) actor. The goal of Nostr is not only to protect against centralized entities censoring you and your communications, but also protect against the ability of a state-level actor to stop these sorts of services from existing in the first place. By replacing centralized servers with decentralized relays, we make it nearly impossible for a centralized actor to completely stop communications between individual users. + +### Goals of this NIP + +1. Private _and_ Confidential DMs and Group messages + 1. **Private** means that an observer cannot tell that Alice and Bob are talking to one another, or that Alice is part of a specific group. This necessarily requires protecting metadata. + 2. **Confidential** means that the contents of conversations can only be viewed by the intended recipients. +2. Forward secrecy and Post-compromise security + 1. **Forward secrecy** means that encrypted content in the past remains encrypted even if a key material is leaked. + 2. **Post compromise security** means that leaking key material doesn't allow an attacker to continue to read messages indefinitely into the future. +3. Scales efficiently for large groups +4. Allows for the use of multiple device/clients in a single conversation/group. + +### Why MLS? + +This scheme adapts the Message Layer Security (MLS) protocol for use with Nostr. You can think of MLS as an evolution of the Signal Protocol. However, it significantly improves the scalability of encryption operations for large group messaging significantly (linear -> log), is built to accommodate federated environments, and also allows for graceful updating of ciphersuites and versions over time. In addition, it's very flexible and agnostic about the message content that is sent. + +It's beyond the scope of this NIP to explain the MLS protocol but you can read more about it in it's [Architectural Overview](https://www.ietf.org/archive/id/draft-ietf-mls-architecture-13.html) or the [RFC](https://www.rfc-editor.org/rfc/rfc9420). MLS is on track to become an internet standard under the IETF so the protocol itself is extremely well vetted and researched. This also means there is the potential for cross network messaging interoperability in the future as MLS gains more adoption. + +## Core MLS Concepts + +From the [MLS Architectural Overview](https://www.ietf.org/archive/id/draft-ietf-mls-architecture-13.html): + +> MLS provides a way for clients to form groups within which they can communicate securely. For example, a set of users might use clients on their phones or laptops to join a group and communicate with each other. A group may be as small as two clients (e.g., for simple person to person messaging) or as large as hundreds of thousands. A client that is part of a group is a member of that group. As groups change membership and group or member properties, they advance from one epoch to another and the cryptographic state of the group evolves. +> +> The group is represented as a tree, which represents the members as the leaves of a tree. It is used to efficiently encrypt to subsets of the members. Each member has a state called a LeafNode object holding the client's identity, credentials, and capabilities. + +The MLS protocol's job is to manage and evolve the cryptographic state of a group. This includes managing the membership of a group, the cryptographic state of a group (ratchet tree, keys, and encryption/decryption/authentication of messages), and managing the evolution of the group over time. + +### Groups + +Groups are created by their first member, who then invites one or more other members. Groups evolve over time in blocks called `Epochs`. New epochs are proposed via one ore more `Proposal` messages and then committed to via a `Commit` message. + +### Clients + +The device/client pair (e.g. Primal on iOS or Coracle on web) with which a user joins the group is represented as a `LeafNode` in the tree. The terms `Client` and `Member` are interchangeable in this regard. It is not possible to share group state across multiple `Clients`. If a user joins a group from 2 separate devices, their state is separate and they will be tracked as 2 separate members of the group. + +### Messages + +There are several different types of messages sent within a group. Some of these are control messages that are used to update the group state over time. These include `Welcome`, `Proposal`, and `Commit` messages. Others are the actual messages that are sent between members in a group. These include `Application` messages. + +Messages in MLS are "framed". Meaning that they are wrapped in a data structure that includes information about the sender, the epoch, the message index within the epoch and the message content. This framing makes it possible to authenticate and decrypt messages correctly, even if they arrive out of order. + +MLS is agnostic to the "content" of the messages that are sent. This is a key feature of MLS that allows for the use of MLS for a wide variety of applications. + +MLS is also agnostic to the transport protocol that is used to send messages. Obviously for us, we'll be using websockets, Nostr events and relays. + +## The focus of this NIP + +This NIP focuses on how to use Nostr to perform the Authentication Service and Delivery Service functions required by the MLS protocol. Most clients will choose to use an MLS implementation to handle keys, ratcheting, group state management, and other aspects of the MLS protocol itself. [OpenMLS](https://github.com/openmls/openmls) is the most actively developed library that implements MLS. + +This NIP specifies the following: + +1. A standardized way that Nostr clients should [create MLS groups](#creating-groups). +2. The required format of the MLS [`Credential`](#mls-credentials) that Nostr clients should use to represent a Nostr user in a group. +3. The structure of [KeyPackage Events](#keypackage-event-and-signing-keys) published to relays that allow Nostr users to be added to a group asynchronously. +4. The structure of [Group Events](#group-events) published to relays that represent the evolution of a group's state and the contents of the messages sent in the group. + +## Security Considerations + +This is a concise overview of the security trade-offs and considerations of this NIP in various scenarios. The NIP strives to fully maintain MLS security guarantees. + +### Forward Secrecy and Post-compromise Security + +- As per the MLS spec, keys are deleted as soon as they are used to encrypt or decrypt a message. This is usually handled by the MLS implementation library itself but attention needs to be paid by clients to ensure they're not storing secrets (expecially the [exporter secret](#group-events)) for longer than absolutely necessary. +- This NIP maintains MLS forward secrecy and post-compromise security guarantees. You can read more about those in the MLS Architectural Overview section on [Forward Secrecy and Post-compromise Security](https://www.ietf.org/archive/id/draft-ietf-mls-architecture-15.html#name-forward-and-post-compromise). + +### Leakage of various keys + +- This NIP does not depend on a user's Nostr identity key for any aspect of the MLS messaging protocol. Compromise of a user's Nostr identity key does not give access to past or future messages in any MLS-based group. +- For a complete discussion of MLS key leakage, please see the Endpoint Compromise section of the [MLS Architectural Overview](https://www.ietf.org/archive/id/draft-ietf-mls-architecture-15.html#name-endpoint-compromise). + +### Metadata + +- The only group specific metadata published to relays is the Nostr group ID value. This value is used to identify the group in the `h` tag of the Group Message Event (`kind: 445`). These events are published ephemerally and this Nostr group ID value can be updated over the lifetime of the group by group admins. This is a tradeoff to ensure that group participants and group size are obfuscated but still makes it possible to efficiently fan out group messages to all participants. The content field of this event is a value encrypted in two separate ways (using NIP-44 and MLS) with MLS group state/keys. Only group members with up-to-date group state can decrypt and read these messages. +- A user's key package events can be used one or more times to be added to groups. There is a tradeoff inherent here: Reusing key packages (initial signing keys) carries some degree of risk but this risk is mitigated as long as a user rotates their signing key immediately upon joining a group. This step also improves the forward secrecy of the entire group. + +### Device Compromise + +Clients implementing this NIP should take every precaution to ensure that data is stored in a secure way on the device and is protected against unwanted access in the case that a device is compromised (e.g. encryption at rest, biometric authentication, etc.). That said, full device compromise should be viewed as a catastrophic event and any group the compromised device was a part of should be considered compromised until they can remove that member and update their group's state. Some suggestions: + +- Clients should support and encourage self-destructing messages (ensuring that full transcript history isn't available on a device forever). +- Clients should regularly suggest to group admins that inactive users be removed. +- Clients should regularly suggest (or automatically) rotate a user's signing key in each of their groups. +- Clients should encrypt group state and keys on the device using a secret value that isn't part of the group state or the user's Nostr identity key. +- Clients should use secure enclave storage where possible. + +For a full discussion of the security considerations of MLS, please see the Security Considerations section of the [MLS RFC](https://www.rfc-editor.org/rfc/rfc9420.html#name-security-considerations). + +## Creating groups + +MLS Groups are created with a random 32-byte ID value that is effectively permanent. This ID should be treated as private to the group and MUST not be published to relays in any form. + +Clients must also ensure that the ciphersuite, capabilities, and extensions they use when creating the group are compatible with those advertised by the users they'd like to invite to the group. They can check this info via the user's published KeyPackage Events. + +When creating a new group, the following MLS extensions MUST be used. + +- [`required_capabilities`](https://docs.rs/openmls/latest/openmls/extensions/struct.RequiredCapabilitiesExtension.html) +- [`ratchet_tree`](https://docs.rs/openmls/latest/openmls/extensions/struct.RatchetTreeExtension.html) +- [`nostr_group_data`](https://github.com/erskingardner/nostr-openmls/blob/master/src/nostr_group_data_extension.rs) + +And the following MLS extension is highly recommended (more [here](#keypackage-event-and-signing-keys)): +- [`last_resort`](https://docs.rs/openmls/latest/openmls/extensions/struct.LastResortExtension.html) + +Changes to an MLS group are affected by first creating one or more `Proposal` events and then committing to a set of proposals in a `Commit` event. These are MLS events, not Nostr events. However, for the group state to properly evolve the Commit events (which represent a specific set of proposals - like adding a new user to the group) must be published to relays for the other group members to see. See [Group Messages](#group-events) for more information. + +## MLS Credentials + +A `Credential` in MLS is an assertion of who the user is coupled with a signing key. When constructing `Credentials` for MLS, clients MUST use the `BasicCredential` type and set the `identity` value as the 32-byte hex-encoded public key of the user's Nostr identity key. Clients MUST not allow users to change the identity field and MUST validate that all `Proposal` messages do not attempt to change the identity field on any credential in the group. + +A `Credential` also has an associated signing key. The initial signing key for a user is included in the KeyPackage event. The signing key MUST be different from the user's Nostr identity key. This signing key SHOULD be rotated over time to provide improved post-compromise security. + +## Nostr Group Data Extension + +As mentioned above, the `nostr_group_data` extension is a required MLS extension used to associate Nostr-specific data with an MLS group in a cryptographically secure and proveable way. This extension MUST be included as a required capability when creating a new group. + +The extension stores the following data about the group: + +- `nostr_group_id`: A 32-byte ID for the group. This is a different value from the group ID used by MLS and CAN be changed over time. This value is the group ID value used in the `h` tags when sending group message events. +- `name`: The name of the group. +- `description`: A short description of the group. +- `admin_pubkeys`: An array of the hex-encoded public keys of the group admins. The MLS protocol itself does not have a concept of group admins. Clients MUST check the list of `admin_pubkeys` before making any change to the group data (anything in this extension), or before changing group membership (add/remove members), or updating any other aspect of the group itself (e.g. ciphersuite, etc.). Note, all members of the group can send `Proposal` and `Commits` messages for changes to their own credentials (e.g. updating their signing key). +- `relays`: An array of the Nostr relay URLs that the group uses to publish and receive messages. + +All of these values can be updated over time using MLS `Proposal` and `Commit` events (by group admins). + +## KeyPackage Event and Signing Keys + +Each user that wishes to be reachable via MLS-based messaging MUST first publish at least one KeyPackage event. The KeyPackage Event is used to authenticate users and create the necessary `Credential` to add members to groups in an asynchronous way. Users can publish multiple KeyPackage Events with different parameters (supporting different ciphersuites or MLS extensions, for example). KeyPackages include a signing key that is used for signing MLS messages within a group. This signing key MUST not be the same as the user's Nostr identity key. + +KeyPackage reuse SHOULD be minimized. However, in normal MLS use, KeyPackages are consumed when joining a group. In order to reduce race conditions between invites for multiple groups using the same Key Package, Nostr clients SHOULD use "Last resort" KeyPackages. This requires the inclusion of the `last_resort` extension on the KeyPackage's capabilities (same as with the Group). + +It's important that clients immediately rotate a user's signing key after joining a group via a last resort key package to improve post-compromise security. The signing key (the public key included in the KeyPackage Event) is used for signing within the group. Therefore, clients implementing this NIP MUST ensure that they retain access to the private key material of the signing key for each group they are a member of. + +In most cases, it's assumed that clients implementing this NIP will manage the creation and rotation of KeyPackage Events. + +### Example KeyPackage Event + +```json + { + "id": , + "kind": 443, + "created_at": , + "pubkey":
, + "content": "", + "tags": [ + ["mls_protocol_version", "1.0"], + ["ciphersuite", ], + ["extensions", ], + ["client", , , ], + ["relays", ], + ["-"] + ], + "sig": +} +``` + +- The `content` hex encoded serialized `KeyPackageBundle` from MLS. +- The `mls_protocol_version` tag is required and MUST be the version number of the MLS protocol version being used. For now, this is `1.0`. +- The `ciphersuite` tag is the value of the MLS ciphersuite that this KeyPackage Event supports. [Read more about ciphersuites in MLS](https://www.rfc-editor.org/rfc/rfc9420.html#name-mls-cipher-suites). +- The `extensions` tag is an array of MLS extension IDs that this KeyPackage Event supports. [Read more about MLS extensions](https://www.rfc-editor.org/rfc/rfc9420.html#name-extensions). +- (optional) The `client` tag helps other clients manage the user experience when they receive group invites but don't have access to the signing key. +- The `relays` tag identifies each of the relays that the client will attempt to publish this KeyPackage event. This allows for deletion of KeyPackage Events at a later date. +- (optional) The `-` tag can be used to ensure that KeyPackage Events are only published by their authenticated author. Read more in [NIP-70](70.md) + +### Deleting KeyPackage Events + +Clients SHOULD delete the KeyPackage Event on all the listed relays any time they successfully process a group request event for a given KeyPackage Event. Clients MAY also create a new KeyPackage Event at the same time. + +If clients cannot process a Welcome message (e.g. because the signing key was generated on another client), clients MUST not delete the KeyPackage Event and SHOULD show a human-understandable error to the user. + +### Rotating Signing Keys + +Clients MUST regularly rotate the user's signing key in each group that they are a part of. The more often the signing key is rotated the stronger the post-compromise security. This rotation is done via `Proposal` and `Commit` events and broadcast to the group via a Group Event. [Read more about forward secrecy and post-compromise security inherent in MLS](https://www.rfc-editor.org/rfc/rfc9420.html#name-forward-secrecy-and-post-co). + +### KeyPackage Relays List Event + +A `kind: 10051` event indicates the relays that a user will publish their KeyPackage Events to. The event MUST include a list of relay tags with relay URIs. These relays SHOULD be readable by anyone the user wants to be able to contact them. + +```json +{ + "kind": 10051, + "tags": [ + ["relay", "wss://inbox.nostr.wine"], + ["relay", "wss://myrelay.nostr1.com"], + ], + "content": "", + //...other fields +} +``` + +### Welcome Event + +When a new user is added to a group via an MLS `Commit` message. The member who sends the `Commit` message to the group is responsible for sending the user being added to the group a Welcome Event. This Welcome Event is sent to the user as a [NIP-59](59.md) gift-wrapped event. The Welcome Event gives the new member the context they need to join the group and start sending messages. + +Clients creating the Welcome Event SHOULD wait until they have received acknowledgement from relays that their Group Event with the `Commit` has been received before publishing the Welcome Event. + +```json +{ + "id": , + "kind": 444, + "created_at": , + "pubkey": , + "content": , + "tags": [ + ["e", ], + ["relays", ], + ], + "sig": +} +``` + +- The `content` field is required and is a serialized MLSMessage object containing the MLS `Welcome` object. +- The `e` tag is required and is the ID of the KeyPackage Event used to add the user to the group. +- The `relays` tag is required and is a list of relays clients should query for Group Events. + +Welcome Events are then sealed and gift-wrapped as detailed in [NIP-59](59.md) before being published. Like all events that are sealed and gift-wrapped, `kind: 444` events MUST never be signed. This ensures that if they were ever leaked they would not be publishable to relays. + +#### Large Groups + +For groups above ~150 participants, welcome messages will become larger than the maximum event size allowed by Nostr. There is currently work underway on the MLS protocol to support "light" client welcomes that don't require the full Ratchet Tree state to be sent to the new member. This section will be updated with recommendations for how to handle large groups. + +## Group Events + +Group Events are all the messages that are sent within a group. This includes all "control" events that update the shared group state over time (`Proposal`, `Commit`) and messages sent between members of the group (`Application` messages). + +Group Events are published using an ephemeral Nostr keypair to obfuscate the number and identity of group participants. Clients MUST use a new Nostr keypair for each Group Event they publish. + +```json +{ + "id": , + "kind": 445, + "created_at": , + "pubkey": , + "content": , + "tags": [ + ["h", ] + ], + "sig": +} +``` +- The `content` field is a [tls-style](https://www.rfc-editor.org/rfc/rfc9420.html#name-the-message-mls-media-type) serialized [`MLSMessage`](https://www.rfc-editor.org/rfc/rfc9420.html#section-6-4) object which is then encrypted according to [NIP-44](44.md). However, instead of using the sender and receivers keys the NIP-44 encryption is done using a Nostr keypair generated from the MLS [`exporter_secret`](https://www.rfc-editor.org/rfc/rfc9420.html#section-8.5) to calulate the `conversation key` value. Essentially, you use the hex-encoded `exporter_secret` value as the private key, calculate the public key, and then use those two keys to encrypt and decrypt messages. +- The `exporter_secret` value should be generated with a 32-byte length and labeled `nostr`. This `exporter_secret` value is rotated on each new epoch in the group. Clients should generate a new 32-byte value each time they process a valid `Commit` message. +- The `pubkey` is the hex-encoded public key of the ephemeral sender. +- The `h` tag is the nostr group ID value (from the Nostr Group Data Extension). + +### Application Messages + +Application messages are the messages that are sent within the group by members. These are contained within the `MLSMessage` object. The format of these messages should be unsigned Nostr events of the appropriate kind. For normal DM or group messages, clents SHOULD use `kind: 9` chat message events. If the user reacts to a message, it would be a `kind: 7` event, and so on. + +This means that once the application message has been decrypted and deserialized, clients can store those events and treat them as any other Nostr event, effectively creating a private Nostr feed of the group's activity and taking advantage of all the features of Nostr. + +These inner unsigned Nostr events MUST use the member's Nostr identity key for the `pubkey` field and clients MUST check that the identity of them member who sent the message matches the pubkey of the inner Nostr event. + +These Nostr events MUST remain **unsigned** to ensure that if they were to leak to relays they would not be published publicly. These Nostr events MUST not include any "h" tags or other tags that would identify the group that they belong to. + +### `Commit` Message race conditions + +The MLS protocol is resilient to almost all messages arriving out of order. However, the order of `Commit` messages is important for the group state to move forward from one epoch to the next correctly. Given Nostr's nature as a decentralized network, it is possible for a client to receive 2 or more `Commit` messages all attempting to update to a new epoch at the same time. + +Clients sending commit messages MUST wait until they receive acknowledgement from at least one relay that their Group Message Event with the `Commit` has been received before applying the commit to their own group state. + +If a client receives 2 or more `Commit` messages attempting to change same epoch, they MUST apply only one of the `Commit` messages they receive, determined by the following: + +1. Using the `created_at` timestamp on the kind `445` event. The `Commit` with the lowest value for `created_at` is the message to be applied. The other `Commit` message is discarded. +2. If the `created_at` timestamp is the same for two or more `Commit` messages, the `Commit` message with the lowest value for `id` field is the message to be applied. + +Clients SHOULD retain previous group state for a short period of time in order to recover from forked group state. diff --git a/README.md b/README.md index 2b305a9..bced697 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-B7: Blossom](B7.md) - [NIP-C0: Code Snippets](C0.md) - [NIP-C7: Chats](C7.md) +- [NIP-EE: E2EE Messaging using MLS Protocol](EE.md) ## Event Kinds | kind | description | NIP | -- cgit v1.2.3 From fd9c627b36aae2b56acfb8eae80429458daa7fef Mon Sep 17 00:00:00 2001 From: AsaiToshiya Date: Thu, 28 Aug 2025 23:15:52 +0900 Subject: add NIP-EE kinds (#2044) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index bced697..83b4197 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `44` | Channel Mute User | [28](28.md) | | `62` | Request to Vanish | [62](62.md) | | `64` | Chess (PGN) | [64](64.md) | +| `443` | KeyPackage | [EE](EE.md) | +| `444` | Welcome Message | [EE](EE.md) | +| `445` | Group Event | [EE](EE.md) | | `818` | Merge Requests | [54](54.md) | | `1018` | Poll Response | [88](88.md) | | `1021` | Bid | [15](15.md) | @@ -201,6 +204,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10020` | Media follows | [51](51.md) | | `10030` | User emoji list | [51](51.md) | | `10050` | Relay list to receive DMs | [51](51.md), [17](17.md) | +| `10051` | KeyPackage Relays List | [EE](EE.md) | | `10063` | User server list | [Blossom][blossom] | | `10096` | File storage server list | [96](96.md) | | `10166` | Relay Monitor Announcement | [66](66.md) | -- cgit v1.2.3 From 5d81c9100e6f4e47438fc0064d5518b532e018cd Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 8 Sep 2025 14:25:05 -0400 Subject: Removing the idea of "Standard" Tags (#2055) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index 83b4197..55ff26a 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [Message Types](#message-types) - [Client to Relay](#client-to-relay) - [Relay to Client](#relay-to-client) -- [Standardized Tags](#standardized-tags) +- [Common Tags](#common-tags) - [Criteria for acceptance of NIPs](#criteria-for-acceptance-of-nips) - [Is this repository a centralizing factor?](#is-this-repository-a-centralizing-factor) - [How this repository works](#how-this-repository-works) @@ -312,7 +312,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `AUTH` | used to send authentication challenges | [42](42.md) | | `COUNT` | used to send requested event counts to clients | [45](45.md) | -## Standardized Tags +## Common Tags | name | value | other parameters | NIP | | ----------------- | ------------------------------------ | ------------------------------- | -------------------------------------------------- | -- cgit v1.2.3 From c3f92ca5775ab5046e826a681a41c9e2bac96655 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 9 Sep 2025 18:24:13 -0400 Subject: Deprecates NIP-96 (#2047) --- 96.md | 2 ++ README.md | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'README.md') diff --git a/96.md b/96.md index 3828e76..28bc8a8 100644 --- a/96.md +++ b/96.md @@ -1,3 +1,5 @@ +> __Warning__ `unrecommended`: deprecated in favor of [NIP-B7](B7.md) + NIP-96 ====== diff --git a/README.md b/README.md index 55ff26a..3004ef8 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-90: Data Vending Machines](90.md) - [NIP-92: Media Attachments](92.md) - [NIP-94: File Metadata](94.md) -- [NIP-96: HTTP File Storage Integration](96.md) +- [NIP-96: HTTP File Storage Integration](96.md) --- **unrecommended**: replaced by blossom APIs - [NIP-98: HTTP Auth](98.md) - [NIP-99: Classified Listings](99.md) - [NIP-A0: Voice Messages](A0.md) @@ -206,7 +206,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10050` | Relay list to receive DMs | [51](51.md), [17](17.md) | | `10051` | KeyPackage Relays List | [EE](EE.md) | | `10063` | User server list | [Blossom][blossom] | -| `10096` | File storage server list | [96](96.md) | +| `10096` | File storage server list | [96](96.md) (deprecated) | | `10166` | Relay Monitor Announcement | [66](66.md) | | `10312` | Room Presence | [53](53.md) | | `10377` | Proxy Announcement | [Nostr Epoxy][nostr-epoxy] | -- cgit v1.2.3 From 4b19bf2e40dd9b644279e45d5bdfc3ee2e079e34 Mon Sep 17 00:00:00 2001 From: AsaiToshiya Date: Thu, 18 Sep 2025 12:30:58 +0900 Subject: delete BREAKING.md (#2058) --- BREAKING.md | 68 ------------------------------------------------------------- README.md | 5 ----- 2 files changed, 73 deletions(-) delete mode 100644 BREAKING.md (limited to 'README.md') diff --git a/BREAKING.md b/BREAKING.md deleted file mode 100644 index c620a3f..0000000 --- a/BREAKING.md +++ /dev/null @@ -1,68 +0,0 @@ -# Breaking Changes - -This is a history of NIP changes that potentially break pre-existing implementations, in -reverse chronological order. - -| Date | Commit | NIP | Change | -| ----------- | --------- | -------- | ------ | -| 2025-02-14 | [81908b6e](https://github.com/nostr-protocol/nips/commit/81908b6e) | [07](07.md), [46](46.md), [55](55.md) | `getRelays` and `get_relays` were removed | -| 2025-02-07 | [0023ca81](https://github.com/nostr-protocol/nips/commit/0023ca81) | [10](10.md) | `"mention"` marker was removed | -| 2025-01-31 | [6a4b125a](https://github.com/nostr-protocol/nips/commit/6a4b125a) | [71](71.md) | video events were changed to regular | -| 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 | -| 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), [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: 30001` was deprecated | -| 2023-11-20 | [7822a8b1](https://github.com/nostr-protocol/nips/commit/7822a8b1) | [51](51.md) | the meaning of `kind: 30000` was changed | -| 2023-11-11 | [cbdca1e9](https://github.com/nostr-protocol/nips/commit/cbdca1e9) | [84](84.md) | `range` tag was removed | -| 2023-11-10 | [c945d8bd](https://github.com/nostr-protocol/nips/commit/c945d8bd) | [32](32.md) | `l` tag annotations was removed | -| 2023-11-07 | [108b7f16](https://github.com/nostr-protocol/nips/commit/108b7f16) | [01](01.md) | `OK` message must have 4 items | -| 2023-10-17 | [cf672b76](https://github.com/nostr-protocol/nips/commit/cf672b76) | [03](03.md) | `block` tag was removed | -| 2023-09-29 | [7dc6385f](https://github.com/nostr-protocol/nips/commit/7dc6385f) | [57](57.md) | optional `a` tag was included in `zap receipt` | -| 2023-08-21 | [89915e02](https://github.com/nostr-protocol/nips/commit/89915e02) | [11](11.md) | `min_prefix` was removed | -| 2023-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), [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` | -| 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. - -## NOTES - -- 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. diff --git a/README.md b/README.md index 3004ef8..f5194de 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [Criteria for acceptance of NIPs](#criteria-for-acceptance-of-nips) - [Is this repository a centralizing factor?](#is-this-repository-a-centralizing-factor) - [How this repository works](#how-this-repository-works) -- [Breaking Changes](#breaking-changes) - [License](#license) --- @@ -408,10 +407,6 @@ Standards may emerge in two ways: the first way is that someone starts doing som These two ways of standardizing things are supported by this repository. Although the second is preferred, an effort will be made to codify standards emerged outside this repository into NIPs that can be later referenced and easily understood and implemented by others -- but obviously as in any human system discretion may be applied when standards are considered harmful. -## Breaking Changes - -[Breaking Changes](BREAKING.md) - ## License All NIPs are public domain. -- cgit v1.2.3 From 6e6b9877b32b44e84c0f3c3d412d688cf86761b0 Mon Sep 17 00:00:00 2001 From: DanConwayDev <114834599+DanConwayDev@users.noreply.github.com> Date: Thu, 16 Oct 2025 18:08:48 +0100 Subject: NIP-34: add PR and PR update events (#1966) --- 34.md | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ README.md | 5 ++++ 2 files changed, 89 insertions(+), 8 deletions(-) (limited to 'README.md') diff --git a/34.md b/34.md index ab80a93..d35c0eb 100644 --- a/34.md +++ b/34.md @@ -10,7 +10,7 @@ This NIP defines all the ways code collaboration using and adjacent to [`git`](h ## Repository announcements -Git repositories are hosted in Git-enabled servers, but their existence can be announced using Nostr events, as well as their willingness to receive patches, bug reports and comments in general. +Git repositories are hosted in Git-enabled servers, but their existence can be announced using Nostr events. By doing so the author asserts themselves as a maintainer and expresses a willingness to receive patches, bug reports and comments in general, unless `t` tag `personal-fork` is included. ```jsonc { @@ -25,6 +25,7 @@ Git repositories are hosted in Git-enabled servers, but their existence can be a ["relays", "", ...], // relays that this repository will monitor for patches and issues ["r", "", "euc"], ["maintainers", "", ...], + ["t","personal-fork"], // optionally indicate author isn't a maintainer ["t", ""], // hashtags labelling the repository ] } @@ -66,9 +67,13 @@ The `refs` tag can be optionally extended to enable clients to identify how many } ``` -## Patches +## Patches and Pull Requests (PRs) -Patches can be sent by anyone to any repository. Patches to a specific repository SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. Patch events SHOULD include an `a` tag pointing to that repository's announcement address. +Patches and PRs can be sent by anyone to any repository. Patches and PRs to a specific repository SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. Patch and PR events SHOULD include an `a` tag pointing to that repository's announcement address. + +Patches SHOULD be used if each event is under 60kb, otherwise PRs SHOULD be used. + +### Patches Patches in a patch set SHOULD include a [NIP-10](10.md) `e` `reply` tag pointing to the previous patch. @@ -103,9 +108,66 @@ The first patch revision in a patch revision SHOULD include a [NIP-10](10.md) `e The first patch in a series MAY be a cover letter in the format produced by `git format-patch`. +### Pull Requests + +The PR or PR update tip SHOULD be successfully pushed to `refs/nostr/<[PR|PR-Update]-event-id>` in all repositories listed in its `clone` tag before the event is signed. + +An attempt SHOULD be made to push this ref to all repositories listed in the repository's announcement event's `"clone"` tag, for which their is reason to believe the user might have write access. This includes each [grasp server](https://njump.me/naddr1qvzqqqrhnypzpgqgmmc409hm4xsdd74sf68a2uyf9pwel4g9mfdg8l5244t6x4jdqy28wumn8ghj7un9d3shjtnwva5hgtnyv4mqqpt8wfshxuqlnvh8x) which can be identified using this method: `clone` tag includes `[http|https]:////.git` and `relays` tag includes `[ws/wss]://`. + +Clients MAY fallback to creating a 'personal-fork' `repository announcement` listing other grasp servers, e.g. from the `User grasp list`, for the purpose of serving the specified commit(s). + +```jsonc +{ + "kind": 1618, + "content": "", + "tags": [ + ["a", "30617::"], + ["r", ""] // so clients can subscribe to all PRs sent to a local git repo + ["p", ""], + ["p", ""], // optionally send the PR to another user to bring it to their attention + + ["subject", ""], + ["t", ""], // optional + ["t", ""], // optional + + ["c", ""], // tip of the PR branch + ["clone", "", ...], // at least one git clone url where commit can be downloaded + ["branch-name", ""], // optional recommended branch name + + ["e", ""], // optionally indicate PR is a revision of an existing patch, which should be closed + ["merge-base", ""], // optional: the most recent common ancestor with the target branch + ] +} +``` + +### Pull Request Updates + +A PR Update changes the tip of a referenced PR event. + +```jsonc +{ + "kind": 1619, + "content": "", + "tags": [ + ["a", "30617::"], + ["r", ""] // so clients can subscribe to all PRs sent to a local git repo + ["p", ""], + ["p", ""], // optionally send the PR to another user to bring it to their attention + + // NIP-22 tags + ["E", ""], + ["P", ""], + + ["c", ""], // updated tip of PR + ["clone", "", ...], // at least one git clone url where commit can be downloaded + ["merge-base", ""], // optional: the most recent common ancestor with the target branch + ] +} +``` + ## Issues -Issues are Markdown text that is just human-readable conversational threads related to the repository: bug reports, feature requests, questions or comments of any kind. Like patches, these SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. +Issues are Markdown text that is just human-readable conversational threads related to the repository: bug reports, feature requests, questions or comments of any kind. Like patches, these SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. Issues may have a `subject` tag, which clients can utilize to display a header. Additionally, one or more `t` tags may be included to provide labels for the issue. @@ -125,11 +187,11 @@ Issues may have a `subject` tag, which clients can utilize to display a header. ## Replies -Replies to either a `kind:1621` (_issue_) or a `kind:1617` (_patch_) event should follow [NIP-22 comment](22.md). +Replies to either a `kind:1621` (_issue_), `kind:1617` (_patch_) or `kind:1618` (_pull request_) event should follow [NIP-22 comment](22.md). ## Status -Root Patches and Issues have a Status that defaults to 'Open' and can be set by issuing Status events. +Root Patches, PRs and Issues have a Status that defaults to 'Open' and can be set by issuing Status events. ```jsonc { @@ -139,7 +201,7 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by "kind": 1633, // Draft "content": "", "tags": [ - ["e", "", "", "root"], + ["e", "", "", "root"], ["e", "", "", "reply"], // for when revisions applied ["p", ""], ["p", ""], @@ -165,8 +227,22 @@ The most recent Status event (by `created_at` date) from either the issue/patch The Status of a patch-revision is to either that of the root-patch, or `1632` (_Closed_) if the root-patch's Status is `1631` (_Applied/Merged_) and the patch-revision isn't tagged in the `1631` (_Applied/Merged_) event. +## User grasp list + +List of [grasp servers](https://njump.me/naddr1qvzqqqrhnypzpgqgmmc409hm4xsdd74sf68a2uyf9pwel4g9mfdg8l5244t6x4jdqy28wumn8ghj7un9d3shjtnwva5hgtnyv4mqqpt8wfshxuqlnvh8x) the user generally wishes to use for NIP-34 related activity. It is similar in function to the NIP-65 relay list and NIP-B7 blossom list. + +The event SHOULD include a list of `g` tags with grasp service websocket URLs in order of preference. + +```jsonc +{ + "kind": 10317, + "content": "", + "tags": [ + ["g", ""], // zero or more grasp sever urls + ] +} +``` ## Possible things to be added later -- "branch merge" kind (specifying a URL from where to fetch the branch to be merged) - inline file comments kind (we probably need one for patches and a different one for merged files) diff --git a/README.md b/README.md index f5194de..445876e 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `1311` | Live Chat Message | [53](53.md) | | `1337` | Code Snippet | [C0](C0.md) | | `1617` | Patches | [34](34.md) | +| `1618` | Pull Requests | [34](34.md) | +| `1619` | Pull Request Updates | [34](34.md) | | `1621` | Issues | [34](34.md) | | `1622` | Git Replies (deprecated) | [34](34.md) | | `1630`-`1633` | Status | [34](34.md) | @@ -317,6 +319,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | ----------------- | ------------------------------------ | ------------------------------- | -------------------------------------------------- | | `a` | coordinates to an event | relay URL | [01](01.md) | | `A` | root address | relay URL | [22](22.md) | +| `c` | commit id | | [34](34.md) | | `d` | identifier | -- | [01](01.md) | | `e` | event id (hex) | relay URL, marker, pubkey (hex) | [01](01.md), [10](10.md) | | `E` | root event id | relay URL | [22](22.md) | @@ -345,6 +348,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `alt` | summary | -- | [31](31.md) | | `amount` | millisatoshis, stringified | -- | [57](57.md) | | `bolt11` | `bolt11` invoice | -- | [57](57.md) | +| `branch-name` | branch name suggestion | -- | [34](34.md) | | `challenge` | challenge string | -- | [42](42.md) | | `client` | name, address | relay URL | [89](89.md) | | `clone` | git clone URL | -- | [34](34.md) | @@ -358,6 +362,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `expiration` | unix timestamp (string) | -- | [40](40.md) | | `file` | full path (string) | -- | [35](35.md) | | `goal` | event id (hex) | relay URL | [75](75.md) | +| `merge-base` | commit id | | [34](34.md) | | `HEAD` | `ref: refs/heads/` | | [34](34.md) | | `image` | image URL | dimensions in pixels | [23](23.md), [52](52.md), [58](58.md) | | `imeta` | inline metadata | -- | [92](92.md) | -- cgit v1.2.3 From 45668383e372fc6ec7c9aa4023efbfad637e6bfe Mon Sep 17 00:00:00 2001 From: AsaiToshiya Date: Tue, 4 Nov 2025 22:46:47 +0900 Subject: add NIP-43 and its kinds to README. (#2110) --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index 445876e..ccae3aa 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,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-43: Relay Access Metadata and Requests](43.md) - [NIP-44: Encrypted Payloads (Versioned)](44.md) - [NIP-45: Counting results](45.md) - [NIP-46: Nostr Remote Signing](46.md) @@ -182,6 +183,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `7376` | Cashu Wallet History | [60](60.md) | | `7516` | Geocache log | [geocaching][geocaching] | | `7517` | Geocache proof of find | [geocaching][geocaching] | +| `8000` | Add User | [43](43.md) | +| `8001` | Remove User | [43](43.md) | | `9000`-`9030` | Group Control Events | [29](29.md) | | `9041` | Zap Goal | [75](75.md) | | `9321` | Nutzap | [61](61.md) | @@ -213,6 +216,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10377` | Proxy Announcement | [Nostr Epoxy][nostr-epoxy] | | `11111` | Transport Method Announcement | [Nostr Epoxy][nostr-epoxy] | | `13194` | Wallet Info | [47](47.md) | +| `13534` | Membership Lists | [43](43.md) | | `17375` | Cashu Wallet Event | [60](60.md) | | `21000` | Lightning Pub RPC | [Lightning.Pub][lnpub] | | `22242` | Client Authentication | [42](42.md) | @@ -221,6 +225,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `24133` | Nostr Connect | [46](46.md) | | `24242` | Blobs stored on mediaservers | [Blossom][blossom] | | `27235` | HTTP Auth | [98](98.md) | +| `28934` | Join Request | [43](43.md) | +| `28935` | Invite Request | [43](43.md) | +| `28936` | Leave Request | [43](43.md) | | `30000` | Follow sets | [51](51.md) | | `30001` | Generic lists | 51 (deprecated) | | `30002` | Relay sets | [51](51.md) | -- cgit v1.2.3 From d8e57865d7869a35567fbb332f19d0c13a36aaa9 Mon Sep 17 00:00:00 2001 From: AsaiToshiya Date: Sat, 15 Nov 2025 05:27:17 +0900 Subject: add NIP-BE to README. --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index ccae3aa..fd498ce 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-A0: Voice Messages](A0.md) - [NIP-B0: Web Bookmarks](B0.md) - [NIP-B7: Blossom](B7.md) +- [NIP-BE: Nostr BLE Communications Protocol](BE.md) - [NIP-C0: Code Snippets](C0.md) - [NIP-C7: Chats](C7.md) - [NIP-EE: E2EE Messaging using MLS Protocol](EE.md) -- cgit v1.2.3 From 247205a155e5fd5e8ca39f4b3e7b76796ea6a8a6 Mon Sep 17 00:00:00 2001 From: JeffG <202880+erskingardner@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:54:19 +0100 Subject: Replace NIP-EE with Marmot (#2154) --- EE.md | 4 +++- README.md | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) (limited to 'README.md') diff --git a/EE.md b/EE.md index f84f47d..dacb152 100644 --- a/EE.md +++ b/EE.md @@ -1,10 +1,12 @@ +> __Warning__ `unrecommended`: superseded by the [Marmot Protocol](https://github.com/marmot-protocol/marmot) + NIP-EE ====== E2EE Messaging using the Messaging Layer Security (MLS) Protocol ---------------------------------------------------------------- -`draft` `optional` +`final` `unrecommended` `optional` This NIP standardizes how to use the [MLS Protocol](https://www.rfc-editor.org/rfc/rfc9420.html) with Nostr for efficient and E2EE (end-to-end encrypted) direct and group messaging. diff --git a/README.md b/README.md index fd498ce..fb5a5e4 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-BE: Nostr BLE Communications Protocol](BE.md) - [NIP-C0: Code Snippets](C0.md) - [NIP-C7: Chats](C7.md) -- [NIP-EE: E2EE Messaging using MLS Protocol](EE.md) +- [NIP-EE: E2EE Messaging using MLS Protocol](EE.md) --- **unrecommended**: superseded by the [Marmot Protocol](https://github.com/marmot-protocol/marmot) ## Event Kinds | kind | description | NIP | @@ -135,9 +135,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `21` | Video Event | [71](71.md) | | `22` | Short-form Portrait Video Event | [71](71.md) | | `30` | internal reference | [NKBIP-03] | -| `31` | external web reference | [NKBIP-03] | -| `32` | hardcopy reference | [NKBIP-03] | -| `33` | prompt reference | [NKBIP-03] | +| `31` | external web reference | [NKBIP-03] | +| `32` | hardcopy reference | [NKBIP-03] | +| `33` | prompt reference | [NKBIP-03] | | `40` | Channel Creation | [28](28.md) | | `41` | Channel Metadata | [28](28.md) | | `42` | Channel Message | [28](28.md) | @@ -145,9 +145,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `44` | Channel Mute User | [28](28.md) | | `62` | Request to Vanish | [62](62.md) | | `64` | Chess (PGN) | [64](64.md) | -| `443` | KeyPackage | [EE](EE.md) | -| `444` | Welcome Message | [EE](EE.md) | -| `445` | Group Event | [EE](EE.md) | +| `443` | KeyPackage | [Marmot](marmot) | +| `444` | Welcome Message | [Marmot](marmot) | +| `445` | Group Event | [Marmot](marmot) | | `818` | Merge Requests | [54](54.md) | | `1018` | Poll Response | [88](88.md) | | `1021` | Bid | [15](15.md) | @@ -209,7 +209,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `10020` | Media follows | [51](51.md) | | `10030` | User emoji list | [51](51.md) | | `10050` | Relay list to receive DMs | [51](51.md), [17](17.md) | -| `10051` | KeyPackage Relays List | [EE](EE.md) | +| `10051` | KeyPackage Relays List | [Marmot](marmot) | | `10063` | User server list | [Blossom][blossom] | | `10096` | File storage server list | [96](96.md) (deprecated) | | `10166` | Relay Monitor Announcement | [66](66.md) | @@ -296,6 +296,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos [Tidal-nostr]: https://wikistr.com/tidal-nostr [geocaching]: https://nostrhub.io/naddr1qvzqqqrcvypzppscgyy746fhmrt0nq955z6xmf80pkvrat0yq0hpknqtd00z8z68qqgkwet0vdskx6rfdenj6etkv4h8guc6gs5y5 [nostr-epoxy]: https://github.com/Origami74/nostr-epoxy-reverse-proxy +[marmot]: https://github.com/marmot-protocol/marmot + ## Message types -- cgit v1.2.3 From 862c7c0fe971c3754115fcac92a5dcc99845f67a Mon Sep 17 00:00:00 2001 From: Vic <88121568+vicariousdrama@users.noreply.github.com> Date: Tue, 16 Dec 2025 16:47:05 +0000 Subject: Update README.md (#2162) --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index fb5a5e4..09ff724 100644 --- a/README.md +++ b/README.md @@ -218,6 +218,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `11111` | Transport Method Announcement | [Nostr Epoxy][nostr-epoxy] | | `13194` | Wallet Info | [47](47.md) | | `13534` | Membership Lists | [43](43.md) | +| `14388` | User Sound Effect Lists | [Corny Chat][cornychat-usersoundlist] | | `17375` | Cashu Wallet Event | [60](60.md) | | `21000` | Lightning Pub RPC | [Lightning.Pub][lnpub] | | `22242` | Client Authentication | [42](42.md) | @@ -273,6 +274,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `31989` | Handler recommendation | [89](89.md) | | `31990` | Handler information | [89](89.md) | | `32267` | Software Application | | +| `32388` | User Room Favorites | [Corny Chat][cornychat-roomfavorites] | +| `33388` | High Scores | [Corny Chat][cornychat-highscores] | +| `34388` | Sound Effects | [Corny Chat][cornychat-soundeffects] | | `34550` | Community Definition | [72](72.md) | | `38172` | Cashu Mint Announcement | [87](87.md) | | `38173` | Fedimint Announcement | [87](87.md) | @@ -286,8 +290,12 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos [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-usersoundlist]: https://cornychat.com/datatypes#kind14388usersoundeffectslist [cornychat-slideset]: https://cornychat.com/datatypes#kind30388slideset [cornychat-linkset]: https://cornychat.com/datatypes#kind31388linkset +[cornychat-roomfavorites]: https://cornychat.com/datatypes#kind32388roomfavorites +[cornychat-highscores]: https://cornychat.com/datatypes#kind33388highscores +[cornychat-soundeffects]: https://cornychat.com/datatypes#kind34388soundeffectsets [joinstr]: https://gitlab.com/1440000bytes/joinstr/-/blob/main/NIP.md [NKBIP-01]: https://wikistr.com/nkbip-01*fd208ee8c8f283780a9552896e4823cc9dc6bfd442063889577106940fd927c1 [NKBIP-02]: https://wikistr.com/nkbip-02*fd208ee8c8f283780a9552896e4823cc9dc6bfd442063889577106940fd927c1 @@ -390,6 +398,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `repo` | Reference to the origin repository | -- | [C0](C0.md) | | `runtime` | Runtime or environment specification | -- | [C0](C0.md) | | `server` | file storage server url | -- | [96](96.md) | +| `sound` | shortcode, sound url, image url | -- | [51](51.md) | | `subject` | subject | -- | [14](14.md), [17](17.md), [34](34.md) | | `summary` | summary | -- | [23](23.md), [52](52.md) | | `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) | -- cgit v1.2.3 From 3afdad183e25ab1559f05802eaab253dbbd5ec28 Mon Sep 17 00:00:00 2001 From: SondreB Date: Sun, 21 Dec 2025 16:49:43 +0100 Subject: Add support for picture sets in NIP-51, using kind 30006. (#2170) --- 51.md | 1 + README.md | 1 + 2 files changed, 2 insertions(+) (limited to 'README.md') diff --git a/51.md b/51.md index dd2bb3f..a7df430 100644 --- a/51.md +++ b/51.md @@ -55,6 +55,7 @@ Aside from their main identifier, the `"d"` tag, sets can optionally have a `"ti | Bookmark sets | 30003 | user-defined bookmarks categories , for when bookmarks must be in labeled separate groups | `"e"` (kind:1 notes), `"a"` (kind:30023 articles) | | Curation sets | 30004 | groups of articles picked by users as interesting and/or belonging to the same category | `"a"` (kind:30023 articles), `"e"` (kind:1 notes) | | Curation sets | 30005 | groups of videos picked by users as interesting and/or belonging to the same category | `"e"` (kind:21 videos) | +| Curation sets | 30006 | groups of pictures picked by users as interesting and/or belonging to the same category | `"e"` (kind:20 pictures) | | 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)) | diff --git a/README.md b/README.md index 09ff724..fa00660 100644 --- a/README.md +++ b/README.md @@ -236,6 +236,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `30003` | Bookmark sets | [51](51.md) | | `30004` | Curation sets | [51](51.md) | | `30005` | Video sets | [51](51.md) | +| `30006` | Picture sets | [51](51.md) | | `30007` | Kind mute sets | [51](51.md) | | `30008` | Profile Badges | [58](58.md) | | `30009` | Badge Definition | [58](58.md) | -- cgit v1.2.3 From c1ff79f1c6c6f90f032a631d141e6ce8d39be7f2 Mon Sep 17 00:00:00 2001 From: AsaiToshiya Date: Mon, 22 Dec 2025 21:52:03 +0900 Subject: add NIP-A4 to README. --- README.md | 2 ++ 1 file changed, 2 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index fa00660..0f70482 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-98: HTTP Auth](98.md) - [NIP-99: Classified Listings](99.md) - [NIP-A0: Voice Messages](A0.md) +- [NIP-A4: Public Messages](A4.md) - [NIP-B0: Web Bookmarks](B0.md) - [NIP-B7: Blossom](B7.md) - [NIP-BE: Nostr BLE Communications Protocol](BE.md) @@ -134,6 +135,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `20` | Picture | [68](68.md) | | `21` | Video Event | [71](71.md) | | `22` | Short-form Portrait Video Event | [71](71.md) | +| `24` | Public Message | [A4](A4.md) | | `30` | internal reference | [NKBIP-03] | | `31` | external web reference | [NKBIP-03] | | `32` | hardcopy reference | [NKBIP-03] | -- cgit v1.2.3 From f34e98c73f47fed6778e2fc62b256f925bead065 Mon Sep 17 00:00:00 2001 From: rabble Date: Thu, 8 Jan 2026 05:48:48 +1300 Subject: NIP-71: Add addressable video events (kinds 34235, 34236) (#2072) Co-authored-by: hodlbod --- 71.md | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 ++ 2 files changed, 75 insertions(+) (limited to 'README.md') diff --git a/71.md b/71.md index 3068e7a..0124edd 100644 --- a/71.md +++ b/71.md @@ -20,6 +20,20 @@ Nothing except cavaliership and common sense prevents a _short_ video from being The format uses a _regular event_ kind `21` for _normal_ videos and `22` for _short_ videos. +## Addressable Video Events + +For content that may need updates after publication (such as correcting metadata, descriptions, or handling URL migrations), addressable versions are available: + +- Kind `34235` for _addressable normal videos_ +- Kind `34236` for _addressable short videos_ + +These addressable events follow the same format as their regular counterparts but include a `d` tag as a unique identifier and can be updated while maintaining the same addressable reference. This is particularly useful for: + +- Metadata corrections (descriptions, titles, tags) without republishing +- Preservation of imported content IDs from legacy platforms +- URL migration when hosting changes +- Platform migration tracking + The `.content` of these events is a summary or description on the video content. The primary source of video information is the `imeta` tags which is defined in [NIP-92](92.md) @@ -81,6 +95,9 @@ The `image` tag contains a preview image (at the same resolution). Multiple `ima Additionally `service nip96` may be included to allow clients to search the authors NIP-96 server list to find the file using the hash. +### Required tags for addressable events: +* `d` - Unique identifier for this video (user-chosen string, required for kinds 34235, 34236) + ### Other tags: * `title` (required) title of the video * `published_at`, for the timestamp in unix seconds (stringified) of the first time the video was published @@ -92,6 +109,9 @@ Additionally `service nip96` may be included to allow clients to search the auth * `p` (optional, repeated) 32-bytes hex pubkey of a participant in the video, optional recommended relay URL * `r` (optional, repeated) references / links to web pages +### Optional tags for imported content: +* `origin` - Track original platform and ID: `["origin", "", "", "", ""]` + ```jsonc { "id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>", @@ -135,3 +155,56 @@ Additionally `service nip96` may be included to allow clients to search the auth ] } ``` + +## Addressable Event Example + +```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": 34235 | 34236, + "content": "", + "tags": [ + ["d", ""], + ["title", ""], + ["published_at", "<unix timestamp>"], + ["alt", "<description for accessibility>"], + + // video data + ["imeta", + "url https://example.com/media.mp4", + "m video/mp4", + "dim 480x480", + "blurhash eVF$^OI:${M{%LRjWBoLoLaeR*", + "image https://example.com/thumb.jpg", + "x 3093509d1e0bc604ff60cb9286f4cd7c781553bc8991937befaacfdc28ec5cdc" + ], + + ["duration", <duration in seconds>], + ["content-warning", "<reason>"], + + // origin tracking for imported content + ["origin", "<platform>", "<external-id>", "<original-url>", "<optional-metadata>"], + + // participants + ["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>"], + + // hashtags + ["t", "<tag>"], + ["t", "<tag>"], + + // reference links + ["r", "<url>"] + ] +} +``` + +## Referencing Addressable Events + +To reference an addressable video: + +``` +["a", "34235:<pubkey>:<d-tag-value>", "<relay-url>"] // for normal videos +["a", "34236:<pubkey>:<d-tag-value>", "<relay-url>"] // for short videos +``` diff --git a/README.md b/README.md index 0f70482..7d3e4f4 100644 --- a/README.md +++ b/README.md @@ -279,6 +279,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `32267` | Software Application | | | `32388` | User Room Favorites | [Corny Chat][cornychat-roomfavorites] | | `33388` | High Scores | [Corny Chat][cornychat-highscores] | +| `34235` | Addressable Video Event | [71](71.md) | +| `34236` | Addressable Short Video Event | [71](71.md) | | `34388` | Sound Effects | [Corny Chat][cornychat-soundeffects] | | `34550` | Community Definition | [72](72.md) | | `38172` | Cashu Mint Announcement | [87](87.md) | -- cgit v1.2.3 From d071018d5a38e1a8a338bd81684fc3029705f5b9 Mon Sep 17 00:00:00 2001 From: Alex Gleason <alex@alexgleason.me> Date: Wed, 28 Jan 2026 15:47:17 -0600 Subject: Add NIP-85 to the README (#2203) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index 7d3e4f4..2e11906 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos - [NIP-78: Application-specific data](78.md) - [NIP-7D: Threads](7D.md) - [NIP-84: Highlights](84.md) +- [NIP-85: Trusted Assertions](85.md) - [NIP-86: Relay Management API](86.md) - [NIP-87: Ecash Mint Discoverability](87.md) - [NIP-88: Polls](88.md) @@ -260,6 +261,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `30312` | Interactive Room | [53](53.md) | | `30313` | Conference Event | [53](53.md) | | `30315` | User Statuses | [38](38.md) | +| `30382` | User Trusted Assertion | [85](85.md) | +| `30383` | Event Trusted Assertion | [85](85.md) | +| `30384` | Addressable Trusted Assertion | [85](85.md) | | `30388` | Slide Set | [Corny Chat][cornychat-slideset] | | `30402` | Classified Listing | [99](99.md) | | `30403` | Draft Classified Listing | [99](99.md) | -- cgit v1.2.3 From 5a4734f8b77519b07568bf693e6dbb0d47aef0b6 Mon Sep 17 00:00:00 2001 From: hodlbod <jstaab@protonmail.com> Date: Fri, 13 Feb 2026 08:45:38 -0800 Subject: Add timehashes to nip 52 (#1752) Co-authored-by: Jon Staab <shtaab@gmail.com> --- 52.md | 6 ++---- README.md | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) (limited to 'README.md') diff --git a/52.md b/52.md index 0b69007..060b38f 100644 --- a/52.md +++ b/52.md @@ -95,6 +95,7 @@ Aside from the common tags, this also takes the following tags: * `end` (optional) exclusive end Unix timestamp in seconds. If omitted, the calendar event ends instantaneously. * `start_tzid` (optional) time zone of the start timestamp, as defined by the IANA Time Zone Database. e.g., `America/Costa_Rica` * `end_tzid` (optional) time zone of the end timestamp, as defined by the IANA Time Zone Database. e.g., `America/Costa_Rica`. If omitted and `start_tzid` is provided, the time zone of the end timestamp is the same as the start timestamp. +* `D` (required) the day-granularity unix timestamp on which the event takes place, calculated as `floor(unix_seconds() / seconds_in_one_day)`. Multiple tags SHOULD be included to cover the event's timeframe. ```yaml { @@ -113,6 +114,7 @@ Aside from the common tags, this also takes the following tags: // timestamps ["start", "<unix timestamp in seconds>"], ["end", "<unix timestamp in seconds>"], + ["D", "82549"], ["start_tzid", "<IANA Time Zone Database identifier>"], ["end_tzid", "<IANA Time Zone Database identifier>"], @@ -203,10 +205,6 @@ The list of tags is as follows: } ``` -## Unsolved Limitations - -* No private events - ## Intentionally Unsupported Scenarios ### Recurring Calendar Events diff --git a/README.md b/README.md index 2e11906..c094d47 100644 --- a/README.md +++ b/README.md @@ -348,6 +348,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos | `A` | root address | relay URL | [22](22.md) | | `c` | commit id | | [34](34.md) | | `d` | identifier | -- | [01](01.md) | +| `D` | day | -- | [52](52.md) | | `e` | event id (hex) | relay URL, marker, pubkey (hex) | [01](01.md), [10](10.md) | | `E` | root event id | relay URL | [22](22.md) | | `f` | currency code | -- | [69](69.md) | -- cgit v1.2.3 From f9f985dff56dec92600a99c59840f4b4640edebf Mon Sep 17 00:00:00 2001 From: AsaiToshiya <to.asai.60@gmail.com> Date: Fri, 6 Mar 2026 22:15:47 +0900 Subject: add kind 10011 (from nip39) (#2256) --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index c094d47..e533ff4 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,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) | +| `10011` | External Identities | [39](39.md) | | `10012` | Favorite relays list | [51](51.md) | | `10013` | Private event relay list | [37](37.md) | | `10015` | Interests list | [51](51.md) | -- cgit v1.2.3