Clips (kind 34235 / 34236)
Clips are video content published to Nostr. NIP-71 defines four video kinds across two axes — normal vs short, and legacy vs addressable:
| Kind | Format | Type |
|---|---|---|
| 21 | Normal (horizontal) video | Legacy (identified by event ID, immutable) |
| 22 | Short (vertical/portrait) video | Legacy (identified by event ID, immutable) |
| 34235 | Normal (horizontal) video | Addressable (d tag, replaceable/updatable) |
| 34236 | Short (vertical/portrait) video | Addressable (d tag, replaceable/updatable) |
Shosho supports all four and deduplicates across them. Prefer kind 34235 (normal) or 34236 (short) when publishing — addressable kinds let you update metadata after publication.
First upload the video file. See Media uploads. The upload response provides the hosted URL and the values to put into the imeta tag.
The clip’s description goes in .content (the event’s content field), not in a separate summary tag — NIP-71 doesn’t define summary for video events.
Publish a clip event (e.g. kind 34236)
nak event -k 34236 \
--content "A great clip from my stream — full description here." \
-t d=my-clip-2024 \
-t title="Amazing Moment" \
-t alt="Short video clip" \
-t duration=30 \
-t published_at=$(date +%s) \
-t 'imeta=dim 1080x1920;url https://media.nostr.build/av/abc123.mp4;m video/mp4;x <sha256>;image https://media.nostr.build/av/abc123_thumb.jpg;blurhash eQGV%25L...;service nip96' \
-t t=shosho \
--sec <nsec1...> \
wss://relay.damus.io wss://relay.primal.netTag structure
NIP-71 defines imeta as the primary source of video information. Most other tags are optional.
| Tag | Value | Required |
|---|---|---|
d | Unique identifier | Yes (kinds 34235/34236) |
title | Clip title | Yes |
imeta | Video data — url, m (MIME), dim, x (sha256), image, fallback, service, bitrate, duration, blurhash. May be repeated for variants. | Yes |
published_at | First-publish unix timestamp (recommended) | No |
alt | Alt text for accessibility | No |
duration | Top-level duration in seconds (also recommended inside imeta) | No |
text-track | Captions/subtitles WebVTT — [<encoded kind 6000 event>, <relay>] | No |
content-warning | Reason for NSFW content | No |
segment | Chapter: [<start HH:MM:SS.sss>, <end>, <title>, <thumb-url>] | No |
t | Hashtags | No |
p | Participant in the video: [<pubkey>, <relay>] | No |
r | References / links to web pages (per NIP-71 — not a media-fallback URL; use fallback inside imeta for that) | No |
origin | Imported-content tracking: [<platform>, <external-id>, <original-url>] | No |
Use kind 34236 for vertical/portrait content (stories, reels, shorts) and 34235 for normal/horizontal. NIP-71 notes the distinction is a stylistic hint to clients, not a hard size rule.
Viewing on Shosho
Build the clip’s naddr:
nak encode naddr -k <clip_kind> -d <d-tag> -a <author_hex_pubkey>View at https://shosho.live/clips/<naddr>.
Comments and reactions
Send a comment (kind 1111)
nak event -k 1111 \
--content "Great clip!" \
-t a='34235:<clip_author_hex_pubkey>:<d-tag>;wss://relay.damus.io;root' \
--sec <nsec1...> \
wss://relay.damus.io wss://relay.primal.netReact (kind 7)
nak event -k 7 \
--content "+" \
-t a='34235:<clip_author_hex_pubkey>:<d-tag>;wss://relay.damus.io;root' \
--sec <nsec1...> \
wss://relay.damus.io wss://relay.primal.netRead comments
nak req -k 1111 -k 7 -k 9735 \
-t a='34235:<clip_author_hex_pubkey>:<d-tag>' \
-l 100 \
wss://relay.damus.io wss://nos.lol