From c80be21cd44aa74efa42ead23a12343bf33ade34 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Mon, 2 Jan 2023 16:49:37 -0300 Subject: drastically simplify @semisol's auth NIP. --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index cce4166..f627f4d 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-35: User Discovery](35.md) - [NIP-36: Sensitive Content](36.md) - [NIP-40: Expiration Timestamp](40.md) +- [NIP-42: Authentication of clients to relays](42.md) ## Event Kinds @@ -47,6 +48,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 43 | Channel Hide Message | [28](28.md) | | 44 | Channel Mute User | [28](28.md) | | 45-49 | Public Chat Reserved | [28](28.md) | +| 22242 | Client Authentication | [42](42.md) | | 10000-19999 | Replaceable Events Reserved | [16](16.md) | | 20000-29999 | Ephemeral Events Reserved | [16](16.md) | @@ -54,11 +56,12 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh ## Message types ### Client to Relay -| type | description | NIP | -|-------|-----------------------------------------------------|------------| -| EVENT | used to publish events | [1](01.md) | -| REQ | used to request events and subscribe to new updates | [1](01.md) | -| CLOSE | used to stop previous subscriptions | [1](01.md) | +| type | description | NIP | +|-------|-----------------------------------------------------|-------------| +| EVENT | used to publish events | [1](01.md) | +| REQ | used to request events and subscribe to new updates | [1](01.md) | +| CLOSE | used to stop previous subscriptions | [1](01.md) | +| AUTH | used to send authentication events | [42](42.md) | ### Relay to Client | type | description | NIP | -- cgit v1.2.3 From 6a70967f0eb6e7b00fc811e34631f8db046d6e1f Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sat, 7 Jan 2023 19:53:42 -0300 Subject: add challenge from relay. --- 42.md | 37 +++++++++++++++++++++++++++---------- README.md | 1 + 2 files changed, 28 insertions(+), 10 deletions(-) (limited to 'README.md') diff --git a/42.md b/42.md index 4c884a9..93bb3e3 100644 --- a/42.md +++ b/42.md @@ -19,16 +19,23 @@ A relay may want to require clients to authenticate to access restricted resourc before clients can query for that kind. - A relay may limit subscriptions of any kind to paying users or users whitelisted through any other means, and require authentication. -## Protocol flow +## Definitions + +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 is of the following form: + +``` +["AUTH", ] +``` -This NIP defines a new message, `AUTH`, which clients can send to relays when they want to authenticate. The message is of the following form: +And, when sent by clients, of the following form: ``` -["AUTH", ] +["AUTH", ] ``` -The signed event is an ephemeral event not meant to be published or queried, it must be of `kind: 22242` and content must be set to the -WebSocket URL of the relay. `created_at` should be the current time. Example: +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. `created_at` should be the current time. Example: ```json { @@ -36,18 +43,27 @@ WebSocket URL of the relay. `created_at` should be the current time. Example: "pubkey": "...", "created_at": 1669695536, "kind": 22242, - "tags": [], - "content": "wss://relay.example.com/", + "tags": [ + ["relay", "wss://relay.example.com/"], + ["challenge", "challengestringhere"] + ], + "content": "", "sig": "..." } ``` +## Protocol flow + +At any moment the relay may send an `AUTH` message to the client containing a challenge. After receiving that the client may decide to +authenticate itself or not. The challenge is expected to be valid for the duration of the connection or until a next challenge is sent by +the relay. + The client may send an auth message right before performing an action for which it knows authentication will be required -- for example, right before requesting `kind: 4` chat messages --, or it may do right on connection start or at some other moment it deems best. The authentication is expected to last for the duration of the WebSocket connection. Upon receiving a message from an unauthenticated user it can't fulfill without authentication, a relay may choose to notify the client. For -that it can use a `NOTICE` message with a standard prefix `"restricted: "` that is readable both by humans and machines, for example: +that it can use a `NOTICE` or `OK` message with a standard prefix `"restricted: "` that is readable both by humans and machines, for example: ``` ["NOTICE", "restricted: we can't serve DMs to unauthenticated users, does your client implement NIP-42?"] @@ -56,7 +72,7 @@ that it can use a `NOTICE` message with a standard prefix `"restricted: "` that or it can return an `OK` message noting the reason an event was not written using the same prefix: ``` -["OK", "b1a649ebe8...", false, "restricted: we do not accept events from unauthenticated users, please sign up at https://example.com/"] +["OK", , false, "restricted: we do not accept events from unauthenticated users, please sign up at https://example.com/"] ``` ## Signed Event Verification @@ -65,5 +81,6 @@ To verify `AUTH` messages, relays must ensure: - that the `kind` is `22242`; - that the event `created_at` is close (e.g. within ~10 minutes) of the current time; - - that the `content` field matches the relay URL: + - that the `"challenge"` tag matches the challenge sent before; + - that the `"relay"` tag matches the relay URL: - URL normalization techniques can be applied. For most cases just checking if the domain name is correct should be enough. diff --git a/README.md b/README.md index f627f4d..05737b1 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | NOTICE | used to send human-readable messages to clients | [1](01.md) | | EOSE | used to notify clients all stored events have been sent | [15](15.md) | | OK | used to notify clients if an EVENT was successuful | [20](20.md) | +| AUTH | used to send authentication challenges | [42](42.md) | Please update these lists when proposing NIPs introducing new event kinds. -- cgit v1.2.3 From 73496430691befb08c4dd22e4027b86091580e29 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Mon, 16 Jan 2023 15:58:49 -0300 Subject: remove NIP-18, it is not really a standard. closes https://github.com/nostr-protocol/nips/issues/173 --- 18.md | 19 ------------------- README.md | 1 - 2 files changed, 20 deletions(-) delete mode 100644 18.md (limited to 'README.md') diff --git a/18.md b/18.md deleted file mode 100644 index 365de9c..0000000 --- a/18.md +++ /dev/null @@ -1,19 +0,0 @@ -NIP-18 -====== - -Reposts -------- - -`draft` `optional` `author:jb55` - -A repost is a `kind 6` note that is used to signal to followers -that another event is worth reading. - -The `content` of a repost event is empty. - -The repost event MUST include an `e` tag with the `id` of the note that is -being reposted. That tag SHOULD include a relay URL as its third entry -to indicate where it can be fetched. - -The repost SHOULD include a `p` tag with the `pubkey` of the event being -reposted. diff --git a/README.md b/README.md index 5dec5f1..ed63973 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,6 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-14: Subject tag in text events.](14.md) - [NIP-15: End of Stored Events Notice](15.md) - [NIP-16: Event Treatment](16.md) -- [NIP-18: Reposts](18.md) - [NIP-19: bech32-encoded entities](19.md) - [NIP-20: Command Results](20.md) - [NIP-22: Event created_at Limits](22.md) -- cgit v1.2.3 From 1840c5cbdf37635fcada6434e91e9a47b0251d91 Mon Sep 17 00:00:00 2001 From: "marc@roosoft.com" Date: Mon, 16 Jan 2023 14:46:13 -0500 Subject: removed kind 6 since NIP-18 has been removed from the spec --- README.md | 1 - 1 file changed, 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index ed63973..1576965 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,6 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 3 | Contacts | [2](02.md) | | 4 | Encrypted Direct Messages | [4](04.md) | | 5 | Event Deletion | [9](09.md) | -| 6 | Repost | [18](18.md) | | 7 | Reaction | [25](25.md) | | 40 | Channel Creation | [28](28.md) | | 41 | Channel Metadata | [28](28.md) | -- cgit v1.2.3 From 9682e43ee03cd50b5994bada0e3a97e3c259b314 Mon Sep 17 00:00:00 2001 From: monlovesmango <96307647+monlovesmango@users.noreply.github.com> Date: Sun, 22 Jan 2023 21:31:27 -0600 Subject: update Parameterized Replaceable Events range --- README.md | 2 ++ 1 file changed, 2 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index 1576965..df955d3 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,8 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 22242 | Client Authentication | [42](42.md) | | 10000-19999 | Replaceable Events Reserved | [16](16.md) | | 20000-29999 | Ephemeral Events Reserved | [16](16.md) | +| 30000-39999 | Param. Repl. Events Reserved| [33](33.md) | + ## Message types -- cgit v1.2.3 From 45649d7b4d40fda4b4db8a02d007e6243a1153c9 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Tue, 24 Jan 2023 10:23:00 -0300 Subject: add NIP-21, `nostr:` url scheme. --- 21.md | 20 ++++++++++++++++++++ README.md | 1 + 2 files changed, 21 insertions(+) create mode 100644 21.md (limited to 'README.md') diff --git a/21.md b/21.md new file mode 100644 index 0000000..2525bf1 --- /dev/null +++ b/21.md @@ -0,0 +1,20 @@ +NIP-21 +====== + +`nostr:` URL scheme +------------------- + +`draft` `optional` `author:fiatjaf` + +This NIP standardizes the usage of a common URL scheme for maximum interoperability and openness in the network. + +The scheme is `nostr:`. + +The identifiers that come after are expected to be the same as those defined in NIP-19 (except `nsec`). + +## Examples + +- `nostr:npub1sn0wdenkukak0d9dfczzeacvhkrgz92ak56egt7vdgzn8pv2wfqqhrjdv9` +- `nostr:nprofile1qqsrhuxx8l9ex335q7he0f09aej04zpazpl0ne2cgukyawd24mayt8gpp4mhxue69uhhytnc9e3k7mgpz4mhxue69uhkg6nzv9ejuumpv34kytnrdaksjlyr9p` +- `nostr:note1fntxtkcy9pjwucqwa9mddn7v03wwwsu9j330jj350nvhpky2tuaspk6nqc` +- `nostr:nevent1qqstna2yrezu5wghjvswqqculvvwxsrcvu7uc0f78gan4xqhvz49d9spr3mhxue69uhkummnw3ez6un9d3shjtn4de6x2argwghx6egpr4mhxue69uhkummnw3ez6ur4vgh8wetvd3hhyer9wghxuet5nxnepm` diff --git a/README.md b/README.md index df955d3..f8dd7c9 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-16: Event Treatment](16.md) - [NIP-19: bech32-encoded entities](19.md) - [NIP-20: Command Results](20.md) +- [NIP-21: `nostr:` URL scheme](21.md) - [NIP-22: Event created_at Limits](22.md) - [NIP-25: Reactions](25.md) - [NIP-26: Delegated Event Signing](26.md) -- cgit v1.2.3 From d82599bc7f894a175174014d3afc44e428ecb99d Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Wed, 25 Jan 2023 13:20:36 -0300 Subject: add list of standardized tags. --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index f8dd7c9..1ef0ec8 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,20 @@ Please update these lists when proposing NIPs introducing new event kinds. When experimenting with kinds, keep in mind the classification introduced by [NIP-16](16.md). +## Standardized Tags + +| name | value | other parameters | NIP | +| ---------- | ----------------------- | ----------------- | ------------------------ | +| e | event id (hex) | relay URL, marker | [1](01.md), [10](10.md) | +| p | pubkey (hex) | relay URL | [1](01.md) | +| r | a reference (URL, etc) | | [12](12.md) | +| t | hashtag | | [12](12.md) | +| g | geohash | | [12](12.md) | +| nonce | random | | [13](13.md) | +| subject | subject | | [14](14.md) | +| d | identifier | | [33](33.md) | +| expiration | unix timestamp (string) | | [40](40.md) | + ## Criteria for acceptance of NIPs 1. They should be implemented in at least two clients and one relay -- when applicable. -- cgit v1.2.3 From 5901fe0b87f8d7ec56bf91a065111f0c3d3b0405 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 27 Jan 2023 07:47:12 -0300 Subject: add NIP-50 to README. --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index 1ef0ec8..829e61b 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-36: Sensitive Content](36.md) - [NIP-40: Expiration Timestamp](40.md) - [NIP-42: Authentication of clients to relays](42.md) +- [NIP-50: Keywords filter](50.md) ## Event Kinds -- cgit v1.2.3 From 69438fc3445490a7081a09f0de65ff8c6abe723b Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Fri, 3 Feb 2023 18:52:56 +1300 Subject: NIP-65 Feed Advertisements --- 65.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 60 insertions(+) create mode 100644 65.md (limited to 'README.md') diff --git a/65.md b/65.md new file mode 100644 index 0000000..1a947eb --- /dev/null +++ b/65.md @@ -0,0 +1,59 @@ +NIP-65 +====== + +Feed Advertisements +------------------- + +`draft` `optional` `author:mikedilger` + +A special replaceable event meaning "Feed Advertisement" is defined as an event with kind `10002` having a list of `r` tags, one for each relay the author posts their outgoing "feed" to. + +The content is not used. + +A feed consists of events that the author posts and wishes for their followers to "follow". Normally these would be kind-1 Text Note events but is not limited as such. + +Clients SHOULD, as with all replaceable events, use only the most recent kind-10002 event they can find. + +Clients SHOULD presume that if their user has a pubkey in their ContactList (kind 3) that it is because they wish to see this author's "feed" events. But clients MAY presume otherwise. + +Clients SHOULD interpret these Feed Advertisements as being the best relays to source the "feed" events from the author of the feed advertisement. + +### Motivation + +There is a common nostr use case where users wish to follow the content produced by other users. This is evidenced by the implicit meaning of the Contact List in [NIP-02](02.md) + +Because users don't often share the same sets of relays, ad-hoc solutions have arisen to get that content, but these solutions negatively impact scalability and decentralization: + + - Most people are sending their posts to the same most popular relays in order to be more widely seen + - Many people are pulling from a large number of relays (including many duplicate events) in order to get more data + - Events are being copied between relays, oftentimes to many different relays + +### Purposes + +The purpose of this NIP is to help clients find the events of the people they follow, and to help nostr scale better. + +### Suggestions + +It is suggested that people spread their kind-10002 events to many relays, but to post their normal feed notes to a much smaller number of relays. It is suggested that clients offer a way for users to spread their Feed Advertisements to many more relays than they normally post to. + +Authors may post events outside of the feed that they wish their followers to follow by posting them to relays outside of those listed in their "Feed Advertisement". For example, an author may want to reply to someone without all of their followers watching, but in many cases they want all their replies to show up in their "feed". + +It is suggsted that relays allow any user to write their own kind-10002 event (optionally with AUTH to verify it is their own) even if they are not otherwise subscribed to the relay because + + - finding where someone posts is rather important + - these events do not have content that needs management + - relays only need to store one replaceable event per pubkey to offer this service + +### Example + +```json +{ + "kind": 10002, + "tags": [ + ["r", "wss://alicerelay.example.com"], + ["r", "wss://brando-relay.com"], + ["r", "wss://expensive-relay.example2.com"], + ], + "content": "", + ...other fields +``` diff --git a/README.md b/README.md index 829e61b..9767f0d 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 43 | Channel Hide Message | [28](28.md) | | 44 | Channel Mute User | [28](28.md) | | 45-49 | Public Chat Reserved | [28](28.md) | +| 10002 | Feed Advertisement | [65](65.md) | | 22242 | Client Authentication | [42](42.md) | | 10000-19999 | Replaceable Events Reserved | [16](16.md) | | 20000-29999 | Ephemeral Events Reserved | [16](16.md) | -- cgit v1.2.3 From 7c444e3474167f7dcdcecf28b8679b022996e958 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 3 Feb 2023 15:59:07 -0300 Subject: NIP-23: long-form content. --- 19.md | 11 +++++++--- 23.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 3 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 23.md (limited to 'README.md') diff --git a/19.md b/19.md index e63ca00..f3dd2b8 100644 --- a/19.md +++ b/19.md @@ -35,6 +35,7 @@ These are the possible bech32 prefixes with `TLV`: - `nprofile`: a nostr profile - `nevent`: a nostr event - `nrelay`: a nostr relay + - `nref`: a nostr parameterized replaceable event coordinate (NIP-33) These possible standardized `TLV` types are indicated here: @@ -42,11 +43,15 @@ 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 `nrelay`, this is the relay URL. + - for `nrelay`, this is the relay URL + - for `nref`, it is the identifier (the `"d"` tag) of the event being referenced - for `nprofile`, `nevent` and `nrelay` this may be included only once. - `1`: `relay` - - A relay in which the entity (profile or event) is more likely to be found, encoded as UTF-8. This may be included multiple times. - - not applicable to `nrelay`. + - for `nprofile`, `nevent` and `nref`, a relay in which the entity (profile or event) is more likely to be found, encoded as UTF-8. This may be included multiple times +- `2`: `author` + - for `nref`, the 32 bytes of the pubkey of the event + + ## Examples - `npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6` should decode into the public key hex `3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d` and vice-versa diff --git a/23.md b/23.md new file mode 100644 index 0000000..b8b8698 --- /dev/null +++ b/23.md @@ -0,0 +1,75 @@ +NIP-23 +====== + +Long-form Content +----------------- + +`draft` `optional` `author:fiatjaf` + +This NIP defines `kind:30023` (a parameterized replaceable event according to NIP-33) for long-form text content, generally referred to as "articles" or "blog posts". + +"Social" clients that deal primarily with `kind:1` notes should not be expected to implement this NIP. + +### Format + +The `.content` of these events should be a string text in Markdown syntax, including YAML front-matter for other metadata that may be necessary. + +### Metadata + +This NIP defines only `title` as the metadata. For the date of publication the event `.created_at` field should be used, and for "tags"/"hashtags" (i.e. topics about which the event might be of relevance) the `"t"` event tag should be used, as in NIP-12. + +### Editability + +These articles are meant to be editable, so they should make use of the replaceability feature of NIP-33 and include a `"d"` tag with an identifier for the article. Clients should take care to only publish and read these events from relays that implement that. If they don't do that they should also take care to hide old versions of the same article they may receive. + +### Linking + +The article may be linked to using the NIP-19 `nref` code, which should contain both the public key of the author and the article identifier (the `"d"` tag) and some relays. With that information it is possible to locate the article. + +### References + +Writing clients should implement support for parsing pasted NIP-19 `nref` identifiers and adding them automatically to the list of `.tags` of the event, replacing the actual content with a string like `#[tag_index]` in the same way as NIP-08 -- or, if the reference is in the form of a URL (for example, `[click here](nref...)`) then they should be replaced with just the tag number directly (for example, `[click here][0]`). + +Reader clients should parse the Markdown and replace these references with either internal links so the referenced events can be accessed directly, with NIP-21 `nostr:` links or direct links to web clients that will handle these references. + +The idea here is that having these tags is that reader clients can display a list of backreferences at the bottom when one article mentions another. + +### `kind:1` interface + +In case there is the desire for users or clients to share the written article on their "social" clients, a `kind:1` event must be used. + +Since "social" clients aren't expected to understand this NIP, these notes should contain a URL like `nostr:nref1...` specifying the `nref1` code for the article, such that it can be rendered clickable and other users can use a different client than their "social" to read the article -- and also if their client handles both kinds of posts, their client may recognize the URL and handle it internally. + +For clients that want to implement the ability for users to comment on these articles. `kind:1` notes should be used as the comments. They must be made in reply to another `kind:1` as above, such that other people on "social" clients can see the comments and get the context from the note above and load the article being commented on if they so desire. + +## Example of an event + +Article text: + +```markdown +title: Lorem Ipsum +--- + +Lorem [ipsum][4] dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Read more at #[3]. +``` + +Derived event: + +```json +{ + "kind": 30023, + "created_at": 1000000000, + "title": "Lorem Ipsum\\n---\\n\\nLorem [ipsum][4] dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\nRead more at #[3].", + "tags": [ + ["d", "lorem-ipsum"], + ["t", "lorem"], + ["t", "ipsum"], + ["e", "b3e392b11f5d4f28321cedd09303a748acfd0487aea5a7450b3481c60b6e4f87", "wss://relay.example.com"], + ["e", "a695f6b60119d9521934a691347d9f78e8770b56da16bb255ee286ddf9fda919", "wss://relay.nostr.org"] + ], + "pubkey": "...", + "id": "..." +} +``` diff --git a/README.md b/README.md index 829e61b..0115e68 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 3 | Contacts | [2](02.md) | | 4 | Encrypted Direct Messages | [4](04.md) | | 5 | Event Deletion | [9](09.md) | +| 30023 | Long-form Content | [23](23.md) | | 7 | Reaction | [25](25.md) | | 40 | Channel Creation | [28](28.md) | | 41 | Channel Metadata | [28](28.md) | -- cgit v1.2.3 From 251382552355258f19403c8ddc8bd63a7c74bd19 Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Sun, 5 Feb 2023 03:50:26 +1300 Subject: Rename, recognize read relays --- 65.md | 33 ++++++++++++++++++++++----------- README.md | 2 +- 2 files changed, 23 insertions(+), 12 deletions(-) (limited to 'README.md') diff --git a/65.md b/65.md index 1a947eb..01c2723 100644 --- a/65.md +++ b/65.md @@ -1,22 +1,28 @@ NIP-65 ====== -Feed Advertisements +Relay List Metadata ------------------- `draft` `optional` `author:mikedilger` -A special replaceable event meaning "Feed Advertisement" is defined as an event with kind `10002` having a list of `r` tags, one for each relay the author posts their outgoing "feed" to. +A special replaceable event meaning "Relay List Metadata" is defined as an event with kind `10002` having a list of `r` tags, one for each relay the author uses to either read or write to. -The content is not used. +The primary purpose of this relay list is to advertise to others, not for configuring one's client. -A feed consists of events that the author posts and wishes for their followers to "follow". Normally these would be kind-1 Text Note events but is not limited as such. +The content is not used and SHOULD be blank. + +The `r` tags can have a second parameter as either `read` or `write`. If it is omitted, it means the author both reads from and writes to that relay. Clients SHOULD, as with all replaceable events, use only the most recent kind-10002 event they can find. -Clients SHOULD presume that if their user has a pubkey in their ContactList (kind 3) that it is because they wish to see this author's "feed" events. But clients MAY presume otherwise. +### The meaning of read and write + +If an author advertises a write relay in a kind `10002` event, that means that feed-related events created by the author, which the author wants their followers to see, will be posted there. Normally these would be kind-1 Text Note events, but are not limited as such. + +Clients SHOULD presume that if their user has a pubkey in their ContactList (kind 3) that it is because they wish to see that author's feed-related events. But clients MAY presume otherwise. -Clients SHOULD interpret these Feed Advertisements as being the best relays to source the "feed" events from the author of the feed advertisement. +If an author advertises a read relay in a kind `10002` event, that means that the author may be subscribed to events that tag them on such relays. Clients SHOULD publish events that tag someone on at least the read relays of the person being tagged. ### Motivation @@ -30,20 +36,24 @@ Because users don't often share the same sets of relays, ad-hoc solutions have a ### Purposes -The purpose of this NIP is to help clients find the events of the people they follow, and to help nostr scale better. +The purpose of this NIP is to help clients find the events of the people they follow, to help tagged events get to the people tagged, and to help nostr scale better. ### Suggestions -It is suggested that people spread their kind-10002 events to many relays, but to post their normal feed notes to a much smaller number of relays. It is suggested that clients offer a way for users to spread their Feed Advertisements to many more relays than they normally post to. +It is suggested that people spread their kind `10002` events to many relays, but write their normal feed-related events to a much smaller number of relays (between 2 to 6 relays). It is suggested that clients offer a way for users to spread their kind `10002` events to many more relays than they normally post to. -Authors may post events outside of the feed that they wish their followers to follow by posting them to relays outside of those listed in their "Feed Advertisement". For example, an author may want to reply to someone without all of their followers watching, but in many cases they want all their replies to show up in their "feed". +Authors may post events outside of the feed that they wish their followers to follow by posting them to relays outside of those listed in their "Relay List Metadata". For example, an author may want to reply to someone without all of their followers watching. -It is suggsted that relays allow any user to write their own kind-10002 event (optionally with AUTH to verify it is their own) even if they are not otherwise subscribed to the relay because +It is suggsted that relays allow any user to write their own kind `10002` event (optionally with AUTH to verify it is their own) even if they are not otherwise subscribed to the relay because - finding where someone posts is rather important - these events do not have content that needs management - relays only need to store one replaceable event per pubkey to offer this service +### Why not in kind `0` Metadata + +Even though this is user related metadata, it is a separate event from kind `0` in order to keep it small (as it should be widely spread) and to not have content that may require moderation by relay operators so that it is more acceptable to relays. + ### Example ```json @@ -52,7 +62,8 @@ It is suggsted that relays allow any user to write their own kind-10002 event (o "tags": [ ["r", "wss://alicerelay.example.com"], ["r", "wss://brando-relay.com"], - ["r", "wss://expensive-relay.example2.com"], + ["r", "wss://expensive-relay.example2.com", "write"], + ["r", "wss://nostr-relay.example.com", "read"], ], "content": "", ...other fields diff --git a/README.md b/README.md index 9767f0d..e7ab5ec 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 43 | Channel Hide Message | [28](28.md) | | 44 | Channel Mute User | [28](28.md) | | 45-49 | Public Chat Reserved | [28](28.md) | -| 10002 | Feed Advertisement | [65](65.md) | +| 10002 | Relay List Metadata | [65](65.md) | | 22242 | Client Authentication | [42](42.md) | | 10000-19999 | Replaceable Events Reserved | [16](16.md) | | 20000-29999 | Ephemeral Events Reserved | [16](16.md) | -- cgit v1.2.3 From 8c031aa710a8f0325620e6ac1d94e30f8a8f212b Mon Sep 17 00:00:00 2001 From: Lio李歐 Date: Mon, 6 Feb 2023 16:15:08 -0800 Subject: Update README.md kind table (#226) --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index 829e61b..53f0aae 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 44 | Channel Mute User | [28](28.md) | | 45-49 | Public Chat Reserved | [28](28.md) | | 22242 | Client Authentication | [42](42.md) | +| 1000-9999 | Regular Events Reserved | [16](16.md) | | 10000-19999 | Replaceable Events Reserved | [16](16.md) | | 20000-29999 | Ephemeral Events Reserved | [16](16.md) | | 30000-39999 | Param. Repl. Events Reserved| [33](33.md) | -- cgit v1.2.3 From b99ca748c8227d2723b5f856b004267b3c122c06 Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Wed, 8 Feb 2023 08:52:35 +1300 Subject: Put NIP-65 in the readme contents --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index 24ade62..f4ed3d2 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-40: Expiration Timestamp](40.md) - [NIP-42: Authentication of clients to relays](42.md) - [NIP-50: Keywords filter](50.md) +- [NIP-65: Relay List Metadata](65.md) ## Event Kinds -- cgit v1.2.3 From f9e38ed00f5b11694ff93c368aacbf47ec21437a Mon Sep 17 00:00:00 2001 From: William Casarin Date: Tue, 7 Feb 2023 13:15:38 -0800 Subject: NIP-56: Reporting (#205) Co-authored-by: Semisol <45574030+Semisol@users.noreply.github.com> Co-authored-by: Leo Wandersleb --- 56.md | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 ++ 2 files changed, 84 insertions(+) create mode 100644 56.md (limited to 'README.md') diff --git a/56.md b/56.md new file mode 100644 index 0000000..55ee1a2 --- /dev/null +++ b/56.md @@ -0,0 +1,82 @@ + +NIP-56 +====== + +Reporting +--------- + +`draft` `optional` `author:jb55` + +A report is a `kind 1984` note that is used to report other notes for spam, +illegal and explicit content. + +The content MAY contain additional information submitted by the entity +reporting the content. + +Tags +---- + +The report event MUST include a `p` tag referencing the pubkey of the user you +are reporting. + +If reporting a note, an `e` tag MUST also be included referencing the note id. + +A `report type` string MUST be included as the 3rd entry to the `e` or `p` tag +being reported, which consists of the following report types: + +- `nudity` - depictions of nudity, porn, etc. +- `profanity` - profanity, hateful speech, etc. +- `illegal` - something which may be illegal in some jurisdiction +- `spam` - spam +- `impersonation` - someone pretending to be someone else + +Some report tags only make sense for profile reports, such as `impersonation` + +Example events +-------------- + +```json +{ + "kind": 1984, + "tags": [ + [ "p", , "nudity"] + ], + "content": "", + ... +} + +{ + "kind": 1984, + "tags": [ + [ "e", , "illegal"], + [ "p", ] + ], + "content": "He's insulting the king!", + ... +} + +{ + "kind": 1984, + "tags": [ + [ "p", , "impersonation"], + [ "p", ] + ], + "content": "Profile is imitating #[1]", + ... +} +``` + +Client behavior +--------------- + +Clients can use reports from friends to make moderation decisions if they +choose to. For instance, if 3+ of your friends report a profile as explicit, +clients can have an option to automatically blur photos from said account. + + +Relay behavior +-------------- + +It is not recommended that relays perform automatic moderation using reports, +as they can be easily gamed. Admins could use reports from trusted moderators to +takedown illegal or explicit content if the relay does not allow such things. diff --git a/README.md b/README.md index f4ed3d2..225379b 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-40: Expiration Timestamp](40.md) - [NIP-42: Authentication of clients to relays](42.md) - [NIP-50: Keywords filter](50.md) +- [NIP-56: Reporting](56.md) - [NIP-65: Relay List Metadata](65.md) ## Event Kinds @@ -49,6 +50,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 43 | Channel Hide Message | [28](28.md) | | 44 | Channel Mute User | [28](28.md) | | 45-49 | Public Chat Reserved | [28](28.md) | +| 1984 | Reporting | [56](56.md) | | 10002 | Relay List Metadata | [65](65.md) | | 22242 | Client Authentication | [42](42.md) | | 1000-9999 | Regular Events Reserved | [16](16.md) | -- cgit v1.2.3 From 643de1b7dac1d00ff8344e887da54ae9edd9ee82 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Thu, 9 Feb 2023 13:41:54 -0300 Subject: change kind:1 description on README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index 225379b..72973c0 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | kind | description | NIP | |-------------|-----------------------------|------------------------| | 0 | Metadata | [1](01.md), [5](05.md) | -| 1 | Text | [1](01.md) | +| 1 | Short Text Note | [1](01.md) | | 2 | Recommend Relay | [1](01.md) | | 3 | Contacts | [2](02.md) | | 4 | Encrypted Direct Messages | [4](04.md) | -- cgit v1.2.3 From a1a090160b610c69513725ae871efdb346cbd82d Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Thu, 9 Feb 2023 13:43:53 -0300 Subject: rewrite ranges. --- README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index 72973c0..54bb5d4 100644 --- a/README.md +++ b/README.md @@ -35,28 +35,28 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh ## Event Kinds -| kind | description | NIP | -|-------------|-----------------------------|------------------------| -| 0 | Metadata | [1](01.md), [5](05.md) | -| 1 | Short Text Note | [1](01.md) | -| 2 | Recommend Relay | [1](01.md) | -| 3 | Contacts | [2](02.md) | -| 4 | Encrypted Direct Messages | [4](04.md) | -| 5 | Event Deletion | [9](09.md) | -| 7 | Reaction | [25](25.md) | -| 40 | Channel Creation | [28](28.md) | -| 41 | Channel Metadata | [28](28.md) | -| 42 | Channel Message | [28](28.md) | -| 43 | Channel Hide Message | [28](28.md) | -| 44 | Channel Mute User | [28](28.md) | -| 45-49 | Public Chat Reserved | [28](28.md) | -| 1984 | Reporting | [56](56.md) | -| 10002 | Relay List Metadata | [65](65.md) | -| 22242 | Client Authentication | [42](42.md) | -| 1000-9999 | Regular Events Reserved | [16](16.md) | -| 10000-19999 | Replaceable Events Reserved | [16](16.md) | -| 20000-29999 | Ephemeral Events Reserved | [16](16.md) | -| 30000-39999 | Param. Repl. Events Reserved| [33](33.md) | +| kind | description | NIP | +| ------------- | -------------------------------- | ----------------------- | +| 0 | Metadata | [1](01.md), [5](05.md) | +| 1 | Short Text Note | [1](01.md) | +| 2 | Recommend Relay | [1](01.md) | +| 3 | Contacts | [2](02.md) | +| 4 | Encrypted Direct Messages | [4](04.md) | +| 5 | Event Deletion | [9](09.md) | +| 7 | Reaction | [25](25.md) | +| 40 | Channel Creation | [28](28.md) | +| 41 | Channel Metadata | [28](28.md) | +| 42 | Channel Message | [28](28.md) | +| 43 | Channel Hide Message | [28](28.md) | +| 44 | Channel Mute User | [28](28.md) | +| 45-49 | Public Chat Reserved | [28](28.md) | +| 1984 | Reporting | [56](56.md) | +| 10002 | Relay List Metadata | [65](65.md) | +| 22242 | Client Authentication | [42](42.md) | +| 1000-9999 | Regular Events | [16](16.md) | +| 10000-19999 | Replaceable Events | [16](16.md) | +| 20000-29999 | Ephemeral Events | [16](16.md) | +| 30000-39999 | Parameterized Replaceable Events | [33](33.md) | -- cgit v1.2.3 From 17ffd3ee4efa33c3f6abb4304d1c4dd998efc523 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Mon, 13 Feb 2023 03:36:04 -0800 Subject: NIP-57: Lightning Zaps (#224) --- 57.md | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 3 ++ 2 files changed, 149 insertions(+) create mode 100644 57.md (limited to 'README.md') diff --git a/57.md b/57.md new file mode 100644 index 0000000..78a3fd6 --- /dev/null +++ b/57.md @@ -0,0 +1,146 @@ +NIP-57 +====== + +Lightning Zaps +-------------- + +`draft` `optional` `author:jb55` `author:kieran` + +This NIP defines a new note type called a lightning zap of kind `9735`. These represent paid lightning invoice receipts sent by a lightning node called the `zapper`. We also define another note type of kind `9734` which are `zap request` notes, which will be described in this document. + +Having lightning receipts on nostr allows clients to display lightning payments from entities on the network. These can be used for fun or for spam deterrence. + + +## Definitions + +`zapper` - the lightning node or service that sends zap notes (kind `9735`) + +`zap request` - a note of kind `9734` created by the person zapping + +`zap invoice` - the bolt11 invoice fetched from a custom lnurl endpoint which contains a `zap request` note + + +## Protocol flow + +### Client side + +1. Calculate the lnurl pay request url for a user from the lud06 or lud16 field on their profile + +2. Fetch the lnurl pay request static endpoint (`https://host.com/.well-known/lnurlp/user`) and gather the `allowsNostr` and `nostrPubkey` fields. If `allowsNostr` exists and it is `true`, and if `nostrPubkey` exists and is a valid BIP 340 public key, associate this information with the user. The `nostrPubkey` is the `zapper`'s pubkey, and it is used to authorize zaps sent to that user. + +3. Clients may choose to display a lightning zap button on each post or on the users profile, if the user's lnurl pay request endpoint supports nostr, the client SHOULD generate a `zap invoice` instead of a normal lnurl invoice. + +4. To generate a `zap invoice`, call the `callback` url with `amount` set to the milli-satoshi amount value. A `nostr` querystring value MUST be set as well. It is a uri-encoded `zap request` note signed by the user's key. The `zap request` note contains an `e` tag of the note it is zapping, and a `p` tag of the target user's pubkey. The `e` tag is optional which allows profile tipping. The `zap request` note must also have a `relays` tag, which is gathered from the user's configured relays. The `content` MAY be an additional comment from the user which can be displayed when listing zaps on posts and profiles. + +5. Pay this invoice or pass it to an app that can pay the invoice. Once it's paid, a `zap note` will be created by the `zapper`. + +### LNURL Server side + +The lnurl server will need some additional pieces of information so that clients can know that zap invoices are supported: + +1. Add a `nostrPubkey` to the lnurl-pay static endpoint `/.well-known/lnurlp/user`, where `nostrPubkey` is the nostr pubkey of the `zapper`, the entity that creates zap notes. Clients will use this to authorize zaps. + +2. Add an `allowsNostr` field and set it to true. + +3. In the lnurl-pay callback URL, watch for a `nostr` querystring, where the contents of the note is a uri-encoded `zap request` JSON. + +4. If present, the zap request note must be validated: + + a. It MUST have a valid nostr signature + + b. It MUST have tags + + c. It MUST have at least one p-tag + + d. It MUST have either 0 or 1 e-tag + + e. There should be a `relays` tag with the relays to send the `zap` note to. + +5. If valid, fetch a description hash invoice where the description is this note and this note only. No additional lnurl metadata is included in the description. + +At this point, the lightning node is ready to send the zap note once payment is received. + +## The zap note + +Zap notes are created by a lightning node reacting to paid invoices. Zap notes are only created when the invoice description (committed to the description hash) contains a `zap request` note. + +Example zap note: + +```json +{ + "id": "67b48a14fb66c60c8f9070bdeb37afdfcc3d08ad01989460448e4081eddda446", + "pubkey": "9630f464cca6a5147aa8a35f0bcdd3ce485324e732fd39e09233b1d848238f31", + "created_at": 1674164545, + "kind": 9735, + "tags": [ + [ + "p", + "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245" + ], + [ + "e", + "3624762a1274dd9636e0c552b53086d70bc88c165bc4dc0f9e836a1eaf86c3b8" + ], + [ + "bolt11", + "lnbc10u1p3unwfusp5t9r3yymhpfqculx78u027lxspgxcr2n2987mx2j55nnfs95nxnzqpp5jmrh92pfld78spqs78v9euf2385t83uvpwk9ldrlvf6ch7tpascqhp5zvkrmemgth3tufcvflmzjzfvjt023nazlhljz2n9hattj4f8jq8qxqyjw5qcqpjrzjqtc4fc44feggv7065fqe5m4ytjarg3repr5j9el35xhmtfexc42yczarjuqqfzqqqqqqqqlgqqqqqqgq9q9qxpqysgq079nkq507a5tw7xgttmj4u990j7wfggtrasah5gd4ywfr2pjcn29383tphp4t48gquelz9z78p4cq7ml3nrrphw5w6eckhjwmhezhnqpy6gyf0" + ], + [ + "description", + "{\"pubkey\":\"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245\",\"content\":\"\",\"id\":\"d9cc14d50fcb8c27539aacf776882942c1a11ea4472f8cdec1dea82fab66279d\",\"created_at\":1674164539,\"sig\":\"77127f636577e9029276be060332ea565deaf89ff215a494ccff16ae3f757065e2bc59b2e8c113dd407917a010b3abd36c8d7ad84c0e3ab7dab3a0b0caa9835d\",\"kind\":9734,\"tags\":[[\"e\",\"3624762a1274dd9636e0c552b53086d70bc88c165bc4dc0f9e836a1eaf86c3b8\"],[\"p\",\"32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245\"],[\"relays\",\"wss://relay.damus.io\",\"wss://nostr-relay.wlvs.space\",\"wss://nostr.fmt.wiz.biz\",\"wss://relay.nostr.bg\",\"wss://nostr.oxtr.dev\",\"wss://nostr.v0l.io\",\"wss://brb.io\",\"wss://nostr.bitcoiner.social\",\"ws://monad.jb55.com:8080\",\"wss://relay.snort.social\"]]}" + ], + [ + "preimage", + "5d006d2cf1e73c7148e7519a4c68adc81642ce0e25a432b2434c99f97344c15f" + ] + ], + "content": "", + "sig": "b0a3c5c984ceb777ac455b2f659505df51585d5fd97a0ec1fdb5f3347d392080d4b420240434a3afd909207195dac1e2f7e3df26ba862a45afd8bfe101c2b1cc" + } +``` + +* The zap note MUST have a `bolt11` tag containing the description hash bolt11 invoice. + +* The zap note MUST contain a `description` tag which is the invoice description. + +* `SHA256(description)` MUST match the description hash in the bolt11 invoice. + +* The zap note MAY contain a `preimage` to match against the payment hash of the bolt11 invoice. This isn't really a payment proof, there is no real way to prove that the invoice is real or has been paid. You are trusting the author of the zap note for the legitimacy of the payment. + +The zap note is not a proof of payment, all it proves is that some nostr user fetched an invoice. The existence of the zap note implies the invoice as paid, but it could be a lie given a rogue implementation. + + +### Creating a zap note + +When receiving a payment, the following steps are executed: + +1. Get the description for the invoice. This needs to be saved somewhere during the generation of the description hash invoice. It is saved automatically for you with CLN, which is the reference implementation used here. + +2. Parse the bolt11 description as a JSON nostr note. You SHOULD check the signature of the parsed note to ensure that it is valid. This is the `zap request` note created by the entity who is zapping. + +4. The note MUST have only one `p` tag + +5. The note MUST have 0 or 1 `e` tag + +6. Create a nostr note of kind `9735` that includes the `p` tag AND optional `e` tag. The content SHOULD be empty. The created_at date SHOULD be set to the invoice paid_at date for idempotency. + +7. Send the note to the `relays` declared in the `zap request` note from the invoice description. + +A reference implementation for the zapper is here: [zapper][zapper] + +[zapper]: https://github.com/jb55/cln-nostr-zapper + + +## Client Behavior + +Clients MAY fetch zap notes on posts and profiles: + +`{"kinds": [9735], "#e": [...]}` + +To authorize these notes, clients MUST fetch the `nostrPubkey` from the users configured lightning address or lnurl and ensure that the zaps to their posts were created by this pubkey. If clients don't do this, anyone could forge unauthorized zaps. + +Once authorized, clients MAY tally zaps on posts, and list them on profiles. If the zap request note contains a non-empty `content`, it may display a zap comment. Generally clients should show users the `zap request` note, and use the `zap note` to show "zap authorized by ..." but this is optional. + +## Future Work + +Zaps can be extended to be more private by encrypting zap request notes to the target user, but for simplicity it has been left out of this initial draft. diff --git a/README.md b/README.md index 54bb5d4..d4e3c04 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-40: Expiration Timestamp](40.md) - [NIP-42: Authentication of clients to relays](42.md) - [NIP-50: Keywords filter](50.md) +- [NIP-57: Lightning Zaps](57.md) - [NIP-56: Reporting](56.md) - [NIP-65: Relay List Metadata](65.md) @@ -51,6 +52,8 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 44 | Channel Mute User | [28](28.md) | | 45-49 | Public Chat Reserved | [28](28.md) | | 1984 | Reporting | [56](56.md) | +| 9734 | Zap Request | [57](57.md) | +| 9735 | Zap | [57](57.md) | | 10002 | Relay List Metadata | [65](65.md) | | 22242 | Client Authentication | [42](42.md) | | 1000-9999 | Regular Events | [16](16.md) | -- cgit v1.2.3 From b4493aa56abdea4b05780651e7af06ea13bbfafa Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Mon, 13 Feb 2023 08:47:23 -0300 Subject: rename coordinates: nitem->naddr, "i"->"a" --- 19.md | 10 +++++----- 23.md | 8 ++++---- 33.md | 4 ++-- README.md | 1 + 4 files changed, 12 insertions(+), 11 deletions(-) (limited to 'README.md') diff --git a/19.md b/19.md index 2caf8bd..ab3b578 100644 --- a/19.md +++ b/19.md @@ -35,7 +35,7 @@ These are the possible bech32 prefixes with `TLV`: - `nprofile`: a nostr profile - `nevent`: a nostr event - `nrelay`: a nostr relay - - `nitem`: a nostr parameterized replaceable event coordinate (NIP-33) + - `naddr`: a nostr parameterized replaceable event coordinate (NIP-33) These possible standardized `TLV` types are indicated here: @@ -44,14 +44,14 @@ These possible standardized `TLV` types are indicated here: - 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 `nrelay`, this is the relay URL - - for `nitem`, it is the identifier (the `"d"` tag) of the event being referenced + - for `naddr`, it is the identifier (the `"d"` tag) of the event being referenced - `1`: `relay` - - for `nprofile`, `nevent` and `nitem`, a relay in which the entity (profile or event) is more likely to be found, encoded as ascii + - for `nprofile`, `nevent` and `naddr`, a relay in which the entity (profile or event) is more likely to be found, encoded as ascii - this may be included multiple times - `2`: `author` - - for `nitem`, the 32 bytes of the pubkey of the event + - for `naddr`, the 32 bytes of the pubkey of the event - `3`: `kind` - - for `nitem`, the 32-bit unsigned integer of the kind, big-endian + - for `naddr`, the 32-bit unsigned integer of the kind, big-endian ## Examples diff --git a/23.md b/23.md index 0c9923d..0648a35 100644 --- a/23.md +++ b/23.md @@ -31,13 +31,13 @@ These articles are meant to be editable, so they should make use of the replacea ### Linking -The article may be linked to using the NIP-19 `nitem` code along with the `"i"` tag (see NIP-33 and NIP-19). +The article may be linked to using the NIP-19 `naddr` code along with the `"a"` tag (see NIP-33 and NIP-19). ### References -Clients that support publishing NIP-23 events should implement support for parsing pasted NIP-19 `nitem` identifiers and adding them automatically to the list of `.tags` of the event, replacing the actual content with a string like `#[tag_index]` in the same way as NIP-08 -- or, if the reference is in the form of a URL (for example, `[click here](nitem1...)`) then they should be replaced with just the tag number directly as if link with that name existed at the bottom of the Markdown (for example, `[click here][0]`). +Clients that support publishing NIP-23 events should implement support for parsing pasted NIP-19 `naddr` identifiers and adding them automatically to the list of `.tags` of the event, replacing the actual content with a string like `#[tag_index]` in the same way as NIP-08 -- or, if the reference is in the form of a URL (for example, `[click here](naddr1...)`) then they should be replaced with just the tag number directly as if link with that name existed at the bottom of the Markdown (for example, `[click here][0]`). -Reader clients should parse the Markdown and replace these references with either internal links so the referenced events can be accessed directly, with NIP-21 `nostr:nitem1...` links or direct links to web clients that will handle these references. +Reader clients should parse the Markdown and replace these references with either internal links so the referenced events can be accessed directly, with NIP-21 `nostr:naddr1...` links or direct links to web clients that will handle these references. The idea here is that having these tags is that reader clients can display a list of backreferences at the bottom when one article mentions another. @@ -56,7 +56,7 @@ The same principles can be applied to `nevent1...`, `note1...`, `nprofile1...` o ["published_at", "1296962229"], ["t", "placeholder"], ["e", "b3e392b11f5d4f28321cedd09303a748acfd0487aea5a7450b3481c60b6e4f87", "wss://relay.example.com"], - ["i", "30023:a695f6b60119d9521934a691347d9f78e8770b56da16bb255ee286ddf9fda919:ipsum", "wss://relay.nostr.org"] + ["a", "30023:a695f6b60119d9521934a691347d9f78e8770b56da16bb255ee286ddf9fda919:ipsum", "wss://relay.nostr.org"] ], "pubkey": "...", "id": "..." diff --git a/33.md b/33.md index 5b8ad66..409ce4f 100644 --- a/33.md +++ b/33.md @@ -38,11 +38,11 @@ Normally (as per NIP-01, NIP-12) the `"p"` tag is used for referencing public ke equivalents for event tags (i.e. an `nprofile` is generally translated into a tag `["p", "", ""]`). -To support linking to parameterized replaceable events, the `nitem` code is introduced on +To support linking to parameterized replaceable events, the `naddr` code is introduced on NIP-19. It includes the public key of the event author and the `d` tag (and relays) such that the referenced combination of public key and `d` tag can be found. -The equivalent in `tags` to the `nitem` code is the tag `"i"`, comprised of `["i", "::", ""]`. +The equivalent in `tags` to the `naddr` code is the tag `"a"`, comprised of `["a", "::", ""]`. Client Behavior --------------- diff --git a/README.md b/README.md index 42cbc0c..c88d949 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,7 @@ When experimenting with kinds, keep in mind the classification introduced by [NI | ---------- | ----------------------- | ----------------- | ------------------------ | | e | event id (hex) | relay URL, marker | [1](01.md), [10](10.md) | | p | pubkey (hex) | relay URL | [1](01.md) | +| a | coordinates to an event | relay URL | [33](33.md), [23](23.md) | | r | a reference (URL, etc) | | [12](12.md) | | t | hashtag | | [12](12.md) | | g | geohash | | [12](12.md) | -- cgit v1.2.3 From b00888cec79b495f8c01d5abdbf2e1ed373896ab Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Mon, 13 Feb 2023 09:00:09 -0300 Subject: add nip23 to list. --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index c88d949..7bef8f3 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-07: `window.nostr` capability for web browsers](07.md) - [NIP-08: Handling Mentions](08.md) - [NIP-09: Event Deletion](09.md) -- [NIP-10: Conventions for clients' use of `e` and `p` tags in text events.](10.md) +- [NIP-10: Conventions for clients' use of `e` and `p` tags in text events](10.md) - [NIP-11: Relay Information Document](11.md) - [NIP-12: Generic Tag Queries](12.md) - [NIP-13: Proof of Work](13.md) @@ -21,7 +21,8 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-19: bech32-encoded entities](19.md) - [NIP-20: Command Results](20.md) - [NIP-21: `nostr:` URL scheme](21.md) -- [NIP-22: Event created_at Limits](22.md) +- [NIP-22: Event `created_at` Limits](22.md) +- [NIP-23: Long-form Content](23.md) - [NIP-25: Reactions](25.md) - [NIP-26: Delegated Event Signing](26.md) - [NIP-28: Public Chat](28.md) -- cgit v1.2.3 From c80cb09e8097c78640756f72d6ba79286a193dee Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Mon, 13 Feb 2023 14:06:21 -0300 Subject: simplify description. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index 7bef8f3..8f31656 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # NIPs -NIPs stand for **Nostr Implementation Possibilities**. They exist to document what MUST, what SHOULD and what MAY be implemented by [Nostr](https://github.com/fiatjaf/nostr)-compatible _relay_ and _client_ software. +NIPs stand for **Nostr Implementation Possibilities**. They exist to document what may be implemented by [Nostr](https://github.com/fiatjaf/nostr)-compatible _relay_ and _client_ software. - [NIP-01: Basic protocol flow description](01.md) - [NIP-02: Contact List and Petnames](02.md) -- cgit v1.2.3 From 04e7f0cef80802ab7cd1fac7604170dec309ee8c Mon Sep 17 00:00:00 2001 From: Chemaclass Date: Tue, 14 Feb 2023 14:27:06 +0100 Subject: Fix readme sorting NIP-56/57 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index 8f31656..e45c531 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-40: Expiration Timestamp](40.md) - [NIP-42: Authentication of clients to relays](42.md) - [NIP-50: Keywords filter](50.md) -- [NIP-57: Lightning Zaps](57.md) - [NIP-56: Reporting](56.md) +- [NIP-57: Lightning Zaps](57.md) - [NIP-65: Relay List Metadata](65.md) ## Event Kinds -- cgit v1.2.3 From b1a5ad355a8b376170471a41817d8722ba7443b1 Mon Sep 17 00:00:00 2001 From: Marco Argentieri <3596602+tiero@users.noreply.github.com> Date: Mon, 20 Feb 2023 20:26:13 +0100 Subject: NIP-46: Nostr Connect 🔌 connect your Nostr app with remote signing devices (#153) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 46.md | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 + 2 files changed, 164 insertions(+) create mode 100644 46.md (limited to 'README.md') diff --git a/46.md b/46.md new file mode 100644 index 0000000..a9f37c1 --- /dev/null +++ b/46.md @@ -0,0 +1,162 @@ +NIP-46 +====== + +Nostr Connect +------------------------ + +`draft` `optional` `author:tiero` `author:giowe` `author:vforvalerio87` + +## Rationale + +Private keys should be exposed to as few systems - apps, operating systems, devices - as possible as each system adds to the attack surface. + +Entering private keys can also be annoying and requires exposing them to even more systems such as the operating system's clipboard that might be monitored by malicious apps. + + +## Terms + +* **App**: Nostr app on any platform that *requires* to act on behalf of a nostr account. +* **Signer**: Nostr app that holds the private key of a nostr account and *can sign* on its behalf. + + +## `TL;DR` + + +**App** and **Signer** sends ephemeral encrypted messages to each other using kind `24133`, using a relay of choice. + +App prompts the Signer to do things such as fetching the public key or signing events. + +The `content` field must be an encrypted JSONRPC-ish **request** or **response**. + +## Signer Protocol + +### Messages + +#### Request + +```json +{ + "id": , + "method": , + "params": [, ] +} +``` + +#### Response + +```json +{ + "id": , + "result": , + "error": +} +``` + +### Methods + + +#### Mandatory + +These are mandatory methods the remote signer app MUST implement: + +- **describe** + - params [] + - result `{"get_public_key": { params: [], result: anything }}` +- **get_public_key** + - params [] + - result `pubkey` +- **sign_event** + - params [`event`] + - result `signature` + +#### optional + + +- **connect** + - params [`pubkey`] +- **disconnect** + - params [] +- **delegate** + - params [`pubkey`, `conditions query string`] + - result `nip26 delegation token` +- **get_relays** + - params [] + - result `{ [url: string]: {read: boolean, write: boolean} }` +- **nip04_encrypt** + - params [`pubkey`, `plaintext`] + - result `nip4 ciphertext` +- **nip04_decrypt** + - params [`pubkey`, `nip4 ciphertext`] + - result [`plaintext`] + + +NOTICE: `pubkey` and `signature` are hex-encoded strings. + + +### Nostr Connect URI + +**Signer** discovers **App** by scanning a QR code, clicking on a deep link or copy-pasting an URI. + +The **App** generates a special URI with prefix `nostrconnect://` and base path the hex-encoded `pubkey` with the following querystring parameters **URL encoded** + +- `relay` URL of the relay of choice where the **App** is connected and the **Signer** must send and listen for messages. +- `metadata` metadata JSON of the **App** + - `name` human-readable name of the **App** + - `url` (optional) URL of the website requesting the connection + - `description` (optional) description of the **App** + - `icons` (optional) array of URLs for icons of the **App**. + +#### JavaScript + +```js +const uri = `nostrconnect://?relay=${encodeURIComponent("wss://relay.damus.io")}&metadata=${encodeURIComponent(JSON.stringify({"name": "Example"}))}` +``` + +#### Example +```sh +nostrconnect://b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558e9d4?relay=wss%3A%2F%2Frelay.damus.io&metadata=%7B%22name%22%3A%22Example%22%7D +``` + + + +## Flows + +The `content` field contains encrypted message as specified by [NIP04](https://github.com/nostr-protocol/nips/blob/master/04.md). The `kind` chosen is `24133`. + +### Connect + +1. User clicks on **"Connect"** button on a website or scan it with a QR code +2. It will show an URI to open a "nostr connect" enabled **Signer** +3. In the URI there is a pubkey of the **App** ie. `nostrconnect://&relay=&metadata=` +4. The **Signer** will send a message to ACK the `connect` request, along with his public key + +### Disconnect (from App) + +1. User clicks on **"Disconnect"** button on the **App** +2. The **App** will send a message to the **Signer** with a `disconnect` request +3. The **Signer** will send a message to ACK the `disconnect` request + +### Disconnect (from Signer) + +1. User clicks on **"Disconnect"** button on the **Signer** +2. The **Signer** will send a message to the **App** with a `disconnect` request + + +### Get Public Key + +1. The **App** will send a message to the **Signer** with a `get_public_key` request +3. The **Signer** will send back a message with the public key as a response to the `get_public_key` request + +### Sign Event + +1. The **App** will send a message to the **Signer** with a `sign_event` request along with the **event** to be signed +2. The **Signer** will show a popup to the user to inspect the event and sign it +3. The **Signer** will send back a message with the schnorr `signature` of the event as a response to the `sign_event` request + +### Delegate + +1. The **App** will send a message with metadata to the **Signer** with a `delegate` request along with the **conditions** query string and the **pubkey** of the **App** to be delegated. +2. The **Signer** will show a popup to the user to delegate the **App** to sign on his behalf +3. The **Signer** will send back a message with the signed [NIP-26 delegation token](https://github.com/nostr-protocol/nips/blob/master/26.md) or reject it + + diff --git a/README.md b/README.md index e45c531..25e5861 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-36: Sensitive Content](36.md) - [NIP-40: Expiration Timestamp](40.md) - [NIP-42: Authentication of clients to relays](42.md) +- [NIP-46: Nostr Connect](46.md) - [NIP-50: Keywords filter](50.md) - [NIP-56: Reporting](56.md) - [NIP-57: Lightning Zaps](57.md) @@ -56,6 +57,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 9735 | Zap | [57](57.md) | | 10002 | Relay List Metadata | [65](65.md) | | 22242 | Client Authentication | [42](42.md) | +| 24133 | Nostr Connect | [46](46.md) | | 30023 | Long-form Content | [23](23.md) | | 1000-9999 | Regular Events | [16](16.md) | | 10000-19999 | Replaceable Events | [16](16.md) | -- cgit v1.2.3 From 405cf480e9f6d419eb5b3516b7acdd1fc5759248 Mon Sep 17 00:00:00 2001 From: Ricardo Arturo Cabral Mejía Date: Wed, 22 Feb 2023 20:11:55 -0500 Subject: docs: add nip-58 badge event and profile badges (#229) --- 58.md | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 7 ++-- 2 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 58.md (limited to 'README.md') diff --git a/58.md b/58.md new file mode 100644 index 0000000..2fa4406 --- /dev/null +++ b/58.md @@ -0,0 +1,132 @@ +NIP-58 +====== + +Badges +------ + +`draft` `optional` `author:cameri` + +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. + +2. A "Badge Award" event is a kind `8` event with a single `a` tag referencing +a "Define Badge" event and one or more `p` tags, one for each pubkey the +badge issuer wishes to award. The value for the `a` tag MUST follow the format +defined in [NIP-33](33.md). Awarded badges are immutable and non-transferrable. + +3. A "Profile Badges" event is defined as a parameterized replaceable event +with kind `30008` with a `d` tag with the value `profile_badges`. +Profile badges contain an ordered list of pairs of `a` and `e` tags referencing a `Badge Definition` and a `Badge Award` for each badge to be displayed. + +### Badge Definition event + +The following tags MUST be present: + +- `d` tag with the unique name of the badge. + +The following tags MAY be present: + +- A `name` tag with a short name for the badge. +- `image` tag whose value is the URL of a high-resolution image representing the badge. The second value optionally specifies the dimensions of the image as `width`x`height` in pixels. Badge recommended dimensions is 1024x1024 pixels. +- A `description` tag whose value MAY contain a textual representation of the +image, the meaning behind the badge, or the reason of it's issuance. +- One or more `thumb` tags whose first value is an URL pointing to a thumbnail version of the image referenced in the `image` tag. The second value optionally specifies the dimensions of the thumbnail as `width`x`height` in pixels. + +### Badge Award event + +The following tags MUST be present: + +- An `a` tag referencing a kind `30009` Badge Definition event. +- One or more `p` tags referencing each pubkey awarded. + +### Profile Badges Event + +The number of badges a pubkey can be awarded is unbounded. The Profile Badge +event allows individual users to accept or reject awarded badges, as well +as choose the display order of badges on their profiles. + +The following tags MUST be present: + +- A `d` tag with the unique identifier `profile_badges` + +The following tags MAY be present: + +- Zero or more ordered consecutive pairs of `a` and `e` tags referencing a kind `30009` Badge Definition and kind `8` Badge Award, respectively. Clients SHOULD +ignore `a` without corresponding `e` tag and viceversa. Badge Awards referenced +by the `e` tags should contain the same `a` tag. + +### Motivation + +Users MAY be awarded badges (but not limited to) in recognition, in gratitude, for participation, or in appreciation of a certain goal, task or cause. + +Users MAY choose to decorate their profiles with badges for fame, notoriety, recognition, support, etc., from badge issuers they deem reputable. + +### Recommendations + +Badge issuers MAY include some Proof of Work as per [NIP-13](13.md) when minting Badge Definitions or Badge Awards to embed them with a combined energy cost, arguably making them more special and valuable for users that wish to collect them. + +Clients MAY whitelist badge issuers (pubkeys) for the purpose of ensuring they retain a valuable/special factor for their users. + +Badge image recommended aspect ratio is 1:1 with a high-res size of 1024x1024 pixels. + +Badge thumbnail image recommended dimensions are: 512x512 (xl), 256x256 (l), 64x64 (m), 32x32 (s) and 16x16 (xs). + +Clients MAY choose to render less badges than those specified by users in the Profile Badges event or replace the badge image and thumbnails with ones that fits the theme of the client. + +Clients SHOULD attempt to render the most appropriate badge thumbnail according to the number of badges chosen by the user and space available. Clients SHOULD attempt render the high-res version on user action (click, tap, hover). + +### Example of a Badge Definition event + +```json +{ + "pubkey": "alice", + "kind": 30009, + "tags": [ + ["d", "bravery"], + ["name", "Medal of Bravery"], + ["description", "Awarded to users demonstrating bravery"], + ["image", "https://nostr.academy/awards/bravery.png", "1024x1024"], + ["thumb", "https://nostr.academy/awards/bravery_256x256.png", "256x256"], + ], + ... +} +``` + +### Example of Badge Award event + +```json +{ + "id": "", + "kind": 8, + "pubkey": "alice", + "tags": [ + ["a", "30009:alice:bravery"], + ["p", "bob", "wss://relay"], + ["p", "charlie", "wss://relay"], + ], + ... +} +``` + +### Example of a Profile Badges event + +Honorable Bob The Brave: +```json +{ + "kind": 30008, + "pubkey": "bob", + "tags": [ + ["d", "profile_badges"], + ["a", "30009:alice:bravery"], + ["e", "", "wss://nostr.academy"], + ["a", "30009:alice:honor"], + ["e", "", "wss://nostr.academy"], + ], + ... +} +``` diff --git a/README.md b/README.md index 25e5861..24106e1 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-36: Sensitive Content](36.md) - [NIP-40: Expiration Timestamp](40.md) - [NIP-42: Authentication of clients to relays](42.md) -- [NIP-46: Nostr Connect](46.md) +- [NIP-46: Nostr Connect](46.md) - [NIP-50: Keywords filter](50.md) - [NIP-56: Reporting](56.md) - [NIP-57: Lightning Zaps](57.md) @@ -46,6 +46,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 4 | Encrypted Direct Messages | [4](04.md) | | 5 | Event Deletion | [9](09.md) | | 7 | Reaction | [25](25.md) | +| 8 | Badge Award | [58](58.md) | | 40 | Channel Creation | [28](28.md) | | 41 | Channel Metadata | [28](28.md) | | 42 | Channel Message | [28](28.md) | @@ -63,8 +64,8 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 10000-19999 | Replaceable Events | [16](16.md) | | 20000-29999 | Ephemeral Events | [16](16.md) | | 30000-39999 | Parameterized Replaceable Events | [33](33.md) | - - +| 30008 | Profile Badges | [58](58.md) | +| 30009 | Badge Definition | [58](58.md) | ## Message types -- cgit v1.2.3 From 2bf08b34874bc040cc257b46806cc682b56e6b50 Mon Sep 17 00:00:00 2001 From: Ricardo Arturo Cabral Mejía Date: Sat, 25 Feb 2023 10:17:33 -0500 Subject: docs: add nip-58 to readme --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index 24106e1..77f97c0 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-50: Keywords filter](50.md) - [NIP-56: Reporting](56.md) - [NIP-57: Lightning Zaps](57.md) +- [NIP-58: Badges](58.md) - [NIP-65: Relay List Metadata](65.md) ## Event Kinds -- cgit v1.2.3 From b549a9809f94ca703b3b63b73cdacc5407a2edd0 Mon Sep 17 00:00:00 2001 From: Sepehr Safari Date: Mon, 27 Feb 2023 23:51:22 +0330 Subject: Update README.md fixed a tiny tipo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index 77f97c0..8ee8b85 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | EVENT | used to send events requested to clients | [1](01.md) | | NOTICE | used to send human-readable messages to clients | [1](01.md) | | EOSE | used to notify clients all stored events have been sent | [15](15.md) | -| OK | used to notify clients if an EVENT was successuful | [20](20.md) | +| OK | used to notify clients if an EVENT was successful | [20](20.md) | | AUTH | used to send authentication challenges | [42](42.md) | Please update these lists when proposing NIPs introducing new event kinds. -- cgit v1.2.3 From c4949ea7078ec96a373f77f725267b36316ee9e4 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Thu, 23 Feb 2023 18:25:55 -0300 Subject: NIP-78: app-specific data. --- 78.md | 21 +++++++++++++++++++++ README.md | 6 ++++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 78.md (limited to 'README.md') diff --git a/78.md b/78.md new file mode 100644 index 0000000..175f66b --- /dev/null +++ b/78.md @@ -0,0 +1,21 @@ +NIP-78 +====== + +Arbitrary custom app data +------------------------- + +`draft` `optional` `author:sandwich` `author:fiatjaf` + +The goal of this NIP is to enable [remoteStorage](https://remotestorage.io/)-like capabilities for custom applications that do not care about interoperability. + +Even though interoperability is great, some apps do not want or do not need interoperability, and it that wouldn't make sense for them. Yet Nostr can still serve as a generalized data storage for these apps in a "bring your own database" way, for example: a user would open an app and somehow input their preferred relay for storage, which would then enable these apps to store application-specific data there. + +## 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. + +## Some use cases + + - User personal settings on Nostr clients (and other apps unrelated to Nostr) + - A way for client developers to propagate dynamic parameters to users without these having to update + - Personal private data generated by apps that have nothing to do with Nostr, but allow users to use Nostr relays as their personal database diff --git a/README.md b/README.md index 8ee8b85..91ad0e8 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-57: Lightning Zaps](57.md) - [NIP-58: Badges](58.md) - [NIP-65: Relay List Metadata](65.md) +- [NIP-78: Application-specific data](78.md) ## Event Kinds | kind | description | NIP | @@ -60,13 +61,14 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 10002 | Relay List Metadata | [65](65.md) | | 22242 | Client Authentication | [42](42.md) | | 24133 | Nostr Connect | [46](46.md) | +| 30008 | Profile Badges | [58](58.md) | +| 30009 | Badge Definition | [58](58.md) | | 30023 | Long-form Content | [23](23.md) | +| 30078 | Application-specific Data | [78](78.md) | | 1000-9999 | Regular Events | [16](16.md) | | 10000-19999 | Replaceable Events | [16](16.md) | | 20000-29999 | Ephemeral Events | [16](16.md) | | 30000-39999 | Parameterized Replaceable Events | [33](33.md) | -| 30008 | Profile Badges | [58](58.md) | -| 30009 | Badge Definition | [58](58.md) | ## Message types -- cgit v1.2.3 From 6eb18389212430f91f293f7a57895b05b9e37e13 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Tue, 7 Mar 2023 07:28:53 -0300 Subject: remove reserved range from NIP-28. --- 28.md | 8 +------- README.md | 59 +++++++++++++++++++++++++++++------------------------------ 2 files changed, 30 insertions(+), 37 deletions(-) (limited to 'README.md') diff --git a/28.md b/28.md index 0862e72..d72e7ab 100644 --- a/28.md +++ b/28.md @@ -9,7 +9,7 @@ Public Chat This NIP defines new event kinds for public chat channels, channel messages, and basic client-side moderation. -It reserves five event kinds (40-44) for immediate use and five event kinds (45-49) for future use. +It reserves five event kinds (40-44) for immediate use: - `40 - channel create` - `41 - channel metadata` @@ -138,12 +138,6 @@ For [NIP-10](10.md) relay recommendations, clients generally SHOULD use the rela Clients MAY recommend any relay URL. For example, if a relay hosting the original kind 40 event for a channel goes offline, clients could instead fetch channel data from a backup relay, or a relay that clients trust more than the original relay. -Future extensibility --------------------- - -We reserve event kinds 45-49 for other events related to chat, to potentially include new types of media (photo/video), moderation, or support of private or group messaging. - - Motivation ---------- If we're solving censorship-resistant communication for social media, we may as well solve it also for Telegram-style messaging. diff --git a/README.md b/README.md index 91ad0e8..42674cc 100644 --- a/README.md +++ b/README.md @@ -39,36 +39,35 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-78: Application-specific data](78.md) ## Event Kinds -| kind | description | NIP | -| ------------- | -------------------------------- | ----------------------- | -| 0 | Metadata | [1](01.md), [5](05.md) | -| 1 | Short Text Note | [1](01.md) | -| 2 | Recommend Relay | [1](01.md) | -| 3 | Contacts | [2](02.md) | -| 4 | Encrypted Direct Messages | [4](04.md) | -| 5 | Event Deletion | [9](09.md) | -| 7 | Reaction | [25](25.md) | -| 8 | Badge Award | [58](58.md) | -| 40 | Channel Creation | [28](28.md) | -| 41 | Channel Metadata | [28](28.md) | -| 42 | Channel Message | [28](28.md) | -| 43 | Channel Hide Message | [28](28.md) | -| 44 | Channel Mute User | [28](28.md) | -| 45-49 | Public Chat Reserved | [28](28.md) | -| 1984 | Reporting | [56](56.md) | -| 9734 | Zap Request | [57](57.md) | -| 9735 | Zap | [57](57.md) | -| 10002 | Relay List Metadata | [65](65.md) | -| 22242 | Client Authentication | [42](42.md) | -| 24133 | Nostr Connect | [46](46.md) | -| 30008 | Profile Badges | [58](58.md) | -| 30009 | Badge Definition | [58](58.md) | -| 30023 | Long-form Content | [23](23.md) | -| 30078 | Application-specific Data | [78](78.md) | -| 1000-9999 | Regular Events | [16](16.md) | -| 10000-19999 | Replaceable Events | [16](16.md) | -| 20000-29999 | Ephemeral Events | [16](16.md) | -| 30000-39999 | Parameterized Replaceable Events | [33](33.md) | +| kind | description | NIP | +| ------------- | -------------------------------- | ----------- | +| 0 | Metadata | [1](01.md) | +| 1 | Short Text Note | [1](01.md) | +| 2 | Recommend Relay | [1](01.md) | +| 3 | Contacts | [2](02.md) | +| 4 | Encrypted Direct Messages | [4](04.md) | +| 5 | Event Deletion | [9](09.md) | +| 7 | Reaction | [25](25.md) | +| 8 | Badge Award | [58](58.md) | +| 40 | Channel Creation | [28](28.md) | +| 41 | Channel Metadata | [28](28.md) | +| 42 | Channel Message | [28](28.md) | +| 43 | Channel Hide Message | [28](28.md) | +| 44 | Channel Mute User | [28](28.md) | +| 1984 | Reporting | [56](56.md) | +| 9734 | Zap Request | [57](57.md) | +| 9735 | Zap | [57](57.md) | +| 10002 | Relay List Metadata | [65](65.md) | +| 22242 | Client Authentication | [42](42.md) | +| 24133 | Nostr Connect | [46](46.md) | +| 30008 | Profile Badges | [58](58.md) | +| 30009 | Badge Definition | [58](58.md) | +| 30023 | Long-form Content | [23](23.md) | +| 30078 | Application-specific Data | [78](78.md) | +| 1000-9999 | Regular Events | [16](16.md) | +| 10000-19999 | Replaceable Events | [16](16.md) | +| 20000-29999 | Ephemeral Events | [16](16.md) | +| 30000-39999 | Parameterized Replaceable Events | [33](33.md) | ## Message types -- cgit v1.2.3 From 30daaedbdb48c7583843a12d3496ced311b9986a Mon Sep 17 00:00:00 2001 From: monlovesmango <96307647+monlovesmango@users.noreply.github.com> Date: Thu, 9 Mar 2023 11:16:57 -0600 Subject: NIP-51 Lists (#183) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Semisol <45574030+Semisol@users.noreply.github.com> Co-authored-by: Ricardo Arturo Cabral Mejía Co-authored-by: fiatjaf_ --- 51.md | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 51a.md | 9 ++++++ 51b.md | 9 ++++++ 51c.md | 9 ++++++ 51d.md | 9 ++++++ README.md | 6 ++++ 6 files changed, 139 insertions(+) create mode 100644 51.md create mode 100644 51a.md create mode 100644 51b.md create mode 100644 51c.md create mode 100644 51d.md (limited to 'README.md') diff --git a/51.md b/51.md new file mode 100644 index 0000000..bbb3987 --- /dev/null +++ b/51.md @@ -0,0 +1,97 @@ +NIP-51 +====== + +Lists +------------------------- + +`draft` `optional` `author:fiatjaf` `author:arcbtc` `author:monlovesmango` `author:eskema` `depends:33` + +A "list" event is defined as having a list of public and/or private tags. Public tags will be listed in the event `tags`. Private tags will be encrypted in the event `content`. Encryption for private tags will use [NIP-04 - Encrypted Direct Message](04.md) encryption, using the list author's private and public key for the shared secret. A distinct event kind should be used for each list type created. + +If a list type should only be defined once per user (like the 'Mute' list), the list type's events should follow the specification for [NIP-16 - Replaceable Events](16.md). These lists may be referred to as 'replaceable lists'. + +Otherwise the list type's events should follow the specification for [NIP-33 - Parameterized Replaceable Events](33.md), where the list name will be used as the 'd' parameter. These lists may be referred to as 'parameterized replaceable lists'. + +## List Event Kinds + +| kind | list type | NIP | +|------|-----------------------------|---------------| +| 10000| Mute | [51a](51a.md) | +| 10001| Pin | [51b](51b.md) | +| 30000| Categorized People | [51c](51c.md) | +| 30001| Categorized Bookmarks | [51d](51d.md) | +## Replaceable List Event Example + +Lets say a user wants to create a 'Mute' list and has keys: +``` +priv: fb505c65d4df950f5d28c9e4d285ee12ffaf315deef1fc24e3c7cd1e7e35f2b1 +pub: b1a5c93edcc8d586566fde53a20bdb50049a97b15483cb763854e57016e0fa3d +``` +The user wants to publicly include these users: + +```json +["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"], +["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"] +``` +and privately include these users (below is the JSON that would be encrypted and placed in the event content): + +```json +[ + ["p", "9ec7a778167afb1d30c4833de9322da0c08ba71a69e1911d5578d3144bb56437"], + ["p", "8c0da4862130283ff9e67d889df264177a508974e2feb96de139804ea66d6168"] +] +``` + +Then the user would create a 'Mute' list event like below: + +```json +{ + "kind": 10000, + "tags": [ + ["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"], + ["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"], + ], + "content": "VezuSvWak++ASjFMRqBPWS3mK5pZ0vRLL325iuIL4S+r8n9z+DuMau5vMElz1tGC/UqCDmbzE2kwplafaFo/FnIZMdEj4pdxgptyBV1ifZpH3TEF6OMjEtqbYRRqnxgIXsuOSXaerWgpi0pm+raHQPseoELQI/SZ1cvtFqEUCXdXpa5AYaSd+quEuthAEw7V1jP+5TDRCEC8jiLosBVhCtaPpLcrm8HydMYJ2XB6Ixs=?iv=/rtV49RFm0XyFEwG62Eo9A==", + ...other fields +} +``` + + +## Parameterized Replaceable List Event Example + +Lets say a user wants to create a 'Categorized People' list of `nostr` people and has keys: +``` +priv: fb505c65d4df950f5d28c9e4d285ee12ffaf315deef1fc24e3c7cd1e7e35f2b1 +pub: b1a5c93edcc8d586566fde53a20bdb50049a97b15483cb763854e57016e0fa3d +``` +The user wants to publicly include these users: + +```json +["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"], +["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"] +``` +and privately include these users (below is the JSON that would be encrypted and placed in the event content): + +```json +[ + ["p", "9ec7a778167afb1d30c4833de9322da0c08ba71a69e1911d5578d3144bb56437"], + ["p", "8c0da4862130283ff9e67d889df264177a508974e2feb96de139804ea66d6168"] +] +``` + +Then the user would create a 'Categorized People' list event like below: + +```json +{ + "kind": 30000, + "tags": [ + ["d", "nostr"], + ["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"], + ["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"], + ], + "content": "VezuSvWak++ASjFMRqBPWS3mK5pZ0vRLL325iuIL4S+r8n9z+DuMau5vMElz1tGC/UqCDmbzE2kwplafaFo/FnIZMdEj4pdxgptyBV1ifZpH3TEF6OMjEtqbYRRqnxgIXsuOSXaerWgpi0pm+raHQPseoELQI/SZ1cvtFqEUCXdXpa5AYaSd+quEuthAEw7V1jP+5TDRCEC8jiLosBVhCtaPpLcrm8HydMYJ2XB6Ixs=?iv=/rtV49RFm0XyFEwG62Eo9A==", + ...other fields +} +``` + + diff --git a/51a.md b/51a.md new file mode 100644 index 0000000..ef9d5de --- /dev/null +++ b/51a.md @@ -0,0 +1,9 @@ +NIP-51a +====== + +Mute List +------------------------- + +`draft` `optional` `author:fiatjaf` `author:arcbtc` `author:monlovesmango` `author:eskema` + +An event with kind `10000` is defined as a replaceable list event (see [NIP-51 - Lists](51.md) for listing content a user wants to mute. Any standarized tag can be included in a Mute List. \ No newline at end of file diff --git a/51b.md b/51b.md new file mode 100644 index 0000000..522403d --- /dev/null +++ b/51b.md @@ -0,0 +1,9 @@ +NIP-51b +====== + +Pin List +------------------------- + +`draft` `optional` `author:fiatjaf` `author:arcbtc` `author:monlovesmango` `author:eskema` + +An event with kind `10001` is defined as a replaceable list event (see [NIP-51 - Lists](51.md) for listing content a user wants to pin. Any standarized tag can be included in a Pin List. \ No newline at end of file diff --git a/51c.md b/51c.md new file mode 100644 index 0000000..772a7f9 --- /dev/null +++ b/51c.md @@ -0,0 +1,9 @@ +NIP-51c +====== + +Categorized People List +------------------------- + +`draft` `optional` `author:fiatjaf` `author:arcbtc` `author:monlovesmango` `author:eskema` + +An event with kind `30000` is defined as a parameterized replaceable list event (see [NIP-51 - Lists](51.md)) for categorizing people. The 'd' parameter for this event holds the category name of the list. The tags included in these lists MUST follow the format of kind 3 events as defined in [NIP-02 - Contact List and Petnames](02.md). \ No newline at end of file diff --git a/51d.md b/51d.md new file mode 100644 index 0000000..0891f60 --- /dev/null +++ b/51d.md @@ -0,0 +1,9 @@ +NIP-51c +====== + +Categorized Bookmarks List +------------------------- + +`draft` `optional` `author:fiatjaf` `author:arcbtc` `author:monlovesmango` `author:eskema` + +An event with kind `30001` is defined as a parameterized replaceable list event (see [NIP-51 - Lists](51.md)) for categorizing bookmarks. The 'd' parameter for this event holds the category name of the list. Any standarized tag can be included in a Categorized Bookmarks List. \ No newline at end of file diff --git a/README.md b/README.md index 42674cc..544a6b2 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-42: Authentication of clients to relays](42.md) - [NIP-46: Nostr Connect](46.md) - [NIP-50: Keywords filter](50.md) +- [NIP-51: Lists](51.md) - [NIP-56: Reporting](56.md) - [NIP-57: Lightning Zaps](57.md) - [NIP-58: Badges](58.md) @@ -39,6 +40,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-78: Application-specific data](78.md) ## Event Kinds + | kind | description | NIP | | ------------- | -------------------------------- | ----------- | | 0 | Metadata | [1](01.md) | @@ -57,9 +59,13 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 1984 | Reporting | [56](56.md) | | 9734 | Zap Request | [57](57.md) | | 9735 | Zap | [57](57.md) | +| 10000 | Mute List | [51](51.md) | +| 10001 | Pin List | [51](51.md) | | 10002 | Relay List Metadata | [65](65.md) | | 22242 | Client Authentication | [42](42.md) | | 24133 | Nostr Connect | [46](46.md) | +| 30000 | Categorized People List | [51](51.md) | +| 30001 | Categorized Bookmark List | [51](51.md) | | 30008 | Profile Badges | [58](58.md) | | 30009 | Badge Definition | [58](58.md) | | 30023 | Long-form Content | [23](23.md) | -- cgit v1.2.3 From a9139ee9a4e7f4859ab9ed1681cc70b9da58508a Mon Sep 17 00:00:00 2001 From: Seth For Privacy Date: Fri, 10 Mar 2023 11:43:39 -0500 Subject: Add NIP-39 to readme --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index 544a6b2..37b2fe4 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-28: Public Chat](28.md) - [NIP-33: Parameterized Replaceable Events](33.md) - [NIP-36: Sensitive Content](36.md) +- [NIP-39: External Identities in Profiles](39.md) - [NIP-40: Expiration Timestamp](40.md) - [NIP-42: Authentication of clients to relays](42.md) - [NIP-46: Nostr Connect](46.md) -- cgit v1.2.3 From 8b158e92279c08af812307ed7294378ddb8abbdd Mon Sep 17 00:00:00 2001 From: arthurfranca Date: Tue, 21 Mar 2023 15:24:05 -0300 Subject: Add alternative mention handling NIP --- 08.md | 2 ++ 27.md | 17 +++++++++++++++++ README.md | 3 ++- 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 27.md (limited to 'README.md') diff --git a/08.md b/08.md index 113cb53..d82787d 100644 --- a/08.md +++ b/08.md @@ -1,3 +1,5 @@ +> __Warning__ `unrecommended`: discouraged in favor of NIP-27 + NIP-08 ====== diff --git a/27.md b/27.md new file mode 100644 index 0000000..b2d1e5a --- /dev/null +++ b/27.md @@ -0,0 +1,17 @@ +NIP-27 +====== + +Handling Mentions +----------------- + +`draft` `optional` `author:fiatjaf` `author:scsibug` `author:arthurfranca` + +This document standardizes the treatment given by clients of inline mentions of other events and pubkeys inside the content of `text_note`s. + +Clients that want to allow inline mentions they MUST show an autocomplete component or something analogous to that whenever the user starts typing a special key (for example, "@") or presses some button to include a mention etc -- or these clients can come up with other ways to unambiguously differentiate between mentions and normal text. + +Once a mention is identified, for example, the pubkey `27866e9d854c78ae625b867eefdfa9580434bc3e675be08d2acb526610d96fbe`, the client MUST replace its textual reference (inside `.content`) with the notation `nostr:nprofile1qqsw3dy8cpu...6x2argwghx6egsqstvg` as per NIP-21. If client doesn't support NIP-21, it can instead use a regular http link to a nostr client such as `https://snort.social/p/nprofile1qqsw3dy8cpu...6x2argwghx6egsqstvg`. The client MAY add that pubkey to the `.tags` with the tag `p` if it wishes to notify mentioned user. + +The same process applies for mentioning event IDs, except that the client SHOULD NOT add the event id to the `.tags` with the tag `e` so to not negatively impact thread loading. + +A client that receives a `text_note` event with such `nostr:...` mentions in its `.content` CAN do any desired context augmentation (for example, linking to the pubkey or showing a preview of the mentioned event contents) it wants in the process. diff --git a/README.md b/README.md index 37b2fe4..d93f5c2 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-05: Mapping Nostr keys to DNS-based internet identifiers](05.md) - [NIP-06: Basic key derivation from mnemonic seed phrase](06.md) - [NIP-07: `window.nostr` capability for web browsers](07.md) -- [NIP-08: Handling Mentions](08.md) +- [NIP-08: Handling Mentions](08.md) – `unrecommended`: discouraged in favor of [NIP-27](27.md) - [NIP-09: Event Deletion](09.md) - [NIP-10: Conventions for clients' use of `e` and `p` tags in text events](10.md) - [NIP-11: Relay Information Document](11.md) @@ -25,6 +25,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-23: Long-form Content](23.md) - [NIP-25: Reactions](25.md) - [NIP-26: Delegated Event Signing](26.md) +- [NIP-27: Handling Mentions](27.md) - [NIP-28: Public Chat](28.md) - [NIP-33: Parameterized Replaceable Events](33.md) - [NIP-36: Sensitive Content](36.md) -- cgit v1.2.3 From a32ec25ecb5cb13754e435db01ef6bf2a749769c Mon Sep 17 00:00:00 2001 From: arthurfranca Date: Wed, 22 Mar 2023 10:13:04 -0300 Subject: Make it clear why e tags are discouraged --- 27.md | 11 ++++++----- README.md | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'README.md') diff --git a/27.md b/27.md index b2d1e5a..237feaa 100644 --- a/27.md +++ b/27.md @@ -1,17 +1,18 @@ NIP-27 ====== -Handling Mentions ------------------ +Text Note References +-------------------- `draft` `optional` `author:fiatjaf` `author:scsibug` `author:arthurfranca` -This document standardizes the treatment given by clients of inline mentions of other events and pubkeys inside the content of `text_note`s. +This document standardizes the treatment given by clients of inline references of other events and pubkeys inside the content of `text notes` (currently kinds 1 and 30023). -Clients that want to allow inline mentions they MUST show an autocomplete component or something analogous to that whenever the user starts typing a special key (for example, "@") or presses some button to include a mention etc -- or these clients can come up with other ways to unambiguously differentiate between mentions and normal text. +Clients that want to allow inline mentions of profiles MUST show an autocomplete component or something analogous to that whenever the user starts typing a special key (for example, "@") or presses some button to include a mention etc -- or these clients can come up with other ways to unambiguously differentiate between mentions and normal text. Once a mention is identified, for example, the pubkey `27866e9d854c78ae625b867eefdfa9580434bc3e675be08d2acb526610d96fbe`, the client MUST replace its textual reference (inside `.content`) with the notation `nostr:nprofile1qqsw3dy8cpu...6x2argwghx6egsqstvg` as per NIP-21. If client doesn't support NIP-21, it can instead use a regular http link to a nostr client such as `https://snort.social/p/nprofile1qqsw3dy8cpu...6x2argwghx6egsqstvg`. The client MAY add that pubkey to the `.tags` with the tag `p` if it wishes to notify mentioned user. -The same process applies for mentioning event IDs, except that the client SHOULD NOT add the event id to the `.tags` with the tag `e` so to not negatively impact thread loading. +The same process applies for referencing event IDs, except that the client SHOULD NOT add the event id to the `.tags` with the tag `e` so to not negatively impact thread loading. +Because `e` tags on `text notes` are usually considered ancestor events used to build a conversarion thread (as per NIP-10), it is advised to use inline references when mentioning events and NOT adding corresponding `e` tag to the `.tags` event key. A client that receives a `text_note` event with such `nostr:...` mentions in its `.content` CAN do any desired context augmentation (for example, linking to the pubkey or showing a preview of the mentioned event contents) it wants in the process. diff --git a/README.md b/README.md index d93f5c2..6642e92 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-23: Long-form Content](23.md) - [NIP-25: Reactions](25.md) - [NIP-26: Delegated Event Signing](26.md) -- [NIP-27: Handling Mentions](27.md) +- [NIP-27: Text Note References](27.md) - [NIP-28: Public Chat](28.md) - [NIP-33: Parameterized Replaceable Events](33.md) - [NIP-36: Sensitive Content](36.md) -- cgit v1.2.3 From 9764a3b510c11719c76ec86240c67049981b8b45 Mon Sep 17 00:00:00 2001 From: arthurfranca Date: Wed, 22 Mar 2023 19:50:03 -0300 Subject: Replace discouraged with deprecated --- 08.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'README.md') diff --git a/08.md b/08.md index d82787d..2ab2b8f 100644 --- a/08.md +++ b/08.md @@ -1,4 +1,4 @@ -> __Warning__ `unrecommended`: discouraged in favor of NIP-27 +> __Warning__ `unrecommended`: deprecated in favor of NIP-27 NIP-08 ====== diff --git a/README.md b/README.md index 6642e92..9390916 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-05: Mapping Nostr keys to DNS-based internet identifiers](05.md) - [NIP-06: Basic key derivation from mnemonic seed phrase](06.md) - [NIP-07: `window.nostr` capability for web browsers](07.md) -- [NIP-08: Handling Mentions](08.md) – `unrecommended`: discouraged in favor of [NIP-27](27.md) +- [NIP-08: Handling Mentions](08.md) – `unrecommended`: deprecated in favor of [NIP-27](27.md) - [NIP-09: Event Deletion](09.md) - [NIP-10: Conventions for clients' use of `e` and `p` tags in text events](10.md) - [NIP-11: Relay Information Document](11.md) -- cgit v1.2.3 From 197b6ea206611e751cb73c2e04a12b371674a109 Mon Sep 17 00:00:00 2001 From: arthurfranca Date: Sat, 25 Mar 2023 11:58:31 -0300 Subject: Bring back NIP-18 --- 18.md | 19 +++++++++++++++++++ README.md | 1 + 2 files changed, 20 insertions(+) create mode 100644 18.md (limited to 'README.md') diff --git a/18.md b/18.md new file mode 100644 index 0000000..365de9c --- /dev/null +++ b/18.md @@ -0,0 +1,19 @@ +NIP-18 +====== + +Reposts +------- + +`draft` `optional` `author:jb55` + +A repost is a `kind 6` note that is used to signal to followers +that another event is worth reading. + +The `content` of a repost event is empty. + +The repost event MUST include an `e` tag with the `id` of the note that is +being reposted. That tag SHOULD include a relay URL as its third entry +to indicate where it can be fetched. + +The repost SHOULD include a `p` tag with the `pubkey` of the event being +reposted. diff --git a/README.md b/README.md index 9390916..947ca70 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-14: Subject tag in text events.](14.md) - [NIP-15: End of Stored Events Notice](15.md) - [NIP-16: Event Treatment](16.md) +- [NIP-18: Reposts](18.md) - [NIP-19: bech32-encoded entities](19.md) - [NIP-20: Command Results](20.md) - [NIP-21: `nostr:` URL scheme](21.md) -- cgit v1.2.3 From 9a362c6df48953fdfefea9178d70f3656d75b1e8 Mon Sep 17 00:00:00 2001 From: arthurfranca Date: Wed, 29 Mar 2023 15:37:54 -0300 Subject: Add optional comment to content --- 18.md | 6 ++++-- README.md | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'README.md') diff --git a/18.md b/18.md index 365de9c..ef77fa6 100644 --- a/18.md +++ b/18.md @@ -4,16 +4,18 @@ NIP-18 Reposts ------- -`draft` `optional` `author:jb55` +`draft` `optional` `author:fiatjaf` `author:arthurfranca` A repost is a `kind 6` note that is used to signal to followers that another event is worth reading. -The `content` of a repost event is empty. +The `content` of a repost event is empty. Optionally, it MAY contain +a comment in the same format of a kind 1 note content. The repost event MUST include an `e` tag with the `id` of the note that is being reposted. That tag SHOULD include a relay URL as its third entry to indicate where it can be fetched. +When reposting a long-form content use an `a` tag instead. The repost SHOULD include a `p` tag with the `pubkey` of the event being reposted. diff --git a/README.md b/README.md index 947ca70..ba78113 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 3 | Contacts | [2](02.md) | | 4 | Encrypted Direct Messages | [4](04.md) | | 5 | Event Deletion | [9](09.md) | +| 6 | Reposts | [18](18.md) | | 7 | Reaction | [25](25.md) | | 8 | Badge Award | [58](58.md) | | 40 | Channel Creation | [28](28.md) | -- cgit v1.2.3 From 5b1640c64815d9c288dd30b7c690b1afecf48930 Mon Sep 17 00:00:00 2001 From: arthurfranca Date: Wed, 29 Mar 2023 15:43:11 -0300 Subject: Document Damus repost as Event Copy --- 30.md | 21 +++++++++++++++++++++ README.md | 3 +++ 2 files changed, 24 insertions(+) create mode 100644 30.md (limited to 'README.md') diff --git a/30.md b/30.md new file mode 100644 index 0000000..2c3c4ae --- /dev/null +++ b/30.md @@ -0,0 +1,21 @@ +NIP-30 +====== + +Event Copy +---------- + +`draft` `optional` `author:jb55` `author:arthurfranca` + +An event of `kind 9` is used to copy any event from another pubkey. A copy +allows its creator to keep content around even when the original gets deleted. + +The `content` of a copy event MUST be the stringified JSON of the whole original event. + +The copy event SHOULD include a `k` tag with the `kind` of the note that is +being copied. This enables subscribing to a subset of copies. + +The copy event SHOULD include an `e` tag with the `id` of the note that is +being copied. This allows the original author to know a specific event has been copied. + +The copy event SHOULD include a `p` tag with the `pubkey` of the event being +copied to notify original author. diff --git a/README.md b/README.md index ba78113..741a288 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-26: Delegated Event Signing](26.md) - [NIP-27: Text Note References](27.md) - [NIP-28: Public Chat](28.md) +- [NIP-30: Event Copy](30.md) - [NIP-33: Parameterized Replaceable Events](33.md) - [NIP-36: Sensitive Content](36.md) - [NIP-39: External Identities in Profiles](39.md) @@ -55,6 +56,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 6 | Reposts | [18](18.md) | | 7 | Reaction | [25](25.md) | | 8 | Badge Award | [58](58.md) | +| 9 | Event Copy | [30](30.md) | | 40 | Channel Creation | [28](28.md) | | 41 | Channel Metadata | [28](28.md) | | 42 | Channel Message | [28](28.md) | @@ -114,6 +116,7 @@ When experimenting with kinds, keep in mind the classification introduced by [NI | g | geohash | | [12](12.md) | | nonce | random | | [13](13.md) | | subject | subject | | [14](14.md) | +| k | referenced event kind | | [30](30.md) | | d | identifier | | [33](33.md) | | expiration | unix timestamp (string) | | [40](40.md) | -- cgit v1.2.3 From 800c0d0cd397eb4b043ef0cdaefd0bad18cb1cd5 Mon Sep 17 00:00:00 2001 From: arthurfranca Date: Wed, 29 Mar 2023 18:45:12 -0300 Subject: Drop event copy --- 18.md | 12 ++++++++---- 30.md | 21 --------------------- README.md | 3 --- 3 files changed, 8 insertions(+), 28 deletions(-) delete mode 100644 30.md (limited to 'README.md') diff --git a/18.md b/18.md index ef77fa6..422ad9c 100644 --- a/18.md +++ b/18.md @@ -4,18 +4,22 @@ NIP-18 Reposts ------- -`draft` `optional` `author:fiatjaf` `author:arthurfranca` +`draft` `optional` `author:jb55` `author:fiatjaf` `author:arthurfranca` A repost is a `kind 6` note that is used to signal to followers that another event is worth reading. The `content` of a repost event is empty. Optionally, it MAY contain -a comment in the same format of a kind 1 note content. +the stringified JSON of the reposted note event for quick look up. The repost event MUST include an `e` tag with the `id` of the note that is -being reposted. That tag SHOULD include a relay URL as its third entry +being reposted. That tag MUST include a relay URL as its third entry to indicate where it can be fetched. -When reposting a long-form content use an `a` tag instead. The repost SHOULD include a `p` tag with the `pubkey` of the event being reposted. + +## Quote Reposts + +Quote reposts are `kind 1` events with an embedded `e` tag (see [NIP-08](08.md) and [NIP-27](27.md)). +Because a quote repost includes an `e` tag, it may show up along replies to the reposted note. diff --git a/30.md b/30.md deleted file mode 100644 index 2c3c4ae..0000000 --- a/30.md +++ /dev/null @@ -1,21 +0,0 @@ -NIP-30 -====== - -Event Copy ----------- - -`draft` `optional` `author:jb55` `author:arthurfranca` - -An event of `kind 9` is used to copy any event from another pubkey. A copy -allows its creator to keep content around even when the original gets deleted. - -The `content` of a copy event MUST be the stringified JSON of the whole original event. - -The copy event SHOULD include a `k` tag with the `kind` of the note that is -being copied. This enables subscribing to a subset of copies. - -The copy event SHOULD include an `e` tag with the `id` of the note that is -being copied. This allows the original author to know a specific event has been copied. - -The copy event SHOULD include a `p` tag with the `pubkey` of the event being -copied to notify original author. diff --git a/README.md b/README.md index 741a288..ba78113 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,6 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-26: Delegated Event Signing](26.md) - [NIP-27: Text Note References](27.md) - [NIP-28: Public Chat](28.md) -- [NIP-30: Event Copy](30.md) - [NIP-33: Parameterized Replaceable Events](33.md) - [NIP-36: Sensitive Content](36.md) - [NIP-39: External Identities in Profiles](39.md) @@ -56,7 +55,6 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 6 | Reposts | [18](18.md) | | 7 | Reaction | [25](25.md) | | 8 | Badge Award | [58](58.md) | -| 9 | Event Copy | [30](30.md) | | 40 | Channel Creation | [28](28.md) | | 41 | Channel Metadata | [28](28.md) | | 42 | Channel Message | [28](28.md) | @@ -116,7 +114,6 @@ When experimenting with kinds, keep in mind the classification introduced by [NI | g | geohash | | [12](12.md) | | nonce | random | | [13](13.md) | | subject | subject | | [14](14.md) | -| k | referenced event kind | | [30](30.md) | | d | identifier | | [33](33.md) | | expiration | unix timestamp (string) | | [40](40.md) | -- cgit v1.2.3 From e219ec64701d89e6b2c3f3ca8fd426d0aefdcb9c Mon Sep 17 00:00:00 2001 From: Jonathan Staab Date: Tue, 3 Jan 2023 20:11:17 -0800 Subject: Add NIP-45, which defines a COUNT verb --- 45.md | 31 +++++++++++++++++++++++++++++++ README.md | 3 +++ 2 files changed, 34 insertions(+) create mode 100644 45.md (limited to 'README.md') diff --git a/45.md b/45.md new file mode 100644 index 0000000..cd81c11 --- /dev/null +++ b/45.md @@ -0,0 +1,31 @@ +NIP-45 +====== + +Event Counts +-------------- + +`draft` `optional` `author:staab` + +Relays may support the `COUNT` verb, which provide a mechanism for obtaining event counts. + +## Motivation + +Some queries a client may want to execute against connected relays are prohibitively expensive, for example, in order to retrieve follower counts for a given pubkey, a client must query all kind-3 events referring to a given pubkey and count them. The result may be cached, either by a client or by a separate indexing server as an alternative, but both options erode the decentralization of the network by creating a second-layer protocol on top of Nostr. + +## Filters and return values + +This NIP defines a verb called `COUNT`, which accepts a subscription id and a filter as specified in [NIP 01](01.md). + +Counts are returned using a `COUNT` response in the form `{count: }`. Relays may use probabilistic counts to reduce compute requirements. + +Examples: + +``` +# Followers count +["COUNT", "", {kinds: [3], '#p': []}] +["COUNT", "", {count: 238}] + +# Count posts and reactions +["COUNT", "", {kinds: [1, 7], authors: []}] +["COUNT", "", {count: 5}] +``` diff --git a/README.md b/README.md index ba78113..215e5cd 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-39: External Identities in Profiles](39.md) - [NIP-40: Expiration Timestamp](40.md) - [NIP-42: Authentication of clients to relays](42.md) +- [NIP-45: Counting results](45.md) - [NIP-46: Nostr Connect](46.md) - [NIP-50: Keywords filter](50.md) - [NIP-51: Lists](51.md) @@ -88,6 +89,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | REQ | used to request events and subscribe to new updates | [1](01.md) | | CLOSE | used to stop previous subscriptions | [1](01.md) | | AUTH | used to send authentication events | [42](42.md) | +| COUNT | used to request event counts | [45](45.md) | ### Relay to Client | type | description | NIP | @@ -97,6 +99,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | EOSE | used to notify clients all stored events have been sent | [15](15.md) | | OK | used to notify clients if an EVENT was successful | [20](20.md) | | AUTH | used to send authentication challenges | [42](42.md) | +| COUNT | used to send requested event counts to clients | [45](45.md) | Please update these lists when proposing NIPs introducing new event kinds. -- cgit v1.2.3 From fb5b7c739ff92cec4962990aa99c54fac9f5de81 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sun, 9 Apr 2023 08:50:24 -0300 Subject: merge NIP-15 into NIP-01. --- 01.md | 5 +++-- 15.md | 21 --------------------- README.md | 3 +-- 3 files changed, 4 insertions(+), 25 deletions(-) delete mode 100644 15.md (limited to 'README.md') diff --git a/01.md b/01.md index 4cfdd35..8efb8ec 100644 --- a/01.md +++ b/01.md @@ -4,7 +4,7 @@ NIP-01 Basic protocol flow description ------------------------------- -`draft` `mandatory` `author:fiatjaf` `author:distbit` `author:scsibug` `author:kukks` `author:jb55` +`draft` `mandatory` `author:fiatjaf` `author:distbit` `author:scsibug` `author:kukks` `author:jb55` `author:semisol` This NIP defines the basic protocol that should be implemented by everybody. New NIPs may add new optional (or mandatory) fields and messages and features to the structures and flows described here. @@ -89,7 +89,8 @@ The `limit` property of a filter is only valid for the initial query and can be Relays can send 2 types of messages, which must also be JSON arrays, according to the following patterns: * `["EVENT", , ]`, used to send events requested by clients. - * `["NOTICE", ]`, used to send human-readable error messages or other things to clients. + * `["EOSE", ]`, used to indicate the _end of stored events_ and the beginning of events newly received in real-time. + * `["NOTICE", ]`, used to send human-readable error messages or other things to clients. This NIP defines no rules for how `NOTICE` messages should be sent or treated. diff --git a/15.md b/15.md deleted file mode 100644 index 081a97d..0000000 --- a/15.md +++ /dev/null @@ -1,21 +0,0 @@ -NIP-15 -====== - -End of Stored Events Notice ---------------------------- - -`final` `optional` `author:Semisol` - -Relays may support notifying clients when all stored events have been sent. - -If a relay supports this NIP, the relay SHOULD send the client a `EOSE` message in the format `["EOSE", ]` after it has sent all the events it has persisted and it indicates all the events that come after this message are newly published. - -Client Behavior ---------------- - -Clients SHOULD use the `supported_nips` field to learn if a relay supports end of stored events notices. - -Motivation ----------- - -The motivation for this proposal is to reduce uncertainty when all events have been sent by a relay to make client code possibly less complex. diff --git a/README.md b/README.md index 215e5cd..ec55ab7 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,6 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-12: Generic Tag Queries](12.md) - [NIP-13: Proof of Work](13.md) - [NIP-14: Subject tag in text events.](14.md) -- [NIP-15: End of Stored Events Notice](15.md) - [NIP-16: Event Treatment](16.md) - [NIP-18: Reposts](18.md) - [NIP-19: bech32-encoded entities](19.md) @@ -96,7 +95,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh |--------|---------------------------------------------------------|-------------| | EVENT | used to send events requested to clients | [1](01.md) | | NOTICE | used to send human-readable messages to clients | [1](01.md) | -| EOSE | used to notify clients all stored events have been sent | [15](15.md) | +| EOSE | used to notify clients all stored events have been sent | [1](01.md) | | OK | used to notify clients if an EVENT was successful | [20](20.md) | | AUTH | used to send authentication challenges | [42](42.md) | | COUNT | used to send requested event counts to clients | [45](45.md) | -- cgit v1.2.3 From acaefe20fa4c9efde541ac352d9c44fe6c2fe790 Mon Sep 17 00:00:00 2001 From: Mariano Pérez Rodríguez Date: Thu, 13 Apr 2023 19:28:03 -0300 Subject: Add missing tag descriptions --- README.md | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index ec55ab7..9f31a36 100644 --- a/README.md +++ b/README.md @@ -106,18 +106,36 @@ When experimenting with kinds, keep in mind the classification introduced by [NI ## Standardized Tags -| name | value | other parameters | NIP | -| ---------- | ----------------------- | ----------------- | ------------------------ | -| e | event id (hex) | relay URL, marker | [1](01.md), [10](10.md) | -| p | pubkey (hex) | relay URL | [1](01.md) | -| a | coordinates to an event | relay URL | [33](33.md), [23](23.md) | -| r | a reference (URL, etc) | | [12](12.md) | -| t | hashtag | | [12](12.md) | -| g | geohash | | [12](12.md) | -| nonce | random | | [13](13.md) | -| subject | subject | | [14](14.md) | -| d | identifier | | [33](33.md) | -| expiration | unix timestamp (string) | | [40](40.md) | +| name | value | other parameters | NIP | +| -------------- | ------------------------------------ | -------------------- | ------------------------ | +| `a` | coordinates to an event | relay URL | [33](33.md), [23](23.md) | +| `d` | identifier | -- | [33](33.md) | +| `e` | event id (hex) | relay URL, marker | [1](01.md), [10](10.md) | +| `g` | geohash | -- | [12](12.md) | +| `i` | identity | proof | [39](39.md) | +| `p` | pubkey (hex) | relay URL | [1](01.md) | +| `r` | a reference (URL, etc) | -- | [12](12.md) | +| `t` | hashtag | -- | [12](12.md) | +| `amount` | millisats | -- | [57](57.md) | +| `bolt11` | `bolt11` invoice | -- | [57](57.md) | +| `challenge` | challenge string | -- | [42](42.md) | +| `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) | +| `description` | badge description | -- | [58](58.md) | +| `description` | invoice description | -- | [57](57.md) | +| `expiration` | unix timestamp (string) | -- | [40](40.md) | +| `image` | image URL | dimensions in pixels | [23](23.md), [58](58.md) | +| `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) | +| `name` | badge name | -- | [58](58.md) | +| `nonce` | random | -- | [13](13.md) | +| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) | +| `published_at` | unix timestamp (string) | -- | [23](23.md) | +| `relay` | relay url | -- | [42](42.md) | +| `relays` | relay list | -- | [57](57.md) | +| `subject` | subject | -- | [14](14.md) | +| `summary` | article summary | -- | [23](23.md) | +| `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) | +| `title` | article title | -- | [23](23.md) | +| `zap` | profile name | type of value | [57](57.md) | ## Criteria for acceptance of NIPs -- cgit v1.2.3 From 6025b6fca0bb7cf7bb334365e92d7ae19f9e1d69 Mon Sep 17 00:00:00 2001 From: Mariano Pérez Rodríguez Date: Thu, 13 Apr 2023 19:28:38 -0300 Subject: Add reference to NIP-33 in note about kinds --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index 9f31a36..406ad2f 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh Please update these lists when proposing NIPs introducing new event kinds. -When experimenting with kinds, keep in mind the classification introduced by [NIP-16](16.md). +When experimenting with kinds, keep in mind the classification introduced by [NIP-16](16.md) and [NIP-33](33.md). ## Standardized Tags -- cgit v1.2.3 From c29812001ae3b14aba1e3a913ce09e7c2fd8736f Mon Sep 17 00:00:00 2001 From: Mariano Pérez Rodríguez Date: Thu, 13 Apr 2023 19:28:57 -0300 Subject: Tidy message lists --- README.md | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index 406ad2f..669ae3e 100644 --- a/README.md +++ b/README.md @@ -82,23 +82,25 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh ## Message types ### Client to Relay -| type | description | NIP | -|-------|-----------------------------------------------------|-------------| -| EVENT | used to publish events | [1](01.md) | -| REQ | used to request events and subscribe to new updates | [1](01.md) | -| CLOSE | used to stop previous subscriptions | [1](01.md) | -| AUTH | used to send authentication events | [42](42.md) | -| COUNT | used to request event counts | [45](45.md) | + +| type | description | NIP | +| ------- | --------------------------------------------------- | ----------- | +| `AUTH` | used to send authentication events | [42](42.md) | +| `CLOSE` | used to stop previous subscriptions | [1](01.md) | +| `COUNT` | used to request event counts | [45](45.md) | +| `EVENT` | used to publish events | [1](01.md) | +| `REQ` | used to request events and subscribe to new updates | [1](01.md) | ### Relay to Client -| type | description | NIP | -|--------|---------------------------------------------------------|-------------| -| EVENT | used to send events requested to clients | [1](01.md) | -| NOTICE | used to send human-readable messages to clients | [1](01.md) | -| EOSE | used to notify clients all stored events have been sent | [1](01.md) | -| OK | used to notify clients if an EVENT was successful | [20](20.md) | -| AUTH | used to send authentication challenges | [42](42.md) | -| COUNT | used to send requested event counts to clients | [45](45.md) | + +| type | description | NIP | +| -------- | ------------------------------------------------------- | ----------- | +| `AUTH` | used to send authentication challenges | [42](42.md) | +| `COUNT` | used to send requested event counts to clients | [45](45.md) | +| `EOSE` | used to notify clients all stored events have been sent | [1](01.md) | +| `EVENT` | used to send events requested to clients | [1](01.md) | +| `NOTICE` | used to send human-readable messages to clients | [1](01.md) | +| `OK` | used to notify clients if an EVENT was successful | [20](20.md) | Please update these lists when proposing NIPs introducing new event kinds. -- cgit v1.2.3 From 3eb2d6e816cac7ff4a623133b1fef3c1872a2510 Mon Sep 17 00:00:00 2001 From: Mariano Pérez Rodríguez Date: Thu, 13 Apr 2023 19:29:39 -0300 Subject: Extract kind ranges to their own table --- README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index 669ae3e..b78f9dc 100644 --- a/README.md +++ b/README.md @@ -74,10 +74,15 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh | 30009 | Badge Definition | [58](58.md) | | 30023 | Long-form Content | [23](23.md) | | 30078 | Application-specific Data | [78](78.md) | -| 1000-9999 | Regular Events | [16](16.md) | -| 10000-19999 | Replaceable Events | [16](16.md) | -| 20000-29999 | Ephemeral Events | [16](16.md) | -| 30000-39999 | Parameterized Replaceable Events | [33](33.md) | + +### Event Kind Ranges + +| range | description | NIP | +| ---------------- | -------------------------------- | ----------- | +| `1000`--`9999` | Regular Events | [16](16.md) | +| `10000`--`19999` | Replaceable Events | [16](16.md) | +| `20000`--`29999` | Ephemeral Events | [16](16.md) | +| `30000`--`39999` | Parameterized Replaceable Events | [33](33.md) | ## Message types -- cgit v1.2.3 From 754bd26b188e1f7b871fcf3789db31ef14a6e826 Mon Sep 17 00:00:00 2001 From: Mariano Pérez Rodríguez Date: Thu, 13 Apr 2023 19:29:58 -0300 Subject: Add missing kinds to list --- README.md | 62 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 32 insertions(+), 30 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index b78f9dc..24ae2c9 100644 --- a/README.md +++ b/README.md @@ -44,36 +44,38 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh ## Event Kinds -| kind | description | NIP | -| ------------- | -------------------------------- | ----------- | -| 0 | Metadata | [1](01.md) | -| 1 | Short Text Note | [1](01.md) | -| 2 | Recommend Relay | [1](01.md) | -| 3 | Contacts | [2](02.md) | -| 4 | Encrypted Direct Messages | [4](04.md) | -| 5 | Event Deletion | [9](09.md) | -| 6 | Reposts | [18](18.md) | -| 7 | Reaction | [25](25.md) | -| 8 | Badge Award | [58](58.md) | -| 40 | Channel Creation | [28](28.md) | -| 41 | Channel Metadata | [28](28.md) | -| 42 | Channel Message | [28](28.md) | -| 43 | Channel Hide Message | [28](28.md) | -| 44 | Channel Mute User | [28](28.md) | -| 1984 | Reporting | [56](56.md) | -| 9734 | Zap Request | [57](57.md) | -| 9735 | Zap | [57](57.md) | -| 10000 | Mute List | [51](51.md) | -| 10001 | Pin List | [51](51.md) | -| 10002 | Relay List Metadata | [65](65.md) | -| 22242 | Client Authentication | [42](42.md) | -| 24133 | Nostr Connect | [46](46.md) | -| 30000 | Categorized People List | [51](51.md) | -| 30001 | Categorized Bookmark List | [51](51.md) | -| 30008 | Profile Badges | [58](58.md) | -| 30009 | Badge Definition | [58](58.md) | -| 30023 | Long-form Content | [23](23.md) | -| 30078 | Application-specific Data | [78](78.md) | +| kind | description | NIP | +| -------- | -------------------------- | ----------- | +| `0` | Metadata | [1](01.md) | +| `1` | Short Text Note | [1](01.md) | +| `2` | Recommend Relay | [1](01.md) | +| `3` | Contacts | [2](02.md) | +| `4` | Encrypted Direct Messages | [4](04.md) | +| `5` | Event Deletion | [9](09.md) | +| `6` | Reposts | [18](18.md) | +| `7` | Reaction | [25](25.md) | +| `8` | Badge Award | [58](58.md) | +| `40` | Channel Creation | [28](28.md) | +| `41` | Channel Metadata | [28](28.md) | +| `42` | Channel Message | [28](28.md) | +| `43` | Channel Hide Message | [28](28.md) | +| `44` | Channel Mute User | [28](28.md) | +| `1984` | Reporting | [56](56.md) | +| `9734` | Zap Request | [57](57.md) | +| `9735` | Zap | [57](57.md) | +| `10000` | Mute List | [51](51.md) | +| `10001` | Pin List | [51](51.md) | +| `10002` | Relay List Metadata | [65](65.md) | +| `22242` | Client Authentication | [42](42.md) | +| `24133` | Nostr Connect | [46](46.md) | +| `30000` | Categorized People List | [51](51.md) | +| `30001` | Categorized Bookmark List | [51](51.md) | +| `30008` | Profile Badges | [58](58.md) | +| `30009` | Badge Definition | [58](58.md) | +| `30017` | Create or update a stall | [15](15.md) | +| `30018` | Create or update a product | [15](15.md) | +| `30023` | Long-form Content | [23](23.md) | +| `30078` | Application-specific Data | [78](78.md) | ### Event Kind Ranges -- cgit v1.2.3 From 074b139a26e92262a5779be85f932e4c94412b35 Mon Sep 17 00:00:00 2001 From: Mariano Pérez Rodríguez Date: Thu, 13 Apr 2023 19:30:23 -0300 Subject: Add table of contents (and NIP list header) --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index 24ae2c9..7c002b3 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,22 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document what may be implemented by [Nostr](https://github.com/fiatjaf/nostr)-compatible _relay_ and _client_ software. +--- + +- [List](#list) +- [Event Kinds](#event-kinds) + - [Event Kind Ranges](#event-kind-ranges) +- [Message Types](#message-types) + - [Client to Relay](#client-to-relay) + - [Relay to Client](#relay-to-client) +- [Standardized Tags](#standardized-tags) +- [Criteria for acceptance of NIPs](#criteria-for-acceptance-of-nips) +- [License](#license) + +--- + +## List + - [NIP-01: Basic protocol flow description](01.md) - [NIP-02: Contact List and Petnames](02.md) - [NIP-03: OpenTimestamps Attestations for Events](03.md) -- cgit v1.2.3 From ec884151b7ca85e3d348fa57a2188ca4e685bd44 Mon Sep 17 00:00:00 2001 From: Mariano Pérez Rodríguez Date: Thu, 13 Apr 2023 19:30:44 -0300 Subject: Ensure single sentence per line --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index 7c002b3..a89f340 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # NIPs -NIPs stand for **Nostr Implementation Possibilities**. They exist to document what may be implemented by [Nostr](https://github.com/fiatjaf/nostr)-compatible _relay_ and _client_ software. +NIPs stand for **Nostr Implementation Possibilities**. +They exist to document what may be implemented by [Nostr](https://github.com/fiatjaf/nostr)-compatible _relay_ and _client_ software. --- -- cgit v1.2.3 From a07ac8c67116ced93e22d4a274156cacb4d5e019 Mon Sep 17 00:00:00 2001 From: Mariano Pérez Rodríguez Date: Thu, 13 Apr 2023 19:31:09 -0300 Subject: Unrecommended notice style change --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index a89f340..a3f5fc0 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/fia - [NIP-05: Mapping Nostr keys to DNS-based internet identifiers](05.md) - [NIP-06: Basic key derivation from mnemonic seed phrase](06.md) - [NIP-07: `window.nostr` capability for web browsers](07.md) -- [NIP-08: Handling Mentions](08.md) – `unrecommended`: deprecated in favor of [NIP-27](27.md) +- [NIP-08: Handling Mentions](08.md) --- **unrecommended**: deprecated in favor of [NIP-27](27.md) - [NIP-09: Event Deletion](09.md) - [NIP-10: Conventions for clients' use of `e` and `p` tags in text events](10.md) - [NIP-11: Relay Information Document](11.md) -- cgit v1.2.3 From 76d46b4859845a5a307f98ec32eab5d8c61abba6 Mon Sep 17 00:00:00 2001 From: Mariano Pérez Rodríguez Date: Thu, 13 Apr 2023 19:33:02 -0300 Subject: Remove extra space --- README.md | 64 +++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index a3f5fc0..417a3c3 100644 --- a/README.md +++ b/README.md @@ -61,38 +61,38 @@ They exist to document what may be implemented by [Nostr](https://github.com/fia ## Event Kinds -| kind | description | NIP | -| -------- | -------------------------- | ----------- | -| `0` | Metadata | [1](01.md) | -| `1` | Short Text Note | [1](01.md) | -| `2` | Recommend Relay | [1](01.md) | -| `3` | Contacts | [2](02.md) | -| `4` | Encrypted Direct Messages | [4](04.md) | -| `5` | Event Deletion | [9](09.md) | -| `6` | Reposts | [18](18.md) | -| `7` | Reaction | [25](25.md) | -| `8` | Badge Award | [58](58.md) | -| `40` | Channel Creation | [28](28.md) | -| `41` | Channel Metadata | [28](28.md) | -| `42` | Channel Message | [28](28.md) | -| `43` | Channel Hide Message | [28](28.md) | -| `44` | Channel Mute User | [28](28.md) | -| `1984` | Reporting | [56](56.md) | -| `9734` | Zap Request | [57](57.md) | -| `9735` | Zap | [57](57.md) | -| `10000` | Mute List | [51](51.md) | -| `10001` | Pin List | [51](51.md) | -| `10002` | Relay List Metadata | [65](65.md) | -| `22242` | Client Authentication | [42](42.md) | -| `24133` | Nostr Connect | [46](46.md) | -| `30000` | Categorized People List | [51](51.md) | -| `30001` | Categorized Bookmark List | [51](51.md) | -| `30008` | Profile Badges | [58](58.md) | -| `30009` | Badge Definition | [58](58.md) | -| `30017` | Create or update a stall | [15](15.md) | -| `30018` | Create or update a product | [15](15.md) | -| `30023` | Long-form Content | [23](23.md) | -| `30078` | Application-specific Data | [78](78.md) | +| kind | description | NIP | +| ------- | -------------------------- | ----------- | +| `0` | Metadata | [1](01.md) | +| `1` | Short Text Note | [1](01.md) | +| `2` | Recommend Relay | [1](01.md) | +| `3` | Contacts | [2](02.md) | +| `4` | Encrypted Direct Messages | [4](04.md) | +| `5` | Event Deletion | [9](09.md) | +| `6` | Reposts | [18](18.md) | +| `7` | Reaction | [25](25.md) | +| `8` | Badge Award | [58](58.md) | +| `40` | Channel Creation | [28](28.md) | +| `41` | Channel Metadata | [28](28.md) | +| `42` | Channel Message | [28](28.md) | +| `43` | Channel Hide Message | [28](28.md) | +| `44` | Channel Mute User | [28](28.md) | +| `1984` | Reporting | [56](56.md) | +| `9734` | Zap Request | [57](57.md) | +| `9735` | Zap | [57](57.md) | +| `10000` | Mute List | [51](51.md) | +| `10001` | Pin List | [51](51.md) | +| `10002` | Relay List Metadata | [65](65.md) | +| `22242` | Client Authentication | [42](42.md) | +| `24133` | Nostr Connect | [46](46.md) | +| `30000` | Categorized People List | [51](51.md) | +| `30001` | Categorized Bookmark List | [51](51.md) | +| `30008` | Profile Badges | [58](58.md) | +| `30009` | Badge Definition | [58](58.md) | +| `30017` | Create or update a stall | [15](15.md) | +| `30018` | Create or update a product | [15](15.md) | +| `30023` | Long-form Content | [23](23.md) | +| `30078` | Application-specific Data | [78](78.md) | ### Event Kind Ranges -- cgit v1.2.3 From 45b539d5d502fd0b42c51b209464495d8c45cc95 Mon Sep 17 00:00:00 2001 From: Mariano Pérez Rodríguez Date: Fri, 14 Apr 2023 19:57:52 -0300 Subject: Apply changes alluded to in https://github.com/nostr-protocol/nips/pull/443 --- README.md | 61 +++++++++++++++++++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 30 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index 417a3c3..836a593 100644 --- a/README.md +++ b/README.md @@ -132,36 +132,37 @@ When experimenting with kinds, keep in mind the classification introduced by [NI ## Standardized Tags -| name | value | other parameters | NIP | -| -------------- | ------------------------------------ | -------------------- | ------------------------ | -| `a` | coordinates to an event | relay URL | [33](33.md), [23](23.md) | -| `d` | identifier | -- | [33](33.md) | -| `e` | event id (hex) | relay URL, marker | [1](01.md), [10](10.md) | -| `g` | geohash | -- | [12](12.md) | -| `i` | identity | proof | [39](39.md) | -| `p` | pubkey (hex) | relay URL | [1](01.md) | -| `r` | a reference (URL, etc) | -- | [12](12.md) | -| `t` | hashtag | -- | [12](12.md) | -| `amount` | millisats | -- | [57](57.md) | -| `bolt11` | `bolt11` invoice | -- | [57](57.md) | -| `challenge` | challenge string | -- | [42](42.md) | -| `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) | -| `description` | badge description | -- | [58](58.md) | -| `description` | invoice description | -- | [57](57.md) | -| `expiration` | unix timestamp (string) | -- | [40](40.md) | -| `image` | image URL | dimensions in pixels | [23](23.md), [58](58.md) | -| `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) | -| `name` | badge name | -- | [58](58.md) | -| `nonce` | random | -- | [13](13.md) | -| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) | -| `published_at` | unix timestamp (string) | -- | [23](23.md) | -| `relay` | relay url | -- | [42](42.md) | -| `relays` | relay list | -- | [57](57.md) | -| `subject` | subject | -- | [14](14.md) | -| `summary` | article summary | -- | [23](23.md) | -| `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) | -| `title` | article title | -- | [23](23.md) | -| `zap` | profile name | type of value | [57](57.md) | +| name | value | other parameters | NIP | +| ----------------- | ------------------------------------ | -------------------- | ------------------------ | +| `a` | coordinates to an event | relay URL | [33](33.md), [23](23.md) | +| `d` | identifier | -- | [33](33.md) | +| `e` | event id (hex) | relay URL, marker | [1](01.md), [10](10.md) | +| `g` | geohash | -- | [12](12.md) | +| `i` | identity | proof | [39](39.md) | +| `p` | pubkey (hex) | relay URL | [1](01.md) | +| `r` | a reference (URL, etc) | -- | [12](12.md) | +| `t` | hashtag | -- | [12](12.md) | +| `amount` | millisats | -- | [57](57.md) | +| `bolt11` | `bolt11` invoice | -- | [57](57.md) | +| `challenge` | challenge string | -- | [42](42.md) | +| `content-warning` | reason | -- | [36](36.md) | +| `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) | +| `description` | badge description | -- | [58](58.md) | +| `description` | invoice description | -- | [57](57.md) | +| `expiration` | unix timestamp (string) | -- | [40](40.md) | +| `image` | image URL | dimensions in pixels | [23](23.md), [58](58.md) | +| `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) | +| `name` | badge name | -- | [58](58.md) | +| `nonce` | random | -- | [13](13.md) | +| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) | +| `published_at` | unix timestamp (string) | -- | [23](23.md) | +| `relay` | relay url | -- | [42](42.md) | +| `relays` | relay list | -- | [57](57.md) | +| `subject` | subject | -- | [14](14.md) | +| `summary` | article summary | -- | [23](23.md) | +| `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) | +| `title` | article title | -- | [23](23.md) | +| `zap` | profile name | type of value | [57](57.md) | ## Criteria for acceptance of NIPs -- cgit v1.2.3 From 92536d8b562d20a37aee92fc4e001937845f4ae7 Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Fri, 21 Apr 2023 00:45:35 +0900 Subject: Add NIP-94 and kind 1063 to README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index 836a593..d47bf76 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/fia - [NIP-58: Badges](58.md) - [NIP-65: Relay List Metadata](65.md) - [NIP-78: Application-specific data](78.md) +- [NIP-94: File Header](94.md) ## Event Kinds @@ -77,6 +78,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/fia | `42` | Channel Message | [28](28.md) | | `43` | Channel Hide Message | [28](28.md) | | `44` | Channel Mute User | [28](28.md) | +| `1063` | File Header | [94](94.md) | | `1984` | Reporting | [56](56.md) | | `9734` | Zap Request | [57](57.md) | | `9735` | Zap | [57](57.md) | -- cgit v1.2.3 From 4b9847802a9fb1a6d13b3967976bca78b5eacb0c Mon Sep 17 00:00:00 2001 From: jiftechnify Date: Fri, 21 Apr 2023 13:04:48 +0900 Subject: fix: re-add NIP-15 to the list --- README.md | 1 + 1 file changed, 1 insertion(+) (limited to 'README.md') diff --git a/README.md b/README.md index d47bf76..fb0ddb7 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/fia - [NIP-12: Generic Tag Queries](12.md) - [NIP-13: Proof of Work](13.md) - [NIP-14: Subject tag in text events.](14.md) +- [NIP-15: Nostr Marketplace (for resilient marketplaces)](15.md) - [NIP-16: Event Treatment](16.md) - [NIP-18: Reposts](18.md) - [NIP-19: bech32-encoded entities](19.md) -- cgit v1.2.3 From 5d0cbcbebfde5b3a32bf8c6fda12cfde40c1bb65 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Mon, 24 Apr 2023 14:57:37 -0300 Subject: reword NIP-94 to remove confusion. --- 94.md | 36 ++++++++++++++---------------------- README.md | 2 +- 2 files changed, 15 insertions(+), 23 deletions(-) (limited to 'README.md') diff --git a/94.md b/94.md index 87b0f3a..d29548e 100644 --- a/94.md +++ b/94.md @@ -1,13 +1,17 @@ -NIP-94 - File Header +NIP-94 ====== -`draft` `optional` `author:frbitten` -The purpose of this NIP is to allow an organization and classification of shared files. So that relays can filter and organize in any way that is of interest. -Also the goal is to create a base on the protocol for this bountsr "Filesharing App" (https://bountsr.org/p2p-filesharing/) to be implemented. +File Metadata +------------- + +`draft` `optional` `author:frbitten` `author:kieran` `author:lovvtide` `author:fiatjaf` + +The purpose of this NIP is to allow an organization and classification of shared files. So that relays can filter and organize in any way that is of interest. With that, multiple types of filesharing clients can be created. NIP-94 support is not expected to be implemented by "social" clients that deal with kind:1 notes or by longform clients that deal with kind:30023 articles. + +## Event format -Nostr event ------------------- This NIP specifies the use of the `1063` event type, having in `content` a description of the file content, and a list of tags described below: + * `url` the url to download the file * `m` a string indicating the data type of the file. The MIME types format must be used (https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) * `"aes-256-gcm"` (optional) key and nonce for AES-GCM encryption with tagSize always 128bits @@ -15,7 +19,7 @@ This NIP specifies the use of the `1063` event type, having in `content` a descr * `size` (optional) size of file in bytes * `magnet` (optional) URI to magnet file * `i` (optional) torrent infohash -* `blurhash`(optional) the [blurhash](https://github.com/woltapp/blurhash) to show while the file is being loaded by the client +* `blurhash`(optional) the [blurhash](https://github.com/woltapp/blurhash) to show while the file is being loaded by the client ```json { @@ -38,20 +42,8 @@ This NIP specifies the use of the `1063` event type, having in `content` a descr } ``` -Client Behavior ---------------- -The client can use this event as they see fit. Either showing events in the same feed as kind 1 events or creating a specific feed for file listings. - -It allows the app to create image galleries (memes, animations) that can be reused countless times in different notes. As it exists in whatsapp, telegram, etc. - -Example: - -To do this, just select the image from the gallery (events NIP-94) and include the URL of the selected image - +## Suggested use cases -Suggested Use Cases -------------------- -* A relay for indexing shared files. For example to promote torrents -* A Pinterest-like relay and app where people can share their portfolio and inspire others. +* A relay for indexing shared files. For example, to promote torrents. +* A pinterest-like client where people can share their portfolio and inspire others. * A simple way to distribute configurations and software updates. -* Specialized relays can provide collections of emojis, memes and animated gifs to be used in notes. diff --git a/README.md b/README.md index fb0ddb7..0a00d0e 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/fia - [NIP-58: Badges](58.md) - [NIP-65: Relay List Metadata](65.md) - [NIP-78: Application-specific data](78.md) -- [NIP-94: File Header](94.md) +- [NIP-94: File Metadata](94.md) ## Event Kinds -- cgit v1.2.3 From badabd513e659964d5fb357fab97dd8319acc98a Mon Sep 17 00:00:00 2001 From: Asai Toshiya Date: Tue, 25 Apr 2023 18:23:32 +0900 Subject: Reword description of kind 1063 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index 0a00d0e..e7c8914 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/fia | `42` | Channel Message | [28](28.md) | | `43` | Channel Hide Message | [28](28.md) | | `44` | Channel Mute User | [28](28.md) | -| `1063` | File Header | [94](94.md) | +| `1063` | File Metadata | [94](94.md) | | `1984` | Reporting | [56](56.md) | | `9734` | Zap Request | [57](57.md) | | `9735` | Zap | [57](57.md) | -- cgit v1.2.3 From bc9d469c203a25a706727219fa7d37dacaf6040d Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 5 May 2023 08:50:50 -0300 Subject: add nip-47 to index. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'README.md') diff --git a/README.md b/README.md index e7c8914..a4a63a4 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/fia - [NIP-42: Authentication of clients to relays](42.md) - [NIP-45: Counting results](45.md) - [NIP-46: Nostr Connect](46.md) +- [NIP-47: Wallet Connect](47.md) - [NIP-50: Keywords filter](50.md) - [NIP-51: Lists](51.md) - [NIP-56: Reporting](56.md) @@ -86,7 +87,10 @@ They exist to document what may be implemented by [Nostr](https://github.com/fia | `10000` | Mute List | [51](51.md) | | `10001` | Pin List | [51](51.md) | | `10002` | Relay List Metadata | [65](65.md) | +| `13194` | Wallet Info | [47](47.md) | | `22242` | Client Authentication | [42](42.md) | +| `23194` | Wallet Request | [47](47.md) | +| `23195` | Wallet Response | [47](47.md) | | `24133` | Nostr Connect | [46](46.md) | | `30000` | Categorized People List | [51](51.md) | | `30001` | Categorized Bookmark List | [51](51.md) | -- cgit v1.2.3 From 1678c53dcd3a2cefcf953722d501c03920ce6092 Mon Sep 17 00:00:00 2001 From: ekzyis Date: Sat, 6 May 2023 23:31:22 +0200 Subject: Update old link to fiatjaf/nostr --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'README.md') diff --git a/README.md b/README.md index a4a63a4..94e945c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # NIPs NIPs stand for **Nostr Implementation Possibilities**. -They exist to document what may be implemented by [Nostr](https://github.com/fiatjaf/nostr)-compatible _relay_ and _client_ software. +They exist to document what may be implemented by [Nostr](https://github.com/nostr-protocol/nostr)-compatible _relay_ and _client_ software. --- -- cgit v1.2.3