From c60ca888efbdc9b8fa4bbfbace372409d0b2161a Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Thu, 4 Jul 2024 09:57:40 -0300 Subject: nip29: create-group event kind. --- 29.md | 1 + 1 file changed, 1 insertion(+) (limited to '29.md') diff --git a/29.md b/29.md index 0f4a579..74dfd66 100644 --- a/29.md +++ b/29.md @@ -119,6 +119,7 @@ Each moderation action uses a different kind and requires different arguments, w | 9004 | `remove-permission` | `p` (pubkey), `permission` (name) | | 9005 | `delete-event` | `e` (id hex) | | 9006 | `edit-group-status` | `public` or `private`, `open` or `closed` | +| 9007 | `create-group` | | - *group metadata* (`kind:39000`) (optional) -- cgit v1.2.3 From 055101786bb4570f00a14f347c22545833922414 Mon Sep 17 00:00:00 2001 From: sepehr-safari Date: Sun, 18 Aug 2024 14:54:21 +0330 Subject: add kind 9008 for deleting a group --- 29.md | 2 ++ 1 file changed, 2 insertions(+) (limited to '29.md') diff --git a/29.md b/29.md index 74dfd66..7a599b5 100644 --- a/29.md +++ b/29.md @@ -120,6 +120,7 @@ Each moderation action uses a different kind and requires different arguments, w | 9005 | `delete-event` | `e` (id hex) | | 9006 | `edit-group-status` | `public` or `private`, `open` or `closed` | | 9007 | `create-group` | | +| 9008 | `delete-group` | | - *group metadata* (`kind:39000`) (optional) @@ -160,6 +161,7 @@ The list of capabilities, as defined by this NIP, for now, is the following: - `add-permission` - `remove-permission` - `edit-group-status` +- `delete-group` ```js { -- cgit v1.2.3 From 62ac522333d374f9c8bab95f08413f13cf648038 Mon Sep 17 00:00:00 2001 From: sepehr-safari Date: Sun, 18 Aug 2024 14:57:50 +0330 Subject: add kind 9022 for leave request --- 29.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to '29.md') diff --git a/29.md b/29.md index 7a599b5..c2b86f1 100644 --- a/29.md +++ b/29.md @@ -93,6 +93,20 @@ Any user can send one of these events to the relay in order to be automatically } ``` +- *leave request* (`kind:9022`) + +Any user can send one of these events to the relay in order to be automatically removed from the group. The relay will automatically issue a `kind:9001` in response removing this user. + +```js +{ + "kind": 9022, + "content": "optional reason", + "tags": [ + ["h", ""] + ] +} +``` + - *moderation events* (`kinds:9000-9020`) (optional) Clients can send these events to a relay in order to accomplish a moderation action. Relays must check if the pubkey sending the event is capable of performing the given action. The relay may discard the event after taking action or keep it as a moderation log. -- cgit v1.2.3 From ca3c52e3e74f0a4679f1c6c0d9ac6461ea748d2d Mon Sep 17 00:00:00 2001 From: fiatjaf_ Date: Tue, 20 Aug 2024 12:56:05 -0300 Subject: rename "parameterized replaceable event" to "addressable event" (#1418) --- 01.md | 4 ++-- 15.md | 2 +- 19.md | 2 +- 23.md | 2 +- 29.md | 2 +- 33.md | 2 +- 38.md | 2 +- 51.md | 2 +- 52.md | 2 +- 53.md | 2 +- 54.md | 2 +- 57.md | 2 +- 58.md | 2 +- 71.md | 2 +- 75.md | 4 ++-- 78.md | 2 +- 99.md | 2 +- 17 files changed, 19 insertions(+), 19 deletions(-) (limited to '29.md') diff --git a/01.md b/01.md index 1da6e83..73c7e8f 100644 --- a/01.md +++ b/01.md @@ -78,8 +78,8 @@ This NIP defines 3 standard tags that can be used across all event kinds with th - The `e` tag, used to refer to an event: `["e", <32-bytes lowercase hex of the id of another event>, ]` - The `p` tag, used to refer to another user: `["p", <32-bytes lowercase hex of a pubkey>, ]` - The `a` tag, used to refer to a (maybe parameterized) replaceable event - - for a parameterized replaceable event: `["a", :<32-bytes lowercase hex of a pubkey>:, ]` - - for a non-parameterized replaceable event: `["a", :<32-bytes lowercase hex of a pubkey>:, ]` + - for an addressable event: `["a", :<32-bytes lowercase hex of a pubkey>:, ]` + - for a normal replaceable event: `["a", :<32-bytes lowercase hex of a pubkey>:, ]` As a convention, all single-letter (only english alphabet letters: a-z, A-Z) key tags are expected to be indexed by relays, such that it is possible, for example, to query or subscribe to events that reference the event `"5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"` by using the `{"#e": ["5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"]}` filter. diff --git a/15.md b/15.md index 6daa801..2a4e2c2 100644 --- a/15.md +++ b/15.md @@ -300,7 +300,7 @@ This event leverages naddr to enable comprehensive customization and sharing of Bids are simply events of kind `1021` with a `content` field specifying the amount, in the currency of the auction. Bids must reference an auction. > [!NOTE] -> Auctions can be edited as many times as desired (they are "parameterized replaceable events") by the author - even after the start_date, but they cannot be edited after they have received the first bid! This is enforced by the fact that bids reference the event ID of the auction (rather than the product UUID), which changes with every new version of the auctioned product. So a bid is always attached to one "version". Editing the auction after a bid would result in the new product losing the bid! +> Auctions can be edited as many times as desired (they are "addressable events") by the author - even after the start_date, but they cannot be edited after they have received the first bid! This is enforced by the fact that bids reference the event ID of the auction (rather than the product UUID), which changes with every new version of the auctioned product. So a bid is always attached to one "version". Editing the auction after a bid would result in the new product losing the bid! ### Event `1022`: Bid confirmation diff --git a/19.md b/19.md index cce9e64..3ea8e11 100644 --- a/19.md +++ b/19.md @@ -43,7 +43,7 @@ These possible standardized `TLV` types are indicated here: - depends on the bech32 prefix: - for `nprofile` it will be the 32 bytes of the profile public key - for `nevent` it will be the 32 bytes of the event id - - for `naddr`, it is the identifier (the `"d"` tag) of the event being referenced. For non-parameterized replaceable events, use an empty string. + - for `naddr`, it is the identifier (the `"d"` tag) of the event being referenced. For normal replaceable events use an empty string. - `1`: `relay` - for `nprofile`, `nevent` and `naddr`, _optionally_, a relay in which the entity (profile or event) is more likely to be found, encoded as ascii - this may be included multiple times diff --git a/23.md b/23.md index 382df83..d8fb51a 100644 --- a/23.md +++ b/23.md @@ -6,7 +6,7 @@ Long-form Content `draft` `optional` -This NIP defines `kind:30023` (a _parameterized replaceable event_) for long-form text content, generally referred to as "articles" or "blog posts". `kind:30024` has the same structure as `kind:30023` and is used to save long form drafts. +This NIP defines `kind:30023` (an _addressable event_) for long-form text content, generally referred to as "articles" or "blog posts". `kind:30024` has the same structure as `kind:30023` and is used to save long form drafts. "Social" clients that deal primarily with `kind:1` notes should not be expected to implement this NIP. diff --git a/29.md b/29.md index c2b86f1..f867268 100644 --- a/29.md +++ b/29.md @@ -16,7 +16,7 @@ Normally a group will originally belong to one specific relay, but the community ## Relay-generated events -Relays are supposed to generate the events that describe group metadata and group admins. These are parameterized replaceable events signed by the relay keypair directly, with the group _id_ as the `d` tag. +Relays are supposed to generate the events that describe group metadata and group admins. These are _addressable_ events signed by the relay keypair directly, with the group _id_ as the `d` tag. ## Group identifier diff --git a/33.md b/33.md index 337a1f9..9c00d42 100644 --- a/33.md +++ b/33.md @@ -6,4 +6,4 @@ Parameterized Replaceable Events `final` `mandatory` -Moved to [NIP-01](01.md). +Renamed to "Addressable events" and moved to [NIP-01](01.md). diff --git a/38.md b/38.md index 4f2c06d..d841d76 100644 --- a/38.md +++ b/38.md @@ -13,7 +13,7 @@ This NIP enables a way for users to share live statuses such as what music they ## Live Statuses -A special event with `kind:30315` "User Status" is defined as an *optionally expiring* _parameterized replaceable event_, where the `d` tag represents the status type: +A special event with `kind:30315` "User Status" is defined as an *optionally expiring* _addressable event_, where the `d` tag represents the status type: For example: diff --git a/51.md b/51.md index 7e43121..f7a468e 100644 --- a/51.md +++ b/51.md @@ -16,7 +16,7 @@ When new items are added to an existing list, clients SHOULD append them to the ## Standard lists -Standard lists use non-parameterized replaceable events, meaning users may only have a single list of each kind. They have special meaning and clients may rely on them to augment a user's profile or browsing experience. +Standard lists use normal replaceable events, meaning users may only have a single list of each kind. They have special meaning and clients may rely on them to augment a user's profile or browsing experience. For example, _mute list_ can contain the public keys of spammers and bad actors users don't want to see in their feeds or receive annoying notifications from. diff --git a/52.md b/52.md index bedf613..c6d6b96 100644 --- a/52.md +++ b/52.md @@ -6,7 +6,7 @@ Calendar Events `draft` `optional` -This specification defines calendar events representing an occurrence at a specific moment or between moments. These calendar events are _parameterized replaceable_ and deletable per [NIP-09](09.md). +This specification defines calendar events representing an occurrence at a specific moment or between moments. These calendar events are _addressable_ and deletable per [NIP-09](09.md). Unlike the term `calendar event` specific to this NIP, the term `event` is used broadly in all the NIPs to describe any Nostr event. The distinction is being made here to discern between the two terms. diff --git a/53.md b/53.md index 0b1cb81..15bdbc9 100644 --- a/53.md +++ b/53.md @@ -12,7 +12,7 @@ Service providers want to offer live activities to the Nostr network in such a w ### Live Event -A special event with `kind:30311` "Live Event" is defined as a _parameterized replaceable event_ of public `p` tags. Each `p` tag SHOULD have a **displayable** marker name for the current role (e.g. `Host`, `Speaker`, `Participant`) of the user in the event and the relay information MAY be empty. This event will be constantly updated as participants join and leave the activity. +A special event with `kind:30311` "Live Event" is defined as an _addressable event_ of public `p` tags. Each `p` tag SHOULD have a **displayable** marker name for the current role (e.g. `Host`, `Speaker`, `Participant`) of the user in the event and the relay information MAY be empty. This event will be constantly updated as participants join and leave the activity. For example: diff --git a/54.md b/54.md index 0c2dd1c..cf22544 100644 --- a/54.md +++ b/54.md @@ -6,7 +6,7 @@ Wiki `draft` `optional` -This NIP defines `kind:30818` (a _parameterized replaceable event_) for long-form text content similar to [NIP-23](23.md), but with one important difference: articles are meant to be descriptions, or encyclopedia entries, of particular subjects, and it's expected that multiple people will write articles about the exact same subjects, with either small variations or completely independent content. +This NIP defines `kind:30818` (an _addressable event_) for long-form text content similar to [NIP-23](23.md), but with one important difference: articles are meant to be descriptions, or encyclopedia entries, of particular subjects, and it's expected that multiple people will write articles about the exact same subjects, with either small variations or completely independent content. Articles are identified by lowercase, normalized ascii `d` tags. diff --git a/57.md b/57.md index d04eeff..1c0b314 100644 --- a/57.md +++ b/57.md @@ -36,7 +36,7 @@ A `zap request` is an event of kind `9734` that is _not_ published to relays, bu In addition, the event MAY include the following tags: - `e` is an optional hex-encoded event id. Clients MUST include this if zapping an event rather than a person. -- `a` is an optional event coordinate that allows tipping parameterized replaceable events such as NIP-23 long-form notes. +- `a` is an optional event coordinate that allows tipping addressable events such as NIP-23 long-form notes. Example: diff --git a/58.md b/58.md index 4a9ed4c..438574b 100644 --- a/58.md +++ b/58.md @@ -9,7 +9,7 @@ Badges Three special events are used to define, award and display badges in user profiles: -1. A "Badge Definition" event is defined as a parameterized replaceable event with kind `30009` having a `d` tag with a value that uniquely identifies the badge (e.g. `bravery`) published by the badge issuer. Badge definitions can be updated. +1. A "Badge Definition" event is defined as an addressable event with kind `30009` having a `d` tag with a value that uniquely identifies the badge (e.g. `bravery`) published by the badge issuer. Badge definitions can be updated. 2. A "Badge Award" event is a kind `8` event with a single `a` tag referencing a "Badge Definition" event and one or more `p` tags, one for each pubkey the badge issuer wishes to award. Awarded badges are immutable and non-transferrable. diff --git a/71.md b/71.md index 2743b2b..be1587c 100644 --- a/71.md +++ b/71.md @@ -6,7 +6,7 @@ Video Events `draft` `optional` -This specification defines video events representing a dedicated post of externally hosted content. These video events are _parameterized replaceable_ and delete requestable per [NIP-09](09.md). +This specification defines video events representing a dedicated post of externally hosted content. These video events are _addressable_ and delete-requestable per [NIP-09](09.md). Unlike a `kind 1` event with a video attached, Video Events are meant to contain all additional metadata concerning the subject media and to be surfaced in video-specific clients rather than general micro-blogging clients. The thought is for events of this kind to be referenced in a Netflix, YouTube, or TikTok like nostr client where the video itself is at the center of the experience. diff --git a/75.md b/75.md index c16436a..a6f2bff 100644 --- a/75.md +++ b/75.md @@ -53,11 +53,11 @@ The following tags are OPTIONAL. } ``` -The goal MAY include an `r` or `a` tag linking to a URL or parameterized replaceable event. +The goal MAY include an `r` or `a` tag linking to a URL or addressable event. The goal MAY include multiple beneficiary pubkeys by specifying [`zap` tags](57.md#appendix-g-zap-tag-on-other-events). -Parameterized replaceable events can link to a goal by using a `goal` tag specifying the event id and an optional relay hint. +Addressable events can link to a goal by using a `goal` tag specifying the event id and an optional relay hint. ```json { diff --git a/78.md b/78.md index 0f2fada..abdd1b2 100644 --- a/78.md +++ b/78.md @@ -12,7 +12,7 @@ Even though interoperability is great, some apps do not want or do not need inte ## Nostr event -This NIP specifies the use of event kind `30078` (parameterized replaceable event) with a `d` tag containing some reference to the app name and context -- or any other arbitrary string. `content` and other `tags` can be anything or in any format. +This NIP specifies the use of event kind `30078` (an _addressable_ event) with a `d` tag containing some reference to the app name and context -- or any other arbitrary string. `content` and other `tags` can be anything or in any format. ## Some use cases diff --git a/99.md b/99.md index 8948287..b1b7ce9 100644 --- a/99.md +++ b/99.md @@ -6,7 +6,7 @@ Classified Listings `draft` `optional` -This NIP defines `kind:30402`: a parameterized replaceable event to describe classified listings that list any arbitrary product, service, or other thing for sale or offer and includes enough structured metadata to make them useful. +This NIP defines `kind:30402`: an addressable event to describe classified listings that list any arbitrary product, service, or other thing for sale or offer and includes enough structured metadata to make them useful. The category of classifieds includes a very broad range of physical goods, services, work opportunities, rentals, free giveaways, personals, etc. and is distinct from the more strictly structured marketplaces defined in [NIP-15](15.md) that often sell many units of specific products through very specific channels. -- cgit v1.2.3 From e6552476aa2e5ca7256be572a9aa226ec8a022ee Mon Sep 17 00:00:00 2001 From: kehiy Date: Tue, 3 Sep 2024 20:41:31 +0330 Subject: format(all): json formatting --- 02.md | 4 ++-- 05.md | 4 ++-- 09.md | 4 ++-- 11.md | 26 +++++++++++++++----------- 15.md | 19 ++++++++++--------- 17.md | 10 +++++----- 25.md | 8 ++++---- 28.md | 26 +++++++++++++------------- 29.md | 28 ++++++++++++++-------------- 32.md | 26 +++++++++++++------------- 34.md | 7 ++++--- 35.md | 2 +- 38.md | 4 +++- 39.md | 5 +++-- 42.md | 8 ++++---- 46.md | 2 +- 47.md | 10 ++++------ 50.md | 4 ++-- 51.md | 2 +- 53.md | 10 +++++----- 54.md | 8 ++++---- 56.md | 12 ++++++++---- 57.md | 2 +- 58.md | 12 ++++++------ 59.md | 4 ++-- 64.md | 12 ++++++------ 65.md | 4 ++-- 71.md | 2 +- 72.md | 6 +++--- 75.md | 20 ++++++++++---------- 84.md | 4 ++-- 89.md | 22 ++++++++++++---------- 90.md | 26 +++++++++++++------------- 94.md | 4 ++-- 96.md | 51 +++++++++++++++++++++++++-------------------------- 99.md | 2 +- 36 files changed, 206 insertions(+), 194 deletions(-) (limited to '29.md') diff --git a/02.md b/02.md index 4029b22..8354bf0 100644 --- a/02.md +++ b/02.md @@ -14,7 +14,7 @@ The `.content` is not used. For example: -```json +```jsonc { "kind": 3, "tags": [ @@ -23,7 +23,7 @@ For example: ["p", "612ae..e610f", "ws://carolrelay.com/ws", "carol"] ], "content": "", - ...other fields + // other fields... } ``` diff --git a/05.md b/05.md index eeca551..ca6da7b 100644 --- a/05.md +++ b/05.md @@ -16,12 +16,12 @@ The result should be a JSON document object with a key `"names"` that should the If a client sees an event like this: -```json +```jsonc { "pubkey": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9", "kind": 0, "content": "{\"name\": \"bob\", \"nip05\": \"bob@example.com\"}" - ... + // other fields... } ``` diff --git a/09.md b/09.md index b1a28ac..23ffeab 100644 --- a/09.md +++ b/09.md @@ -12,7 +12,7 @@ The event's `content` field MAY contain a text note describing the reason for th For example: -``` +```jsonc { "kind": 5, "pubkey": <32-bytes hex-encoded public key of the event creator>, @@ -24,7 +24,7 @@ For example: ["k", "30023"] ], "content": "these posts were published by accident", - ...other fields + // other fields... } ``` diff --git a/11.md b/11.md index 21c61e4..0ca5870 100644 --- a/11.md +++ b/11.md @@ -66,7 +66,7 @@ These are limitations imposed by the relay on clients. Your client should expect that requests which exceed these *practical* limitations are rejected or fail immediately. -```json +```jsonc { "limitation": { "max_message_length": 16384, @@ -83,7 +83,7 @@ are rejected or fail immediately. "created_at_lower_limit": 31536000, "created_at_upper_limit": 3 }, - ... + // other fields... } ``` @@ -146,14 +146,15 @@ Retention times are given in seconds, with `null` indicating infinity. If zero is provided, this means the event will not be stored at all, and preferably an error will be provided when those are received. -```json +```jsonc { "retention": [ {"kinds": [0, 1, [5, 7], [40, 49]], "time": 3600}, {"kinds": [[40000, 49999]], "time": 100}, {"kinds": [[30000, 39999]], "count": 1000}, {"time": 3600, "count": 10000} - ] + ], + // other fields... } ``` @@ -186,10 +187,10 @@ Users should be able to avoid relays in countries they don't like, and/or select relays in more favorable zones. Exposing this flexibility is up to the client software. -```json +```jsonc { "relay_countries": [ "CA", "US" ], - ... + // other fields... } ``` @@ -208,12 +209,12 @@ local community. This would encourage users to follow the global feed on that relay, in addition to their usual individual follows. To support this goal, relays MAY specify some of the following values. -```json +```jsonc { "language_tags": ["en", "en-419"], "tags": ["sfw-only", "bitcoin-only", "anime"], "posting_policy": "https://example.com/posting-policy.html", - ... + // other fields... } ``` @@ -260,10 +261,10 @@ Relays that require payments may want to expose their fee schedules. A URL pointing to an image to be used as an icon for the relay. Recommended to be squared in shape. -```json +```jsonc { "icon": "https://nostr.build/i/53866b44135a27d624e99c6165cabd76ac8f72797209700acb189fce75021f47.jpg", - ... + // other fields... } ``` @@ -271,9 +272,11 @@ A URL pointing to an image to be used as an icon for the relay. Recommended to b As of 2 May 2023 the following command provided these results: +```bash +$ curl -H "Accept: application/nostr+json" https://eden.nostr.land | jq ``` -~> curl -H "Accept: application/nostr+json" https://eden.nostr.land | jq +```json { "description": "nostr.land family of relays (us-or-01)", "name": "nostr.land", @@ -312,3 +315,4 @@ As of 2 May 2023 the following command provided these results: ] }, } +``` diff --git a/15.md b/15.md index 2a4e2c2..b55b444 100644 --- a/15.md +++ b/15.md @@ -73,10 +73,10 @@ Fields that are not self-explanatory: **Event Tags** -```json +```jsonc { "tags": [["d", , "address": , - "message": ", + "message": , "contact": { "nostr": <32-bytes hex of a pubkey>, "phone": , @@ -237,7 +237,7 @@ Create a customized user experience using the `naddr` from [NIP-19](19.md#sharea **Event Content** -```json +```jsonc { "name": , "about": , @@ -248,7 +248,7 @@ Create a customized user experience using the `naddr` from [NIP-19](19.md#sharea "darkMode": }, "merchants": [array of pubkeys (optional)], - ... + // other fields... } ``` @@ -290,10 +290,11 @@ This event leverages naddr to enable comprehensive customization and sharing of ### Event `1021`: Bid -```json +```jsonc { "content": , "tags": [["e", ]], + // other fields... } ``` @@ -335,4 +336,4 @@ Customer support is handled over whatever communication method was specified. If ## Additional -Standard data models can be found here +Standard data models can be found [here](https://raw.githubusercontent.com/lnbits/nostrmarket/main/models.py) diff --git a/17.md b/17.md index d22dbde..4b96bce 100644 --- a/17.md +++ b/17.md @@ -12,18 +12,18 @@ This NIP defines an encrypted direct messaging scheme using [NIP-44](44.md) encr Kind `14` is a chat message. `p` tags identify one or more receivers of the message. -```js +```jsonc { "id": "",   "pubkey": "", - "created_at": now(), + "created_at": "",   "kind": 14,   "tags": [     ["p", "", ""],     ["p", "", ""],     ["e", "", "", "reply"] // if this is a reply ["subject", ""], -    ... +    // rest of tags...   ],   "content": "", } @@ -86,7 +86,7 @@ Clients CAN offer disappearing messages by setting an `expiration` tag in the gi Kind `10050` indicates the user's preferred relays to receive DMs. The event MUST include a list of `relay` tags with relay URIs. -```js +```jsonc { "kind": 10050, "tags": [ @@ -94,7 +94,7 @@ Kind `10050` indicates the user's preferred relays to receive DMs. The event MUS ["relay", "wss://myrelay.nostr1.com"], ], "content": "", - //...other fields + // other fields... } ``` diff --git a/25.md b/25.md index f038603..671c55f 100644 --- a/25.md +++ b/25.md @@ -57,14 +57,14 @@ Reactions to a website If the target of the reaction is a website, the reaction MUST be a `kind 17` event and MUST include an `r` tag with the website's URL. -```json +```jsonc { "kind": 17, "content": "⭐", "tags": [ ["r", "https://example.com/"] ], - ...other fields + // other fields... } ``` @@ -79,14 +79,14 @@ The client may specify a custom emoji ([NIP-30](30.md)) `:shortcode:` in the reaction content. The client should refer to the emoji tag and render the content as an emoji if shortcode is specified. -```json +```jsonc { "kind": 7, "content": ":soapbox:", "tags": [ ["emoji", "soapbox", "https://gleasonator.com/emoji/Gleasonator/soapbox.png"] ], - ...other fields + // other fields... } ``` diff --git a/28.md b/28.md index 1632088..73c76b2 100644 --- a/28.md +++ b/28.md @@ -25,10 +25,10 @@ Create a public chat channel. In the channel creation `content` field, Client SHOULD include basic channel metadata (`name`, `about`, `picture` and `relays` as specified in kind 41). -```json +```jsonc { "content": "{\"name\": \"Demo Channel\", \"about\": \"A test channel.\", \"picture\": \"https://placekitten.com/200/200\", \"relays\": [\"wss://nos.lol\", \"wss://nostr.mom\"]}", - ... + // other fields... } ``` @@ -52,11 +52,11 @@ Clients MAY add additional metadata fields. Clients SHOULD use [NIP-10](10.md) marked "e" tags to recommend a relay. -```json +```jsonc { "content": "{\"name\": \"Updated Demo Channel\", \"about\": \"Updating a test channel.\", \"picture\": \"https://placekitten.com/201/201\", \"relays\": [\"wss://nos.lol\", \"wss://nostr.mom\"]}", "tags": [["e", , ]], - ... + // other fields... } ``` @@ -71,26 +71,26 @@ Clients SHOULD append [NIP-10](10.md) "p" tags to replies. Root message: -```json +```jsonc { "content": , "tags": [["e", , , "root"]], - ... + // other fields... } ``` Reply to another message: -```json +```jsonc { "content": , "tags": [ ["e", , , "root"], ["e", , , "reply"], ["p", , ], - ... + // rest of tags... ], - ... + // other fields... } ``` @@ -107,11 +107,11 @@ Clients MAY hide event 42s for other users other than the user who sent the even (For example, if three users 'hide' an event giving a reason that includes the word 'pornography', a Nostr client that is an iOS app may choose to hide that message for all iOS clients.) -```json +```jsonc { "content": "{\"reason\": \"Dick pic\"}", "tags": [["e", ]], - ... + // other fields... } ``` @@ -125,11 +125,11 @@ Clients SHOULD hide event 42s shown to a given user, if there is an event 44 fro Clients MAY hide event 42s for users other than the user who sent the event 44. -```json +```jsonc { "content": "{\"reason\": \"Posting dick pics\"}", "tags": [["p", ]], - ... + // other fields... } ``` diff --git a/29.md b/29.md index f867268..6232f8b 100644 --- a/29.md +++ b/29.md @@ -42,14 +42,14 @@ Relays should prevent late publication (messages published now with a timestamp This is the basic unit of a "microblog" root text note sent to a group. -```js +```jsonc "kind": 11, "content": "hello my friends lovers of pizza", "tags": [ ["h", ""], - ["previous", "", "", ...] + ["previous", "", "", /*...*/] ] - ... + // other fields... ``` - *threaded text reply* (`kind:12`) @@ -63,14 +63,14 @@ This is the basic unit of a "microblog" reply note sent to a group. It's the sam This is the basic unit of a _chat message_ sent to a group. -```js +```jsonc "kind": 9, "content": "hello my friends lovers of pizza", "tags": [ ["h", ""], - ["previous", "", "", ...] + ["previous", "", "", /*...*/] ] - ... + // other fields... ``` - *chat message threaded reply* (`kind:10`) @@ -83,7 +83,7 @@ Similar to `kind:12`, this is the basic unit of a chat message sent to a group. Any user can send one of these events to the relay in order to be automatically or manually added to the group. If the group is `open` the relay will automatically issue a `kind:9000` in response adding this user. Otherwise group admins may choose to query for these requests and act upon them. -```js +```json { "kind": 9021, "content": "optional reason", @@ -97,7 +97,7 @@ Any user can send one of these events to the relay in order to be automatically Any user can send one of these events to the relay in order to be automatically removed from the group. The relay will automatically issue a `kind:9001` in response removing this user. -```js +```json { "kind": 9022, "content": "optional reason", @@ -111,13 +111,13 @@ Any user can send one of these events to the relay in order to be automatically Clients can send these events to a relay in order to accomplish a moderation action. Relays must check if the pubkey sending the event is capable of performing the given action. The relay may discard the event after taking action or keep it as a moderation log. -```js +```json { "kind": 90xx, "content": "optional reason", "tags": [ ["h", ""], - ["previous", ...] + ["previous", /*...*/] ] } ``` @@ -142,7 +142,7 @@ This event defines the metadata for the group -- basically how clients should di If the group is forked and hosted in multiple relays, there will be multiple versions of this event in each different relay and so on. -```js +```jsonc { "kind": 39000, "content": "", @@ -154,7 +154,7 @@ If the group is forked and hosted in multiple relays, there will be multiple ver ["public"], // or ["private"] ["open"] // or ["closed"] ] - ... + // other fields... } ``` @@ -177,7 +177,7 @@ The list of capabilities, as defined by this NIP, for now, is the following: - `edit-group-status` - `delete-group` -```js +```json { "kind": 39001, "content": "list of admins for the pizza lovers group", @@ -186,7 +186,7 @@ The list of capabilities, as defined by this NIP, for now, is the following: ["p", "", "ceo", "add-user", "edit-metadata", "delete-event", "remove-user"], ["p", "", "secretary", "add-user", "delete-event"] ] - ... + // other fields... } ``` diff --git a/32.md b/32.md index e06cad5..66f0283 100644 --- a/32.md +++ b/32.md @@ -57,7 +57,7 @@ Example events A suggestion that multiple pubkeys be associated with the `permies` topic. -```json +```jsonc { "kind": 1985, "tags": [ @@ -66,13 +66,13 @@ A suggestion that multiple pubkeys be associated with the `permies` topic. ["p", , ], ["p", , ] ], - ... + // other fields... } ``` A report flagging violence toward a human being as defined by ontology.example.com. -```json +```jsonc { "kind": 1985, "tags": [ @@ -81,13 +81,13 @@ A report flagging violence toward a human being as defined by ontology.example.c ["p", , ], ["p", , ] ], - ... + // other fields... } ``` A moderation suggestion for a chat event. -```json +```jsonc { "kind": 1985, "tags": [ @@ -95,13 +95,13 @@ A moderation suggestion for a chat event. ["l", "approve", "nip28.moderation"], ["e", , ] ], - ... + // other fields... } ``` Assignment of a license to an event. -```json +```jsonc { "kind": 1985, "tags": [ @@ -109,14 +109,14 @@ Assignment of a license to an event. ["l", "MIT", "license"], ["e", , ] ], - ... + // other fields... } ``` Publishers can self-label by adding `l` tags to their own non-1985 events. In this case, the kind 1 event's author is labeling their note as being related to Milan, Italy using ISO 3166-2. -```json +```jsonc { "kind": 1, "tags": [ @@ -124,13 +124,13 @@ is labeling their note as being related to Milan, Italy using ISO 3166-2. ["l", "IT-MI", "ISO-3166-2"] ], "content": "It's beautiful here in Milan!", - ... + // other fields... } ``` Author is labeling their note language as English using ISO-639-1. -```json +```jsonc { "kind": 1, "tags": [ @@ -138,7 +138,7 @@ Author is labeling their note language as English using ISO-639-1. ["l", "en", "ISO-639-1"] ], "content": "English text", - ... + // other fields... } ``` @@ -169,7 +169,7 @@ be handled in some other way. Appendix: Known Ontologies -------------------------- +-------------------------- Below is a non-exhaustive list of ontologies currently in widespread use. diff --git a/34.md b/34.md index 69f460b..9363aeb 100644 --- a/34.md +++ b/34.md @@ -106,7 +106,7 @@ The first patch in a series MAY be a cover letter in the format produced by `git 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. -```jsonc +```json { "kind": 1621, "content": "", @@ -132,8 +132,9 @@ Replies are also Markdown text. The difference is that they MUST be issued as re // other "e" and "p" tags should be applied here when necessary, following the threading rules of NIP-10 ["p", "", "", "mention"], ["e", "", "", "reply"], - // ... - ] + // rest of tags... + ], + // other fields... } ``` diff --git a/35.md b/35.md index 980bc85..3891f6f 100644 --- a/35.md +++ b/35.md @@ -37,7 +37,7 @@ A second level prefix should be included where the database supports multiple me In some cases the url mapping isnt direct, mapping the url in general is out of scope for this NIP, the section above is only a guide so that implementers have enough information to succsesfully map the url if they wish. -```jsonc +```json { "kind": 2003, "content": "", diff --git a/38.md b/38.md index 684843a..8b22b2a 100644 --- a/38.md +++ b/38.md @@ -17,7 +17,7 @@ A special event with `kind:30315` "User Status" is defined as an *optionally exp For example: -```js +```json { "kind": 30315, "content": "Sign up for nostrasia!", @@ -26,7 +26,9 @@ For example: ["r", "https://nostr.world"] ], } +``` +```json { "kind": 30315, "content": "Intergalatic - Beastie Boys", diff --git a/39.md b/39.md index b7c3b9c..3777ac5 100644 --- a/39.md +++ b/39.md @@ -13,7 +13,8 @@ Nostr protocol users may have other online identities such as usernames, profile ## `i` tag on a metadata event A new optional `i` tag is introduced for `kind 0` metadata event defined in [NIP-01](01.md): -```json + +```jsonc { "id": , "pubkey": , @@ -23,7 +24,7 @@ A new optional `i` tag is introduced for `kind 0` metadata event defined in [NIP ["i", "mastodon:bitcoinhackers.org/@semisol", "109775066355589974"] ["i", "telegram:1087295469", "nostrdirectory/770"] ], - ... + // other fields... } ``` diff --git a/42.md b/42.md index 8c70de4..fdc5d10 100644 --- a/42.md +++ b/42.md @@ -22,13 +22,13 @@ A relay may want to require clients to authenticate to access restricted resourc This NIP defines a new message, `AUTH`, which relays CAN send when they support authentication and clients can send to relays when they want to authenticate. When sent by relays the message has the following form: -```json +``` ["AUTH", ] ``` And, when sent by clients, the following form: -```json +``` ["AUTH", ] ``` @@ -38,14 +38,14 @@ And, when sent by clients, the following form: The signed event is an ephemeral event not meant to be published or queried, it must be of `kind: 22242` and it should have at least two tags, one for the relay URL and one for the challenge string as received from the relay. Relays MUST exclude `kind: 22242` events from being broadcasted to any client. `created_at` should be the current time. Example: -```json +```jsonc { "kind": 22242, "tags": [ ["relay", "wss://relay.example.com/"], ["challenge", "challengestringhere"] ], - ... + // other fields... } ``` diff --git a/46.md b/46.md index 389a3e8..e1675b0 100644 --- a/46.md +++ b/46.md @@ -94,7 +94,7 @@ nostrconnect://?relay=&metadata ## Request Events `kind: 24133` -```json +```jsonc { "id": , "kind": 24133, diff --git a/47.md b/47.md index e4e432c..a19230f 100644 --- a/47.md +++ b/47.md @@ -173,7 +173,7 @@ Request: "amount": 123, // invoice amount in msats, required "pubkey": "03...", // payee pubkey, required "preimage": "0123456789abcdef...", // preimage of the payment, optional - "tlv_records: [ // tlv records, optional + "tlv_records": [ // tlv records, optional { "type": 5482373484, // tlv type "value": "0123456789abcdef" // hex encoded tlv value @@ -208,7 +208,7 @@ Request: "method": "multi_pay_keysend", "params": { "keysends": [ - {"id": "4c5b24a351", pubkey": "03...", "amount": 123}, + {"id": "4c5b24a351", "pubkey": "03...", "amount": 123}, {"id": "3da52c32a1", "pubkey": "02...", "amount": 567, "preimage": "abc123..", "tlv_records": [{"type": 696969, "value": "77616c5f6872444873305242454d353736"}]}, ], } @@ -358,8 +358,7 @@ Request: ```jsonc { "method": "get_balance", - "params": { - } + "params": {} } ``` @@ -379,8 +378,7 @@ Request: ```jsonc { "method": "get_info", - "params": { - } + "params": {} } ``` diff --git a/50.md b/50.md index 2a31cb1..9eea1f8 100644 --- a/50.md +++ b/50.md @@ -15,9 +15,9 @@ extensible framework for performing such queries. ## `search` filter field A new `search` field is introduced for `REQ` messages from clients: -```json +```jsonc { - ... + // other fields on filter object... "search": } ``` diff --git a/51.md b/51.md index f7a468e..3792d7f 100644 --- a/51.md +++ b/51.md @@ -111,7 +111,7 @@ Some clients have used these lists in the past, but they should work on transiti ### A _release artifact set_ of an Example App -```json +```jsonc { "id": "567b41fc9060c758c4216fe5f8d3df7c57daad7ae757fa4606f0c39d4dd220ef", "pubkey": "d6dc95542e18b8b7aec2f14610f55c335abebec76f3db9e58c254661d0593a0c", diff --git a/53.md b/53.md index 15bdbc9..ee12fef 100644 --- a/53.md +++ b/53.md @@ -16,7 +16,7 @@ A special event with `kind:30311` "Live Event" is defined as an _addressable eve For example: -```json +```jsonc { "kind": 30311, "tags": [ @@ -35,10 +35,10 @@ For example: ["p", "91cf9..4e5ca", "wss://provider1.com/", "Host", ""], ["p", "14aeb..8dad4", "wss://provider2.com/nostr", "Speaker"], ["p", "612ae..e610f", "ws://provider3.com/ws", "Participant"], - ["relays", "wss://one.com", "wss://two.com", ...] + ["relays", "wss://one.com", "wss://two.com", /*...*/] ], "content": "", - ... + // other fields... } ``` @@ -64,14 +64,14 @@ This feature is important to avoid malicious event owners adding large account h Event `kind:1311` is live chat's channel message. Clients MUST include the `a` tag of the activity with a `root` marker. Other Kind-1 tags such as `reply` and `mention` can also be used. -```json +```jsonc { "kind": 1311, "tags": [ ["a", "30311::", "", "root"], ], "content": "Zaps to live streams is beautiful.", - ... + // other fields... } ``` diff --git a/54.md b/54.md index cf22544..611ec7a 100644 --- a/54.md +++ b/54.md @@ -11,7 +11,7 @@ This NIP defines `kind:30818` (an _addressable event_) for long-form text conten Articles are identified by lowercase, normalized ascii `d` tags. ### Articles -```jsonc +```json { "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.", "tags": [ @@ -96,13 +96,13 @@ Asciidoc has a strict spec, multiple implementations in many languages, and supp # Appendix 1: Merge requests Users can request other users to get their entries merged into someone else's entry by creating a `kind:818` event. -```jsonc +```json { "content": "I added information about how to make hot ice-creams", "kind": 818, "tags": [ [ "a", "30818::hot-ice-creams", "" ], - [ "e", "", "' ], + [ "e", "", "" ], [ "p", "" ], [ "e", "", "", "source" ] ] @@ -114,4 +114,4 @@ Users can request other users to get their entries merged into someone else's en `e` tag: optional version of the article in which this modifications is based `e` tag with `source` marker: the ID of the event that should be merged. This event id MUST be of a `kind:30818` as defined in this NIP. -The destination-pubkey (the pubkey being requested to merge something into their article can create [[NIP-25]] reactions that tag the `kind:818` event with `+` or `-` +The destination-pubkey is the pubkey being requested to merge something into their article can create [[NIP-25]] reactions that tag the `kind:818` event with `+` or `-` diff --git a/56.md b/56.md index fc8d898..f7b1b1a 100644 --- a/56.md +++ b/56.md @@ -41,7 +41,7 @@ further qualification and querying. Example events -------------- -```json +```jsonc { "kind": 1984, "tags": [ @@ -50,9 +50,11 @@ Example events ["l", "NS-nud", "social.nos.ontology"] ], "content": "", - ... + // other fields... } +``` +```jsonc { "kind": 1984, "tags": [ @@ -60,16 +62,18 @@ Example events ["p", ] ], "content": "He's insulting the king!", - ... + // other fields... } +``` +```jsonc { "kind": 1984, "tags": [ ["p", , "impersonation"] ], "content": "Profile is impersonating nostr:", - ... + // other fields... } ``` diff --git a/57.md b/57.md index 1c0b314..b533811 100644 --- a/57.md +++ b/57.md @@ -171,7 +171,7 @@ A client can retrieve `zap receipt`s on events and pubkeys using a NIP-01 filter When an event includes one or more `zap` tags, clients wishing to zap it SHOULD calculate the lnurl pay request based on the tags value instead of the event author's profile field. The tag's second argument is the `hex` string of the receiver's pub key and the third argument is the relay to download the receiver's metadata (Kind-0). An optional fourth parameter specifies the weight (a generalization of a percentage) assigned to the respective receiver. Clients should parse all weights, calculate a sum, and then a percentage to each receiver. If weights are not present, CLIENTS should equally divide the zap amount to all receivers. If weights are only partially present, receivers without a weight should not be zapped (`weight = 0`). -```js +```jsonc { "tags": [ [ "zap", "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2", "wss://nostr.oxtr.dev", "1" ], // 25% diff --git a/58.md b/58.md index 438574b..b6324f4 100644 --- a/58.md +++ b/58.md @@ -74,7 +74,7 @@ Clients SHOULD attempt to render the most appropriate badge thumbnail according ### Example of a Badge Definition event -```json +```jsonc { "pubkey": "alice", "kind": 30009, @@ -85,13 +85,13 @@ Clients SHOULD attempt to render the most appropriate badge thumbnail according ["image", "https://nostr.academy/awards/bravery.png", "1024x1024"], ["thumb", "https://nostr.academy/awards/bravery_256x256.png", "256x256"] ], - ... + // other fields... } ``` ### Example of Badge Award event -```json +```jsonc { "id": "", "kind": 8, @@ -101,14 +101,14 @@ Clients SHOULD attempt to render the most appropriate badge thumbnail according ["p", "bob", "wss://relay"], ["p", "charlie", "wss://relay"] ], - ... + // other fields... } ``` ### Example of a Profile Badges event Honorable Bob The Brave: -```json +```jsonc { "kind": 30008, "pubkey": "bob", @@ -119,6 +119,6 @@ Honorable Bob The Brave: ["a", "30009:alice:honor"], ["e", "", "wss://nostr.academy"] ], - ... + // other fields... } ``` diff --git a/59.md b/59.md index 4dc857f..a4fc99d 100644 --- a/59.md +++ b/59.md @@ -41,7 +41,7 @@ A `seal` is a `kind:13` event that wraps a `rumor` with the sender's regular key to a receiver's pubkey but there is no `p` tag pointing to the receiver. There is no way to know who the rumor is for without the receiver's or the sender's private key. The only public information in this event is who is signing it. -```js +```json { "id": "", "pubkey": "", @@ -60,7 +60,7 @@ Tags MUST must always be empty in a `kind:13`. The inner event MUST always be un A `gift wrap` event is a `kind:1059` event that wraps any other event. `tags` SHOULD include any information needed to route the event to its intended recipient, including the recipient's `p` tag or [NIP-13](13.md) proof of work. -```js +```json { "id": "", "pubkey": "", diff --git a/64.md b/64.md index 7c2329a..616c5d6 100644 --- a/64.md +++ b/64.md @@ -16,23 +16,23 @@ The `.content` of these notes is a string representing a [PGN-database][pgn_form ### Notes -```json +```jsonc { "kind": 64, "content": "1. e4 *", - ... + // other fields... } ``` -```json +```jsonc { "kind": 64, "tags": [ ["alt", "Fischer vs. Spassky in Belgrade on 1992-11-04 (F/S Return Match, Round 29)"], - ... + // rest of tags... ], - "content": "[Event \"F/S Return Match\"]\n[Site \"Belgrade, Serbia JUG\"]\n[Date \"1992.11.04\"]\n[Round \"29\"]\n[White \"Fischer, Robert J.\"]\n[Black \"Spassky, Boris V.\"]\n[Result \"1/2-1/2\"]\n\n1. e4 e5 2. Nf3 Nc6 3. Bb5 {This opening is called the Ruy Lopez.} 3... a6\n4. Ba4 Nf6 5. O-O Be7 6. Re1 b5 7. Bb3 d6 8. c3 O-O 9. h3 Nb8 10. d4 Nbd7\n11. c4 c6 12. cxb5 axb5 13. Nc3 Bb7 14. Bg5 b4 15. Nb1 h6 16. Bh4 c5 17. dxe5\nNxe4 18. Bxe7 Qxe7 19. exd6 Qf6 20. Nbd2 Nxd6 21. Nc4 Nxc4 22. Bxc4 Nb6\n23. Ne5 Rae8 24. Bxf7+ Rxf7 25. Nxf7 Rxe1+ 26. Qxe1 Kxf7 27. Qe3 Qg5 28. Qxg5\nhxg5 29. b3 Ke6 30. a3 Kd6 31. axb4 cxb4 32. Ra5 Nd5 33. f3 Bc8 34. Kf2 Bf5\n35. Ra7 g6 36. Ra6+ Kc5 37. Ke1 Nf4 38. g3 Nxh3 39. Kd2 Kb5 40. Rd6 Kc5 41. Ra6\nNf2 42. g4 Bd3 43. Re6 1/2-1/2" - ... + "content": "[Event \"F/S Return Match\"]\n[Site \"Belgrade, Serbia JUG\"]\n[Date \"1992.11.04\"]\n[Round \"29\"]\n[White \"Fischer, Robert J.\"]\n[Black \"Spassky, Boris V.\"]\n[Result \"1/2-1/2\"]\n\n1. e4 e5 2. Nf3 Nc6 3. Bb5 {This opening is called the Ruy Lopez.} 3... a6\n4. Ba4 Nf6 5. O-O Be7 6. Re1 b5 7. Bb3 d6 8. c3 O-O 9. h3 Nb8 10. d4 Nbd7\n11. c4 c6 12. cxb5 axb5 13. Nc3 Bb7 14. Bg5 b4 15. Nb1 h6 16. Bh4 c5 17. dxe5\nNxe4 18. Bxe7 Qxe7 19. exd6 Qf6 20. Nbd2 Nxd6 21. Nc4 Nxc4 22. Bxc4 Nb6\n23. Ne5 Rae8 24. Bxf7+ Rxf7 25. Nxf7 Rxe1+ 26. Qxe1 Kxf7 27. Qe3 Qg5 28. Qxg5\nhxg5 29. b3 Ke6 30. a3 Kd6 31. axb4 cxb4 32. Ra5 Nd5 33. f3 Bc8 34. Kf2 Bf5\n35. Ra7 g6 36. Ra6+ Kc5 37. Ke1 Nf4 38. g3 Nxh3 39. Kd2 Kb5 40. Rd6 Kc5 41. Ra6\nNf2 42. g4 Bd3 43. Re6 1/2-1/2", + // other fields... } ``` diff --git a/65.md b/65.md index f32c965..71660d4 100644 --- a/65.md +++ b/65.md @@ -12,7 +12,7 @@ The event MUST include a list of `r` tags with relay URIs and a `read` or `write The `.content` is not used. -```json +```jsonc { "kind": 10002, "tags": [ @@ -22,7 +22,7 @@ The `.content` is not used. ["r", "wss://nostr-relay.example.com", "read"] ], "content": "", - ...other fields + // other fields... } ``` diff --git a/71.md b/71.md index 302bbbf..5cf3b36 100644 --- a/71.md +++ b/71.md @@ -42,7 +42,7 @@ The list of tags are as follows: * `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 -```json +```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>, diff --git a/72.md b/72.md index b2f523b..582410a 100644 --- a/72.md +++ b/72.md @@ -35,7 +35,7 @@ The goal of this NIP is to enable public communities. It defines the replaceable ["relay", "", "approvals"], ["relay", ""] ], - ... + // other fields... } ``` @@ -50,7 +50,7 @@ Any Nostr event can be posted to a community. Clients MUST add one or more commu ["a", "34550::", ""], ], "content": "hello world", - // ... + // other fields... } ``` @@ -75,7 +75,7 @@ Moderators MAY request deletion of their approval of a post at any time using [N ["k", ""] ], "content": "", - // ... + // other fields... } ``` diff --git a/75.md b/75.md index a6f2bff..885c391 100644 --- a/75.md +++ b/75.md @@ -21,15 +21,16 @@ The following tags are defined as REQUIRED. Example event: -```json +```jsonc { "kind": 9041, "tags": [ - ["relays", "wss://alicerelay.example.com", "wss://bobrelay.example.com", ...], + ["relays", "wss://alicerelay.example.com", "wss://bobrelay.example.com", /*...*/], ["amount", "210000"], ], "content": "Nostrasia travel expenses", - ... + // other fields... +} ``` The following tags are OPTIONAL. @@ -38,18 +39,18 @@ The following tags are OPTIONAL. - `image` - an image for the goal - `summary` - a brief description -```json +```jsonc { "kind": 9041, "tags": [ - ["relays", "wss://alicerelay.example.com", "wss://bobrelay.example.com", ...], + ["relays", "wss://alicerelay.example.com", "wss://bobrelay.example.com", /*...*/], ["amount", "210000"], ["closed_at", ""], ["image", ""], ["summary", ""], ], "content": "Nostrasia travel expenses", - ... + // other fields... } ``` @@ -59,15 +60,14 @@ The goal MAY include multiple beneficiary pubkeys by specifying [`zap` tags](57. Addressable events can link to a goal by using a `goal` tag specifying the event id and an optional relay hint. -```json +```jsonc { - ... "kind": 3xxxx, "tags": [ - ... ["goal", "", ""], + // rest of tags... ], - ... + // other fields... } ``` diff --git a/84.md b/84.md index d5f54d4..e3063c2 100644 --- a/84.md +++ b/84.md @@ -26,14 +26,14 @@ useful when highlighting non-nostr content for which the client might be able to (e.g. prompting the user or reading a `` tag on the document). A role MAY be included as the last value of the tag. -```json +```jsonc { "tags": [ ["p", "", "", "author"], ["p", "", "", "author"], ["p", "", "", "editor"] ], - ... + // other fields... } ``` diff --git a/89.md b/89.md index 54aa30b..24aa3c5 100644 --- a/89.md +++ b/89.md @@ -27,7 +27,7 @@ There are three actors to this workflow: ## Events ### Recommendation event -```json +```jsonc { "kind": 31989, "pubkey": , @@ -35,7 +35,8 @@ There are three actors to this workflow: ["d", ], ["a", "31990:app1-pubkey:", "wss://relay1", "ios"], ["a", "31990:app2-pubkey:", "wss://relay2", "web"] - ] + ], + // other fields... } ``` @@ -47,7 +48,7 @@ The second value of the tag SHOULD be a relay hint. The third value of the tag SHOULD be the platform where this recommendation might apply. ## Handler information -```json +```jsonc { "kind": 31990, "pubkey": "", @@ -59,7 +60,8 @@ The third value of the tag SHOULD be the platform where this recommendation migh ["web", "https://..../p/", "nprofile"], ["web", "https://..../e/"], ["ios", ".../"] - ] + ], + // other fields... } ``` @@ -77,13 +79,13 @@ A tag without a second value in the array SHOULD be considered a generic handler # Client tag When publishing events, clients MAY include a `client` tag. Identifying the client that published the note. This tag is a tuple of `name`, `address` identifying a handler event and, a relay `hint` for finding the handler event. This has privacy implications for users, so clients SHOULD allow users to opt-out of using this tag. -```json +```jsonc { "kind": 1, "tags": [ ["client", "My Client", "31990:app1-pubkey:", "wss://relay1"] ] - ... + // other fields... } ``` @@ -99,14 +101,14 @@ The client MIGHT query for the user's and the user's follows handler. ### User A recommends a `kind:31337`-handler User A might be a user of Zapstr, a `kind:31337`-centric client (tracks). Using Zapstr, user A publishes an event recommending Zapstr as a `kind:31337`-handler. -```json +```jsonc { "kind": 31989, "tags": [ ["d", "31337"], ["a", "31990:1743058db7078661b94aaf4286429d97ee5257d14a86d6bfa54cb0482b876fb0:abcd", , "web"] ], - ... + // other fields... } ``` @@ -115,7 +117,7 @@ User B might see in their timeline an event referring to a `kind:31337` event (e User B's client, not knowing how to handle a `kind:31337` might display the event using its `alt` tag (as described in NIP-31). When the user clicks on the event, the application queries for a handler for this `kind`: -```json +``` ["REQ", , { "kinds": [31989], "#d": ["31337"], "authors": [, ] }] ``` @@ -126,6 +128,6 @@ User B's client sees the application's `kind:31990` which includes the informati ### Alternative query bypassing `kind:31989` Alternatively, users might choose to query directly for `kind:31990` 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": [31990], "#k": [], "authors": [...] }] ``` diff --git a/90.md b/90.md index 5a15ebb..696ebd5 100644 --- a/90.md +++ b/90.md @@ -36,7 +36,7 @@ There are two actors in the workflow described in this NIP: ## Job request (`kind:5000-5999`) A request to process data, published by a customer. This event signals that a customer is interested in receiving the result of some kind of compute. -```json +```jsonc { "kind": 5xxx, // kind in 5000-5999 range "content": "", @@ -46,7 +46,8 @@ A request to process data, published by a customer. This event signals that a cu [ "relays", "wss://..." ], [ "bid", "" ], [ "t", "bitcoin" ] - ] + ], + // other fields... } ``` @@ -81,19 +82,18 @@ If the user wants to keep the input parameters a secret, they can encrypt the `i ["param", "top-p", "0.7"], ["param", "frequency_penalty", "1"] ] - ``` This param data will be encrypted and added to the `content` field and `p` tag should be present -```json +```jsonc { "content": "BE2Y4xvS6HIY7TozIgbEl3sAHkdZoXyLRRkZv4fLPh3R7LtviLKAJM5qpkC7D6VtMbgIt4iNcMpLtpo...", "tags": [ ["p", "04f74530a6ede6b24731b976b8e78fb449ea61f40ff10e3d869a3030c4edc91f"], ["encrypted"] ], - ... + // other fields... } ``` @@ -102,7 +102,7 @@ This param data will be encrypted and added to the `content` field and `p` tag s Service providers publish job results, providing the output of the job result. They should tag the original job request event id as well as the customer's pubkey. -```json +```jsonc { "pubkey": "", "content": "", @@ -114,7 +114,7 @@ Service providers publish job results, providing the output of the job result. T ["p", ""], ["amount", "requested-payment-amount", ""] ], - ... + // other fields... } ``` @@ -127,7 +127,7 @@ Service providers publish job results, providing the output of the job result. T If the request has encrypted params, then output should be encrypted and placed in `content` field. If the output is encrypted, then avoid including `i` tag with input-data as clear text. Add a tag encrypted to mark the output content as `encrypted` -```json +```jsonc { "pubkey": "", "content": "", @@ -139,7 +139,7 @@ Add a tag encrypted to mark the output content as `encrypted` ["amount", "requested-payment-amount", ""], ["encrypted"] ], - ... + // other fields... } ``` @@ -147,7 +147,7 @@ Add a tag encrypted to mark the output content as `encrypted` Service providers can give feedback about a job back to the customer. -```json +```jsonc { "kind": 7000, "content": "", @@ -157,7 +157,7 @@ Service providers can give feedback about a job back to the customer. ["e", "", ""], ["p", ""], ], - ... + // other fields... } ``` @@ -211,7 +211,7 @@ This gives a higher level of flexibility to service providers (which sophisticat # Appendix 2: Service provider discoverability Service Providers MAY use NIP-89 announcements to advertise their support for job kinds: -```js +```jsonc { "kind": 31990, "pubkey": "", @@ -223,7 +223,7 @@ Service Providers MAY use NIP-89 announcements to advertise their support for jo ["k", "5005"], // e.g. translation ["t", "bitcoin"] // e.g. optionally advertises it specializes in bitcoin audio transcription that won't confuse "Drivechains" with "Ridechains" ], - ... + // other fields... } ``` diff --git a/94.md b/94.md index e35dfa1..a057cb2 100644 --- a/94.md +++ b/94.md @@ -27,7 +27,7 @@ This NIP specifies the use of the `1063` event type, having in `content` a descr * `alt` (optional) description for accessibility * `fallback` (optional) zero or more fallback file sources in case `url` fails -```json +```jsonc { "kind": 1063, "tags": [ @@ -46,7 +46,7 @@ This NIP specifies the use of the `1063` event type, having in `content` a descr ["alt", ] ], "content": "", - ... + // other fields... } ``` diff --git a/96.md b/96.md index fab0c1a..75d7f1f 100644 --- a/96.md +++ b/96.md @@ -19,7 +19,7 @@ will not have to learn anything about nostr relays. File storage servers wishing to be accessible by nostr users should opt-in by making available an https route at `/.well-known/nostr/nip96.json` with `api_url`: -```js +```jsonc { // Required // File upload and deletion are served from this url @@ -59,7 +59,7 @@ File storage servers wishing to be accessible by nostr users should opt-in by ma "file_expiration": [14, 90], "media_transformations": { "image": [ - 'resizing' + "resizing" ] } } @@ -127,14 +127,14 @@ The `server` MUST link the user's `pubkey` string as the owner of the file so to The upload response is a json object as follows: -```js +```jsonc { // "success" if successful or "error" if not - status: "success", + "status": "success", // Free text success, failure or info message - message: "Upload successful.", + "message": "Upload successful.", // Optional. See "Delayed Processing" section - processing_url: "...", + "processing_url": "...", // This uses the NIP-94 event format but DO NOT need // to fill some fields like "id", "pubkey", "created_at" and "sig" // @@ -143,9 +143,9 @@ The upload response is a json object as follows: // and, optionally, all file metadata the server wants to make available // // nip94_event field is absent if unsuccessful upload - nip94_event: { + "nip94_event2":{ // Required tags: "url" and "ox" - tags: [ + "tags": [ // Can be same from /.well-known/nostr/nip96.json's "download_url" field // (or "api_url" field if "download_url" is absent or empty) with appended // original file hash. @@ -171,7 +171,7 @@ The upload response is a json object as follows: ["dim", "800x600"] // ... other optional NIP-94 tags ], - content: "" + "content": "" }, // ... other custom fields (please consider adding them to this NIP or to NIP-94 tags) } @@ -202,12 +202,12 @@ the file processing is done. If the processing isn't done, the server should reply at the `processing_url` url with **200 OK** and the following JSON: -``` +```jsonc { // It should be "processing". If "error" it would mean the processing failed. - status: "processing", - message: "Processing. Please check again later for updated status.", - percentage: 15 // Processing percentage. An integer between 0 and 100. + "status": "processing", + "message": "Processing. Please check again later for updated status.", + "percentage": 15 // Processing percentage. An integer between 0 and 100. } ``` @@ -270,10 +270,10 @@ in the same file hash). The successful response is a 200 OK one with just basic JSON fields: -``` +```json { - status: "success", - message: "File deleted." + "status": "success", + "message": "File deleted." } ``` @@ -287,7 +287,7 @@ Returns a list of files linked to the authenticated users pubkey. Example Response: -```js +```jsonc { "count": 1, // server page size, eg. max(1, min(server_max_page_size, arg_count)) "total": 1, // total number of files @@ -295,17 +295,16 @@ Example Response: "files": [ { "tags": [ - ["ox": "719171db19525d9d08dd69cb716a18158a249b7b3b3ec4bbdec5698dca104b7b"], - ["x": "5d2899290e0e69bcd809949ee516a4a1597205390878f780c098707a7f18e3df"], + ["ox", "719171db19525d9d08dd69cb716a18158a249b7b3b3ec4bbdec5698dca104b7b"], + ["x", "5d2899290e0e69bcd809949ee516a4a1597205390878f780c098707a7f18e3df"], ["size", "123456"], ["alt", "a meme that makes you laugh"], ["expiration", "1715691139"], // ...other metadata - ] + ], "content": "haha funny meme", // caption "created_at": 1715691130 // upload timestamp - }, - ... + } ] } ``` @@ -324,14 +323,14 @@ Note: HTTP File Storage Server developers may skip this section. This is meant f A File Server Preference event is a kind 10096 replaceable event meant to select one or more servers the user wants to upload files to. Servers are listed as `server` tags: -```js -{ - // ... +```json +{. "kind": 10096, "content": "", "tags": [ ["server", "https://file.server.one"], ["server", "https://file.server.two"] - ] + ], + // other fields... } ``` diff --git a/99.md b/99.md index b1b7ce9..e2ffc3b 100644 --- a/99.md +++ b/99.md @@ -54,7 +54,7 @@ Other standard tags that might be useful. ## Example Event -```json +```jsonc { "kind": 30402, "created_at": 1675642635, -- cgit v1.2.3 From e61651ac06c662b43817f85581b50e4254efbd7b Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 13 Sep 2024 08:07:38 -0300 Subject: nip29: make @staab happier. --- 29.md | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 75 insertions(+), 15 deletions(-) (limited to '29.md') diff --git a/29.md b/29.md index 6232f8b..f4a5436 100644 --- a/29.md +++ b/29.md @@ -22,6 +22,12 @@ Relays are supposed to generate the events that describe group metadata and grou A group may be identified by a string in the format `'`. For example, a group with _id_ `abcdef` hosted at the relay `wss://groups.nostr.com` would be identified by the string `groups.nostr.com'abcdef`. +Group identifiers must be strings restricted to the characters `a-z0-9-_`. + +When encountering just the `` without the `'`, clients can choose to connect to the group with id `_`, which is a special top-level group dedicated to relay-local discussions. + +Group identifiers in most cases should be random or pseudo-random, as that mitigates message replay confusiong and ensures they can be migrated or forked to other relays easily without risking conflicting with other groups using the same id in these new relays. This isn't a hard rule, as, for example, in `unmanaged` and/or ephemeral relays groups might not want to migrate ever, so they might not care about this. Notably, the `_` relay-local group isn't expected to be migrated ever. + ## The `h` tag Events sent by users to groups (chat messages, text notes, moderation events etc) must have an `h` tag with the value set to the group _id_. @@ -36,8 +42,22 @@ This is a hack to prevent messages from being broadcasted to external relays tha Relays should prevent late publication (messages published now with a timestamp from days or even hours ago) unless they are open to receive a group forked or moved from another relay. +## Unmanaged groups + +Unmanaged groups are impromptu groups that can be used in any public relay unaware of NIP-29 specifics. They piggyback on relays' natural white/blacklists (or lack of) but aside from that are not actively managed and won't have any admins, group state or metadata events. + +In `unmanaged` groups, everybody is considered to be a member. + +Unmanaged groups can transition to managed groups, in that case the relay master key just has to publish moderation events setting the state of all groups and start enforcing the rules they choose to. + ## Event definitions +These are the events expected to be found in NIP-29 groups. + +### Normal user-created events + +These events generally can be sent by all members of a group and they require the `h` tag to be present so they're attached to a specific group. + - *text root note* (`kind:11`) This is the basic unit of a "microblog" root text note sent to a group. @@ -79,6 +99,14 @@ Similar to `kind:12`, this is the basic unit of a chat message sent to a group. `kind:10` SHOULD use NIP-10 markers, just like `kind:12`. +- other events: + +Groups may also accept other events, like long-form articles, calendar, livestream, market announcements and so on. These should be as defined in their respective NIPs, with the addition of the `h` tag. + +### User-related group management events + +These are events that can be sent my user to manage their situation in a group, they also require the `h` tag. + - *join request* (`kind:9021`) Any user can send one of these events to the relay in order to be automatically or manually added to the group. If the group is `open` the relay will automatically issue a `kind:9000` in response adding this user. Otherwise group admins may choose to query for these requests and act upon them. @@ -88,11 +116,14 @@ Any user can send one of these events to the relay in order to be automatically "kind": 9021, "content": "optional reason", "tags": [ - ["h", ""] + ["h", ""], + ["claim", ""] ] } ``` +The optional `claim` tag may be used by the relay to preauthorize acceptances in `closed` groups, together with the `kind:9009` `create-invite` moderation event. + - *leave request* (`kind:9022`) Any user can send one of these events to the relay in order to be automatically removed from the group. The relay will automatically issue a `kind:9001` in response removing this user. @@ -107,6 +138,10 @@ Any user can send one of these events to the relay in order to be automatically } ``` +### Group state -- or moderation + +These are events expected to be sent by the relay master key or by group admins -- and relays should reject them if they don't come from an authorized admin. They also require the `h` tag. + - *moderation events* (`kinds:9000-9020`) (optional) Clients can send these events to a relay in order to accomplish a moderation action. Relays must check if the pubkey sending the event is capable of performing the given action. The relay may discard the event after taking action or keep it as a moderation log. @@ -124,17 +159,24 @@ Clients can send these events to a relay in order to accomplish a moderation act Each moderation action uses a different kind and requires different arguments, which are given as tags. These are defined in the following table: -| kind | name | tags | -| --- | --- | --- | -| 9000 | `add-user` | `p` (pubkey hex) | -| 9001 | `remove-user` | `p` (pubkey hex) | -| 9002 | `edit-metadata` | `name`, `about`, `picture` (string) | -| 9003 | `add-permission` | `p` (pubkey), `permission` (name) | -| 9004 | `remove-permission` | `p` (pubkey), `permission` (name) | -| 9005 | `delete-event` | `e` (id hex) | -| 9006 | `edit-group-status` | `public` or `private`, `open` or `closed` | -| 9007 | `create-group` | | -| 9008 | `delete-group` | | +| kind | name | tags | +| --- | --- | --- | +| 9000 | `add-user` | `p` (pubkey hex) | +| 9001 | `remove-user` | `p` (pubkey hex) | +| 9002 | `edit-metadata` | `name`, `about`, `picture` (string) | +| 9003 | `add-permission` | `p` (pubkey), `permission` (name) | +| 9004 | `remove-permission` | `p` (pubkey), `permission` (name) | +| 9005 | `delete-event` | `e` (id hex) | +| 9006 | `edit-group-status` | `public` or `private`, `open` or `closed` | +| 9007 | `create-group` | | +| 9008 | `delete-group` | | +| 9009 | `create-invite` | `code`, `uses` (how many times it can be used) | + +It's expected that the group state (of who is an allowed member or not, who is an admin and with which permission or not, what are the group name and picture etc) can be fully reconstructed from the canonical sequence of these events. + +### Group metadata events + +These events contain the group id in a `d` tag instead of the `h` tag. They are expected to be created by the relay master key only and a single instance of each (or none) should exist at all times for each group. They are merely informative but should reflect the latest group state (as it was changed by moderation events over time). - *group metadata* (`kind:39000`) (optional) @@ -142,6 +184,8 @@ This event defines the metadata for the group -- basically how clients should di If the group is forked and hosted in multiple relays, there will be multiple versions of this event in each different relay and so on. +When this event is not found, clients may still connect to the group, but treat it as having a different status, `unmanaged`, + ```jsonc { "kind": 39000, @@ -194,7 +238,9 @@ The list of capabilities, as defined by this NIP, for now, is the following: Similar to *group admins*, this event is supposed to be generated by relays that host the group. -It's a NIP-51-like list of pubkeys that are members of the group. Relays might choose to not to publish this information or to restrict what pubkeys can fetch it. +It's a list of pubkeys that are members of the group. Relays might choose to not to publish this information or to restrict what pubkeys can fetch it. + +Clients should not assume this will always be present or that it will contain a full list of members, as relays may opt to not publish it or publish a shortened version. ```json { @@ -209,6 +255,20 @@ It's a NIP-51-like list of pubkeys that are members of the group. Relays might c } ``` -## Storing the list of groups a user belongs to +## Implementation quirks + +### Checking your own membership in a group + +The latest of either `kind:9000` or `kind:9001` events present in a group should tell a user that they are currently members of the group or if they were removed. In case none of these exist the user is assumed to not be a member of the group -- unless the group is `unmanaged`, in which case the user is assumed to be a member. + +### Adding yourself to a group + +When a group is `open`, anyone can send a `kind:9021` event to it in order to be added, then expect a `kind:9000` event to be emitted confirming that the user was added. The same happens with `closed` groups, except in that case a user may only send a `kind:9021` if it has an invite code. + +### Storing your list of groups + +A definition for `kind:10009` was included in [NIP-51](51.md) that allows clients to store the list of groups a user wants to remember being in. + +### Using `unmanaged` relays -A definition for kind `10009` was included in [NIP-51](51.md) that allows clients to store the list of groups a user wants to remember being in. +To prevent event leakage, replay and confusion, when using `unmanaged` relays, clients should include the [NIP-70](70.md) `-` tag, as just the `previous` tag won't be checked by other `unmanaged` relays. -- cgit v1.2.3 From 765daceaa1a25a0324864668cf977cbdcb30bbd4 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Wed, 18 Sep 2024 22:27:03 -0300 Subject: remove invites, simplify group metadata edits, rework fine-grained "permissions" into unspecified "roles". --- 29.md | 77 +++++++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 43 insertions(+), 34 deletions(-) (limited to '29.md') diff --git a/29.md b/29.md index f4a5436..c0dbcef 100644 --- a/29.md +++ b/29.md @@ -144,7 +144,7 @@ These are events expected to be sent by the relay master key or by group admins - *moderation events* (`kinds:9000-9020`) (optional) -Clients can send these events to a relay in order to accomplish a moderation action. Relays must check if the pubkey sending the event is capable of performing the given action. The relay may discard the event after taking action or keep it as a moderation log. +Clients can send these events to a relay in order to accomplish a moderation action. Relays must check if the pubkey sending the event is capable of performing the given action based on its role and the relay's internal policy (see also the description of `kind:39003`). ```json { @@ -161,22 +161,21 @@ Each moderation action uses a different kind and requires different arguments, w | kind | name | tags | | --- | --- | --- | -| 9000 | `add-user` | `p` (pubkey hex) | -| 9001 | `remove-user` | `p` (pubkey hex) | -| 9002 | `edit-metadata` | `name`, `about`, `picture` (string) | -| 9003 | `add-permission` | `p` (pubkey), `permission` (name) | -| 9004 | `remove-permission` | `p` (pubkey), `permission` (name) | -| 9005 | `delete-event` | `e` (id hex) | -| 9006 | `edit-group-status` | `public` or `private`, `open` or `closed` | +| 9000 | `add-user` | `p` with pubkey hex | +| 9001 | `remove-user` | `p` with pubkey hex | +| 9002 | `edit-metadata` | fields from `kind:39000` to be modified | +| 9003 | | | +| 9004 | | | +| 9005 | `delete-event` | | +| 9006 | `set-role` | `p` with pubkey hex and roles | | 9007 | `create-group` | | | 9008 | `delete-group` | | -| 9009 | `create-invite` | `code`, `uses` (how many times it can be used) | It's expected that the group state (of who is an allowed member or not, who is an admin and with which permission or not, what are the group name and picture etc) can be fully reconstructed from the canonical sequence of these events. ### Group metadata events -These events contain the group id in a `d` tag instead of the `h` tag. They are expected to be created by the relay master key only and a single instance of each (or none) should exist at all times for each group. They are merely informative but should reflect the latest group state (as it was changed by moderation events over time). +These events contain the group id in a `d` tag instead of the `h` tag. They MUST be created by the relay master key only and a single instance of each (or none) should exist at all times for each group. They are merely informative but should reflect the latest group state (as it was changed by moderation events over time). - *group metadata* (`kind:39000`) (optional) @@ -206,43 +205,29 @@ When this event is not found, clients may still connect to the group, but treat - *group admins* (`kind:39001`) (optional) -Similar to the group metadata, this event is supposed to be generated by relays that host the group. +Each admin is listed along with one or more roles. These roles SHOULD have a correspondence with the roles supported by the relay, as advertised by the `kind:39003` event. -Each admin gets a label that is only used for display purposes, and a list of permissions it has are listed afterwards. These permissions can inform client building UI, but ultimately are evaluated by the relay in order to become effective. - -The list of capabilities, as defined by this NIP, for now, is the following: - -- `add-user` -- `edit-metadata` -- `delete-event` -- `remove-user` -- `add-permission` -- `remove-permission` -- `edit-group-status` -- `delete-group` - -```json +```jsonc { "kind": 39001, "content": "list of admins for the pizza lovers group", "tags": [ ["d", ""], - ["p", "", "ceo", "add-user", "edit-metadata", "delete-event", "remove-user"], - ["p", "", "secretary", "add-user", "delete-event"] - ] + ["p", "", "ceo"], + ["p", "", "secretary", "gardener"], + // other pubkeys... + ], // other fields... } ``` - *group members* (`kind:39002`) (optional) -Similar to *group admins*, this event is supposed to be generated by relays that host the group. +It's a list of pubkeys that are members of the group. Relays might choose to not to publish this information, to restrict what pubkeys can fetch it or to only display a subset of the members in it. -It's a list of pubkeys that are members of the group. Relays might choose to not to publish this information or to restrict what pubkeys can fetch it. +Clients should not assume this will always be present or that it will contain a full list of members. -Clients should not assume this will always be present or that it will contain a full list of members, as relays may opt to not publish it or publish a shortened version. - -```json +```jsonc { "kind": 39002, "content": "list of members for the pizza lovers group", @@ -251,7 +236,31 @@ Clients should not assume this will always be present or that it will contain a ["p", ""], ["p", ""], ["p", ""], - ] + // other pubkeys... + ], + // other fields... +} +``` + +- *group roles* (`kind:39003`) (optional) + +This is an event that MAY be published by the relay informing users and clients about what are the roles supported by this relay according to its internal logic. + +For example, a relay may choose to support the roles `"admin"` and `"moderator"`, in which the `"admin"` will be allowed to edit the group metadata, delete messages and remove users from the group, while the `"moderator"` can only delete messages (or the relay may choose to call these roles `"ceo"` and `"secretary"` instead, the exact role name is not relevant). + +The process through which the relay decides what roles to support and how to handle moderation events internally based on them is specific to each relay and not specified here. + +```jsonc +{ + "kind": 39003, + "content": "list of roles supported by this group", + "tags": [ + ["d", ""], + ["role", "", ""], + ["role", "", ""], + // other roles... + ], + // other fields... } ``` -- cgit v1.2.3 From e3cf02840d382360a604a7506e1b9608c63c4002 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Mon, 21 Oct 2024 13:45:51 -0300 Subject: rename "claim"=>"code", get rid of kind 9006 (just use 9000), add a paragraph explaining moderation. --- 29.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to '29.md') diff --git a/29.md b/29.md index c0dbcef..c4ee495 100644 --- a/29.md +++ b/29.md @@ -42,6 +42,14 @@ This is a hack to prevent messages from being broadcasted to external relays tha Relays should prevent late publication (messages published now with a timestamp from days or even hours ago) unless they are open to receive a group forked or moved from another relay. +## Group management + +Groups can have any number of users with elevated access. These users are identified by role labels which are arbitrarily defined by the relays (see also the description of `kind:39003`). What each role is capable of not defined in this NIP either, it's a relay policy that can vary. Roles can be assigned by other users (as long as they have the capability to add roles) by publishing a `kind:9000` event with that user's pubkey in a `p` tag and the roles afterwards (even if the user is already a group member a `kind:9000` can be issued and the user roles must just be updated). + +The roles supported by the group as to having some special privilege assigned to them should be accessible on the event `kind:39003`, but the relay may also accept other role names, arbitrarily defined by clients, and just not do anything with them. + +Users with any roles that have any privilege can be considered _admins_ in a broad sense and be returned in the `kind:39001` event for a group. + ## Unmanaged groups Unmanaged groups are impromptu groups that can be used in any public relay unaware of NIP-29 specifics. They piggyback on relays' natural white/blacklists (or lack of) but aside from that are not actively managed and won't have any admins, group state or metadata events. @@ -117,12 +125,12 @@ Any user can send one of these events to the relay in order to be automatically "content": "optional reason", "tags": [ ["h", ""], - ["claim", ""] + ["code", ""] ] } ``` -The optional `claim` tag may be used by the relay to preauthorize acceptances in `closed` groups, together with the `kind:9009` `create-invite` moderation event. +The optional `code` tag may be used by the relay to preauthorize acceptances in `closed` groups, together with the `kind:9009` `create-invite` moderation event. - *leave request* (`kind:9022`) @@ -161,13 +169,10 @@ Each moderation action uses a different kind and requires different arguments, w | kind | name | tags | | --- | --- | --- | -| 9000 | `add-user` | `p` with pubkey hex | +| 9000 | `add-user` | `p` with pubkey hex and optional roles | | 9001 | `remove-user` | `p` with pubkey hex | | 9002 | `edit-metadata` | fields from `kind:39000` to be modified | -| 9003 | | | -| 9004 | | | | 9005 | `delete-event` | | -| 9006 | `set-role` | `p` with pubkey hex and roles | | 9007 | `create-group` | | | 9008 | `delete-group` | | -- cgit v1.2.3 From d4d040ee715a1f742a19e2c3a9e8697387725e46 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Tue, 22 Oct 2024 09:55:42 -0300 Subject: fix typo. --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '29.md') diff --git a/29.md b/29.md index c4ee495..80e0f96 100644 --- a/29.md +++ b/29.md @@ -113,7 +113,7 @@ Groups may also accept other events, like long-form articles, calendar, livestre ### User-related group management events -These are events that can be sent my user to manage their situation in a group, they also require the `h` tag. +These are events that can be sent by users to manage their situation in a group, they also require the `h` tag. - *join request* (`kind:9021`) -- cgit v1.2.3 From 690e1b065ca789b04edce220d23bf6e39f6891bd Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Wed, 6 Nov 2024 22:40:46 +0900 Subject: nip29: add kind 9009 to moderation events table. --- 29.md | 1 + 1 file changed, 1 insertion(+) (limited to '29.md') diff --git a/29.md b/29.md index 80e0f96..885dae4 100644 --- a/29.md +++ b/29.md @@ -175,6 +175,7 @@ Each moderation action uses a different kind and requires different arguments, w | 9005 | `delete-event` | | | 9007 | `create-group` | | | 9008 | `delete-group` | | +| 9009 | `create-invite` | | It's expected that the group state (of who is an allowed member or not, who is an admin and with which permission or not, what are the group name and picture etc) can be fully reconstructed from the canonical sequence of these events. -- cgit v1.2.3 From 29696eb364d8a0cd609efa85b450c174c5806eda Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 9 Nov 2024 08:53:01 -0300 Subject: rename kind:11 as "forum thread root". --- 29.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to '29.md') diff --git a/29.md b/29.md index 885dae4..ed57e51 100644 --- a/29.md +++ b/29.md @@ -66,9 +66,9 @@ These are the events expected to be found in NIP-29 groups. These events generally can be sent by all members of a group and they require the `h` tag to be present so they're attached to a specific group. -- *text root note* (`kind:11`) +- *thread root post* (`kind:11`) -This is the basic unit of a "microblog" root text note sent to a group. +This is the basic unit of a forum-like root thread post sent to a group. ```jsonc "kind": 11, -- cgit v1.2.3 From 39154346bb691191a1fc734e53d5eda08a1eec79 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 9 Nov 2024 08:56:29 -0300 Subject: remove kind:10 and note that kind:1111 could be used. --- 29.md | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) (limited to '29.md') diff --git a/29.md b/29.md index ed57e51..b02cad2 100644 --- a/29.md +++ b/29.md @@ -66,12 +66,12 @@ These are the events expected to be found in NIP-29 groups. These events generally can be sent by all members of a group and they require the `h` tag to be present so they're attached to a specific group. -- *thread root post* (`kind:11`) +- _chat message_ (`kind:9`) -This is the basic unit of a forum-like root thread post sent to a group. +This is the basic unit of a _chat message_ sent to a group. ```jsonc - "kind": 11, + "kind": 9, "content": "hello my friends lovers of pizza", "tags": [ ["h", ""], @@ -80,19 +80,12 @@ This is the basic unit of a forum-like root thread post sent to a group. // other fields... ``` -- *threaded text reply* (`kind:12`) - -This is the basic unit of a "microblog" reply note sent to a group. It's the same as `kind:11`, except for the fact that it must be used whenever it's in reply to some other note (either in reply to a `kind:11` or a `kind:12`). `kind:12` events SHOULD use NIP-10 markers, leaving an empty relay url: - -* `["e", "", "", "root"]` -* `["e", "", "", "reply"]` - -- *chat message* (`kind:9`) +- _thread root post_ (`kind:11`) -This is the basic unit of a _chat message_ sent to a group. +This is the basic unit of a forum-like root thread post sent to a group. ```jsonc - "kind": 9, + "kind": 11, "content": "hello my friends lovers of pizza", "tags": [ ["h", ""], @@ -101,15 +94,9 @@ This is the basic unit of a _chat message_ sent to a group. // other fields... ``` -- *chat message threaded reply* (`kind:10`) - -Similar to `kind:12`, this is the basic unit of a chat message sent to a group. This is intended for in-chat threads that may be hidden by default. Not all in-chat replies MUST use `kind:10`, only when the intention is to create a hidden thread that isn't part of the normal flow of the chat (although clients are free to display those by default too). - -`kind:10` SHOULD use NIP-10 markers, just like `kind:12`. - -- other events: +- _other events_: -Groups may also accept other events, like long-form articles, calendar, livestream, market announcements and so on. These should be as defined in their respective NIPs, with the addition of the `h` tag. +Groups may also accept other events, like [NIP-22](22.md) comments as threaded replies to both chats messages and threads, long-form articles, calendar, livestreams, market announcements and so on. These should be as defined in their respective NIPs, with the addition of the `h` tag. ### User-related group management events -- cgit v1.2.3 From b58f02925e7ea05e9f104041cb6e42d146ab4c54 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 9 Nov 2024 08:56:43 -0300 Subject: rename kind:9000 to "put-user" instead of "add-user". --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '29.md') diff --git a/29.md b/29.md index b02cad2..5526b74 100644 --- a/29.md +++ b/29.md @@ -156,7 +156,7 @@ Each moderation action uses a different kind and requires different arguments, w | kind | name | tags | | --- | --- | --- | -| 9000 | `add-user` | `p` with pubkey hex and optional roles | +| 9000 | `put-user` | `p` with pubkey hex and optional roles | | 9001 | `remove-user` | `p` with pubkey hex | | 9002 | `edit-metadata` | fields from `kind:39000` to be modified | | 9005 | `delete-event` | | -- cgit v1.2.3 From 18bdc0ce8c80b68cd8e2c30c0dfd12c43e8b8bc0 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 9 Nov 2024 15:41:25 -0300 Subject: nip29: add missing "e" tag in kind:9005. --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '29.md') diff --git a/29.md b/29.md index 5526b74..e4673dd 100644 --- a/29.md +++ b/29.md @@ -159,7 +159,7 @@ Each moderation action uses a different kind and requires different arguments, w | 9000 | `put-user` | `p` with pubkey hex and optional roles | | 9001 | `remove-user` | `p` with pubkey hex | | 9002 | `edit-metadata` | fields from `kind:39000` to be modified | -| 9005 | `delete-event` | | +| 9005 | `delete-event` | `e` with event id hex | | 9007 | `create-group` | | | 9008 | `delete-group` | | | 9009 | `create-invite` | | -- cgit v1.2.3 From 8794be6775a6264a82ed8044b14f3c5e4eb01122 Mon Sep 17 00:00:00 2001 From: Josh Brown Date: Fri, 15 Nov 2024 11:14:19 -0500 Subject: Fix typo in NIP-29 --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '29.md') diff --git a/29.md b/29.md index e4673dd..f0ba8ab 100644 --- a/29.md +++ b/29.md @@ -26,7 +26,7 @@ Group identifiers must be strings restricted to the characters `a-z0-9-_`. When encountering just the `` without the `'`, clients can choose to connect to the group with id `_`, which is a special top-level group dedicated to relay-local discussions. -Group identifiers in most cases should be random or pseudo-random, as that mitigates message replay confusiong and ensures they can be migrated or forked to other relays easily without risking conflicting with other groups using the same id in these new relays. This isn't a hard rule, as, for example, in `unmanaged` and/or ephemeral relays groups might not want to migrate ever, so they might not care about this. Notably, the `_` relay-local group isn't expected to be migrated ever. +Group identifiers in most cases should be random or pseudo-random, as that mitigates message replay confusion and ensures they can be migrated or forked to other relays easily without risking conflicting with other groups using the same id in these new relays. This isn't a hard rule, as, for example, in `unmanaged` and/or ephemeral relays groups might not want to migrate ever, so they might not care about this. Notably, the `_` relay-local group isn't expected to be migrated ever. ## The `h` tag -- cgit v1.2.3 From f3244a0903b1fedbd8aa89596c658c9529e19ea6 Mon Sep 17 00:00:00 2001 From: hakkadaikon Date: Mon, 18 Nov 2024 02:33:29 +0900 Subject: js,json -> jsonc --- 11.md | 4 ++-- 17.md | 2 +- 22.md | 14 +++++++------- 29.md | 2 +- 46.md | 8 ++++---- 96.md | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) (limited to '29.md') diff --git a/11.md b/11.md index 8efd0f0..8af4f31 100644 --- a/11.md +++ b/11.md @@ -262,7 +262,7 @@ processed by appropriate client software. Relays that require payments may want to expose their fee schedules. -```json +```jsonc { "payments_url": "https://my-relay/payments", "fees": { @@ -270,7 +270,7 @@ Relays that require payments may want to expose their fee schedules. "subscription": [{ "amount": 5000000, "unit": "msats", "period": 2592000 }], "publication": [{ "kinds": [4], "amount": 100, "unit": "msats" }], }, - ... + // other fields... } ``` diff --git a/17.md b/17.md index 4b96bce..72f40c4 100644 --- a/17.md +++ b/17.md @@ -47,7 +47,7 @@ An optional `subject` tag defines the current name/topic of the conversation. An Following [NIP-59](59.md), the **unsigned** `kind:14` chat message must be sealed (`kind:13`) and then gift-wrapped (`kind:1059`) to each receiver and the sender individually. -```js +```jsonc { "id": "",   "pubkey": randomPublicKey, diff --git a/22.md b/22.md index 3706aec..f11925f 100644 --- a/22.md +++ b/22.md @@ -13,7 +13,7 @@ It uses `kind:1111` with plaintext `.content` (no HTML, Markdown, or other forma Comments MUST point to the root scope using uppercase tag names (e.g. `K`, `E`, `A` or `I`) and MUST point to the parent item with lowercase ones (e.g. `k`, `e`, `a` or `i`). -```js +```jsonc { kind: 1111, content: '', @@ -56,7 +56,7 @@ If the parent item is an event, a `p` tag set to the parent event's author SHOUL A comment on a blog post looks like this: -```js +```jsonc { kind: 1111, content: 'Great blog post!', @@ -79,7 +79,7 @@ A comment on a blog post looks like this: A comment on a [NIP-94](94.md) file looks like this: -```js +```jsonc { kind: 1111, content: 'Great file!', @@ -100,7 +100,7 @@ A comment on a [NIP-94](94.md) file looks like this: A reply to a comment looks like this: -```js +```jsonc { kind: 1111, content: 'This is a reply to "Great file!"', @@ -121,7 +121,7 @@ A reply to a comment looks like this: A comment on a website's url looks like this: -```js +```jsonc { kind: 1111, content: 'Nice article!', @@ -142,7 +142,7 @@ A comment on a website's url looks like this: A podcast comment example: -```js +```jsonc { id: "80c48d992a38f9c445b943a9c9f1010b396676013443765750431a9004bdac05", pubkey: "252f10c83610ebca1a059c0bae8255eba2f95be4d1d7bcfa89d7248a82d9f111", @@ -164,7 +164,7 @@ A podcast comment example: A reply to a podcast comment: -```js +```jsonc { kind: 1111, content: "I'm replying to the above comment.", diff --git a/29.md b/29.md index f0ba8ab..a116433 100644 --- a/29.md +++ b/29.md @@ -141,7 +141,7 @@ These are events expected to be sent by the relay master key or by group admins Clients can send these events to a relay in order to accomplish a moderation action. Relays must check if the pubkey sending the event is capable of performing the given action based on its role and the relay's internal policy (see also the description of `kind:39003`). -```json +```jsonc { "kind": 90xx, "content": "optional reason", diff --git a/46.md b/46.md index 60850aa..ce6764d 100644 --- a/46.md +++ b/46.md @@ -58,7 +58,7 @@ _user_ passes this token to _remote-signer_, which then sends `connect` *respons ## Request Events `kind: 24133` -```js +```jsonc { "kind": 24133, "pubkey": , @@ -136,7 +136,7 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](04.md) encrypted ### Signature request -```js +```jsonc { "kind": 24133, "pubkey": "eff37350d839ce3707332348af4549a96051bd695d3223af4aabce4993531d86", @@ -156,7 +156,7 @@ The `content` field is a JSON-RPC-like message that is [NIP-04](04.md) encrypted ### Response event -```js +```jsonc { "kind": 24133, "pubkey": "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52", @@ -196,7 +196,7 @@ _client_ should display (in a popup or new tab) the URL from the `error` field a ### Announcing _remote-signer_ metadata _remote-signer_ MAY publish it's metadata by using [NIP-05](05.md) and [NIP-89](89.md). With NIP-05, a request to `/.well-known/nostr.json?name=_` MAY return this: -``` +```jsonc { "names":{ "_": , diff --git a/96.md b/96.md index 05c1b18..3828e76 100644 --- a/96.md +++ b/96.md @@ -323,8 +323,8 @@ Note: HTTP File Storage Server developers may skip this section. This is meant f A File Server Preference event is a kind 10096 replaceable event meant to select one or more servers the user wants to upload files to. Servers are listed as `server` tags: -```json -{. +```jsonc +{ "kind": 10096, "content": "", "tags": [ -- cgit v1.2.3 From 1e47fd75572704b84cf484ce52394fc7ea7d4067 Mon Sep 17 00:00:00 2001 From: hodlbod Date: Thu, 21 Nov 2024 06:55:23 -0800 Subject: Break out chat and threads from nip 29 (#1591) --- 29.md | 34 +--------------------------------- 7D.md | 34 ++++++++++++++++++++++++++++++++++ C7.md | 29 +++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 33 deletions(-) create mode 100644 7D.md create mode 100644 C7.md (limited to '29.md') diff --git a/29.md b/29.md index a116433..a2c8ef2 100644 --- a/29.md +++ b/29.md @@ -64,39 +64,7 @@ These are the events expected to be found in NIP-29 groups. ### Normal user-created events -These events generally can be sent by all members of a group and they require the `h` tag to be present so they're attached to a specific group. - -- _chat message_ (`kind:9`) - -This is the basic unit of a _chat message_ sent to a group. - -```jsonc - "kind": 9, - "content": "hello my friends lovers of pizza", - "tags": [ - ["h", ""], - ["previous", "", "", /*...*/] - ] - // other fields... -``` - -- _thread root post_ (`kind:11`) - -This is the basic unit of a forum-like root thread post sent to a group. - -```jsonc - "kind": 11, - "content": "hello my friends lovers of pizza", - "tags": [ - ["h", ""], - ["previous", "", "", /*...*/] - ] - // other fields... -``` - -- _other events_: - -Groups may also accept other events, like [NIP-22](22.md) comments as threaded replies to both chats messages and threads, long-form articles, calendar, livestreams, market announcements and so on. These should be as defined in their respective NIPs, with the addition of the `h` tag. +Groups may accept any event kind, including chats, threads, long-form articles, calendar, livestreams, market announcements and so on. These should be as defined in their respective NIPs, with the addition of the `h` tag. ### User-related group management events diff --git a/7D.md b/7D.md new file mode 100644 index 0000000..d8509a6 --- /dev/null +++ b/7D.md @@ -0,0 +1,34 @@ +NIP-7D +====== + +Threads +------- + +`draft` `optional` + +A thread is a `kind 11` event. Threads SHOULD include a `subject` with a summary +of the thread's topic. + +```json +{ + "kind": 11, + "content": "Good morning", + "tags": [ + ["subject", "GM"] + ] +} +``` + +Replies to `kind 11` MUST use [NIP-22](./22.md) `kind 1111` comments. Replies should +always be to the root `kind 11` to avoid arbitrarily nested reply hierarchies. + +```json +{ + "kind": 1111, + "content": "Cool beans", + "tags": [ + ["K", "11"], + ["E", , , ] + ] +} +``` diff --git a/C7.md b/C7.md new file mode 100644 index 0000000..0d94f18 --- /dev/null +++ b/C7.md @@ -0,0 +1,29 @@ +NIP-C7 +====== + +Chats +----- + +`draft` `optional` + +A chat message is a `kind 9` event. + +```json +{ + "kind": 9, + "content": "GM", + "tags": [] +} +``` + +A reply to a `kind 9` is an additional `kind 9` which quotes the parent using a `q` tag. + +```json +{ + "kind": 9, + "content": "nostr:nevent1...\nyes", + "tags": [ + ["q", , , ] + ] +} +``` -- cgit v1.2.3 From d09b51246d7d5757b5e78ef1cc18e8925561d42f Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 22 Nov 2024 14:09:12 -0800 Subject: Tweak group join requests to include user feedback --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '29.md') diff --git a/29.md b/29.md index a2c8ef2..93dc3d2 100644 --- a/29.md +++ b/29.md @@ -72,7 +72,7 @@ These are events that can be sent by users to manage their situation in a group, - *join request* (`kind:9021`) -Any user can send one of these events to the relay in order to be automatically or manually added to the group. If the group is `open` the relay will automatically issue a `kind:9000` in response adding this user. Otherwise group admins may choose to query for these requests and act upon them. +Any user can send a kind `9021` event to the relay in order to request admission to the group. Relays MUST reject the request if the user has not been added to the group. The accompanying error message SHOULD explain whether the rejection is final, if the request is pending review, or if some other special handling is relevant (e.g. if payment is required). If a user is already a member, the event MUST be accepted. ```json { -- cgit v1.2.3 From 4d47b38dbc0c2e09d235972f59a4338a7bb37cc0 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Sat, 23 Nov 2024 07:09:25 -0800 Subject: Switch to rejecting duplicate joins --- 29.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '29.md') diff --git a/29.md b/29.md index 93dc3d2..7705c6d 100644 --- a/29.md +++ b/29.md @@ -72,7 +72,7 @@ These are events that can be sent by users to manage their situation in a group, - *join request* (`kind:9021`) -Any user can send a kind `9021` event to the relay in order to request admission to the group. Relays MUST reject the request if the user has not been added to the group. The accompanying error message SHOULD explain whether the rejection is final, if the request is pending review, or if some other special handling is relevant (e.g. if payment is required). If a user is already a member, the event MUST be accepted. +Any user can send a kind `9021` event to the relay in order to request admission to the group. Relays MUST reject the request if the user has not been added to the group. The accompanying error message SHOULD explain whether the rejection is final, if the request is pending review, or if some other special handling is relevant (e.g. if payment is required). If a user is already a member, the event MUST be rejected with `duplicate: ` as the error message prefix. ```json { -- cgit v1.2.3 From 43767e1e531de51874889b4eab905409192c404e Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 22 Nov 2024 13:55:23 -0800 Subject: Add support for naming unmanaged groups --- 29.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to '29.md') diff --git a/29.md b/29.md index a2c8ef2..331047f 100644 --- a/29.md +++ b/29.md @@ -22,15 +22,15 @@ Relays are supposed to generate the events that describe group metadata and grou A group may be identified by a string in the format `'`. For example, a group with _id_ `abcdef` hosted at the relay `wss://groups.nostr.com` would be identified by the string `groups.nostr.com'abcdef`. -Group identifiers must be strings restricted to the characters `a-z0-9-_`. +Group identifiers must be strings restricted to the characters `a-z0-9-_`, and SHOULD be random in order to avoid name collisions. -When encountering just the `` without the `'`, clients can choose to connect to the group with id `_`, which is a special top-level group dedicated to relay-local discussions. - -Group identifiers in most cases should be random or pseudo-random, as that mitigates message replay confusion and ensures they can be migrated or forked to other relays easily without risking conflicting with other groups using the same id in these new relays. This isn't a hard rule, as, for example, in `unmanaged` and/or ephemeral relays groups might not want to migrate ever, so they might not care about this. Notably, the `_` relay-local group isn't expected to be migrated ever. +When encountering just the `` without the `'`, clients MAY infer `_` as the group id, which is a special top-level group dedicated to relay-local discussions. ## The `h` tag -Events sent by users to groups (chat messages, text notes, moderation events etc) must have an `h` tag with the value set to the group _id_. +Events sent by users to groups (chat messages, text notes, moderation events etc) MUST have an `h` tag with the value set to the group _id_. + +`h` tags MAY include the group's name as the second argument. This allows `unmanaged` groups to be assigned human-readable names without relay support. ## Timeline references @@ -241,4 +241,4 @@ A definition for `kind:10009` was included in [NIP-51](51.md) that allows client ### Using `unmanaged` relays -To prevent event leakage, replay and confusion, when using `unmanaged` relays, clients should include the [NIP-70](70.md) `-` tag, as just the `previous` tag won't be checked by other `unmanaged` relays. +To prevent event leakage, when using `unmanaged` relays, clients should include the [NIP-70](70.md) `-` tag, as just the `previous` tag won't be checked by other `unmanaged` relays. -- cgit v1.2.3 From a1ca7a194b6d8f249b7437c0082682c2a7c074ab Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Tue, 10 Dec 2024 14:11:43 -0800 Subject: Change strategy for naming groups --- 29.md | 4 ++-- 51.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to '29.md') diff --git a/29.md b/29.md index 331047f..8711cc9 100644 --- a/29.md +++ b/29.md @@ -30,8 +30,6 @@ When encountering just the `` without the `'`, clients MAY infer Events sent by users to groups (chat messages, text notes, moderation events etc) MUST have an `h` tag with the value set to the group _id_. -`h` tags MAY include the group's name as the second argument. This allows `unmanaged` groups to be assigned human-readable names without relay support. - ## Timeline references In order to not be used out of context, events sent to these groups may contain references to previous events seen from the same relay in the `previous` tag. The choice of which previous events to pick belongs to the clients. The references are to be made using the first 8 characters (4 bytes) of any event in the last 50 events seen by the user in the relay, excluding events by themselves. There can be any number of references (including zero), but it's recommended that clients include at least 3 and that relays enforce this. @@ -242,3 +240,5 @@ A definition for `kind:10009` was included in [NIP-51](51.md) that allows client ### Using `unmanaged` relays To prevent event leakage, when using `unmanaged` relays, clients should include the [NIP-70](70.md) `-` tag, as just the `previous` tag won't be checked by other `unmanaged` relays. + +Groups MAY be named without relay support by adding a `name` to the corresponding tag in a user's `kind 10009` group list. diff --git a/51.md b/51.md index 90b56ce..23d5b99 100644 --- a/51.md +++ b/51.md @@ -29,7 +29,7 @@ For example, _mute list_ can contain the public keys of spammers and bad actors | Public chats | 10005 | [NIP-28](28.md) chat channels the user is in | `"e"` (kind:40 channel definitions) | | Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) | | Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) | -| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group id + relay URL), `"r"` for each relay in use | +| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group id + relay URL + optional group name), `"r"` for each relay in use | | Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a"` (kind:30015 interest set) | | Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) | | DM relays | 10050 | Where to receive [NIP-17](17.md) direct messages | `"relay"` (see [NIP-17](17.md)) | -- cgit v1.2.3