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-48 - Bridged Events — Nostr Instruction Manual</title>7<meta name="description" content="NIP-48: bridged events. The proxy tag links a Nostr event back to its source object on ActivityPub, AT Protocol, RSS, or the web. 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 48 - Interop</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="48">48</div>48 <div class="titles">49 <div class="kicker">Nostr Implementation Possibility - Hex № 48</div>50 <h1>Bridged Events</h1>51 <p class="sub">One tag that marks an event as bridged from another protocol and points back to the original object.</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>Not every Nostr event starts life on Nostr. A <strong>bridge</strong> is a service that copies content from another protocol into Nostr events. ActivityPub posts, Bluesky posts, RSS items, and plain web pages can all arrive this way.</p>60 <p>A bridged copy loses its origin unless the bridge records it. This NIP defines one tag for that record: the <code>proxy</code> tag. The tag holds the ID of the source object and the name of the source protocol.</p>61 <p>Clients may use the tag in two ways. They can reconcile duplicated content that arrives over more than one protocol. They can also display a link to the source object.</p>6263 <div class="box hint">64 <span class="tag">Hint!</span>65 <p>See a note from a Mastodon user in your Nostr feed? A bridge such as Mostr made it. Look for the <code>proxy</code> tag to find the original post on the Fediverse.</p>66 </div>6768 <figure class="diagram">69 <div class="frame">70 <svg viewBox="0 0 560 190" role="img" aria-label="A source object travels from an ActivityPub server through a bridge, becomes a Nostr event with a proxy tag, and reaches a client via a relay">71 <rect class="d-actor" x="10" y="70" width="120" height="50" rx="8"/>72 <text class="d-actor-label" x="70" y="92" text-anchor="middle">AP Server</text>73 <text class="d-note" x="70" y="109" text-anchor="middle">source object</text>74 <rect class="d-actor" x="180" y="70" width="100" height="50" rx="8"/>75 <text class="d-actor-label" x="230" y="92" text-anchor="middle">Bridge</text>76 <text class="d-note" x="230" y="109" text-anchor="middle">signs event</text>77 <rect class="d-actor" x="330" y="70" width="100" height="50" rx="8"/>78 <text class="d-actor-label" x="380" y="99" text-anchor="middle">Relay</text>79 <rect class="d-actor" x="480" y="70" width="70" height="50" rx="8"/>80 <text class="d-actor-label" x="515" y="99" text-anchor="middle">Client</text>81 <path class="d-msg d-flow" d="M132,95 L177,95"/>82 <path class="d-msg d-flow" d="M282,95 L327,95"/>83 <path class="d-msg blue d-flow" d="M432,95 L477,95"/>84 <text class="d-label" x="155" y="60" text-anchor="middle">fetch</text>85 <text class="d-label" x="305" y="60" text-anchor="middle">EVENT</text>86 <text class="d-label" x="455" y="60" text-anchor="middle">REQ</text>87 <text class="d-note" x="280" y="150" text-anchor="middle">The event carries ["proxy", <id>, "activitypub"] back to the source.</text>88 <circle r="4" fill="#f26a00">89 <animateMotion dur="2.6s" repeatCount="indefinite" path="M132,95 L327,95"/>90 </circle>91 </svg>92 </div>93 <figcaption>Fig. 48-1 — <b>The bridge path.</b> The bridge copies the source object into a Nostr event and records the origin in a <code>proxy</code> tag.</figcaption>94 </figure>9596 <h2 class="bar" id="spec"><span class="num">2</span> The proxy Tag</h2>97 <p>An event bridged from another protocol links back to the source object with a <code>proxy</code> tag. The tag has this exact form:</p>9899 <div class="crt">100 <div class="titlebar">Tag format - proxy</div>101<pre>[<span class="s">"proxy"</span>, <span class="c"><id></span>, <span class="c"><protocol></span>]</pre>102 </div>103104 <div class="tscroll"><table class="ref">105 <caption>Tag elements</caption>106 <tr><th>Element</th><th>Type</th><th>Rule</th></tr>107 <tr><td class="btn">proxy</td><td>tag name</td><td>Fixed string. Marks the event as bridged.</td></tr>108 <tr><td class="btn">id</td><td>string</td><td>The ID of the source object. The ID format varies by protocol. The ID must be universally unique, regardless of the protocol.</td></tr>109 <tr><td class="btn">protocol</td><td>string</td><td>The name of the source protocol, for example <code>"activitypub"</code>. See §3.</td></tr>110 </table></div>111112 <p>A <code>proxy</code> tag may appear on any event kind. The tag makes a claim: this event did not originate on the Nostr protocol. It originated elsewhere on the web.</p>113 <p>Clients may use this information in two ways:</p>114 <ul>115 <li>Reconcile duplicated content bridged from other protocols. Two events with the same source ID describe one object.</li>116 <li>Display a link to the source object.</li>117 </ul>118119 <div class="box tech">120 <span class="tag">Tech Note</span>121 <p>The <code>proxy</code> tag is an unverified claim. This NIP defines no way to prove that the signing pubkey controls the source object. Any pubkey can attach any source ID. Clients that deduplicate on source IDs should weigh the trustworthiness of the bridge pubkey first.</p>122 </div>123124 <h2 class="bar" id="protocols"><span class="num">3</span> Supported Protocols</h2>125 <p>This NIP names four protocols. The list may be extended in the future. Each protocol fixes the format of its source IDs:</p>126127 <div class="tscroll"><table class="ref">128 <caption>Protocol registry</caption>129 <tr><th>Protocol</th><th>ID format</th><th>Example</th></tr>130 <tr><td class="btn">activitypub</td><td>URL</td><td><code>https://gleasonator.com/objects/9f524868-c1a0-4ee7-ad51-aaa23d68b526</code></td></tr>131 <tr><td class="btn">atproto</td><td>AT URI</td><td><code>at://did:plc:zhbjlbmir5dganqhueg7y4i3/app.bsky.feed.post/3jt5hlibeol2i</code></td></tr>132 <tr><td class="btn">rss</td><td>URL with guid fragment</td><td><code>https://soapbox.pub/rss/feed.xml#https%3A%2F%2Fsoapbox.pub%2Fblog%2Fmostr-fediverse-nostr-bridge</code></td></tr>133 <tr><td class="btn">web</td><td>URL</td><td><code>https://twitter.com/jack/status/20</code></td></tr>134 </table></div>135136 <div class="box hint">137 <span class="tag">Hint!</span>138 <p>RSS items often lack stable URLs of their own. The <code>rss</code> format solves this. Take the feed URL, add <code>#</code>, then append the URL-encoded <code>guid</code> of the item. The result is one universally unique string.</p>139 </div>140141 <h2 class="bar" id="examples"><span class="num">4</span> Worked Example</h2>142 <p>The event below is a kind-1 text note bridged from ActivityPub. The <code>proxy</code> tag points to the original object on <code>gleasonator.com</code>. A client can render the note normally and add a "view original" link:</p>143144 <div class="crt">145 <div class="titlebar">Bridged event - ActivityPub object</div>146<pre>{147 <span class="k">"kind"</span>: 1,148 <span class="k">"content"</span>: <span class="s">"I'm vegan btw"</span>,149 <span class="k">"tags"</span>: [150 [151 <span class="s">"proxy"</span>,152 <span class="s">"https://gleasonator.com/objects/8f6fac53-4f66-4c6e-ac7d-92e5e78c3e79"</span>,153 <span class="s">"activitypub"</span>154 ]155 ],156 <span class="k">"pubkey"</span>: <span class="s">"79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6"</span>,157 <span class="k">"created_at"</span>: 1691091365,158 <span class="k">"id"</span>: <span class="s">"55920b758b9c7b17854b6e3d44e6a02a83d1cb49e1227e75a30426dea94d4cb2"</span>,159 <span class="k">"sig"</span>: <span class="s">"a72f12c08f18e85d98fb92ae89e2fe63e48b8864c5e10fbdd5335f3c9f936397a6b0a7350efe251f8168b1601d7012d4a6d0ee6eec958067cf22a14f5a5ea579"</span>160}</pre>161 </div>162163 <p>Here the bridge holds the keypair, not the human author. The bridge maps the ActivityPub actor to the Nostr <code>pubkey</code> and re-signs each object as it crosses over.</p>164165 <h2 class="bar" id="history"><span class="num">5</span> Version History</h2>166 <p>NIP-48 has been stable since its merge. Notable changes, newest first:</p>167 <ul class="patchnotes">168 <li class="minor"><span class="ver">2026</span><span class="when">2026-05</span>Wording cleanup ("fix: sanity") in a repo-wide sweep.</li>169 <li class="minor"><span class="ver">2023</span><span class="when">2023-11</span>Author lines removed from all NIPs in a repo-wide cleanup.</li>170 <li><span class="ver">Origin</span><span class="when">2023-08</span>Alex Gleason merged the spec as "NIP-48: Proxy Tags", drawing on the Mostr bridge and the Fediverse FEP-fffd "Proxy Objects" proposal.</li>171 </ul>172173 <div class="credits">174 <h3 class="cardhead">Original Proposal - Credits</h3>175 <table>176 <tr><td>Author</td><td>Alex Gleason</td></tr>177 <tr><td>First commit</td><td>2023-08-03 — “NIP-48: Proxy Tags”</td></tr>178 <tr><td>Status</td><td>draft - optional — only bridges and interop-aware clients need it</td></tr>179 <tr><td>Source</td><td><a href="https://github.com/nostr-protocol/nips/blob/master/48.md">48.md on GitHub</a> - <a href="https://github.com/nostr-protocol/nips/commits/master/48.md">full change history</a></td></tr>180 </table>181 </div>182183 <h2 class="bar"><span class="num">6</span> See Also</h2>184 <ul>185 <li><a href="01.html">NIP-01</a> — the event object and the tags array that the <code>proxy</code> tag rides in.</li>186 <li><a href="https://codeberg.org/fediverse/fep/src/branch/main/fep/fffd/fep-fffd.md">FEP-fffd: Proxy Objects</a> — the mirror-image proposal on the Fediverse side.</li>187 <li><a href="https://mostr.pub/">Mostr bridge</a> — a live Fediverse-to-Nostr bridge that emits <code>proxy</code> tags.</li>188 </ul>189 </div>190191 <aside>192 <div class="cartridge">193 <div class="inner">194 <h3 class="cardhead">Spec Card</h3>195 <div class="lights"><span class="led on"></span><span class="led on"></span><span class="led on"></span></div>196 <dl>197 <dt>Status</dt><dd><span class="chip draft">draft</span><span class="chip">optional</span></dd>198 <dt>Defines</dt><dd><code>proxy</code> tag - protocol registry</dd>199 <dt>Kinds</dt><dd>none — applies to any event kind</dd>200 <dt>Requires</dt><dd><a href="01.html">NIP-01</a></dd>201 <dt>Protocols</dt><dd>activitypub - atproto - rss - web</dd>202 <dt>First commit</dt><dd>2023-08-03</dd>203 <dt>Last updated</dt><dd>2026-05-28</dd>204 </dl>205 </div>206 </div>207 </aside>208 </main>209210 <nav class="navbtns">211 <a href="47.html">◀ NIP-47: Nostr Wallet Connect (NWC)</a>212 <a href="49.html">NIP-49: Private Key Encryption (ncryptsec) ▶</a>213 </nav>214215 <footer class="pagefoot">216 <a href="../index.html">Nostr Protocol Manual</a>217 <span class="pageno">NIP 48 / F4</span>218 </footer>219</div>220221<script src="../assets/webmcp.js" defer></script>222</body>223</html>