12<html lang="en">3<head>4<meta charset="utf-8">5<meta name="viewport" content="width=device-width, initial-scale=1">6<title>NIP-71 - Video Events — Nostr Instruction Manual</title>7<meta name="description" content="NIP-71: video events. Normal and short video kinds, addressable variants, imeta video metadata, audio tracks, and title/publish rules. Complete manual page.">8<link rel="preload" href="../assets/fonts/michroma-400-latin.woff2" as="font" type="font/woff2" crossorigin>9<link rel="preload" href="../assets/fonts/exo2-var-latin.woff2" as="font" type="font/woff2" crossorigin>10<link rel="preload" href="../assets/fonts/sairacondensed-600-latin.woff2" as="font" type="font/woff2" crossorigin>11<link rel="preload" href="../assets/fonts/sairacondensed-700-latin.woff2" as="font" type="font/woff2" crossorigin>12<link rel="preload" href="../assets/fonts/sairacondensed-500-latin.woff2" as="font" type="font/woff2" crossorigin>13<link rel="preload" href="../assets/fonts/sharetechmono-400-latin.woff2" as="font" type="font/woff2" crossorigin>14<link rel="preload" href="../assets/fonts/exo2-400i-latin.woff2" as="font" type="font/woff2" crossorigin>15<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">16<link rel="stylesheet" href="../assets/manual.css">17</head>18<body>1920<svg width="0" height="0" style="position:absolute">21 <defs>22 <marker id="arr" markerWidth="9" markerHeight="9" refX="7" refY="4.5" orient="auto">23 <path d="M1,1 L8,4.5 L1,8 Z" fill="#f26a00"/>24 </marker>25 <marker id="arrb" markerWidth="9" markerHeight="9" refX="7" refY="4.5" orient="auto">26 <path d="M1,1 L8,4.5 L1,8 Z" fill="#2e5f9e"/>27 </marker>28 </defs>29</svg>3031<div class="page">32 <span class="staple s1"></span><span class="staple s2"></span>3334 <header class="band">35 <a class="logo" href="../index.html">NOSTR<b>▸</b>PROTOCOL MANUAL</a>36 <span class="booklet-note">Chapter 71 - Media</span>37 </header>38 <nav class="tabs">39 <a href="../index.html">Contents</a>40 <a href="#overview" class="on">Overview</a>41 <a href="#spec">Spec</a>42 <a href="#examples">Examples</a>43 <a href="#history">History</a>44 </nav>4546 <div class="chapter">47 <div class="nipno" data-n="71">71</div>48 <div class="titles">49 <div class="kicker">Nostr Implementation Possibility - Hex № 71</div>50 <h1>Video Events</h1>51 <p class="sub">Dedicated posts for externally hosted video: two viewing formats, addressable editions, and full playback metadata in one event.</p>52 </div>53 </div>5455 <main class="spread">56 <div class="main">5758 <h2 class="bar" id="overview"><span class="num">1</span> Overview</h2>59 <p>A <strong>video event</strong> is a dedicated post about one externally hosted video. The event does not carry the video bytes. It carries every piece of metadata a player needs: URLs, formats, resolutions, previews, audio tracks, and chapters.</p>60 <p>A <a href="01.html">NIP-01</a> <code>kind:1</code> note can also link a video. The difference is intent. A kind-1 note targets micro-blogging clients. A video event targets video-specific clients, in the style of Netflix, YouTube, or TikTok. There the video is the center of the experience, and clients need structured metadata, not a bare link.</p>61 <p>This NIP defines four kinds. Kinds <code>21</code> and <code>22</code> are regular events for normal and short videos. Kinds <code>34235</code> and <code>34236</code> are addressable versions of the same two formats. The media metadata itself rides in <code>imeta</code> tags from <a href="92.html">NIP-92</a>.</p>6263 <div class="box hint">64 <span class="tag">Hint!</span>65 <p>Read <a href="92.html">NIP-92</a> and <a href="94.html">NIP-94</a> first. This chapter reuses their <code>imeta</code> vocabulary (<code>url</code>, <code>m</code>, <code>x</code>, <code>dim</code>, <code>image</code>, <code>fallback</code>, <code>blurhash</code>, <code>service</code>) and adds three video-specific properties on top.</p>66 </div>6768 <h2 class="bar" id="spec"><span class="num">2</span> The Four Video Kinds</h2>69 <p>There are two types of video events: <strong>normal</strong> and <strong>short</strong>. Normal videos are longer and mostly horizontal (landscape). Short videos are short-form and mostly vertical (portrait): "stories", "reels", "shorts". The split lets a client build a different viewing experience for each type.</p>70 <p>The split is stylistic, not technical. Nothing except common sense stops a short video from being long, or a normal video from being vertical. The kind states how the author wants the video presented. It does not constrain the raw size or dimensions.</p>7172 <div class="tscroll"><table class="ref">73 <caption>Kind reference</caption>74 <tr><th>Kind</th><th>Type</th><th>Storage class</th></tr>75 <tr><td class="btn">21</td><td>Normal video</td><td>Regular event. Immutable once published.</td></tr>76 <tr><td class="btn">22</td><td>Short video</td><td>Regular event. Immutable once published.</td></tr>77 <tr><td class="btn">34235</td><td>Addressable normal video</td><td>Addressable event. Requires a <code>d</code> tag. Updatable.</td></tr>78 <tr><td class="btn">34236</td><td>Addressable short video</td><td>Addressable event. Requires a <code>d</code> tag. Updatable.</td></tr>79 </table></div>8081 <figure class="diagram">82 <div class="frame">83 <svg viewBox="0 0 560 200" role="img" aria-label="Four video kinds arranged by format, normal versus short, and by storage class, regular versus addressable">84 <text class="d-actor-label" x="170" y="20" text-anchor="middle">NORMAL (landscape)</text>85 <text class="d-actor-label" x="425" y="20" text-anchor="middle">SHORT (portrait)</text>86 <rect class="d-actor" x="90" y="34" width="160" height="56" rx="8"/>87 <text class="d-actor-label" x="170" y="58" text-anchor="middle">kind 21</text>88 <text class="d-note" x="170" y="76" text-anchor="middle">regular - immutable</text>89 <rect class="d-actor" x="345" y="34" width="160" height="56" rx="8"/>90 <text class="d-actor-label" x="425" y="58" text-anchor="middle">kind 22</text>91 <text class="d-note" x="425" y="76" text-anchor="middle">regular - immutable</text>92 <rect class="d-actor" x="90" y="120" width="160" height="56" rx="8"/>93 <text class="d-actor-label" x="170" y="144" text-anchor="middle">kind 34235</text>94 <text class="d-note" x="170" y="162" text-anchor="middle">addressable - d tag - updatable</text>95 <rect class="d-actor" x="345" y="120" width="160" height="56" rx="8"/>96 <text class="d-actor-label" x="425" y="144" text-anchor="middle">kind 34236</text>97 <text class="d-note" x="425" y="162" text-anchor="middle">addressable - d tag - updatable</text>98 <path class="d-msg" d="M170,92 L170,117"/>99 <path class="d-msg" d="M425,92 L425,117"/>100 <text class="d-label" x="45" y="65" text-anchor="middle">publish</text>101 <text class="d-label" x="45" y="151" text-anchor="middle">update</text>102 </svg>103 </div>104 <figcaption>Fig. 71-1 — <b>The kind grid.</b> Pick the column by presentation format. Pick the row by whether you need updates later.</figcaption>105 </figure>106107 <p>In every one of the four kinds, the <code>content</code> field holds a summary or description of the video. The primary source of video information is the <code>imeta</code> tags, described in §4.</p>108109 <h2 class="bar" id="addressable"><span class="num">3</span> Addressable Video Events</h2>110 <p>Some video posts need edits after publication. Kinds <code>34235</code> and <code>34236</code> exist for that case. They follow the same format as kinds <code>21</code> and <code>22</code>. They add one required tag: a <code>d</code> tag with a unique, user-chosen identifier string. Publish a new event with the same <code>d</code> value to update the post. The addressable reference stays stable across updates.</p>111 <p>Use the addressable kinds for:</p>112 <ul>113 <li>Metadata corrections — fix descriptions, titles, or tags without republishing the video.</li>114 <li>Preservation of imported content IDs from legacy platforms.</li>115 <li>URL migration when the hosting server changes.</li>116 <li>Platform migration tracking.</li>117 </ul>118119 <h3>Referencing an addressable video</h3>120 <p>Reference an addressable video with a standard <a href="01.html">NIP-01</a> <code>a</code> tag:</p>121 <div class="crt">122 <div class="titlebar">Address reference - a tags</div>123<pre>[<span class="s">"a"</span>, <span class="s">"34235:<pubkey>:<d-tag-value>"</span>, <span class="s">"<relay-url>"</span>] <span class="c">// normal videos</span>124[<span class="s">"a"</span>, <span class="s">"34236:<pubkey>:<d-tag-value>"</span>, <span class="s">"<relay-url>"</span>] <span class="c">// short videos</span></pre>125 </div>126127 <h2 class="bar" id="imeta"><span class="num">4</span> Video Data: imeta Tags</h2>128 <p>Each <code>imeta</code> tag describes one file. One video event can carry many <code>imeta</code> tags. Each tag can specify one <strong>variant</strong> of the video, distinguished by the <code>dim</code> (dimensions) and <code>m</code> (MIME type) properties. Extra <code>imeta</code> tags can carry separate audio tracks, one per language.</p>129 <p>Clients should check if separate audio tracks are available and prefer them over in-video audio. Separate audio allows smooth resolution switching without interrupting the sound. The <code>ov</code> flag on the <code>l</code> (language) property marks the original language track.</p>130131 <div class="tscroll"><table class="ref">132 <caption>imeta properties inherited from NIP-92 / NIP-94</caption>133 <tr><th>Property</th><th>Meaning in a video event</th></tr>134 <tr><td class="btn">url</td><td>Primary server URL of the file.</td></tr>135 <tr><td class="btn">fallback</td><td>Another server hosting the same file. Repeatable. Weight <code>url</code> and <code>fallback</code> equally; clients are recommended to use any of the provided URLs.</td></tr>136 <tr><td class="btn">m</td><td>MIME type, for example <code>video/mp4</code> or <code>application/x-mpegURL</code>.</td></tr>137 <tr><td class="btn">x</td><td>SHA-256 hash of the file, hex.</td></tr>138 <tr><td class="btn">dim</td><td>Dimensions in pixels, <code><width>x<height></code>. Selects the variant together with <code>m</code>.</td></tr>139 <tr><td class="btn">image</td><td>Preview image at the same resolution. Repeatable: extra <code>image</code> entries are fallback copies, the same way <code>fallback</code> backs up <code>url</code>.</td></tr>140 <tr><td class="btn">blurhash</td><td>Blurhash placeholder string for the preview.</td></tr>141 <tr><td class="btn">l</td><td>Language of an audio track: code, standard (for example <code>ISO-639-1</code>), and the optional <code>ov</code> flag for the original version.</td></tr>142 <tr><td class="btn">service</td><td><code>service nip96</code> lets clients search the author's <a href="96.html">NIP-96</a> server list to find the file by its hash.</td></tr>143 </table></div>144145 <p>This NIP defines three additional <code>imeta</code> properties, on top of those listed in <a href="92.html">NIP-92</a> and <a href="94.html">NIP-94</a>:</p>146 <div class="tscroll"><table class="ref">147 <caption>imeta properties added by NIP-71</caption>148 <tr><th>Property</th><th>Level</th><th>Meaning</th></tr>149 <tr><td class="btn">duration</td><td><span class="chip draft">recommended</span></td><td>Duration of the video or audio in seconds. Floating point number.</td></tr>150 <tr><td class="btn">bitrate</td><td><span class="chip draft">recommended</span></td><td>Average bitrate of the video or audio in bits per second.</td></tr>151 <tr><td class="btn">waveform</td><td><span class="chip">optional</span></td><td>Audio only. Amplitude values over time: space-separated full integers. Fewer than 100 values should be enough for a nice visual.</td></tr>152 </table></div>153154 <figure class="diagram">155 <div class="frame">156 <svg viewBox="0 0 560 230" role="img" aria-label="One video event offers several imeta variants and one audio track; the player picks a variant by dimensions and MIME type and pairs it with the audio track">157 <rect class="d-actor" x="10" y="85" width="110" height="56" rx="8"/>158 <text class="d-actor-label" x="65" y="109" text-anchor="middle">Video event</text>159 <text class="d-note" x="65" y="127" text-anchor="middle">kind 21</text>160 <rect class="d-actor" x="215" y="14" width="170" height="38" rx="6"/>161 <text class="d-actor-label" x="300" y="38" text-anchor="middle">imeta 1080p - mp4</text>162 <rect class="d-actor" x="215" y="62" width="170" height="38" rx="6"/>163 <text class="d-actor-label" x="300" y="86" text-anchor="middle">imeta 720p - mp4</text>164 <rect class="d-actor" x="215" y="110" width="170" height="38" rx="6"/>165 <text class="d-actor-label" x="300" y="134" text-anchor="middle">imeta 720p - HLS</text>166 <rect class="d-actor" x="215" y="170" width="170" height="38" rx="6"/>167 <text class="d-actor-label" x="300" y="194" text-anchor="middle">imeta audio - l en ov</text>168 <rect class="d-actor" x="460" y="85" width="90" height="56" rx="8"/>169 <text class="d-actor-label" x="505" y="109" text-anchor="middle">Player</text>170 <text class="d-note" x="505" y="127" text-anchor="middle">dim + m</text>171 <path class="d-msg" d="M122,100 C165,80 175,45 212,35"/>172 <path class="d-msg" d="M122,110 L212,84"/>173 <path class="d-msg" d="M122,120 C165,125 175,128 212,130"/>174 <path class="d-msg" d="M122,130 C165,160 175,185 212,190"/>175 <path class="d-msg blue d-flow" d="M387,84 C420,88 425,100 457,106"/>176 <path class="d-msg blue d-flow" d="M387,190 C425,180 430,140 457,124"/>177 <text class="d-label" x="425" y="70" text-anchor="middle">video</text>178 <text class="d-label" x="435" y="175" text-anchor="middle">audio</text>179 <circle r="4" fill="#2e5f9e">180 <animateMotion dur="2.6s" repeatCount="indefinite" path="M387,84 C420,88 425,100 457,106"/>181 </circle>182 <circle r="4" fill="#f26a00">183 <animateMotion dur="2.6s" begin="1.3s" repeatCount="indefinite" path="M387,190 C425,180 430,140 457,124"/>184 </circle>185 </svg>186 </div>187 <figcaption>Fig. 71-2 — <b>Variant selection.</b> The player picks one video variant by <code>dim</code> and <code>m</code>, then pairs it with a separate audio track. Resolution can switch without an audio cut.</figcaption>188 </figure>189190 <div class="crt">191 <div class="titlebar">imeta variants - three resolutions plus one audio track</div>192<pre>[193 [<span class="s">"imeta"</span>,194 <span class="s">"dim 1920x1080"</span>,195 <span class="s">"url https://myvideo.com/1080/12345.mp4"</span>,196 <span class="s">"x 3093509d1e0bc604ff60cb9286f4cd7c781553bc8991937befaacfdc28ec5cdc"</span>,197 <span class="s">"m video/mp4"</span>,198 <span class="s">"image https://myvideo.com/1080/12345.jpg"</span>,199 <span class="s">"image https://myotherserver.com/1080/12345.jpg"</span>,200 <span class="s">"fallback https://myotherserver.com/1080/12345.mp4"</span>,201 <span class="s">"fallback https://andanotherserver.com/1080/12345.mp4"</span>,202 <span class="s">"service nip96"</span>,203 <span class="s">"bitrate 3000000"</span>,204 <span class="s">"duration 29.223"</span>205 ],206 [<span class="s">"imeta"</span>,207 <span class="s">"dim 1280x720"</span>,208 <span class="s">"url https://myvideo.com/720/12345.mp4"</span>,209 <span class="s">"x e1d4f808dae475ed32fb23ce52ef8ac82e3cc760702fca10d62d382d2da3697d"</span>,210 <span class="s">"m video/mp4"</span>,211 <span class="s">"image https://myvideo.com/720/12345.jpg"</span>,212 <span class="s">"fallback https://myotherserver.com/720/12345.mp4"</span>,213 <span class="s">"service nip96"</span>,214 <span class="s">"bitrate 2000000"</span>,215 <span class="s">"duration 29.24"</span>216 ],217 [<span class="s">"imeta"</span>,218 <span class="s">"dim 1280x720"</span>,219 <span class="s">"url https://myvideo.com/720/12345.m3u8"</span>,220 <span class="s">"x 704e720af2697f5d6a198ad377789d462054b6e8d790f8a3903afbc1e044014f"</span>,221 <span class="s">"m application/x-mpegURL"</span>,222 <span class="s">"image https://myvideo.com/720/12345.jpg"</span>,223 <span class="s">"fallback https://myotherserver.com/720/12345.m3u8"</span>,224 <span class="s">"service nip96"</span>,225 <span class="s">"duration 29.21"</span>226 ],227 [<span class="s">"imeta"</span>,228 <span class="s">"url https://myaudio.com/audio/en/12345.mp3"</span>,229 <span class="s">"x b2e0a7a82ac9f3f3a71f1d9a78c381d5be9d1cf19dce258765c17c8a76287c93"</span>,230 <span class="s">"m audio/mp3"</span>,231 <span class="s">"waveform 0 7 35 8 100 100 49 8 4 16 8 10 7 2 20 10 100 100 ..."</span>,232 <span class="s">"l en ISO-639-1 ov"</span>,233 <span class="s">"fallback https://myotherserver.com/audio/en/12345.mp3"</span>,234 <span class="s">"service nip96"</span>,235 <span class="s">"bitrate 320000"</span>,236 <span class="s">"duration 29.24"</span>237 ]238]</pre>239 </div>240241 <h2 class="bar" id="tags"><span class="num">5</span> Tag Reference</h2>242 <p>Outside the <code>imeta</code> tags, a video event uses the tags below. The <code>title</code> tag is required on every video event. The <code>d</code> tag is required on the addressable kinds only.</p>243244 <div class="tscroll"><table class="ref">245 <caption>Video event tags</caption>246 <tr><th>Tag</th><th>Level</th><th>Rule</th></tr>247 <tr><td class="btn">d</td><td>required*</td><td>Unique identifier for this video. A user-chosen string. Required for kinds <code>34235</code> and <code>34236</code> only.</td></tr>248 <tr><td class="btn">title</td><td>required</td><td>Title of the video.</td></tr>249 <tr><td class="btn">published_at</td><td>optional</td><td>Unix timestamp in seconds, stringified, of the first time the video was published. Keep it stable across updates of an addressable event.</td></tr>250 <tr><td class="btn">text-track</td><td>optional, repeated</td><td>Link to a WebVTT file for the video, the type of supplementary information (captions, subtitles, chapters, or metadata), and an optional language code.</td></tr>251 <tr><td class="btn">content-warning</td><td>optional</td><td>Warning about the content of an NSFW video. The value is the reason.</td></tr>252 <tr><td class="btn">alt</td><td>optional</td><td>Description of the video for accessibility.</td></tr>253 <tr><td class="btn">segment</td><td>optional, repeated</td><td>One chapter: start timestamp in <code>HH:MM:SS.sss</code> format, end timestamp in <code>HH:MM:SS.sss</code> format, chapter title, chapter thumbnail URL.</td></tr>254 <tr><td class="btn">t</td><td>optional, repeated</td><td>Hashtag to categorize the video.</td></tr>255 <tr><td class="btn">p</td><td>optional, repeated</td><td>32-byte hex pubkey of a participant in the video, plus an optional recommended relay URL.</td></tr>256 <tr><td class="btn">r</td><td>optional, repeated</td><td>Reference link to a web page.</td></tr>257 <tr><td class="btn">origin</td><td>optional</td><td>For imported content. Tracks the original platform and ID: <code>["origin", "<platform>", "<external-id>", "<original-url>", "<optional-metadata>"]</code>.</td></tr>258 </table></div>259260 <div class="box tech">261 <span class="tag">Tech Note</span>262 <p>The source spec defines <code>text-track</code> twice, with different shapes. The tag list says: a WebVTT file link, a type, and an optional language code. The kind-21 schema instead shows <code>["text-track", "<encoded kind 6000 event>", "<recommended relay urls>"]</code>. Kind <code>6000</code> is a data-vending-machine job-result kind elsewhere. The spec does not say which shape is normative. This page lists both; expect either in the wild.</p>263 </div>264265 <div class="box tech">266 <span class="tag">Tech Note</span>267 <p>The addressable example in the source shows a top-level <code>["duration", <seconds>]</code> tag. The tag reference does not list it; the spec defines <code>duration</code> only as an <code>imeta</code> property. Treat the top-level form as a leftover from an older revision. Prefer <code>duration</code> inside <code>imeta</code>.</p>268 </div>269270 <h2 class="bar" id="examples"><span class="num">6</span> Worked Example</h2>271 <p>The event below is a complete short video, kind <code>22</code>. It offers one mp4 file with a preview image, one fallback server, a caption track, one participant, and hashtags.</p>272273 <div class="crt">274 <div class="titlebar">Wire format - kind 22 short video</div>275<pre>{276 <span class="k">"id"</span>: <span class="s">"7fdc7e6a15…"</span>,277 <span class="k">"pubkey"</span>: <span class="s">"22a12a12…"</span>,278 <span class="k">"created_at"</span>: 1749762600,279 <span class="k">"kind"</span>: 22,280 <span class="k">"content"</span>: <span class="s">"My cat discovers the water tap. 29 seconds of chaos."</span>,281 <span class="k">"tags"</span>: [282 [<span class="s">"title"</span>, <span class="s">"Cat vs. tap"</span>],283 [<span class="s">"published_at"</span>, <span class="s">"1749762600"</span>],284 [<span class="s">"alt"</span>, <span class="s">"A vertical phone video of a cat pawing at a running tap"</span>],285 [<span class="s">"imeta"</span>,286 <span class="s">"dim 1080x1920"</span>,287 <span class="s">"url https://myvideo.com/v/cat-tap.mp4"</span>,288 <span class="s">"x 3093509d1e0bc604ff60cb9286f4cd7c781553bc8991937befaacfdc28ec5cdc"</span>,289 <span class="s">"m video/mp4"</span>,290 <span class="s">"image https://myvideo.com/v/cat-tap.jpg"</span>,291 <span class="s">"fallback https://myotherserver.com/v/cat-tap.mp4"</span>,292 <span class="s">"service nip96"</span>,293 <span class="s">"bitrate 2500000"</span>,294 <span class="s">"duration 29.223"</span>295 ],296 [<span class="s">"text-track"</span>, <span class="s">"https://myvideo.com/v/cat-tap.en.vtt"</span>, <span class="s">"captions"</span>, <span class="s">"en"</span>],297 [<span class="s">"segment"</span>, <span class="s">"00:00:00.000"</span>, <span class="s">"00:00:12.000"</span>, <span class="s">"The approach"</span>, <span class="s">"https://myvideo.com/v/seg1.jpg"</span>],298 [<span class="s">"segment"</span>, <span class="s">"00:00:12.000"</span>, <span class="s">"00:00:29.223"</span>, <span class="s">"Contact"</span>, <span class="s">"https://myvideo.com/v/seg2.jpg"</span>],299 [<span class="s">"content-warning"</span>, <span class="s">"mild cat distress"</span>],300 [<span class="s">"p"</span>, <span class="s">"f7234bd4c139…76e9ca"</span>, <span class="s">"wss://relay.example.com"</span>],301 [<span class="s">"t"</span>, <span class="s">"cats"</span>],302 [<span class="s">"t"</span>, <span class="s">"shorts"</span>],303 [<span class="s">"r"</span>, <span class="s">"https://myblog.example.com/cat-tap"</span>]304 ],305 <span class="k">"sig"</span>: <span class="s">"e8551d85…"</span>306}</pre>307 </div>308309 <p>An imported catalog uses the addressable kinds instead. The event below is kind <code>34235</code>. The <code>d</code> tag preserves the legacy platform ID, and the <code>origin</code> tag records where the video came from. Republishing with the same <code>d</code> value updates the metadata in place.</p>310311 <div class="crt">312 <div class="titlebar">Wire format - kind 34235 addressable normal video (abridged)</div>313<pre>{314 <span class="k">"kind"</span>: 34235,315 <span class="k">"content"</span>: <span class="s">"Full 40-minute talk on relay economics."</span>,316 <span class="k">"tags"</span>: [317 [<span class="s">"d"</span>, <span class="s">"yt-dQw4w9WgXcQ"</span>],318 [<span class="s">"title"</span>, <span class="s">"Relay Economics 101"</span>],319 [<span class="s">"published_at"</span>, <span class="s">"1702166400"</span>],320 [<span class="s">"imeta"</span>,321 <span class="s">"url https://example.com/talks/relay-econ.mp4"</span>,322 <span class="s">"m video/mp4"</span>,323 <span class="s">"dim 1920x1080"</span>,324 <span class="s">"blurhash eVF$^OI:${M{%LRjWBoLoLaeR*"</span>,325 <span class="s">"image https://example.com/talks/relay-econ.jpg"</span>,326 <span class="s">"x 3093509d1e0bc604ff60cb9286f4cd7c781553bc8991937befaacfdc28ec5cdc"</span>,327 <span class="s">"duration 2400.0"</span>328 ],329 [<span class="s">"origin"</span>, <span class="s">"youtube"</span>, <span class="s">"dQw4w9WgXcQ"</span>, <span class="s">"https://youtube.com/watch?v=dQw4w9WgXcQ"</span>]330 ],331 <span class="c">… id / pubkey / created_at / sig as usual …</span>332}333<span class="c">-- reference it from any other event --</span>334[<span class="s">"a"</span>, <span class="s">"34235:22a12a12…:yt-dQw4w9WgXcQ"</span>, <span class="s">"wss://relay.example.com"</span>]</pre>335 </div>336337 <h2 class="bar" id="history"><span class="num">7</span> Version History</h2>338 <p>The spec started life as a proposal numbered 44 and became NIP-71 on merge. It has grown from a simple video post into a full playback-metadata format. Notable changes, newest first:</p>339 <ul class="patchnotes">340 <li><span class="ver">2026</span><span class="when">2026-05</span>Added multiple audio tracks per video: the <code>l</code> language property, the <code>ov</code> original-version flag, and the <code>waveform</code> property.</li>341 <li><span class="ver">2026</span><span class="when">2026-01</span>Added the addressable kinds <code>34235</code> and <code>34236</code>, the required <code>d</code> tag, and the <code>origin</code> tag for imported content.</li>342 <li><span class="ver">2025</span><span class="when">2025-10</span>Added the <code>duration</code> and <code>bitrate</code> imeta properties.</li>343 <li><span class="ver">2025</span><span class="when">2025-01</span>Made video events regular: the original addressable kinds <code>34235</code>/<code>34236</code> became kinds <code>21</code> and <code>22</code>.</li>344 <li><span class="ver">2024</span><span class="when">2024-05</span>Moved all file metadata into <a href="92.html">NIP-92</a> <code>imeta</code> tags; removed the <code>aes-256-gcm</code> tag.</li>345 <li class="minor"><span class="ver">2023-24</span><span class="when">2023-12</span>Early edits: removed the <code>summary</code> tag; renamed the proposal from 44 to 71.</li>346 <li><span class="ver">Origin</span><span class="when">2023-12</span>zmeyer44 opened the first draft, "Create NIP 44 for Video Events".</li>347 </ul>348349 <div class="credits">350 <h3 class="cardhead">Original Proposal - Credits</h3>351 <table>352 <tr><td>Author</td><td>zmeyer44</td></tr>353 <tr><td>First commit</td><td>2023-12-07 — “Create NIP 44 for Video Events” (renamed to 71.md on 2023-12-09)</td></tr>354 <tr><td>Status</td><td>draft - optional — implement it only in video-oriented clients</td></tr>355 <tr><td>Source</td><td><a href="https://github.com/nostr-protocol/nips/blob/master/71.md">71.md on GitHub</a> - <a href="https://github.com/nostr-protocol/nips/commits/master/71.md">full change history</a></td></tr>356 </table>357 </div>358359 <h2 class="bar"><span class="num">8</span> See Also</h2>360 <ul>361 <li><a href="01.html">NIP-01</a> — the base event format, regular and addressable storage classes, and <code>a</code> tags.</li>362 <li><a href="92.html">NIP-92</a> — defines the <code>imeta</code> tag this NIP builds on.</li>363 <li><a href="94.html">NIP-94</a> — file metadata fields (<code>url</code>, <code>m</code>, <code>x</code>, <code>dim</code>, <code>blurhash</code>, …) reused inside <code>imeta</code>.</li>364 <li><a href="96.html">NIP-96</a> — HTTP file storage; the target of <code>service nip96</code> hash lookups.</li>365 <li><a href="68.html">NIP-68</a> — picture-first feeds; the same idea for images instead of video.</li>366 <li><a href="53.html">NIP-53</a> — live streaming events, for video that is still being broadcast.</li>367 </ul>368 </div>369370 <aside>371 <div class="cartridge">372 <div class="inner">373 <h3 class="cardhead">Spec Card</h3>374 <div class="lights"><span class="led on"></span><span class="led on"></span><span class="led on"></span></div>375 <dl>376 <dt>Status</dt><dd><span class="chip draft">draft</span><span class="chip">optional</span></dd>377 <dt>Defines</dt><dd>kinds 21/22/34235/34236 - imeta <code>duration</code>/<code>bitrate</code>/<code>waveform</code> - title/segment/text-track/origin tags</dd>378 <dt>Kinds</dt><dd>21 - 22 - 34235 - 34236</dd>379 <dt>Requires</dt><dd><a href="01.html">NIP-01</a> - <a href="92.html">NIP-92</a> - <a href="94.html">NIP-94</a></dd>380 <dt>Plays well with</dt><dd><a href="96.html">NIP-96</a> file storage</dd>381 <dt>First commit</dt><dd>2023-12-07</dd>382 <dt>Last updated</dt><dd>2026-06-13</dd>383 </dl>384 </div>385 </div>386 </aside>387 </main>388389 <nav class="navbtns">390 <a href="70.html">◀ NIP-70: Protected Events</a>391 <a href="72.html">NIP-72: Moderated Communities ▶</a>392 </nav>393394 <footer class="pagefoot">395 <a href="../index.html">Nostr Protocol Manual</a>396 <span class="pageno">NIP 71 / F4</span>397 </footer>398</div>399400<script src="../assets/webmcp.js" defer></script>401</body>402</html>