mirror of
https://github.com/nostr-protocol/nips.git
synced 2025-12-09 00:28:51 +00:00
Compare commits
8 Commits
n94-stream
...
k-tag
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ddd9e914d0 | ||
|
|
ea3fbab9b0 | ||
|
|
e6de76f76b | ||
|
|
aefad1876b | ||
|
|
4984b057c2 | ||
|
|
9be455bf57 | ||
|
|
e50f37a527 | ||
|
|
074b8eeb01 |
4
03.md
4
03.md
@@ -12,8 +12,8 @@ This NIP defines an event with `kind:1040` that can contain an [OpenTimestamps](
|
||||
{
|
||||
"kind": 1040
|
||||
"tags": [
|
||||
["e", <event-id>, <relay-url>],
|
||||
["alt", "opentimestamps attestation"]
|
||||
["e", <target-event-id>, <relay-url>],
|
||||
["k", "<target-event-kind>"]
|
||||
],
|
||||
"content": <base64-encoded OTS file data>
|
||||
}
|
||||
|
||||
3
18.md
3
18.md
@@ -40,6 +40,5 @@ Since `kind 6` reposts are reserved for `kind 1` contents, we use `kind 16`
|
||||
as a "generic repost", that can include any kind of event inside other than
|
||||
`kind 1`.
|
||||
|
||||
`kind 16` reposts SHOULD contain a `k` tag with the stringified kind number
|
||||
`kind 16` reposts SHOULD contain a `"k"` tag with the stringified kind number
|
||||
of the reposted event as its value.
|
||||
|
||||
|
||||
2
25.md
2
25.md
@@ -26,8 +26,6 @@ There SHOULD be a `p` tag set to the `pubkey` of the event being reacted to. If
|
||||
|
||||
If the event being reacted to is an addressable event, an `a` SHOULD be included together with the `e` tag, it must be set to the coordinates (`kind:pubkey:d-tag`) of the event being reacted to.
|
||||
|
||||
The reaction SHOULD include a `k` tag with the stringified kind number of the reacted event as its value.
|
||||
|
||||
The `e` and `a` tags SHOULD include relay and pubkey hints. The `p` tags SHOULD include relay hints.
|
||||
|
||||
The reaction event MAY include a `k` tag with the stringified kind number of the reacted event as its value.
|
||||
|
||||
5
57.md
5
57.md
@@ -37,6 +37,7 @@ In addition, the event MAY include the following tags:
|
||||
|
||||
- `e` is an optional hex-encoded event id. Clients MUST include this if zapping an event rather than a person.
|
||||
- `a` is an optional event coordinate that allows tipping addressable events such as NIP-23 long-form notes.
|
||||
- `k` is the stringified kind of the target event.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -49,7 +50,8 @@ Example:
|
||||
["amount", "21000"],
|
||||
["lnurl", "lnurl1dp68gurn8ghj7um5v93kketj9ehx2amn9uh8wetvdskkkmn0wahz7mrww4excup0dajx2mrv92x9xp"],
|
||||
["p", "04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9"],
|
||||
["e", "9ae37aa68f48645127299e9453eb5d908a0cbb6058ff340d528ed4d37c8994fb"]
|
||||
["e", "9ae37aa68f48645127299e9453eb5d908a0cbb6058ff340d528ed4d37c8994fb"],
|
||||
["k", "1"]
|
||||
],
|
||||
"pubkey": "97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322",
|
||||
"created_at": 1679673265,
|
||||
@@ -151,6 +153,7 @@ Example `zap receipt`:
|
||||
["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"],
|
||||
["P", "97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322"],
|
||||
["e", "3624762a1274dd9636e0c552b53086d70bc88c165bc4dc0f9e836a1eaf86c3b8"],
|
||||
["k", "1"],
|
||||
["bolt11", "lnbc10u1p3unwfusp5t9r3yymhpfqculx78u027lxspgxcr2n2987mx2j55nnfs95nxnzqpp5jmrh92pfld78spqs78v9euf2385t83uvpwk9ldrlvf6ch7tpascqhp5zvkrmemgth3tufcvflmzjzfvjt023nazlhljz2n9hattj4f8jq8qxqyjw5qcqpjrzjqtc4fc44feggv7065fqe5m4ytjarg3repr5j9el35xhmtfexc42yczarjuqqfzqqqqqqqqlgqqqqqqgq9q9qxpqysgq079nkq507a5tw7xgttmj4u990j7wfggtrasah5gd4ywfr2pjcn29383tphp4t48gquelz9z78p4cq7ml3nrrphw5w6eckhjwmhezhnqpy6gyf0"],
|
||||
["description", "{\"pubkey\":\"97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322\",\"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"]
|
||||
|
||||
124
5E.md
124
5E.md
@@ -1,124 +0,0 @@
|
||||
# NIP-5E
|
||||
|
||||
## Nostr Live Streams
|
||||
|
||||
`draft` `optional` `dep:53` `dep:92` `dep:94` `dep:40`
|
||||
|
||||
Describes a way to distribute live video streams via nostr.
|
||||
|
||||
**"Live Video" in this context implies segmented video streams like HLS or DASH**
|
||||
|
||||
All other live interactions (chat/zap/raid etc) from [NIP-53](53.md) are re-used here so that the main stream event is interchangeable.
|
||||
|
||||
## N94 Stream
|
||||
|
||||
A new `kind: 1053` event lists a single live stream.
|
||||
|
||||
Example:
|
||||
|
||||
```jsonc
|
||||
{
|
||||
"kind": 1053,
|
||||
"tags": [
|
||||
["title", "<name of the event>"],
|
||||
["summary", "<description>"],
|
||||
["image", "<preview image url>"],
|
||||
[
|
||||
"variant",
|
||||
"dim 1920x1080",
|
||||
"bitrate 5000000",
|
||||
"m video/mp2t",
|
||||
"d 1080p"
|
||||
],
|
||||
[
|
||||
"variant",
|
||||
"dim 1280x720",
|
||||
"bitrate 3000000",
|
||||
"m video/mp2t",
|
||||
"d 720p"
|
||||
],
|
||||
[
|
||||
"variant",
|
||||
"dim 1920x1080",
|
||||
"bitrate 6000000",
|
||||
"m video/mp4",
|
||||
"d 1080p-fmp4"
|
||||
],
|
||||
["t", "hashtag"],
|
||||
["relays", "wss://one.com", "wss://two.com", /*...*/],
|
||||
["pinned", "<event id of pinned live chat message>"],
|
||||
["goal", "<event id of stream goal>"]
|
||||
],
|
||||
"content": "",
|
||||
// other fields...
|
||||
}
|
||||
```
|
||||
|
||||
The `variant` tag works like `imeta` tag from [NIP-92](92.md) and defines a variant stream.
|
||||
|
||||
The `d` entry of the `variant` tag is used in the NIP-94 segment event for variant following.
|
||||
|
||||
## N94 Segment
|
||||
|
||||
Each segment of the stream is a [NIP-94](94.md) event which describes where the file can be found and its hash.
|
||||
|
||||
```jsonc
|
||||
{
|
||||
"kind": 1063,
|
||||
"tags": [
|
||||
["d", "1080p"],
|
||||
["k", "1053"],
|
||||
["e", "<id-of-kind-1053>"],
|
||||
["x", "<sha256>"],
|
||||
["m", "video/mp2t"],
|
||||
["dim", "1920x1080"],
|
||||
["duration", "2.033"],
|
||||
["index", "1234"],
|
||||
["url", "https://example.com/1234.ts"],
|
||||
["fallback", "https://another.com/1234.ts"],
|
||||
["expiration", "1752752349"],
|
||||
["service", "blossom"],
|
||||
...
|
||||
]
|
||||
// other fields...
|
||||
}
|
||||
```
|
||||
|
||||
Aside from the standard NIP-94 tags:
|
||||
|
||||
- `d`: Variant stream tag.
|
||||
- `index`: Segment index, a simple counter. Used of ordering.
|
||||
|
||||
`service` tag should be used for extended censorship resitance by looking up the appropriate server list (Blossom) of the uploader and checking for files on alternate servers.
|
||||
|
||||
An [NIP-40](40.md) `expiration` tag MAY be used to automatically clean up segments after a specified time, which is useful for live streams that are not intended to persist. Producers SHOULD also automatically delete segment files from file servers.
|
||||
|
||||
## Implementors
|
||||
|
||||
### Consumers
|
||||
|
||||
Clients wishing to implement a player should use [MSE](https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API) or similar technologies which allow appending data to the player buffer.
|
||||
|
||||
Other services MAY provide a compatability layer with [NIP-53](53.md) live streams by producing HLS playlists over a N94 Stream.
|
||||
|
||||
Clients SHOULD listen for new segments using a filter like this:
|
||||
|
||||
`{"kinds":[1063],"#e":["<id-of-kind-1053>"],"limit":10}`
|
||||
|
||||
Leaving the subscription open will allow clients to be notified immediately as segments are published and can fetch those segments and append them to the player buffer, enabling live playback without delays.
|
||||
|
||||
### Producers
|
||||
|
||||
Segment length SHOULD be carefully considered as a trade off between stream delay and total number of NIP-94 events / segment files.
|
||||
|
||||
Using `expiration` tags on N94 segments and deleting segment files from servers SHOULD be used to cleanup streams which don't want to persist after the stream is finished.
|
||||
|
||||
## Example implementations:
|
||||
|
||||
### Player
|
||||
|
||||
[zap.stream](https://github.com/v0l/zap.stream/blob/main/src/element/stream/n94-player.tsx)
|
||||
|
||||
### Producer
|
||||
|
||||
[n94](https://github.com/v0l/zap-stream-core/tree/main/crates/n94)
|
||||
1
61.md
1
61.md
@@ -53,6 +53,7 @@ Clients MUST prefix the public key they P2PK-lock with `"02"` (for nostr<>cashu
|
||||
[ "proof", "{\"amount\":1,\"C\":\"02277c66191736eb72fce9d975d08e3191f8f96afb73ab1eec37e4465683066d3f\",\"id\":\"000a93d6f8a1d2c4\",\"secret\":\"[\\\"P2PK\\\",{\\\"nonce\\\":\\\"b00bdd0467b0090a25bdf2d2f0d45ac4e355c482c1418350f273a04fedaaee83\\\",\\\"data\\\":\\\"02eaee8939e3565e48cc62967e2fde9d8e2a4b3ec0081f29eceff5c64ef10ac1ed\\\"}]\"}" ],
|
||||
[ "u", "https://stablenut.umint.cash" ],
|
||||
[ "e", "<nutzapped-event-id>", "<relay-hint>" ],
|
||||
[ "k", "<nutzapped-kind>"],
|
||||
[ "p", "e9fbced3a42dcf551486650cc752ab354347dd413b307484e4fd1818ab53f991" ], // recipient of nutzap
|
||||
]
|
||||
}
|
||||
|
||||
60
A0.md
Normal file
60
A0.md
Normal file
@@ -0,0 +1,60 @@
|
||||
NIP-A0
|
||||
======
|
||||
|
||||
Voice Messages
|
||||
-----------
|
||||
|
||||
**Status:** Draft
|
||||
|
||||
This NIP defines new events `kind: 1222` for root messages and `kind: 1244` for reply messages to be used for short voice messages, typically up to 60 seconds in length.
|
||||
|
||||
## Specification
|
||||
|
||||
### Event Kind `1222` and Kind `1244`
|
||||
|
||||
The `kind: 1222` event is defined as follows:
|
||||
|
||||
- `content`: MUST be a URL pointing directly to an audio file.
|
||||
- The audio file SHOULD be in `audio/mp4` (.m4a) format using AAC or Opus encoding. Clients MAY support other common audio formats like `audio/ogg`, `audio/webm`, or `audio/mpeg` (mp3), but `audio/mp4` is recommended for broad compatibility and efficiency.
|
||||
- The audio duration SHOULD be no longer than 60 seconds. Clients publishing `kind: 1222` events SHOULD enforce this limit or provide a clear warning to the user if exceeded.
|
||||
- `tags`:
|
||||
- Tags MAY be included as per other NIPs (e.g., `t` for hashtags, `g` for geohash, etc.).
|
||||
|
||||
The `kind: 1244` event is defined as follows:
|
||||
|
||||
- To be used for replies, `kind: 1244` events MUST follow the structure of `NIP-22`.
|
||||
- `content`: MUST be a URL pointing directly to an audio file.
|
||||
- The audio file SHOULD be in `audio/mp4` (.m4a) format using AAC or Opus encoding. Clients MAY support other common audio formats like `audio/ogg`, `audio/webm`, or `audio/mpeg` (mp3), but `audio/mp4` is recommended for broad compatibility and efficiency.
|
||||
- The audio duration SHOULD be no longer than 60 seconds. Clients publishing `kind: 1222` events SHOULD enforce this limit or provide a clear warning to the user if exceeded.
|
||||
- `tags`:
|
||||
- Tags MAY be included as per other NIPs (e.g., `t` for hashtags, `g` for geohash, etc.).
|
||||
|
||||
|
||||
## Visual representation with `imeta` (NIP-92) tag (optional)
|
||||
|
||||
The following imeta (NIP-92) tags MAY be included so clients can render a visual preview without having to download the audio file first:
|
||||
|
||||
- `waveform`: amplitude values over time, space separated full integers, less than 100 values should be enough to render a nice visual
|
||||
- `duration`: audio length in seconds
|
||||
|
||||
## Examples
|
||||
|
||||
### Root Voice Message Example
|
||||
|
||||
```json
|
||||
{
|
||||
"content": "https://blossom.primal.net/5fe7df0e46ee6b14b5a8b8b92939e84e3ca5e3950eb630299742325d5ed9891b.mp4",
|
||||
"created_at": 1752501052,
|
||||
"id": "...",
|
||||
"kind": 1222,
|
||||
"pubkey": "...",
|
||||
"sig": "...",
|
||||
"tags": [
|
||||
[
|
||||
"imeta",
|
||||
"url https://blossom.primal.net/5fe7df0e46ee6b14b5a8b8b92939e84e3ca5e3950eb630299742325d5ed9891b.mp4",
|
||||
"waveform 0 7 35 8 100 100 49 8 4 16 8 10 7 2 20 10 100 100 100 100 100 100 15 100 100 100 25 60 5 4 3 1 0 100 100 15 100 29 88 0 33 11 39 100 100 19 4 100 42 35 5 0 1 5 0 0 11 38 100 94 17 11 44 58 5 100 100 100 55 14 72 100 100 57 6 1 14 2 16 100 100 40 16 100 100 6 32 14 13 41 36 16 14 6 3 0 1 2 1 6 0",
|
||||
"duration 8"
|
||||
]
|
||||
]
|
||||
}
|
||||
10
README.md
10
README.md
@@ -102,11 +102,10 @@ 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-5E: Nostr Live Streams](5E.md)
|
||||
- [NIP-A0: Voice Messages](A0.md)
|
||||
- [NIP-B0: Web Bookmarks](B0.md)
|
||||
- [NIP-B7: Blossom](B7.md)
|
||||
- [NIP-C0: Code Snippets](C0.md)
|
||||
- [NIP-7D: Threads](7D.md)
|
||||
- [NIP-C7: Chats](C7.md)
|
||||
|
||||
## Event Kinds
|
||||
@@ -149,11 +148,12 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `1021` | Bid | [15](15.md) |
|
||||
| `1022` | Bid confirmation | [15](15.md) |
|
||||
| `1040` | OpenTimestamps | [03](03.md) |
|
||||
| `1053` | Live Stream | [5E](5E.md) |
|
||||
| `1059` | Gift Wrap | [59](59.md) |
|
||||
| `1063` | File Metadata | [94](94.md) |
|
||||
| `1068` | Poll | [88](88.md) |
|
||||
| `1111` | Comment | [22](22.md) |
|
||||
| `1222` | Voice Message | [A0](A0.md) |
|
||||
| `1244` | Voice Message Comment | [A0](A0.md) |
|
||||
| `1311` | Live Chat Message | [53](53.md) |
|
||||
| `1337` | Code Snippet | [C0](C0.md) |
|
||||
| `1617` | Patches | [34](34.md) |
|
||||
@@ -201,9 +201,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `10063` | User server list | [Blossom][blossom] |
|
||||
| `10096` | File storage server list | [96](96.md) |
|
||||
| `10166` | Relay Monitor Announcement | [66](66.md) |
|
||||
| `10312` | Room Presence | [53](53.md) |
|
||||
| `13194` | Wallet Info | [47](47.md) |
|
||||
| `17375` | Cashu Wallet Event | [60](60.md) |
|
||||
| `17375` | Ecash Mint Recommendation | [87](87.md) |
|
||||
| `21000` | Lightning Pub RPC | [Lightning.Pub][lnpub] |
|
||||
| `22242` | Client Authentication | [42](42.md) |
|
||||
| `23194` | Wallet Request | [47](47.md) |
|
||||
@@ -235,6 +235,8 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
|
||||
| `30166` | Relay Discovery | [66](66.md) |
|
||||
| `30267` | App curation sets | [51](51.md) |
|
||||
| `30311` | Live Event | [53](53.md) |
|
||||
| `30312` | Interactive Room | [53](53.md) |
|
||||
| `30313` | Conference Event | [53](53.md) |
|
||||
| `30315` | User Statuses | [38](38.md) |
|
||||
| `30388` | Slide Set | [Corny Chat][cornychat-slideset] |
|
||||
| `30402` | Classified Listing | [99](99.md) |
|
||||
|
||||
Reference in New Issue
Block a user