Compare commits

..

2 Commits

Author SHA1 Message Date
Kieran
e72cf63789 Update 94.md 2025-01-28 13:24:25 +00:00
Kieran
56f6919faa Add NIP-71 tags to NIP-94 spec
Adding `duration` and `bitrate` to NIP-94 to cover NIP-71 content
2025-01-28 13:23:39 +00:00
9 changed files with 46 additions and 66 deletions

2
01.md
View File

@@ -89,7 +89,7 @@ Kinds specify how clients should interpret the meaning of each event and the oth
This NIP defines one basic kind:
- `0`: **user metadata**: the `content` is set to a stringified JSON object `{name: <nickname or full name>, about: <short bio>, picture: <url of the image>}` describing the user who created the event. [Extra metadata fields](24.md#kind-0) may be set. A relay may delete older events once it gets a new one for the same pubkey.
- `0`: **user metadata**: the `content` is set to a stringified JSON object `{name: <username>, about: <string>, picture: <url, string>}` describing the user who created the event. [Extra metadata fields](24.md#kind-0) may be set. A relay may delete older events once it gets a new one for the same pubkey.
And also a convention for kind ranges that allow for easier experimentation and flexibility of relay implementation:

2
51.md
View File

@@ -50,7 +50,7 @@ Aside from their main identifier, the `"d"` tag, sets can optionally have a `"ti
| Relay sets | 30002 | user-defined relay groups the user can easily pick and choose from during various operations | `"relay"` (relay URLs) |
| Bookmark sets | 30003 | user-defined bookmarks categories , for when bookmarks must be in labeled separate groups | `"e"` (kind:1 notes), `"a"` (kind:30023 articles), `"t"` (hashtags), `"r"` (URLs) |
| Curation sets | 30004 | groups of articles picked by users as interesting and/or belonging to the same category | `"a"` (kind:30023 articles), `"e"` (kind:1 notes) |
| Curation sets | 30005 | groups of videos picked by users as interesting and/or belonging to the same category | `"a"` (kind:21 videos) |
| Curation sets | 30005 | groups of videos picked by users as interesting and/or belonging to the same category | `"a"` (kind:34235 videos) |
| Kind mute sets | 30007 | mute pubkeys by kinds<br>`"d"` tag MUST be the kind string | `"p"` (pubkeys) |
| Interest sets | 30015 | interest topics represented by a bunch of "hashtags" | `"t"` (hashtags) |
| Emoji sets | 30030 | categorized emoji groups | `"emoji"` (see [NIP-30](30.md)) |

27
56.md
View File

@@ -22,7 +22,7 @@ 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`, `p` or `x` tag
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.
@@ -33,9 +33,7 @@ being reported, which consists of the following report types:
- `impersonation` - someone pretending to be someone else
- `other` - for reports that don't fit in the above categories
Some report tags only make sense for profile reports, such as `impersonation`.
- `x` tags SHOULD be info hash of a blob which is intended to be report. when the `x` tag is represented client MUST include an `e` tag which is the id of the event that contains the mentioned blob. also, additionally these events can contain a `server` tag to point to media servers which may contain the mentioned media.
Some report tags only make sense for profile reports, such as `impersonation`
`l` and `L` tags MAY be also be used as defined in [NIP-32](32.md) to support
further qualification and querying.
@@ -47,7 +45,7 @@ Example events
{
"kind": 1984,
"tags": [
["p", "<pubkey>", "nudity"],
["p", <pubkey>, "nudity"],
["L", "social.nos.ontology"],
["l", "NS-nud", "social.nos.ontology"]
],
@@ -60,8 +58,8 @@ Example events
{
"kind": 1984,
"tags": [
["e", "<eventId>", "illegal"],
["p", "<pubkey>"]
["e", <eventId>, "illegal"],
["p", <pubkey>]
],
"content": "He's insulting the king!",
// other fields...
@@ -72,26 +70,13 @@ Example events
{
"kind": 1984,
"tags": [
["p", "<impersonator pubkey>", "impersonation"]
["p", <impersonator pubkey>, "impersonation"]
],
"content": "Profile is impersonating nostr:<victim bech32 pubkey>",
// other fields...
}
```
```jsonc
{
"kind": 1984,
"tags": [
["x", "<blob hash>", "malware"],
["e", "<event id which contains the blob on x tag>", "malware"],
["server", "https://you-may-find-the-blob-here.com/path-to-url.ext"]
],
"content": "This file contains malware software in it.",
// other fields...
}
```
Client behavior
---------------

27
60.md
View File

@@ -39,7 +39,7 @@ This NIP doesn't deal with users' *receiving* money from someone else, it's just
}
```
The wallet event is an addressable event `kind:37375`.
The wallet event is a parameterized replaceable event `kind:37375`.
Tags:
* `d` - wallet ID.
@@ -57,7 +57,7 @@ Any tag, other than the `d` tag, can be [[NIP-44]] encrypted into the `.content`
Due to addressable event being hard to delete, if a user wants to delete a wallet, they should empty the event and keep just the `d` identifier and add a `deleted` tag.
## Token Event
Token events are used to record unspent proofs.
Token events are used to record the unspent proofs that come from the mint.
There can be multiple `kind:7375` events for the same mint, and multiple proofs inside each `kind:7375` event.
@@ -73,9 +73,7 @@ There can be multiple `kind:7375` events for the same mint, and multiple proofs
"secret": "z+zyxAVLRqN9lEjxuNPSyRJzEstbl69Jc1vtimvtkPg=",
"C": "0241d98a8197ef238a192d47edf191a9de78b657308937b4f7dd0aa53beae72c46"
}
],
// tokens that were destroyed in the creation of this token
"del": [ "token-id-1" ]
]
}),
"tags": [
[ "a", "37375:<pubkey>:my-wallet" ]
@@ -83,11 +81,8 @@ There can be multiple `kind:7375` events for the same mint, and multiple proofs
}
```
* `a` an optional tag linking the token to a specific wallet.
* `.content` is a [[NIP-44]] encrypted payload:
* `mint`: The mint the proofs belong to.
* `proofs`: unecoded proofs
* `del`: token-ids that were destroyed by the creation of this token. This assists with state transitions.
`.content` is a [[NIP-44]] encrypted payload storing the mint and the unencoded proofs.
* `a` an optional tag linking the token to a specific wallet.
### Spending proofs
When one or more proofs of a token are spent, the token event should be [[NIP-09]]-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.
@@ -101,7 +96,7 @@ Clients SHOULD publish `kind:7376` events to create a transaction history when t
"content": nip44_encrypt([
[ "direction", "in" ], // in = received, out = sent
[ "amount", "1", "sat" ],
[ "e", "<event-id-of-created-token>", "<relay-hint>", "created" ],
[ "e", "<event-id-of-spent-token>", "<relay-hint>", "created" ],
]),
"tags": [
[ "a", "37375:<pubkey>:my-wallet" ],
@@ -134,7 +129,7 @@ While the client is fetching (and perhaps validating) proofs it can use the opti
## Spending token
If Alice spends 4 sats from this token event
```jsonc
```jsonconc
{
"kind": 7375,
"id": "event-id-1",
@@ -155,7 +150,7 @@ If Alice spends 4 sats from this token event
Her client:
* MUST roll over the unspent proofs:
```jsonc
```jsonconc
{
"kind": 7375,
"id": "event-id-2",
@@ -165,8 +160,7 @@ Her client:
{ "id": "1", "amount": 1 },
{ "id": "2", "amount": 2 },
{ "id": "4", "amount": 8 },
],
"del": [ "event-id-1" ]
]
}),
"tags": [
[ "a", "37375:<pubkey>:my-wallet" ]
@@ -174,9 +168,8 @@ Her client:
}
```
* MUST delete event `event-id-1`
* SHOULD add the `event-id-1` to the `del` array of deleted token-ids.
* SHOULD create a `kind:7376` event to record the spend
```jsonc
```jsonconc
{
"kind": 7376,
"content": nip44_encrypt([

6
68.md
View File

@@ -12,7 +12,7 @@ The idea is for this type of event to cater to Nostr clients resembling platform
## Picture Events
Picture events contain a `title` tag and description in the `.content`.
Picture events contain a `title` tag and description in the `.content`.
They may contain multiple images to be displayed as a single post.
@@ -81,7 +81,7 @@ They may contain multiple images to be displayed as a single post.
The `imeta` tag `annotate-user` places a user link in the specific position in the image.
Only the following media types are accepted:
Only the following media types are accepted:
- `image/apng`: Animated Portable Network Graphics (APNG)
- `image/avif`: AV1 Image File Format (AVIF)
- `image/gif`: Graphics Interchange Format (GIF)
@@ -89,4 +89,4 @@ Only the following media types are accepted:
- `image/png`: Portable Network Graphics (PNG)
- `image/webp`: Web Picture format (WEBP)
Picture events might be used with [NIP-71](71.md)'s kind `22` to display short vertical videos in the same feed.
Picture events might be used with [NIP-71](71.md)'s kind `34236` to display short vertical videos in the same feed.

32
71.md
View File

@@ -6,19 +6,17 @@ Video Events
`draft` `optional`
This specification defines _video_ events representing a dedicated post of externally hosted content.
This specification defines video events representing a dedicated post of externally hosted content. These video events are _addressable_ and delete-requestable per [NIP-09](09.md).
Unlike a `kind:1` event with a video attached, video events are meant to contain all additional metadata concerning the subject media and to be surfaced in video-specific clients rather than general micro-blogging clients. The thought is for events of this kind to be referenced in a Netflix, YouTube, or TikTok like nostr client where the video itself is at the center of the experience.
Unlike a `kind 1` event with a video attached, Video Events are meant to contain all additional metadata concerning the subject media and to be surfaced in video-specific clients rather than general micro-blogging clients. The thought is for events of this kind to be referenced in a Netflix, YouTube, or TikTok like nostr client where the video itself is at the center of the experience.
## Video Events
There are two types of video events represented by different kinds: _normal_ and _short_ video events. This is meant to allow clients to cater to each as the viewing experience for longer, mostly horizontal (landscape) videos is often different than that of short-form, mostly vertical (portrait), videos ("stories", "reels", "shorts" etc).
Nothing except cavaliership and common sense prevents a _short_ video from being long, or a _normal_ video from being vertical, and that may or may not be justified, it's mostly a stylistic qualitative difference, not a question of actual raw size.
There are two types of video events represented by different kinds: horizontal and vertical video events. This is meant to allow clients to cater to each as the viewing experience for horizontal (landscape) videos is often different than that of vertical (portrait) videos (Stories, Reels, Shorts, etc).
#### Format
The format uses a _regular event_ kind `21` for _normal_ videos and `22` for _short_ videos.
The format uses an _addressable event_ kind `34235` for horizontal videos and `34236` for vertical videos.
The `.content` of these events is a summary or description on the video content.
@@ -29,7 +27,7 @@ Each `imeta` tag can be used to specify a variant of the video by the `dim` & `m
Example:
```json
[
["imeta",
["imeta",
"dim 1920x1080",
"url https://myvideo.com/1080/12345.mp4",
"x 3093509d1e0bc604ff60cb9286f4cd7c781553bc8991937befaacfdc28ec5cdc",
@@ -40,7 +38,7 @@ Example:
"fallback https://andanotherserver.com/1080/12345.mp4",
"service nip96",
],
["imeta",
["imeta",
"dim 1280x720",
"url https://myvideo.com/720/12345.mp4",
"x e1d4f808dae475ed32fb23ce52ef8ac82e3cc760702fca10d62d382d2da3697d",
@@ -51,7 +49,7 @@ Example:
"fallback https://andanotherserver.com/720/12345.mp4",
"service nip96",
],
["imeta",
["imeta",
"dim 1280x720",
"url https://myvideo.com/720/12345.m3u8",
"x 704e720af2697f5d6a198ad377789d462054b6e8d790f8a3903afbc1e044014f",
@@ -88,15 +86,17 @@ Additionally `service nip96` may be included to allow clients to search the auth
"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": 21 | 22,
"kind": 34235 | 34236,
"content": "<summary / description of video>",
"tags": [
["d", "<UUID>"],
["title", "<title of video>"],
["published_at", "<unix timestamp>"],
["alt", <description>],
// video Data
["imeta",
// Video Data
["imeta",
"dim 1920x1080",
"url https://myvideo.com/1080/12345.mp4",
"x 3093509d1e0bc604ff60cb9286f4cd7c781553bc8991937befaacfdc28ec5cdc",
@@ -113,17 +113,17 @@ Additionally `service nip96` may be included to allow clients to search the auth
["content-warning", "<reason>"],
["segment", <start>, <end>, "<title>", "<thumbnail URL>"],
// participants
// Participants
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>"],
["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>"],
// hashtags
// Hashtags
["t", "<tag>"],
["t", "<tag>"],
// reference links
// Reference links
["r", "<url>"],
["r", "<url>"]
]
}
```
```

4
92.md
View File

@@ -6,10 +6,10 @@ Media Attachments
Media attachments (images, videos, and other files) may be added to events by including a URL in the event content, along with a matching `imeta` tag.
`imeta` ("inline metadata") tags MAY add information about media URLs in the event's content. Each `imeta` tag SHOULD match a URL in the event content. Clients MAY replace imeta URLs with rich previews.
`imeta` ("inline metadata") tags add information about media URLs in the event's content. Each `imeta` tag SHOULD match a URL in the event content. Clients may replace imeta URLs with rich previews.
The `imeta` tag is variadic, and each entry is a space-delimited key/value pair.
Each `imeta` tag MUST have a `url`, and at least one other field. `imeta` MAY include
Each `imeta` tag MUST have a `url`, and at least one other field. `imeta` may include
any field specified by [NIP 94](./94.md). There SHOULD be only one `imeta` tag per URL.
## Example

4
94.md
View File

@@ -15,7 +15,7 @@ This NIP specifies the use of the `1063` event kind, having in `content` a descr
* `url` the url to download the file
* `m` a string indicating the data type of the file. The [MIME types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) format must be used, and they should be lowercase.
* `x` containing the SHA-256 hexencoded string of the file.
* `ox` containing the SHA-256 hexencoded string of the original file, before any transformations done by the upload server
* `ox` (optional) containing the SHA-256 hexencoded string of the original file, before any transformations done by the upload server
* `size` (optional) size of file in bytes
* `dim` (optional) size of file in pixels in the form `<width>x<height>`
* `magnet` (optional) URI to magnet file
@@ -27,6 +27,8 @@ This NIP specifies the use of the `1063` event kind, having in `content` a descr
* `alt` (optional) description for accessibility
* `fallback` (optional) zero or more fallback file sources in case `url` fails
* `service` (optional) service type which is serving the file (eg. [NIP-96](96.md))
* `duration` (optional) duration of media (video/audio) in seconds
* `bitrate` (optional) average bitrate of media (video/audio) in bits/sec
```jsonc
{

View File

@@ -122,8 +122,6 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `16` | Generic Repost | [18](18.md) |
| `17` | Reaction to a website | [25](25.md) |
| `20` | Picture | [68](68.md) |
| `21` | Video Event | [71](71.md) |
| `22` | Short-form Portrait Video Event | [71](71.md) |
| `40` | Channel Creation | [28](28.md) |
| `41` | Channel Metadata | [28](28.md) |
| `42` | Channel Message | [28](28.md) |
@@ -229,8 +227,10 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `31924` | Calendar | [52](52.md) |
| `31925` | Calendar Event RSVP | [52](52.md) |
| `31989` | Handler recommendation | [89](89.md) |
| `31990` | Handler information | [89](89.md) | |
| `32267` | Software Application | | |
| `31990` | Handler information | [89](89.md) |
| `32267` | Software Application | |
| `34235` | Video Event | [71](71.md) |
| `34236` | Short-form Portrait Video Event | [71](71.md) |
| `34550` | Community Definition | [72](72.md) |
| `37375` | Cashu Wallet Event | [60](60.md) |
| `38383` | Peer-to-peer Order events | [69](69.md) |