mirror of
https://github.com/nostr-protocol/nips.git
synced 2025-12-08 16:18:50 +00:00
Compare commits
7 Commits
alexgleaso
...
no-batchin
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
85ea8ab124 | ||
|
|
0b3eea1053 | ||
|
|
0619f370bc | ||
|
|
bf699c9bc1 | ||
|
|
7a9e2ec87d | ||
|
|
078ffd873e | ||
|
|
0ed88ee0bd |
8
01.md
8
01.md
@@ -78,8 +78,8 @@ This NIP defines 3 standard tags that can be used across all event kinds with th
|
||||
- The `e` tag, used to refer to an event: `["e", <32-bytes lowercase hex of the id of another event>, <recommended relay URL, optional>, <32-bytes lowercase hex of the author's pubkey, optional>]`
|
||||
- The `p` tag, used to refer to another user: `["p", <32-bytes lowercase hex of a pubkey>, <recommended relay URL, optional>]`
|
||||
- The `a` tag, used to refer to an addressable or replaceable event
|
||||
- for an addressable event: `["a", <kind integer>:<32-bytes lowercase hex of a pubkey>:<d tag value>, <recommended relay URL, optional>]`
|
||||
- for a normal replaceable event: `["a", <kind integer>:<32-bytes lowercase hex of a pubkey>:, <recommended relay URL, optional>]`
|
||||
- for an addressable event: `["a", "<kind integer>:<32-bytes lowercase hex of a pubkey>:<d tag value>", <recommended relay URL, optional>]`
|
||||
- for a normal replaceable event: `["a", "<kind integer>:<32-bytes lowercase hex of a pubkey>:", <recommended relay URL, optional>]` (note: include the trailing colon)
|
||||
|
||||
As a convention, all single-letter (only english alphabet letters: a-z, A-Z) key tags are expected to be indexed by relays, such that it is possible, for example, to query or subscribe to events that reference the event `"5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"` by using the `{"#e": ["5c83da77af1dec6d7289834998ad7aafbd9e2191396d75ec3cc27f5a77226f36"]}` filter. Only the first value in any given tag is indexed.
|
||||
|
||||
@@ -113,7 +113,7 @@ Relays expose a websocket endpoint to which clients can connect. Clients SHOULD
|
||||
Clients can send 3 types of messages, which must be JSON arrays, according to the following patterns:
|
||||
|
||||
* `["EVENT", <event JSON as defined above>]`, used to publish events.
|
||||
* `["REQ", <subscription_id>, <filters1>, <filters2>, ...]`, used to request events and subscribe to new updates.
|
||||
* `["REQ", <subscription_id>, <filter>]`, used to request events and subscribe to new updates.
|
||||
* `["CLOSE", <subscription_id>]`, used to stop previous subscriptions.
|
||||
|
||||
`<subscription_id>` is an arbitrary, non-empty string of max length 64 chars. It represents a subscription per connection. Relays MUST manage `<subscription_id>`s independently for each WebSocket connection. `<subscription_id>`s are not guaranteed to be globally unique.
|
||||
@@ -142,8 +142,6 @@ The `since` and `until` properties can be used to specify the time range of even
|
||||
|
||||
All conditions of a filter that are specified must match for an event for it to pass the filter, i.e., multiple conditions are interpreted as `&&` conditions.
|
||||
|
||||
A `REQ` message may contain multiple filters. In this case, events that match any of the filters are to be returned, i.e., multiple filters are to be interpreted as `||` conditions.
|
||||
|
||||
The `limit` property of a filter is only valid for the initial query and MUST be ignored afterwards. When `limit: n` is present it is assumed that the events returned in the initial query will be the last `n` events ordered by the `created_at`. Newer events should appear first, and in the case of ties the event with the lowest id (first in lexical order) should be first. It is safe to return less events than `limit` specifies, but it is expected that relays do not return (much) more events than requested so clients don't get unnecessarily overwhelmed by data.
|
||||
|
||||
### From relay to client: sending events and notices
|
||||
|
||||
14
17.md
14
17.md
@@ -57,7 +57,7 @@ Kind `14`s MUST never be signed. If it is signed, the message might leak to rela
|
||||
["file-type", "<file-mime-type>"],
|
||||
["encryption-algorithm", "<encryption-algorithm>"],
|
||||
["decryption-key", "<decryption-key>"],
|
||||
["decryptiion-nonce", "<decryption-nonce>"],
|
||||
["decryption-nonce", "<decryption-nonce>"],
|
||||
["x", "<the SHA-256 hexencoded string of the file>"],
|
||||
// rest of tags...
|
||||
],
|
||||
@@ -74,16 +74,16 @@ Kind 15 is used for sending encrypted file event messages:
|
||||
- `content`: The URL of the file (`<file-url>`).
|
||||
- `x` containing the SHA-256 hexencoded string of the file.
|
||||
- `size` (optional) size of file in bytes
|
||||
- `dim` (optional) size of file in pixels in the form `<width>x<height>`
|
||||
- `blurhash`(optional) the [blurhash](https://github.com/woltapp/blurhash) to show while the file is being loaded by the client
|
||||
- `thumb` (optional) url of thumbnail with same aspect ratio
|
||||
- `dim` (optional) size of the file in pixels in the form `<width>x<height>`
|
||||
- `blurhash`(optional) the [blurhash](https://github.com/woltapp/blurhash) to show while the client is loading the file
|
||||
- `thumb` (optional) URL of thumbnail with same aspect ratio (encrypted with the same key, nonce)
|
||||
- `fallback` (optional) zero or more fallback file sources in case `url` fails
|
||||
|
||||
Just like kind 14, kind `15`s MUST never be signed.
|
||||
|
||||
## Chat Rooms
|
||||
|
||||
The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or a current one is removed, a new room is created with clean message history.
|
||||
The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or a current one is removed, a new room is created with a clean message history.
|
||||
|
||||
Clients SHOULD render messages of the same room in a continuous thread.
|
||||
|
||||
@@ -91,7 +91,7 @@ An optional `subject` tag defines the current name/topic of the conversation. An
|
||||
|
||||
## Encrypting
|
||||
|
||||
Following [NIP-59](59.md), the **unsigned** `kind:14` & `kind:15` chat message must be sealed (`kind:13`) and then gift-wrapped (`kind:1059`) to each receiver and the sender individually.
|
||||
Following [NIP-59](59.md), the **unsigned** `kind:14` & `kind:15` chat messages must be sealed (`kind:13`) and then gift-wrapped (`kind:1059`) to each receiver and the sender individually.
|
||||
|
||||
```jsonc
|
||||
{
|
||||
@@ -173,7 +173,7 @@ The main limitation of this approach is having to send a separate encrypted even
|
||||
|
||||
Clients implementing this NIP should by default only connect to the set of relays found in their `kind:10050` list. From that they should be able to load all messages both sent and received as well as get new live updates, making it for a very simple and lightweight implementation that should be fast.
|
||||
|
||||
When sending a message to anyone, clients must then connect to the relays in the receiver's `kind:10050` and send the events there, but can disconnect right after unless more messages are expected to be sent (e.g. the chat tab is still selected). Clients should also send a copy of their outgoing messages to their own `kind:10050` relay set.
|
||||
When sending a message to anyone, clients must then connect to the relays in the receiver's `kind:10050` and send the events there but can disconnect right after unless more messages are expected to be sent (e.g. the chat tab is still selected). Clients should also send a copy of their outgoing messages to their own `kind:10050` relay set.
|
||||
|
||||
## Examples
|
||||
|
||||
|
||||
4
23.md
4
23.md
@@ -60,3 +60,7 @@ References to other Nostr notes, articles or profiles must be made according to
|
||||
"id": "..."
|
||||
}
|
||||
```
|
||||
|
||||
### Replies & Comments
|
||||
|
||||
Replies to `kind 30023` MUST use [NIP-22](./22.md) `kind 1111` comments.
|
||||
20
50.md
20
50.md
@@ -8,11 +8,11 @@ Search Capability
|
||||
|
||||
## Abstract
|
||||
|
||||
Many Nostr use cases require some form of general search feature, in addition to structured queries by tags or ids.
|
||||
Specifics of the search algorithms will differ between event kinds, this NIP only describes a general
|
||||
Many Nostr use cases require some form of general search feature, in addition to structured queries by tags or ids.
|
||||
Specifics of the search algorithms will differ between event kinds, this NIP only describes a general
|
||||
extensible framework for performing such queries.
|
||||
|
||||
## `search` filter field
|
||||
## `search` filter field
|
||||
|
||||
A new `search` field is introduced for `REQ` messages from clients:
|
||||
```jsonc
|
||||
@@ -21,23 +21,23 @@ A new `search` field is introduced for `REQ` messages from clients:
|
||||
"search": <string>
|
||||
}
|
||||
```
|
||||
`search` field is a string describing a query in a human-readable form, i.e. "best nostr apps".
|
||||
Relays SHOULD interpret the query to the best of their ability and return events that match it.
|
||||
`search` field is a string describing a query in a human-readable form, i.e. "best nostr apps".
|
||||
Relays SHOULD interpret the query to the best of their ability and return events that match it.
|
||||
Relays SHOULD perform matching against `content` event field, and MAY perform
|
||||
matching against other fields if that makes sense in the context of a specific kind.
|
||||
matching against other fields if that makes sense in the context of a specific kind.
|
||||
|
||||
Results SHOULD be returned in descending order by quality of search result (as defined by the implementation),
|
||||
not by the usual `.created_at`. The `limit` filter SHOULD be applied after sorting by matching score.
|
||||
A query string may contain `key:value` pairs (two words separated by colon), these are extensions, relays SHOULD ignore
|
||||
A query string may contain `key:value` pairs (two words separated by colon), these are extensions, relays SHOULD ignore
|
||||
extensions they don't support.
|
||||
|
||||
Clients may specify several search filters, i.e. `["REQ", "", { "search": "orange" }, { "kinds": [1, 2], "search": "purple" }]`. Clients may
|
||||
Clients may specify several search filters, i.e. `["REQ", "_", {"kinds": [1], "search": "purple"}]`. Clients may
|
||||
include `kinds`, `ids` and other filter field to restrict the search results to particular event kinds.
|
||||
|
||||
Clients SHOULD use the supported_nips field to learn if a relay supports `search` filter. Clients MAY send `search`
|
||||
Clients SHOULD use the supported_nips field to learn if a relay supports `search` filter. Clients MAY send `search`
|
||||
filter queries to any relay, if they are prepared to filter out extraneous responses from relays that do not support this NIP.
|
||||
|
||||
Clients SHOULD query several relays supporting this NIP to compensate for potentially different
|
||||
Clients SHOULD query several relays supporting this NIP to compensate for potentially different
|
||||
implementation details between relays.
|
||||
|
||||
Clients MAY verify that events returned by a relay match the specified query in a way that suits the
|
||||
|
||||
37
73.md
37
73.md
@@ -9,26 +9,37 @@ External Content IDs
|
||||
There are certain established global content identifiers such as [Book ISBNs](https://en.wikipedia.org/wiki/ISBN), [Podcast GUIDs](https://podcastnamespace.org/tag/guid), and [Movie ISANs](https://en.wikipedia.org/wiki/International_Standard_Audiovisual_Number) that are useful to reference in nostr events so that clients can query all the events assosiated with these ids.
|
||||
|
||||
|
||||
`i` tags are used for referencing these external content ids, with `k` tags representing the external content id kind so that clients can query all the events for a specific kind.
|
||||
`i` tags are used for referencing these external content ids, with `k` tags representing the external content id kind so that clients can query all the events for a specific kind.
|
||||
|
||||
## Supported IDs
|
||||
|
||||
| Type | `i` tag | `k` tag |
|
||||
|- | - | - |
|
||||
| URLs | "`<URL, normalized, no fragment>`" | "`<scheme-host, normalized>`" |
|
||||
| Hashtags | "#`<topic, lowercase>`" | "#" |
|
||||
| Geohashes| "geo:`<geohash, lowercase>`" | "geo" |
|
||||
| Books | "isbn:`<id, without hyphens>`" | "isbn" |
|
||||
| Podcast Feeds | "podcast:guid:`<guid>`" | "podcast:guid" |
|
||||
| Podcast Episodes | "podcast:item:guid:`<guid>`" | "podcast:item:guid" |
|
||||
| Podcast Publishers | "podcast:publisher:guid:`<guid>`" | "podcast:publisher:guid" |
|
||||
| Movies | "isan:`<id, without version part>`" | "isan" |
|
||||
| Papers | "doi:`<id, lowercase>`" | "doi" |
|
||||
| Type | `i` tag | `k` tag |
|
||||
| --- | --- | --- |
|
||||
| URLs | "`<URL, normalized, no fragment>`" | "web" |
|
||||
| Hashtags | "#`<topic, lowercase>`" | "#" |
|
||||
| Geohashes | "geo:`<geohash, lowercase>`" | "geo" |
|
||||
| Books | "isbn:`<id, without hyphens>`" | "isbn" |
|
||||
| Podcast Feeds | "podcast:guid:`<guid>`" | "podcast:guid" |
|
||||
| Podcast Episodes | "podcast:item:guid:`<guid>`" | "podcast:item:guid" |
|
||||
| Podcast Publishers | "podcast:publisher:guid:`<guid>`" | "podcast:publisher:guid" |
|
||||
| Movies | "isan:`<id, without version part>`" | "isan" |
|
||||
| Papers | "doi:`<id, lowercase>`" | "doi" |
|
||||
|
||||
---
|
||||
|
||||
## Examples
|
||||
|
||||
### Webpages
|
||||
|
||||
For the webpage "https://myblog.example.com/post/2012-03-27/hello-world" the "i" and "k" tags are:
|
||||
|
||||
```jsonc
|
||||
[
|
||||
["i","https://myblog.example.com/post/2012-03-27/hello-world"],
|
||||
["k", "web"]
|
||||
]
|
||||
```
|
||||
|
||||
### Books:
|
||||
|
||||
- Book ISBN: `["i", "isbn:9780765382030"]` - https://isbnsearch.org/isbn/9780765382030
|
||||
@@ -56,5 +67,3 @@ Each `i` tag MAY have a url hint as the second argument to redirect people to a
|
||||
`["i", "podcast:item:guid:d98d189b-dc7b-45b1-8720-d4b98690f31f", https://fountain.fm/episode/z1y9TMQRuqXl2awyrQxg]`
|
||||
|
||||
`["i", "isan:0000-0000-401A-0000-7", https://www.imdb.com/title/tt0120737]`
|
||||
|
||||
|
||||
|
||||
15
README.md
15
README.md
@@ -127,6 +127,10 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `20` | Picture | [68](68.md) |
|
||||
| `21` | Video Event | [71](71.md) |
|
||||
| `22` | Short-form Portrait Video Event | [71](71.md) |
|
||||
| `30` | internal reference | [NKBIP-03] |
|
||||
| `31` | external web reference | [NKBIP-03] |
|
||||
| `32` | hardcopy reference | [NKBIP-03] |
|
||||
| `33` | prompt reference | [NKBIP-03] |
|
||||
| `40` | Channel Creation | [28](28.md) |
|
||||
| `41` | Channel Metadata | [28](28.md) |
|
||||
| `42` | Channel Message | [28](28.md) |
|
||||
@@ -213,8 +217,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `30023` | Long-form Content | [23](23.md) |
|
||||
| `30024` | Draft Long-form Content | [23](23.md) |
|
||||
| `30030` | Emoji sets | [51](51.md) |
|
||||
| `30040` | Modular Article Header | [NKBIP-01] |
|
||||
| `30041` | Modular Article Content | [NKBIP-01] |
|
||||
| `30040` | Curated Publication Index | [NKBIP-01] |
|
||||
| `30041` | Curated Publication Content | [NKBIP-01] |
|
||||
| `30063` | Release artifact sets | [51](51.md) |
|
||||
| `30078` | Application-specific Data | [78](78.md) |
|
||||
| `30166` | Relay Discovery | [66](66.md) |
|
||||
@@ -248,8 +252,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
[cornychat-slideset]: https://cornychat.com/datatypes#kind30388slideset
|
||||
[cornychat-linkset]: https://cornychat.com/datatypes#kind31388linkset
|
||||
[joinstr]: https://gitlab.com/1440000bytes/joinstr/-/blob/main/NIP.md
|
||||
[NKBIP-01]: https://wikistr.com/nkbip-01
|
||||
[NKBIP-02]: https://wikistr.com/nkbip-02
|
||||
[NKBIP-01]: https://wikistr.com/nkbip-01*fd208ee8c8f283780a9552896e4823cc9dc6bfd442063889577106940fd927c1
|
||||
[NKBIP-02]: https://wikistr.com/nkbip-02*fd208ee8c8f283780a9552896e4823cc9dc6bfd442063889577106940fd927c1
|
||||
[NKBIP-03]: https://wikistr.com/nkbip-03*fd208ee8c8f283780a9552896e4823cc9dc6bfd442063889577106940fd927c1
|
||||
[blossom]: https://github.com/hzrd149/blossom
|
||||
[Tidal-nostr]: https://wikistr.com/tidal-nostr
|
||||
|
||||
@@ -379,4 +384,4 @@ All NIPs are public domain.
|
||||
|
||||
<a align="center" href="https://github.com/nostr-protocol/nips/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=nostr-protocol/nips" />
|
||||
</a>
|
||||
</a>
|
||||
Reference in New Issue
Block a user