Compare commits

..

12 Commits

Author SHA1 Message Date
fiatjaf_
14d3801485 Merge branch 'master' into video-events-regular 2025-01-30 23:21:21 -03:00
daniele
f440eac3dc Remove reference to 'username' and update descriptions in metadata (#1726) 2025-01-30 13:49:06 -08:00
P. Reis
7370729472 NIP-60: jsonconc -> jsonc (#1727) 2025-01-30 05:45:35 -08:00
k.
54b431e701 Add x tag to NIP-56 (#1669) 2025-01-29 13:15:18 +03:00
P. Reis
993c8a025e parameterized replaceable -> addressable (#1722) 2025-01-29 09:26:41 +09:00
Pablo Fernandez
36c48ca128 NIP-60: more consistent state transition (#1720) 2025-01-28 16:26:21 -03:00
Kieran
70db801bb7 Update 92.md (#1721) 2025-01-28 06:37:54 -08:00
Asai Toshiya
a7f30b1eb2 add kind 32267 to list. (#1698) 2025-01-28 12:33:53 +09:00
fiatjaf
5eb515ceb9 fix mentions in other NIPs and README. 2025-01-21 17:21:17 -03:00
fiatjaf
23884854ad add note about cavaliership. 2025-01-21 11:48:24 -03:00
fiatjaf
23ac7d9f7a rename from "horizontal" and "vertical" to "normal" and "short". 2025-01-21 11:46:03 -03:00
fiatjaf
b0ab83f04d nip71: make video events regular. 2025-01-20 16:24:31 -03:00
9 changed files with 72 additions and 55 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: <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.
- `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.
And also a convention for kind ranges that allow for easier experimentation and flexibility of relay implementation:

20
29.md
View File

@@ -122,29 +122,23 @@ Each moderation action uses a different kind and requires different arguments, w
| kind | name | tags |
| --- | --- | --- |
| 9000 | `put-user` | `p` with pubkey hex and optional roles |
| 9001 | `remove-user` | `p` with pubkey hex |
| 9002 | `edit-metadata` | fields from `kind:39000` to be modified |
| 9005 | `delete-event` | `e` with event id hex |
| 9007 | `create-group` | |
| 9008 | `delete-group` | |
| 9009 | `create-invite` | |
It's expected that the group state (of who is an allowed member or not, who is an admin and with which permission or not, what are the group name and picture etc) can be fully reconstructed from the canonical sequence of these events.
### Metadata / Group creation
Admins of a group can publish a `kind:39000` event to edit a group metadata. Relays may allow using this event to create a new group when an non-existing `d` tag is used. Relays should copy the payload of this event AS-IS and resign it with their key.
The metadata event may include extra metadata about the group, for example, it may include `k` tags for the type of kinds this group is centered around.
Relays SHOULD reject `kind:39000` events from non-admins and MUST not re-sign the event with their own key.
### Membership events
Admins of a group should publish `kind:39001` and `kind:39002` to modify the admin and members list respectively. Just like with `kind:39000`, relays should re-sign with their own key when they receive an event from an admin pubkey and MUST not re-sign the event when receiving the event from an unauthorized list.
### Group metadata events
These events contain the group id in a `d` tag instead of the `h` tag. They MUST be created by the relay master key only and a single instance of each (or none) should exist at all times for each group. They are merely informative but should reflect the latest group state (as it was changed by moderation events over time).
- *group metadata* (`kind:39000`) (optional)
This event defines the metadata for the group -- basically how clients should display it. It must be generated and signed by the relay in which is found. Relays shouldn't accept these events if they're signed by anyone else other than admins.
This event defines the metadata for the group -- basically how clients should display it. It must be generated and signed by the relay in which is found. Relays shouldn't accept these events if they're signed by anyone else.
If the group is forked and hosted in multiple relays, there will be multiple versions of this event in each different relay and so on.

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:34235 videos) |
| Curation sets | 30005 | groups of videos picked by users as interesting and/or belonging to the same category | `"a"` (kind:21 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` or `p` tag
A `report type` string MUST be included as the 3rd entry to the `e`, `p` or `x` tag
being reported, which consists of the following report types:
- `nudity` - depictions of nudity, porn, etc.
@@ -33,7 +33,9 @@ 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`
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.
`l` and `L` tags MAY be also be used as defined in [NIP-32](32.md) to support
further qualification and querying.
@@ -45,7 +47,7 @@ Example events
{
"kind": 1984,
"tags": [
["p", <pubkey>, "nudity"],
["p", "<pubkey>", "nudity"],
["L", "social.nos.ontology"],
["l", "NS-nud", "social.nos.ontology"]
],
@@ -58,8 +60,8 @@ Example events
{
"kind": 1984,
"tags": [
["e", <eventId>, "illegal"],
["p", <pubkey>]
["e", "<eventId>", "illegal"],
["p", "<pubkey>"]
],
"content": "He's insulting the king!",
// other fields...
@@ -70,13 +72,26 @@ 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 a parameterized replaceable event `kind:37375`.
The wallet event is an addressable 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 the unspent proofs that come from the mint.
Token events are used to record unspent proofs.
There can be multiple `kind:7375` events for the same mint, and multiple proofs inside each `kind:7375` event.
@@ -73,7 +73,9 @@ 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" ]
@@ -81,8 +83,11 @@ There can be multiple `kind:7375` events for the same mint, and multiple proofs
}
```
`.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.
* `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.
### 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.
@@ -96,7 +101,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-spent-token>", "<relay-hint>", "created" ],
[ "e", "<event-id-of-created-token>", "<relay-hint>", "created" ],
]),
"tags": [
[ "a", "37375:<pubkey>:my-wallet" ],
@@ -129,7 +134,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
```jsonconc
```jsonc
{
"kind": 7375,
"id": "event-id-1",
@@ -150,7 +155,7 @@ If Alice spends 4 sats from this token event
Her client:
* MUST roll over the unspent proofs:
```jsonconc
```jsonc
{
"kind": 7375,
"id": "event-id-2",
@@ -160,7 +165,8 @@ Her client:
{ "id": "1", "amount": 1 },
{ "id": "2", "amount": 2 },
{ "id": "4", "amount": 8 },
]
],
"del": [ "event-id-1" ]
}),
"tags": [
[ "a", "37375:<pubkey>:my-wallet" ]
@@ -168,8 +174,9 @@ 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
```jsonconc
```jsonc
{
"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 `34236` to display short vertical videos in the same feed.
Picture events might be used with [NIP-71](71.md)'s kind `22` to display short vertical videos in the same feed.

32
71.md
View File

@@ -6,17 +6,19 @@ Video Events
`draft` `optional`
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).
This specification defines _video_ events representing a dedicated post of externally hosted content.
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: 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).
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.
#### Format
The format uses an _addressable event_ kind `34235` for horizontal videos and `34236` for vertical videos.
The format uses a _regular event_ kind `21` for _normal_ videos and `22` for _short_ videos.
The `.content` of these events is a summary or description on the video content.
@@ -27,7 +29,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",
@@ -38,7 +40,7 @@ Example:
"fallback https://andanotherserver.com/1080/12345.mp4",
"service nip96",
],
["imeta",
["imeta",
"dim 1280x720",
"url https://myvideo.com/720/12345.mp4",
"x e1d4f808dae475ed32fb23ce52ef8ac82e3cc760702fca10d62d382d2da3697d",
@@ -49,7 +51,7 @@ Example:
"fallback https://andanotherserver.com/720/12345.mp4",
"service nip96",
],
["imeta",
["imeta",
"dim 1280x720",
"url https://myvideo.com/720/12345.m3u8",
"x 704e720af2697f5d6a198ad377789d462054b6e8d790f8a3903afbc1e044014f",
@@ -86,17 +88,15 @@ 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": 34235 | 34236,
"kind": 21 | 22,
"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 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 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.
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

View File

@@ -122,6 +122,8 @@ 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) |
@@ -227,9 +229,8 @@ 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) |
| `34235` | Video Event | [71](71.md) |
| `34236` | Short-form Portrait Video Event | [71](71.md) |
| `31990` | Handler information | [89](89.md) | |
| `32267` | Software Application | | |
| `34550` | Community Definition | [72](72.md) |
| `37375` | Cashu Wallet Event | [60](60.md) |
| `38383` | Peer-to-peer Order events | [69](69.md) |