Chapter 48 - Interop
48
Nostr Implementation Possibility - Hex № 48

Bridged Events

One tag that marks an event as bridged from another protocol and points back to the original object.

1 Overview

Not every Nostr event starts life on Nostr. A bridge 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.

A bridged copy loses its origin unless the bridge records it. This NIP defines one tag for that record: the proxy tag. The tag holds the ID of the source object and the name of the source protocol.

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.

Hint!

See a note from a Mastodon user in your Nostr feed? A bridge such as Mostr made it. Look for the proxy tag to find the original post on the Fediverse.

AP Server source object Bridge signs event Relay Client fetch EVENT REQ The event carries ["proxy", <id>, "activitypub"] back to the source.
Fig. 48-1 — The bridge path. The bridge copies the source object into a Nostr event and records the origin in a proxy tag.

2 The proxy Tag

An event bridged from another protocol links back to the source object with a proxy tag. The tag has this exact form:

Tag format - proxy
["proxy", <id>, <protocol>]
Tag elements
ElementTypeRule
proxytag nameFixed string. Marks the event as bridged.
idstringThe ID of the source object. The ID format varies by protocol. The ID must be universally unique, regardless of the protocol.
protocolstringThe name of the source protocol, for example "activitypub". See §3.

A proxy 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.

Clients may use this information in two ways:

  • Reconcile duplicated content bridged from other protocols. Two events with the same source ID describe one object.
  • Display a link to the source object.
Tech Note

The proxy 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.

3 Supported Protocols

This NIP names four protocols. The list may be extended in the future. Each protocol fixes the format of its source IDs:

Protocol registry
ProtocolID formatExample
activitypubURLhttps://gleasonator.com/objects/9f524868-c1a0-4ee7-ad51-aaa23d68b526
atprotoAT URIat://did:plc:zhbjlbmir5dganqhueg7y4i3/app.bsky.feed.post/3jt5hlibeol2i
rssURL with guid fragmenthttps://soapbox.pub/rss/feed.xml#https%3A%2F%2Fsoapbox.pub%2Fblog%2Fmostr-fediverse-nostr-bridge
webURLhttps://twitter.com/jack/status/20
Hint!

RSS items often lack stable URLs of their own. The rss format solves this. Take the feed URL, add #, then append the URL-encoded guid of the item. The result is one universally unique string.

4 Worked Example

The event below is a kind-1 text note bridged from ActivityPub. The proxy tag points to the original object on gleasonator.com. A client can render the note normally and add a "view original" link:

Bridged event - ActivityPub object
{
  "kind": 1,
  "content": "I'm vegan btw",
  "tags": [
    [
      "proxy",
      "https://gleasonator.com/objects/8f6fac53-4f66-4c6e-ac7d-92e5e78c3e79",
      "activitypub"
    ]
  ],
  "pubkey": "79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6",
  "created_at": 1691091365,
  "id": "55920b758b9c7b17854b6e3d44e6a02a83d1cb49e1227e75a30426dea94d4cb2",
  "sig": "a72f12c08f18e85d98fb92ae89e2fe63e48b8864c5e10fbdd5335f3c9f936397a6b0a7350efe251f8168b1601d7012d4a6d0ee6eec958067cf22a14f5a5ea579"
}

Here the bridge holds the keypair, not the human author. The bridge maps the ActivityPub actor to the Nostr pubkey and re-signs each object as it crosses over.

5 Version History

NIP-48 has been stable since its merge. Notable changes, newest first:

  • 20262026-05Wording cleanup ("fix: sanity") in a repo-wide sweep.
  • 20232023-11Author lines removed from all NIPs in a repo-wide cleanup.
  • Origin2023-08Alex Gleason merged the spec as "NIP-48: Proxy Tags", drawing on the Mostr bridge and the Fediverse FEP-fffd "Proxy Objects" proposal.

Original Proposal - Credits

AuthorAlex Gleason
First commit2023-08-03 — “NIP-48: Proxy Tags”
Statusdraft - optional — only bridges and interop-aware clients need it
Source48.md on GitHub - full change history

6 See Also

  • NIP-01 — the event object and the tags array that the proxy tag rides in.
  • FEP-fffd: Proxy Objects — the mirror-image proposal on the Fediverse side.
  • Mostr bridge — a live Fediverse-to-Nostr bridge that emits proxy tags.