mirror of
https://github.com/nostr-protocol/nips.git
synced 2025-12-09 00:28:51 +00:00
Compare commits
14 Commits
social-boo
...
bigger-nip
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b8782df594 | ||
|
|
4de6a69931 | ||
|
|
5b7d338200 | ||
|
|
2ade2e6229 | ||
|
|
85f3282e46 | ||
|
|
77fdeeb6f1 | ||
|
|
b96b72b488 | ||
|
|
507830c5c4 | ||
|
|
473f651b3e | ||
|
|
257e8700ea | ||
|
|
121258a611 | ||
|
|
5a371a5b92 | ||
|
|
4f09333ab5 | ||
|
|
8cdfe98e74 |
46
22.md
46
22.md
@@ -18,9 +18,9 @@ and `p` for the author of the parent item.
|
||||
|
||||
```jsonc
|
||||
{
|
||||
kind: 1111,
|
||||
content: '<comment>',
|
||||
tags: [
|
||||
"kind": 1111,
|
||||
"content": "<comment>",
|
||||
"tags": [
|
||||
// root scope: event addresses, event ids, or I-tags.
|
||||
["<A, E, I>", "<address, id or I-value>", "<relay or web page hint>", "<root event's pubkey, if an E tag>"],
|
||||
// the root item kind
|
||||
@@ -64,9 +64,9 @@ A comment on a blog post looks like this:
|
||||
|
||||
```jsonc
|
||||
{
|
||||
kind: 1111,
|
||||
content: 'Great blog post!',
|
||||
tags: [
|
||||
"kind": 1111,
|
||||
"content": "Great blog post!",
|
||||
"tags": [
|
||||
// top-level comments scope to event addresses or ids
|
||||
["A", "30023:3c9849383bdea883b0bd16fece1ed36d37e37cdde3ce43b17ea4e9192ec11289:f9347ca7", "wss://example.relay"],
|
||||
// the root kind
|
||||
@@ -91,9 +91,9 @@ A comment on a [NIP-94](94.md) file looks like this:
|
||||
|
||||
```jsonc
|
||||
{
|
||||
kind: 1111,
|
||||
content: 'Great file!',
|
||||
tags: [
|
||||
"kind": 1111,
|
||||
"content": "Great file!",
|
||||
"tags": [
|
||||
// top-level comments have the same scope and reply to addresses or ids
|
||||
["E", "768ac8720cdeb59227cf95e98b66560ef03d8bc9a90d721779e76e68fb42f5e6", "wss://example.relay", "3721e07b079525289877c366ccab47112bdff3d1b44758ca333feb2dbbbbe5bb"],
|
||||
// the root kind
|
||||
@@ -115,9 +115,9 @@ A reply to a comment looks like this:
|
||||
|
||||
```jsonc
|
||||
{
|
||||
kind: 1111,
|
||||
content: 'This is a reply to "Great file!"',
|
||||
tags: [
|
||||
"kind": 1111,
|
||||
"content": "This is a reply to \"Great file!\"",
|
||||
"tags": [
|
||||
// nip-94 file event id
|
||||
["E", "768ac8720cdeb59227cf95e98b66560ef03d8bc9a90d721779e76e68fb42f5e6", "wss://example.relay", "fd913cd6fa9edb8405750cd02a8bbe16e158b8676c0e69fdc27436cc4a54cc9a"],
|
||||
// the root kind
|
||||
@@ -138,9 +138,9 @@ A comment on a website's url looks like this:
|
||||
|
||||
```jsonc
|
||||
{
|
||||
kind: 1111,
|
||||
content: 'Nice article!',
|
||||
tags: [
|
||||
"kind": 1111,
|
||||
"content": "Nice article!",
|
||||
"tags": [
|
||||
// referencing the root url
|
||||
["I", "https://abc.com/articles/1"],
|
||||
// the root "kind": for an url, the kind is its domain
|
||||
@@ -159,11 +159,11 @@ A podcast comment example:
|
||||
|
||||
```jsonc
|
||||
{
|
||||
id: "80c48d992a38f9c445b943a9c9f1010b396676013443765750431a9004bdac05",
|
||||
pubkey: "252f10c83610ebca1a059c0bae8255eba2f95be4d1d7bcfa89d7248a82d9f111",
|
||||
kind: 1111,
|
||||
content: "This was a great episode!",
|
||||
tags: [
|
||||
"id": "80c48d992a38f9c445b943a9c9f1010b396676013443765750431a9004bdac05",
|
||||
"pubkey": "252f10c83610ebca1a059c0bae8255eba2f95be4d1d7bcfa89d7248a82d9f111",
|
||||
"kind": 1111,
|
||||
"content": "This was a great episode!",
|
||||
"tags": [
|
||||
// podcast episode reference
|
||||
["I", "podcast:item:guid:d98d189b-dc7b-45b1-8720-d4b98690f31f", "https://fountain.fm/episode/z1y9TMQRuqXl2awyrQxg"],
|
||||
// podcast episode type
|
||||
@@ -181,9 +181,9 @@ A reply to a podcast comment:
|
||||
|
||||
```jsonc
|
||||
{
|
||||
kind: 1111,
|
||||
content: "I'm replying to the above comment.",
|
||||
tags: [
|
||||
"kind": 1111,
|
||||
"content": "I'm replying to the above comment.",
|
||||
"tags": [
|
||||
// podcast episode reference
|
||||
["I", "podcast:item:guid:d98d189b-dc7b-45b1-8720-d4b98690f31f", "https://fountain.fm/episode/z1y9TMQRuqXl2awyrQxg"],
|
||||
// podcast episode type
|
||||
|
||||
2
26.md
2
26.md
@@ -1,3 +1,5 @@
|
||||
> __Warning__ `unrecommended`: adds unecessary burden for little gain
|
||||
|
||||
NIP-26
|
||||
=======
|
||||
|
||||
|
||||
31
44.md
31
44.md
@@ -84,10 +84,12 @@ NIP-44 version 2 has the following design characteristics:
|
||||
- Slice 76-byte HKDF output into: `chacha_key` (bytes 0..32), `chacha_nonce` (bytes 32..44), `hmac_key` (bytes 44..76)
|
||||
4. Add padding
|
||||
- Content must be encoded from UTF-8 into byte array
|
||||
- Validate plaintext length. Minimum is 1 byte, maximum is 65535 bytes
|
||||
- Validate plaintext length. Minimum is 1 byte, maximum is 4294967296 bytes
|
||||
- Padding format is: `[plaintext_length: u16][plaintext][zero_bytes]`
|
||||
- Padding algorithm is related to powers-of-two, with min padded msg size of 32 bytes
|
||||
- Plaintext length is encoded in big-endian as first 2 bytes of the padded blob
|
||||
- Plaintext length is encoded in big-endian:
|
||||
- if smaller than 65536, as a u16 in the first 2 bytes of the padded blob;
|
||||
- if greater than 65536, the first 6 bytes of the padded blob, the first 2 being zero and the other 4 being the actual encoded length as u32
|
||||
5. Encrypt padded content
|
||||
- Use ChaCha20, with key and nonce from step 3
|
||||
6. Calculate MAC (message authentication code)
|
||||
@@ -124,7 +126,9 @@ validation rules, refer to BIP-340.
|
||||
6. Decrypt ciphertext
|
||||
- Use ChaCha20 with key and nonce from step 3
|
||||
7. Remove padding
|
||||
- Read the first two BE bytes of plaintext that correspond to plaintext length
|
||||
- Read the first 2 bytes,
|
||||
- if they're zero, read the next 4 bytes as the u32 big-endian plaintext length;
|
||||
- otherwise interpret those 2 bytes as the u16 plaintext length
|
||||
- Verify that the length of sliced plaintext matches the value of the two BE bytes
|
||||
- Verify that calculated padding from step 3 of the [encryption](#Encryption) process matches the actual padding
|
||||
|
||||
@@ -148,8 +152,6 @@ validation rules, refer to BIP-340.
|
||||
- `x[i:j]`, where `x` is a byte array and `i, j <= 0` returns a `(j - i)`-byte array with a copy of the
|
||||
`i`-th byte (inclusive) to the `j`-th byte (exclusive) of `x`.
|
||||
- Constants `c`:
|
||||
- `min_plaintext_size` is 1. 1 byte msg is padded to 32 bytes.
|
||||
- `max_plaintext_size` is 65535 (64kB - 1). It is padded to 65536 bytes.
|
||||
- Functions
|
||||
- `base64_encode(string)` and `base64_decode(bytes)` are Base64 ([RFC 4648](https://datatracker.ietf.org/doc/html/rfc4648), with padding)
|
||||
- `concat` refers to byte array concatenation
|
||||
@@ -182,16 +184,27 @@ def calc_padded_len(unpadded_len):
|
||||
def pad(plaintext):
|
||||
unpadded = utf8_encode(plaintext)
|
||||
unpadded_len = len(plaintext)
|
||||
if (unpadded_len < c.min_plaintext_size or
|
||||
unpadded_len > c.max_plaintext_size): raise Exception('invalid plaintext length')
|
||||
prefix = write_u16_be(unpadded_len)
|
||||
if (unpadded_len < 1 or
|
||||
unpadded_len > 4294967295): raise Exception('invalid plaintext length')
|
||||
if unpadded_len > 65536:
|
||||
prefix = concat(
|
||||
[0, 0],
|
||||
write_u32_be(unpadded_len),
|
||||
)
|
||||
else:
|
||||
prefix = write_u16_be(unpadded_len)
|
||||
suffix = zeros(calc_padded_len(unpadded_len) - unpadded_len)
|
||||
return concat(prefix, unpadded, suffix)
|
||||
|
||||
# Converts padded bytearray to unpadded plaintext
|
||||
def unpad(padded):
|
||||
unpadded_len = read_uint16_be(padded[0:2])
|
||||
unpadded = padded[2:2+unpadded_len]
|
||||
if unpadded_len == 0:
|
||||
unpadded_len = read_uint32_be(padded[2:6])
|
||||
unpadded = padded[6:6+unpadded_len]
|
||||
else:
|
||||
unpadded = padded[2:2+unpadded_len]
|
||||
|
||||
if (unpadded_len == 0 or
|
||||
len(unpadded) != unpadded_len or
|
||||
len(padded) != 2 + calc_padded_len(unpadded_len)): raise Exception('invalid padding')
|
||||
|
||||
2
60.md
2
60.md
@@ -68,7 +68,7 @@ There can be multiple `kind:7375` events for the same mint, and multiple proofs
|
||||
|
||||
* `.content` is a [NIP-44](44.md) encrypted payload:
|
||||
* `mint`: The mint the proofs belong to.
|
||||
* `proofs`: unecoded proofs
|
||||
* `proofs`: unencoded proofs
|
||||
* `del`: token-ids that were destroyed by the creation of this token. This assists with state transitions.
|
||||
|
||||
When one or more proofs of a token are spent, the token event should be [NIP-09](09.md)-deleted and, if some proofs are unspent from the same token event, a new token event should be created rolling over the unspent proofs and adding any change outputs to the new token event (the change output should include a `del` field).
|
||||
|
||||
8
61.md
8
61.md
@@ -46,10 +46,10 @@ Clients MUST prefix the public key they P2PK-lock with `"02"` (for nostr<>cashu
|
||||
|
||||
```jsonc
|
||||
{
|
||||
kind: 9321,
|
||||
content: "Thanks for this great idea.",
|
||||
pubkey: "<sender-pubkey>",
|
||||
tags: [
|
||||
"kind": 9321,
|
||||
"content": "Thanks for this great idea.",
|
||||
"pubkey": "<sender-pubkey>",
|
||||
"tags": [
|
||||
[ "proof", "{\"amount\":1,\"C\":\"02277c66191736eb72fce9d975d08e3191f8f96afb73ab1eec37e4465683066d3f\",\"id\":\"000a93d6f8a1d2c4\",\"secret\":\"[\\\"P2PK\\\",{\\\"nonce\\\":\\\"b00bdd0467b0090a25bdf2d2f0d45ac4e355c482c1418350f273a04fedaaee83\\\",\\\"data\\\":\\\"02eaee8939e3565e48cc62967e2fde9d8e2a4b3ec0081f29eceff5c64ef10ac1ed\\\"}]\"}" ],
|
||||
[ "u", "https://stablenut.umint.cash" ],
|
||||
[ "e", "<nutzapped-event-id>", "<relay-hint>" ],
|
||||
|
||||
1
65.md
1
65.md
@@ -32,6 +32,7 @@ When publishing an event, clients SHOULD:
|
||||
|
||||
- Send the event to the **write** relays of the author
|
||||
- Send the event to all **read** relays of each tagged user
|
||||
- Send the author's `kind:10002` event to all relays the event was published to
|
||||
|
||||
### Size
|
||||
|
||||
|
||||
6
66.md
6
66.md
@@ -1,4 +1,8 @@
|
||||
# NIP-66: Relay Discovery and Liveness Monitoring
|
||||
NIP-66
|
||||
======
|
||||
|
||||
Relay Discovery and Liveness Monitoring
|
||||
-------------------
|
||||
|
||||
`draft` `optional`
|
||||
|
||||
|
||||
6
69.md
6
69.md
@@ -1,6 +1,8 @@
|
||||
# NIP-69
|
||||
NIP-69
|
||||
======
|
||||
|
||||
## Peer-to-peer Order events
|
||||
Peer-to-peer Order events
|
||||
-------------------------
|
||||
|
||||
`draft` `optional`
|
||||
|
||||
|
||||
61
B0.md
Normal file
61
B0.md
Normal file
@@ -0,0 +1,61 @@
|
||||
NIP-B0
|
||||
======
|
||||
|
||||
Web Bookmarking
|
||||
---------------
|
||||
|
||||
`draft` `optional`
|
||||
|
||||
This NIP defines `kind:39701` (an _addressable event_) for a URI as a web bookmark which uses the HTTP (Hypertext transfer protocol) scheme.
|
||||
These web bookmark events are _addressable_ and deletable per [NIP-09](09.md).
|
||||
|
||||
### Editability
|
||||
|
||||
Web bookmarks are meant to be editable, so they should include a `d` tag with an identifier for the bookmark. 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 bookmark they may receive.
|
||||
|
||||
### Format
|
||||
|
||||
The format uses an _addressable event_ of `kind:39701`.
|
||||
|
||||
The `.content` of these events should be a detailed description of the web bookmark. It is required but can be an empty string.
|
||||
|
||||
The `d` tag is required.
|
||||
|
||||
In this way web bookmarks events can be queried by the `d` tag by clients, which is just their URL without the scheme, which is always and everywhere assumed to be `https://` or `http://`.
|
||||
|
||||
The querystring and the hash must be removed entirely, unless their requirement is explicitly stated either by the user or by some hardcoded list of URLs that rely on querystrings for basic routing provided by the client.
|
||||
|
||||
### Metadata
|
||||
|
||||
For the date of the last update the `.created_at` field should be used. For "tags"/"hashtags" (i.e. topics about which the event might be of relevance) the `t` tag should be used.
|
||||
|
||||
Other metadata fields can be added as tags to the event as necessary.
|
||||
|
||||
* `"published_at"`, for the timestamp in unix seconds (stringified) of the first time the bookmark was published
|
||||
* `"title"`, title about bookmark and can be used as a attribute for the HTML link element
|
||||
|
||||
## Example event
|
||||
|
||||
```jsonc
|
||||
{
|
||||
"kind": 39701,
|
||||
"id": "d7a92714f81d0f712e715556aee69ea6da6bfb287e6baf794a095d301d603ec7",
|
||||
"pubkey": "2729620da105979b22acfdfe9585274a78c282869b493abfa4120d3af2061298",
|
||||
"created_at": 1738869705,
|
||||
"tags": [
|
||||
// Required tags
|
||||
["d", "alice.blog/post"],
|
||||
// Optional tags
|
||||
["published_at", "1738863000"],
|
||||
["title", "Blog insights by Alice"],
|
||||
["t", "post"],
|
||||
["t", "insight"]
|
||||
],
|
||||
"content": "A marvelous insight by Alice about the nature of blogs and posts.",
|
||||
"sig": "36d34e6448fe0223e9999361c39c492a208bc423d2fcdfc2a3404e04df7c22dc65bbbd62dbe8a4373c62e4d29aac285b5aa4bb9b4b8053bd6207a8b45fbd0c98"
|
||||
}
|
||||
```
|
||||
|
||||
### Replies & Comments
|
||||
|
||||
Replies to `kind 39701` MUST use `kind 1111` events as comments with [NIP-22](22.md).
|
||||
41
B7.md
Normal file
41
B7.md
Normal file
@@ -0,0 +1,41 @@
|
||||
NIP-B7
|
||||
======
|
||||
|
||||
Blossom media
|
||||
-------------
|
||||
|
||||
`draft` `optional`
|
||||
|
||||
This NIP specifies how Nostr clients can use [Blossom][] for handling media.
|
||||
|
||||
Blossom is a set of standards (called BUDs) for dealing with servers that store files addressable by their SHA-256 sums. Nostr clients may make use of all the BUDs for allowing users to upload files, manage their own files and so on, but most importantly Nostr clients SHOULD make use of [BUD-03][] to fetch `kind:10063` lists of servers for each user:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "e4bee088334cb5d38cff1616e964369c37b6081be997962ab289d6c671975d71",
|
||||
"pubkey": "781208004e09102d7da3b7345e64fd193cd1bc3fce8fdae6008d77f9cabcd036",
|
||||
"content": "",
|
||||
"kind": 10063,
|
||||
"created_at": 1708774162,
|
||||
"tags": [
|
||||
["server", "https://blossom.self.hosted"],
|
||||
["server", "https://cdn.blossom.cloud"]
|
||||
],
|
||||
"sig": "cc5efa74f59e80622c77cacf4dd62076bcb7581b45e9acff471e7963a1f4d8b3406adab5ee1ac9673487480e57d20e523428e60ffcc7e7a904ac882cfccfc653"
|
||||
}
|
||||
```
|
||||
|
||||
Whenever a Nostr client finds a URL in an event published by a given user and that URL ends a 64-character hex string (with or without an ending file extension) and that URL is not available anymore, that means that string is likely a representation of a sha256 and that the user may have a `kind:10063` list of Blossom servers published.
|
||||
|
||||
Given that, the client SHOULD look into the `kind:10063` list for other Blossom servers and lookup for the same 64-character hex string in them, by just using the hex string as a path (optionally with the file extension at the end), producing a URL like `https://blossom.self.hosted/<hex-string>.png`.
|
||||
|
||||
When downloading such files Nostr clients SHOULD verify that the sha256-hash of its contents matches the 64-character hex string.
|
||||
|
||||
More information can be found at [BUD-03][].
|
||||
|
||||
### More complex interactions
|
||||
|
||||
Clients may use other facilities exposed by Blossom servers (for example, for checking if a file exists in a Blossom server, instead of actually downloading it) which are better documented in the [BUDs][Blossom].
|
||||
|
||||
[Blossom]: https://github.com/hzrd149/blossom
|
||||
[BUD-03]: https://github.com/hzrd149/blossom/blob/master/buds/03.md
|
||||
6
C0.md
6
C0.md
@@ -1,4 +1,8 @@
|
||||
# NIP-C0: Code Snippets
|
||||
NIP-C0
|
||||
======
|
||||
|
||||
Code Snippets
|
||||
-------------
|
||||
|
||||
`draft` `optional`
|
||||
|
||||
|
||||
11
README.md
11
README.md
@@ -44,7 +44,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
- [NIP-23: Long-form Content](23.md)
|
||||
- [NIP-24: Extra metadata fields and tags](24.md)
|
||||
- [NIP-25: Reactions](25.md)
|
||||
- [NIP-26: Delegated Event Signing](26.md)
|
||||
- [NIP-26: Delegated Event Signing](26.md) --- **unrecommended**: adds unecessary burden for little gain
|
||||
- [NIP-27: Text Note References](27.md)
|
||||
- [NIP-28: Public Chat](28.md)
|
||||
- [NIP-29: Relay-based Groups](29.md)
|
||||
@@ -89,6 +89,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
- [NIP-73: External Content IDs](73.md)
|
||||
- [NIP-75: Zap Goals](75.md)
|
||||
- [NIP-78: Application-specific data](78.md)
|
||||
- [NIP-7D: Threads](7D.md)
|
||||
- [NIP-84: Highlights](84.md)
|
||||
- [NIP-86: Relay Management API](86.md)
|
||||
- [NIP-88: Polls](88.md)
|
||||
@@ -99,7 +100,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
- [NIP-96: HTTP File Storage Integration](96.md)
|
||||
- [NIP-98: HTTP Auth](98.md)
|
||||
- [NIP-99: Classified Listings](99.md)
|
||||
- [NIP-7D: Threads](7D.md)
|
||||
- [NIP-B0: Web Bookmarks](B0.md)
|
||||
- [NIP-B7: Blossom](B7.md)
|
||||
- [NIP-C0: Code Snippets](C0.md)
|
||||
- [NIP-C7: Chats](C7.md)
|
||||
|
||||
@@ -247,6 +249,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `34550` | Community Definition | [72](72.md) |
|
||||
| `38383` | Peer-to-peer Order events | [69](69.md) |
|
||||
| `39000-9` | Group metadata events | [29](29.md) |
|
||||
| `39701` | Web bookmarks | [B0](B0.md) |
|
||||
|
||||
[NUD: Custom Feeds]: https://wikifreedia.xyz/cip-01/
|
||||
[nostrocket]: https://github.com/nostrocket/NIPS/blob/main/Problems.md
|
||||
@@ -341,7 +344,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) |
|
||||
| `price` | price | currency, frequency | [99](99.md) |
|
||||
| `proxy` | external ID | protocol | [48](48.md) |
|
||||
| `published_at` | unix timestamp (string) | -- | [23](23.md) |
|
||||
| `published_at` | unix timestamp (string) | -- | [23](23.md), [B0](B0.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) |
|
||||
@@ -350,7 +353,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `subject` | subject | -- | [14](14.md), [17](17.md), [34](34.md) |
|
||||
| `summary` | summary | -- | [23](23.md), [52](52.md) |
|
||||
| `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) |
|
||||
| `title` | article title | -- | [23](23.md) |
|
||||
| `title` | title | -- | [23](23.md), [B0](B0.md) |
|
||||
| `tracker` | torrent tracker URL | -- | [35](35.md) |
|
||||
| `web` | webpage URL | -- | [34](34.md) |
|
||||
| `zap` | pubkey (hex), relay URL | weight | [57](57.md) |
|
||||
|
||||
31
b0.md
31
b0.md
@@ -1,31 +0,0 @@
|
||||
NIP-B0
|
||||
======
|
||||
|
||||
Web Bookmarking
|
||||
---------------
|
||||
|
||||
`draft` `optional`
|
||||
|
||||
This NIP defines `kind:39701` as website bookmarks.
|
||||
|
||||
```jsonc
|
||||
{
|
||||
"kind": 39701,
|
||||
"id": "d7a92714f81d0f712e715556aee69ea6da6bfb287e6baf794a095d301d603ec7",
|
||||
"pubkey": "2729620da105979b22acfdfe9585274a78c282869b493abfa4120d3af2061298",
|
||||
"created_at": 1738869705,
|
||||
"tags": [
|
||||
["d", "alice.blog/post"],
|
||||
["t", "post"],
|
||||
["t", "insight"]
|
||||
],
|
||||
"content": "A marvelous insight by Alice about the nature of blogs and posts.",
|
||||
"sig": "36d34e6448fe0223e9999361c39c492a208bc423d2fcdfc2a3404e04df7c22dc65bbbd62dbe8a4373c62e4d29aac285b5aa4bb9b4b8053bd6207a8b45fbd0c98"
|
||||
}
|
||||
```
|
||||
|
||||
Bookmarks can be queried by the `d` tag, which is just their URL without the scheme, which is always and everywhere assumed to be `https://`.
|
||||
|
||||
The querystring and the hash must be removed entirely, unless their requirement is explicitly stated either by the user or by some hardcoded list of URLs that rely on querystrings for basic routing provided by the client (I've searched the internet extensively and could only find 3 websites that do this: YouTube, Hacker News and a random guy's sad old blog).
|
||||
|
||||
Bookmarks can be commented on with [NIP-22](22.md).
|
||||
Reference in New Issue
Block a user