mirror of
https://github.com/nostr-protocol/nips.git
synced 2025-12-09 16:48:50 +00:00
Compare commits
2 Commits
mplorentz-
...
no-batchin
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
85ea8ab124 | ||
|
|
0b3eea1053 |
4
01.md
4
01.md
@@ -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
|
||||
|
||||
1
24.md
1
24.md
@@ -17,7 +17,6 @@ These are extra fields not specified in NIP-01 that may be present in the string
|
||||
- `website`: a web URL related in any way to the event author.
|
||||
- `banner`: an URL to a wide (~1024x768) picture to be optionally displayed in the background of a profile screen.
|
||||
- `bot`: a boolean to clarify that the content is entirely or partially the result of automation, such as with chatbots or newsfeeds.
|
||||
- `birthday`: an object representing the author's birth date. The format is { "year": number, "month": number, "day": number }. Each field MAY be omitted.
|
||||
|
||||
### Deprecated fields
|
||||
|
||||
|
||||
3
29.md
3
29.md
@@ -153,7 +153,6 @@ When this event is not found, clients may still connect to the group, but treat
|
||||
["name", "Pizza Lovers"],
|
||||
["picture", "https://pizza.com/pizza.png"],
|
||||
["about", "a group for people who love pizza"],
|
||||
["guidelines", "Rule #1: No pineapple"]
|
||||
["public"], // or ["private"]
|
||||
["open"] // or ["closed"]
|
||||
]
|
||||
@@ -161,7 +160,7 @@ When this event is not found, clients may still connect to the group, but treat
|
||||
}
|
||||
```
|
||||
|
||||
`name`, `picture`, `about`, and `guidelines` are basic metadata for the group for display purposes. `public` signals the group can be _read_ by anyone, while `private` signals that only AUTHed users can read. `open` signals that anyone can request to join and the request will be automatically granted, while `closed` signals that members must be pre-approved or that requests to join will be manually handled.
|
||||
`name`, `picture` and `about` are basic metadata for the group for display purposes. `public` signals the group can be _read_ by anyone, while `private` signals that only AUTHed users can read. `open` signals that anyone can request to join and the request will be automatically granted, while `closed` signals that members must be pre-approved or that requests to join will be manually handled.
|
||||
|
||||
- *group admins* (`kind:39001`) (optional)
|
||||
|
||||
|
||||
19
34.md
19
34.md
@@ -125,7 +125,24 @@ Issues may have a `subject` tag, which clients can utilize to display a header.
|
||||
|
||||
## Replies
|
||||
|
||||
Replies to either a `kind:1621` _issue_ or a `kind:1617` _patch_ event should follow [NIP-22 comment](22.md).
|
||||
Replies are also Markdown text. The difference is that they MUST be issued as replies to either a `kind:1621` _issue_ or a `kind:1617` _patch_ event. The threading of replies and patches should follow NIP-10 rules.
|
||||
|
||||
```jsonc
|
||||
{
|
||||
"kind": 1622,
|
||||
"content": "<markdown text>",
|
||||
"tags": [
|
||||
["a", "30617:<base-repo-owner-pubkey>:<base-repo-id>", "<relay-url>"],
|
||||
["e", "<issue-or-patch-id-hex>", "", "root"],
|
||||
|
||||
// other "e" and "p" tags should be applied here when necessary, following the threading rules of NIP-10
|
||||
["p", "<patch-author-pubkey-hex>", "", "mention"],
|
||||
["e", "<previous-reply-id-hex>", "", "reply"],
|
||||
// rest of tags...
|
||||
],
|
||||
// other fields...
|
||||
}
|
||||
```
|
||||
|
||||
## Status
|
||||
|
||||
|
||||
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
|
||||
|
||||
2
65.md
2
65.md
@@ -63,8 +63,6 @@ This NIP allows Clients to connect directly with the most up-to-date relay set f
|
||||
|
||||
6. Clients SHOULD deduplicate connections by normalizing relay URIs according to [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986#section-6).
|
||||
|
||||
7. When publishing to a relay, clients SHOULD ensure the user's `kind 10002` is also available on that relay. Relays SHOULD accept and serve `kind 10002` notes for any pubkey whose notes they store. Relays MAY scrape the network for missing `kind 10002` events. The goal here is that for any note served from a relay the user can also request the author's relay selections as a way of bootstrapping further context discovery.
|
||||
|
||||
## Related articles
|
||||
- [Outbox model](https://mikedilger.com/gossip-model/)
|
||||
- [What is the Outbox Model?](https://habla.news/u/hodlbod@coracle.social/8YjqXm4SKY-TauwjOfLXS)
|
||||
|
||||
83
73.md
83
73.md
@@ -13,32 +13,29 @@ There are certain established global content identifiers such as [Book ISBNs](ht
|
||||
|
||||
## Supported IDs
|
||||
|
||||
| Type | `i` tag | `k` tag |
|
||||
| --- | --- | --- |
|
||||
| URLs | "`<URL, normalized, no fragment>`" | "web" |
|
||||
| Books | "isbn:`<id, without hyphens>`" | "isbn" |
|
||||
| Geohashes | "geo:`<geohash, lowercase>`" | "geo" |
|
||||
| Movies | "isan:`<id, without version part>`" | "isan" |
|
||||
| Papers | "doi:`<id, lowercase>`" | "doi" |
|
||||
| Hashtags | "#`<topic, lowercase>`" | "#" |
|
||||
| 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" |
|
||||
| Blockchain Transaction | "`<blockchain>`:[`<chainId>`:]tx:`<txid, hex, lowercase>`" | "`<blockchain>`:tx" |
|
||||
| Blockchain Address | "`<blockchain>`:[`<chainId>`:]address:`<address>`" | "`<blockchain>`:address" |
|
||||
| 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"],
|
||||
["i","https://myblog.example.com/post/2012-03-27/hello-world"],
|
||||
["k", "web"]
|
||||
]
|
||||
```
|
||||
@@ -61,62 +58,6 @@ Book ISBNs MUST be referenced _**without hyphens**_ as many book search APIs ret
|
||||
|
||||
Movie ISANs SHOULD be referenced _**without the version part**_ as the versions / edits of movies are not relevant. More info on ISAN parts here - https://support.isan.org/hc/en-us/articles/360002783131-Records-relations-and-hierarchies-in-the-ISAN-Registry
|
||||
|
||||
### Blockchain
|
||||
|
||||
`<blockchain>` can be any layer 1 chain (`bitcoin`, `ethereum`, `solana`, ...). If necessary (e.g. for ethereum), you can specify a `<chainId>`.
|
||||
|
||||
#### Bitcoin
|
||||
|
||||
```
|
||||
bitcoin:address:<bech32, lowercase | base58, case sensitive>
|
||||
bitcoin:tx:<txid, hex, lowercase>
|
||||
```
|
||||
|
||||
E.g. https://blockstream.info/tx/a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d
|
||||
|
||||
```jsonc
|
||||
[
|
||||
["i", "bitcoin:tx:a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d"],
|
||||
["k", "bitcoin:tx"]
|
||||
]
|
||||
```
|
||||
|
||||
E.g. https://blockstream.info/address/1HQ3Go3ggs8pFnXuHVHRytPCq5fGG8Hbhx
|
||||
|
||||
```jsonc
|
||||
[
|
||||
["i", "bitcoin:address:1HQ3Go3ggs8pFnXuHVHRytPCq5fGG8Hbhx"],
|
||||
["k", "bitcoin:address"]
|
||||
]
|
||||
```
|
||||
|
||||
#### Ethereum (and other EVM chains)
|
||||
|
||||
```
|
||||
ethereum:<chainId, integer>:tx:<txHash, hex, lowercase>
|
||||
ethereum:<chainId, integer>:address:<hex, lowercase>
|
||||
```
|
||||
|
||||
E.g. https://etherscan.io/address/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
|
||||
|
||||
```jsonc
|
||||
[
|
||||
["i", "ethereum:1:address:0xd8da6bf26964af9d7eed9e03e53415d37aa96045"],
|
||||
["k", "ethereum:address"]
|
||||
]
|
||||
```
|
||||
|
||||
E.g. https://gnosisscan.io/tx/0x98f7812be496f97f80e2e98d66358d1fc733cf34176a8356d171ea7fbbe97ccd
|
||||
|
||||
```jsonc
|
||||
[
|
||||
["i", "ethereum:100:tx:0x98f7812be496f97f80e2e98d66358d1fc733cf34176a8356d171ea7fbbe97ccd"],
|
||||
["k", "ethereum:tx"]
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
### Optional URL Hints
|
||||
|
||||
65
C0.md
65
C0.md
@@ -1,65 +0,0 @@
|
||||
# NIP-C0: Code Snippets
|
||||
|
||||
`draft` `optional`
|
||||
|
||||
## Abstract
|
||||
|
||||
This NIP defines a new event kind for sharing and storing code snippets. Unlike regular text notes (`kind:1`), code snippets have specialized metadata like language, extension, and other code-specific attributes that enhance discoverability, syntax highlighting, and improved user experience.
|
||||
|
||||
## Event Kind
|
||||
|
||||
This NIP defines `kind:1337` as a code snippet event.
|
||||
|
||||
The `.content` field contains the actual code snippet text.
|
||||
|
||||
## Optional Tags
|
||||
|
||||
- `l` - Programming language name (lowercase). Examples: "javascript", "python", "rust"
|
||||
- `name` - Name of the code snippet, commonly a filename. Examples: "hello-world.js", "quick-sort.py"
|
||||
- `extension` - File extension (without the dot). Examples: "js", "py", "rs"
|
||||
- `description` - Brief description of what the code does
|
||||
- `runtime` - Runtime or environment specification (e.g., "node v18.15.0", "python 3.11")
|
||||
- `license` - License under which the code is shared (e.g., "MIT", "GPL-3.0", "Apache-2.0")
|
||||
- `dep` - Dependency required for the code to run (can be repeated)
|
||||
- `repo` - Reference to a repository where this code originates
|
||||
|
||||
## Format
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>",
|
||||
"pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>",
|
||||
"created_at": <Unix timestamp in seconds>,
|
||||
"kind": 1337,
|
||||
"content": "function helloWorld() {\n console.log('Hello, Nostr!');\n}\n\nhelloWorld();",
|
||||
"tags": [
|
||||
["l", "javascript"],
|
||||
["extension", "js"],
|
||||
["name", "hello-world.js"],
|
||||
["description", "A basic JavaScript function that prints 'Hello, Nostr!' to the console"],
|
||||
["runtime", "node v18.15.0"],
|
||||
["license", "MIT"],
|
||||
["repo", "https://github.com/nostr-protocol/nostr"]
|
||||
],
|
||||
"sig": "<64-bytes signature of the id>"
|
||||
}
|
||||
```
|
||||
|
||||
## Client Behavior
|
||||
|
||||
Clients that support this NIP SHOULD:
|
||||
|
||||
1. Display code snippets with proper syntax highlighting based on the language.
|
||||
2. Allow copying the full code snippet with a single action.
|
||||
3. Render the code with appropriate formatting, preserving whitespace and indentation.
|
||||
4. Display the language and extension prominently.
|
||||
5. Provide "run" functionality for supported languages when possible.
|
||||
6. Display the description (if available) as part of the snippet presentation.
|
||||
|
||||
Clients MAY provide additional functionality such as:
|
||||
|
||||
1. Code editing capabilities
|
||||
2. Forking/modifying snippets
|
||||
3. Creating executable environments based on the runtime/dependencies
|
||||
4. Downloading the snippet as a file using the provided extension
|
||||
5. Sharing the snippet with attribution
|
||||
17
README.md
17
README.md
@@ -100,7 +100,6 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
- [NIP-98: HTTP Auth](98.md)
|
||||
- [NIP-99: Classified Listings](99.md)
|
||||
- [NIP-7D: Threads](7D.md)
|
||||
- [NIP-C0: Code Snippets](C0.md)
|
||||
- [NIP-C7: Chats](C7.md)
|
||||
|
||||
## Event Kinds
|
||||
@@ -149,10 +148,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `1068` | Poll | [88](88.md) |
|
||||
| `1111` | Comment | [22](22.md) |
|
||||
| `1311` | Live Chat Message | [53](53.md) |
|
||||
| `1337` | Code Snippet | [C0](C0.md) |
|
||||
| `1617` | Patches | [34](34.md) |
|
||||
| `1621` | Issues | [34](34.md) |
|
||||
| `1622` | Git Replies (deprecated) | [34](34.md) |
|
||||
| `1622` | Replies | [34](34.md) |
|
||||
| `1630`-`1633` | Status | [34](34.md) |
|
||||
| `1971` | Problem Tracker | [nostrocket][nostrocket] |
|
||||
| `1984` | Reporting | [56](56.md) |
|
||||
@@ -300,7 +298,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `I` | root external identity | -- | [22](22.md) |
|
||||
| `k` | kind | -- | [18](18.md), [25](25.md), [72](72.md), [73](73.md) |
|
||||
| `K` | root scope | -- | [22](22.md) |
|
||||
| `l` | label, label namespace, language name| -- | [32](32.md), [C0](C0.md) |
|
||||
| `l` | label, label namespace | -- | [32](32.md) |
|
||||
| `L` | label namespace | -- | [32](32.md) |
|
||||
| `m` | MIME type | -- | [94](94.md) |
|
||||
| `p` | pubkey (hex) | relay URL, petname | [01](01.md), [02](02.md), [22](22.md) |
|
||||
@@ -323,20 +321,17 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `clone` | git clone URL | -- | [34](34.md) |
|
||||
| `content-warning` | reason | -- | [36](36.md) |
|
||||
| `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) |
|
||||
| `dep` | Required dependency | -- | [C0](C0.md) |
|
||||
| `description` | description | -- | [34](34.md), [57](57.md), [58](58.md), [C0](C0.md) |
|
||||
| `description` | description | -- | [34](34.md), [57](57.md), [58](58.md) |
|
||||
| `emoji` | shortcode, image URL | -- | [30](30.md) |
|
||||
| `encrypted` | -- | -- | [90](90.md) |
|
||||
| `extension` | File extension | -- | [C0](C0.md) |
|
||||
| `expiration` | unix timestamp (string) | -- | [40](40.md) |
|
||||
| `file` | full path (string) | -- | [35](35.md) |
|
||||
| `goal` | event id (hex) | relay URL | [75](75.md) |
|
||||
| `image` | image URL | dimensions in pixels | [23](23.md), [52](52.md), [58](58.md) |
|
||||
| `imeta` | inline metadata | -- | [92](92.md) |
|
||||
| `license` | License of the shared content | -- | [C0](C0.md) |
|
||||
| `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) |
|
||||
| `location` | location string | -- | [52](52.md), [99](99.md) |
|
||||
| `name` | name | -- | [34](34.md), [58](58.md), [72](72.md), [C0](C0.md) |
|
||||
| `name` | name | -- | [34](34.md), [58](58.md), [72](72.md) |
|
||||
| `nonce` | random | difficulty | [13](13.md) |
|
||||
| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) |
|
||||
| `price` | price | currency, frequency | [99](99.md) |
|
||||
@@ -344,8 +339,6 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `published_at` | unix timestamp (string) | -- | [23](23.md) |
|
||||
| `relay` | relay url | -- | [42](42.md), [17](17.md) |
|
||||
| `relays` | relay list | -- | [57](57.md) |
|
||||
| `repo` | Reference to the origin repository | -- | [C0](C0.md) |
|
||||
| `runtime` | Runtime or environment specification | -- | [C0](C0.md) |
|
||||
| `server` | file storage server url | -- | [96](96.md) |
|
||||
| `subject` | subject | -- | [14](14.md), [17](17.md), [34](34.md) |
|
||||
| `summary` | summary | -- | [23](23.md), [52](52.md) |
|
||||
@@ -391,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