CINXE.COM

Bridgy Fed

<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Bridgy Fed</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="mobile-web-app-capable" content="yes"/> <link rel="shortcut icon" sizes="128x128" href="https://brid.gy/static/bridgy_logo_128.jpg"> <link rel="apple-touch-icon-precomposed" sizes="128x128" href="https://brid.gy/static/bridgy_logo_128.jpg"> <!-- 32x32 last so that browsers prefer it --> <link rel="shortcut icon" sizes="32x32" href="https://brid.gy/static/favicon.png"> <link rel="apple-touch-icon-precomposed" sizes="32x32" href="https://brid.gy/static/favicon.png"> <link rel="stylesheet" href="/oauth_dropins_static/bootstrap.min.css" /> <link rel="stylesheet" href="/oauth_dropins_static/util.css" type="text/css" /> <link rel="stylesheet" href="/static/style.css" type="text/css" /> <link rel="webmention" href="/webmention" /> <!-- Not async because it adds a DOMContentLoaded event listener, which may -- happen before an async script loads. --> <script src="/oauth_dropins_static/util.js"></script> </head> <body id=""> <main class="tp-main lead container "> <div id="header" class="row"> <p id="logo"> <a href="/"> <img id="logo-img" src="/static/bridgy_logo_with_alpha.png" /> <span class="big">Bridgy Fed</span> </a> </p> <p class="header-links"> <a href="/docs">Docs</a> &nbsp; <a href="https://snarfed.org/?s=%22bridgy+fed%22">News</a> &nbsp; <a href="https://github.com/snarfed/bridgy-fed">Code</a> &nbsp; <a href="https://github.com/snarfed/bridgy-fed/issues">Issues</a> </p> </div> <style type="text/css"> @media screen and (max-width: 455px) { .half-sidebyside { width: 45% !important; } } </style> <div id="docs"> <div class="right half"> <div class="right half-sidebyside"> <a href="/static/snarfed_mastodon.png"> <img class="shadow" src="/static/snarfed_mastodon.png" /> </a> <p><em>...bridged to the fediverse</em> </div> <div class="half-sidebyside"> <a href="/static/snarfed_web_site.png"> <img class="shadow" src="/static/snarfed_web_site.png" /> </a> <p><em>Personal web site</em> </div> <br> <div class="right half-sidebyside"> <a href="/static/gargron_bluesky.png"> <img class="shadow" src="/static/gargron_bluesky.png" /> </a> <p><em>...bridged to Bluesky</em> </div> <div class="half-sidebyside"> <a href="/static/gargron_mastodon.png"> <img class="shadow" src="/static/gargron_mastodon.png" /> </a> <p><em>Fediverse account</em> </div> <br> <div class="right half-sidebyside"> <a href="/static/jay_mastodon.png"> <img class="shadow" src="/static/jay_mastodon.png" /> </a> <p><em>...bridged to the fediverse</em> </div> <div class="half-sidebyside"> <a href="/static/jay_bluesky.png"> <img class="shadow" src="/static/jay_bluesky.png" /> </a> <p><em>Bluesky account</em> </div> </div> <!-- </div> --> <p>Bridgy Fed is a decentralized social network bridge. It connects the <a href="https://en.wikipedia.org/wiki/Fediverse">fediverse</a>, the <a href="https://indieweb.org/">web</a>, and <a href="https://bsky.social/">Bluesky</a>. If you're on one of these networks, you can use Bridgy Fed to follow people on other networks, see their posts, and reply and like and repost them. Likewise, they'll be able to see you and your posts too.</p> <p><a href="/docs#get-started">Click here to get started</a>, or read on for more information and setup details.</p> <br> <ul class="docs"> <p><em>About</em></p> <li><a href="#which-networks">Which networks are supported?</a></li> <li><a href="#visibility">Who can see me and my stuff?</a></li> <li><a href="#other-bridges">What about other bridges?</a></li> <li><a href="#bridgy-classic">What's the difference between this and Bridgy classic, ie non-Fed?</a></li> <li><a href="#behavior-mismatches">How does this handle behavior differences between networks?</a></li> <li><a href="#format-mismatches">How does this handle formatting differences between networks?</a></li> <li><a href="#moderation">What about moderation? How do blocks, mutes, etc work?</a></li> <li><a href="#opt-out">How do I opt out and remove my site or account?</a></li> <li><a href="#dms">Why is Bridgy Fed chatting or DMing with me?</a></li> <li><a href="#migration">Is account migration supported?</a></li> <li><a href="#use-like-normal">Can I log into my bridged account and use it like a normal account?</a></li> <li><a href="#cross-post">Can I use this to bridge two existing accounts that I already have?</a></li> <br> <p><em>Using</em></p> <li><a href="#get-started">How do I get started?</a></li> <li><a href="#which-accounts">Which accounts do I need?</a></li> <li><a href="#login">How do I log into Bridgy Fed?</a></li> <li><a href="#update-profile">How do I update my profile?</a></li> <li><a href="#troubleshooting">I tried it, and it didn't work!</a></li> <li><a href="#user-page">Can I see my account's status and recent activity?</a></li> <li><a href="#follower-count">How does my bridged account's follower count work?</a></li> <li><a href="#mention">How do I @-mention a bridged user?</a></li> <li><a href="#delete">How do I delete a post?</a></li> <li><a href="#block">How do I block someone in another network who's not bridged into mine?</a></li> <li><a href="#enhanced">The <code>*.brid.gy</code> domain in my bridged account is ugly. Can I use my own domain instead?</a></li> <li><a href="#dm-commands">What commands can I DM the bot account?</a></li> <li><a href="#dm-request">I want to follow someone, but they're not bridged!</a></li> <br> <p><em>From the fediverse</em></p> <li><a href="#fediverse-get-started">How do I get started?</a></li> <li><a href="#fediverse-follow-bluesky">How do I find a bridged Bluesky account?</a></li> <li><a href="#fediverse-protocol-bot-user-blocked">I can't find <code>@bsky.brid.gy@bsky.brid.gy</code> on the fediverse!</a></li> <li><a href="#fediverse-follow-web">How do I find a bridged web site?</a></li> <li><a href="#fediverse-what">Which stuff of mine from the fediverse will get bridged?</a></li> <li><a href="#fediverse-admins">I'm a fediverse instance admin. What do I need to know?</a></li> <br> <p><em>To the fediverse</em></p> <li><a href="#mastodon-link-verification">How do I verify my profile links (ie get green checks) in Mastodon?</a></li> <li><a href="#fediverse-enhanced">Can I use my own domain as my fediverse handle?</a></li> <li><a href="#fediverse-delete">I disabled my bridged profile, or deleted a post, but it's still visible in the fediverse!</a></li> <li><a href="#instance-subdomains">Could other networks' instances get their own brid.gy subdomains, so that fediverse admins can federate with or block them individually?</a></li> <br> <p><em>From Bluesky</em></p> <li><a href="#bluesky-get-started">How do I get started?</a></li> <li><a href="#bluesky-follow-fediverse">How do I find a bridged fediverse account?</a></li> <li><a href="#bluesky-follow-web">How do I find a bridged web site?</a></li> <li><a href="#bluesky-reply-controls">Can I use Bluesky's reply controls?</a></li> <br> <p><em>To Bluesky</em></p> <li><a href="#bluesky-what-to">Which stuff of mine can get bridged into Bluesky?</a></li> <li><a href="#bluesky-what-not-to">Which stuff can't get bridged into Bluesky?</a></li> <li><a href="#bluesky-hashtags-in-text">Why didn't my hashtag show up?</a></li> <li><a href="#bluesky-report">What happens when I report a bridged Bluesky user?</a></li> <li><a href="#bluesky-edits">I edited a post, but it didn't get edited in Bluesky!</a></li> <li><a href="#bluesky-video">Why can't I see a video?</a></li> <li><a href="#bluesky-enhanced">Can I use my own domain as my Bluesky handle?</a></li> <li><a href="#bluesky-fields">How can I see the full text or original URL for a bridged post?</a></li> <li><a href="#bluesky-image-cdn">My images or videos are blank in Bluesky!</a></li> <br> <p><em>From the web</em></p> <li><a href="#web-get-started">How do I get started?</a></li> <li><a href="#web-profile">Where does my profile info come from?</a></li> <li><a href="#web-how-post">How does Bridgy Fed find my posts?</a></li> <li><a href="#web-interpret">How does it interpret and translate my posts?</a></li> <li><a href="#web-which-parts">How does it decide which parts of my posts to include?</a></li> <li><a href="#web-visible-links">What's up with the visible fed.brid.gy links in my fediverse posts?</a></li> <li><a href="#web-reply">How do I reply to a fediverse post?</a></li> <li><a href="#web-like">How do I favorite (aka like) or boost (aka repost) a fediverse post?</a></li> <li><a href="#web-follow">How do I follow someone?</a></li> <li><a href="#web-unfollow">How do I unfollow someone?</a></li> <li><a href="#web-image">How do I include an image in a post?</a></li> <li><a href="#web-video">How do I include a video in a post?</a></li> <li><a href="#web-hashtags">How do I use hashtags?</a></li> <li><a href="#web-mention">How do I @-mention someone?</a></li> <li><a href="#web-update">How do I edit an existing post?</a></li> <li><a href="#web-delete">How do I delete a post?</a></li> <li><a href="#web-fragment">Can I publish just one part of a page?</a></li> <li><a href="#web-backfeed">How do fediverse replies, likes, and other interactions show up on my site?</a></li> <li><a href="#web-read">How do I read my fediverse timeline/feed?</a></li> <li><a href="#web-notifications">Are there notifications?</a></li> <li><a href="#web-discovery">How can people on the fediverse find and follow me?</a></li> <li><a href="#web-see-posts">How can I see what my posts look like inside the fediverse?</a></li> <li><a href="#web-searchable">Can I make my posts show up when people search for them in the fediverse?</a></li> <li><a href="#web-enhanced">Can I use my own domain as my handle on other networks?</a></li> <br> <p><em>Background</em></p> <li><a href="#who">Who are you? Why did you make this?</a></li> <li><a href="#cost">How much does it cost?</a></li> <li><a href="#privacy">What do you do with my data?</a></li> <li><a href="#history">How long has this been around?</a></li> <li><a href="#terms">What are the terms of service?</a></li> <li><a href="#moderation-policy">What is your content moderation policy?</a></li> <li><a href="#bug">I found a bug! I have a feature request!</a></li> <li><a href="#vulnerability">I found a security vulnerability!</a></li> <li><a href="#succession">What's your succession plan if you can't run Bridgy Fed any more?</a></li> <br> <p><em>Development</em></p> <li><a href="#values">What are Bridgy Fed's product and engineering values?</a></li> <li><a href="#compare">How do the different protocols compare?</a></li> <li><a href="#translate">How are the different protocols translated?</a></li> <li><a href="#router">How are activities routed?</a></li> <!-- <li><a href="#error-handling">How are errors handled?</a></li> --> </ul> <ul class="docs"> <br> <h3 id="about">About</h3> <li id="which-networks" class="question">Which networks are supported?</li> <li class="answer"> <p>Bridgy Fed currently supports <a href="https://indieweb.org/">the web</a>, <a href="https://en.wikipedia.org/wiki/Fediverse">fediverse</a>, and <a href="https://bsky.social/">Bluesky</a>. We're considering adding more networks, including <a href="https://www.farcaster.xyz/">Farcaster</a> and <a href="https://nostr.com/">Nostr</a>.</p> <p>All bridging is fully bidirectional. If you're on a supported network, you can use Bridgy Fed to follow and interact with bridged users on any other supported network.</p> </li> <li id="visibility" class="question">Who can see me and my stuff?</li> <li class="answer"> <p>If you haven't enabled the bridge for your account, no one. Once you enable it, Bridgy Fed only bridges fully public profiles and posts and interactions, not unlisted, quiet public, followers-only, or otherwise private posts or DMs. In other words, bridging your account doesn't expose your profile or posts to anyone new who couldn't already see them before.</p> </li> <li id="other-bridges" class="question">What about other bridges?</li> <li class="answer"> <p>Bridgy Fed is just one of many different bridges: <a href="https://fietkau.software/pinhole">pinhole</a>, <a href="https://rss-parrot.net/">RSS Parrot</a>, <a href="https://mostr.pub/">mostr.pub</a>, and <a href="https://eclipse.pub/">Eclipse</a>, among others. They're great! They rarely reach the level of fully bidirectional federation that Bridgy Fed aims at, but they contribute to a diversity of approaches that we think is still valuable.</p> <p>These bridges don't interoperate right now, but we hope they will eventually. For example, where multiple bridges overlap, networks can end up with duplicate bridged accounts, which is obviously not ideal. <a href="https://github.com/snarfed/bridgy-fed/issues/543">FEP-fffd</a> is one promising approach to this that we're following closely. <a href="https://github.com/snarfed/bridgy-fed/issues/12">We're open to other ideas!</a></p> </li> <li id="bridgy-classic" class="question">What's the difference between this and Bridgy classic, ie non-Fed?</li> <li class="answer"> <p><a href="https://fed.brid.gy/">Bridgy Fed</a> and <a href="https://brid.gy/">Bridgy classic</a> are separate services. They both connect web sites and social networks and translate posts and interactions back and forth, but they each do it very differently.</p> <a href="https://fed.brid.gy/">Bridgy Fed</a> - this service - bridges accounts on decentralized social networks like the <a href="https://en.wikipedia.org/wiki/Fediverse">fediverse</a>, <a href="https://bsky.social/">Bluesky</a>/<a href="https://atproto.com/">AT Protocol</a>, and the <a href="https://indieweb.org/">IndieWeb</a> <em>directly</em> across those networks.</p> <p><a href="https://brid.gy/">Bridgy classic</a>, on the other hand, connects IndieWeb web sites to <em>existing</em> accounts on social networks, both centralized and decentralized, and provides <a href="https://indieweb.org/backfeed">backfeed</a> and <a href="https://indieweb.org/POSSE">POSSE</a> (aka cross-posting) as a service.</p> <p>As an example, here's a visualization of how they each connect web sites to the fediverse:</p> <br> <div class="row which-bridgy"> <div class="col-lg-6 col-lg-offset-0 col-md-8 col-md-offset-2 col-sm-10 col-sm-offset-1 col-xs-12"> <a class="btn btn-default" href="https://brid.gy/mastodon/start"> <p class="bigger"> Bridgy cross-posts to a Mastodon account: @you@mastodon.server </p> <pre class="bigger"> <img title="Pleroma" style="height: 1.5em; margin-bottom: -.2em" src="/static/pleroma_logo.svg"> / <span class="highlight" style="background-color: khaki" title="Your web site">🌐</span> — <span class="highlight"><img title="Mastodon" src="/oauth_dropins_static/mastodon_2x.png"></span> — <img title="Friendica" src="/static/friendica_logo.svg"> \ <img title="Mastodon" src="/oauth_dropins_static/mastodon_2x.png"> </pre> <p class="big">You already have a Mastodon account. You want to copy posts from your web site to Mastodon and send responses back to your site.</p> </a> </div> <div class="col-lg-6 col-lg-offset-0 col-md-8 col-md-offset-2 col-sm-10 col-sm-offset-1 col-xs-12"> <a class="btn btn-default" href="https://fed.brid.gy/"> <p class="bigger"> Bridgy Fed connects directly to the fediverse: @yoursite.com </p> <pre class="bigger"><img title="Fediverse" src="/static/fediverse_logo.svg"> <img title="PeerTube" src="/static/peertube_logo.svg"> \ / <img title="Misskey" src="/static/misskey_logo.png"> — <span class="highlight" title="Your web site">🌐</span> — <img title="Mastodon" src="/oauth_dropins_static/mastodon_2x.png"> / \ <img title="GNU Social" src="/static/gnu_social_logo.svg"> <img title="Pixelfed" src="/oauth_dropins_static/pixelfed_2x.png"> </pre> <p class="big">Your web site will be its own fediverse account. Its posts will show up in the fediverse automatically. People there can follow it directly.</p> </a> </div> </div> <p>Apologies for the confusingly similar names!</p> </li> <li id="behavior-mismatches" class="question">How does this handle behavior differences between networks?</li> <li class="answer"> <p>When networks work differently, we try to preserve each network's behavior as much as possible. For example, following on the web is permissionless: you can follow any web site in a feed reader. However, in the fediverse, following may require approval, ie users can choose to approve or reject each follower individually.</p> <p>Bridgy Fed cooperates with this. When a web user follows a fediverse user, Bridgy Fed only adds them and starts delivering posts once the fediverse user approves the follow.</p> </li> <li id="format-mismatches" class="question">How does this handle formatting differences between networks?</li> <li class="answer"> <p>We work hard to preserve profile and post formatting as much as possible. For networks with rich formatting like the web, we convert that formatting to text-based formatting as much as possible when delivering to text-based networks.</p> <p>Unfortunately, this kind of conversion is never perfect. Some types of posts, eg events and polls, are difficult to represent in networks that don't support them. As a fallback, Bridgy Fed includes a link to the original post on its own network that users elsewhere can follow to see it as it was originally intended.</p> </li> <li id="moderation" class="question">What about moderation? How do blocks, mutes, etc work?</li> <li class="answer"> <p>In general, native moderation tools within each network work with bridged users just like with native users. <a href="https://docs.bsky.app/docs/advanced-guides/moderation#global-label-values">Bluesky labels</a> are translated to/from the fediverse's <a href="https://swicg.github.io/miscellany/#sensitive"><code>sensitive</code> flag</a> and <a href="https://docs.joinmastodon.org/user/posting/#cw">content warnings</a>. Blocking and muting is translated too, and works just like normal. Similarly, if you or an admin block an entire bridged network, that works just like blocking a native instance.</p> <p>Bridgy Fed also incorporates and obeys lower level mitigation techniques such as the fediverse’s <a href="https://fedi.tips/authorized-fetch/">authorized fetch</a> aka secure mode. It always includes valid HTTP Signatures when fetching actors and other objects.</p> <p>For more background, see our <a href="#moderation-policy">content moderation policy</a> and <a href="https://snarfed.org/2024-01-19_moderate-people-not-code">this blog post</a>.</p> </li> <li id="opt-out" class="question">How do I opt out and remove my site or account?</li> <li class="answer"> <p>If you're on the fediverse or Bluesky, and you've opted in but now want to opt out, block the Bridgy Fed bot user for the network you want to opt out of. For example, on the fediverse, block <code>@bsky.brid.gy@bsky.brid.gy</code>. On Bluesky, block <a href="https://bsky.app/profile/ap.brid.gy">@ap.brid.gy</a>.</p> <p>(However, if you're on a <a href="https://pixelfed.org/">Pixelfed</a> instance, DM the word <code>stop</code> to <code>@bsky.brid.gy@bsky.brid.gy</code> instead. <a href="https://github.com/pixelfed/pixelfed/issues/5678">Pixelfed doesn't yet send the ActivityPub Block activity</a>, so blocking won't work. Hopefully they'll fix that soon!) <p>If you're on the web, <a href="mailto:feedback@brid.gy">email us</a> from an address at your web site's domain to show that you own it, or you can put the text <code>#nobridge</code> in the <a href="#web-profile">profile on your home page</a> and then <a href="#update-profile">update your profile</a> on <a href="#user-page">your user page</a>.</p> <p>Once you've done this, Bridgy Fed will deactivate your bridged profile in that network, and it will no longer bridge any of your posts or interactions there.</p> <p>You can undo this later by un-blocking and re-following the bot user, but depending on the network, not everything will be perfectly restored. For example, when you disable bridging into the fediverse, the bridged fediverse account is deleted and all followers are disconnected. If you later re-enable it, fediverse users will have to search for your account by address manually to find and follow it again.</p> </li> <li id="dms" class="question">Why is Bridgy Fed chatting or DMing with me?</li> <li class="answer"> <p>Bridgy Fed sends a few different types of chat messages (aka DMs, or direct messages):</p> <ul> <li>When you first enable it for your account. <li>When you first reply to a bridged account, but you haven't enabled the bridge yourself, so they won't see your reply. <li>If you haven't enabled the bridge, and someone on a different network <a href="#dm-request">requests that you enable it so they can follow you</a>. (Bridgy Fed includes a link to their profile in this message.) <li>A confirmation or other reply when you <a href="#dm-request">message it to request that someone else enables the bridge</a>. </ul> <p>Bridgy Fed tries hard to avoid spamming. Apart from replying to your own messages, it will only send you at most one of each of these messages, ever.</p> <p>Also, chats with Bridgy Fed bot accounts are not monitored by a human. Feel free to <a href="#bug">file an issue in GitHub if you have a bug report or feature request!</a> </li> <li id="migration" class="question">Is account migration supported?</li> <li class="answer"> <!-- <p>Somewhat. Currently, if you have a Bluesky account or web site that's bridged into the fediverse, you can <a href="https://docs.joinmastodon.org/user/moving/#migration">migrate</a> that bridged fediverse account out to a native fediverse account with the <a href="#dm-commands"><code>migrate-to</code> DM command</a>. --> <!-- <p>Otherwise, --> <p>Not yet. If you bridge your fediverse account and then <a href="https://docs.joinmastodon.org/user/moving/#migration">migrate to a new instance</a>, or bridge your Bluesky account and then <a href="https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial">change your handle</a>, or bridge your web site and then move it to a new domain, Bridgy Fed doesn't officially support that right now. Some parts of bridging may continue to work, but probably not all. <p>Details in <a href="https://github.com/snarfed/bridgy-fed/issues/330">these</a> <a href="https://github.com/snarfed/bridgy-fed/issues/1074">issues</a>. Hopefully this will be more fully supported in the future. <p><a href="https://github.com/snarfed/bridgy-fed/issues/1137">Bridgy Fed also doesn't support migrating an existing account into it to become a bridged account, or migrating a bridged account out to be a normal account.</a> Those are unlikely to be supported, even in the future. </li> <li id="use-like-normal" class="question">Can I log into my bridged account and use it like a normal account?</a></li> <li class="answer"> <p>Sorry, no, Bridgy Fed doesn't support this. It would be difficult to manage and resolve the conflicts that would inevitably arise between bridging and interactive use. This would also take a huge amount of effort; we'd have to build a full-fledged, interactive fediverse instance, Bluesky PDS, web server CMS, etc, on top of the current bridge functionality. <p> </li> <li id="cross-post" class="question">Can I use this to bridge two existing accounts that I already have?</a></li> <li class="answer"> <p>Sorry, no, Bridgy Fed doesn't support this. When it bridges one of your accounts into a new network, Bridgy Fed fully owns the bridged account in the new network. Fortunately, there are <a href="https://www.google.com/search?q=cross-post+bluesky+fediverse">many other cross-posting and clients tools that can copy posts between existing accounts</a>! </li> <br> <h3 id="general">Using</h3> <li id="get-started" class="question">How do I get started?</li> <li class="answer"> <p>Here are instructions if you're coming from:</p> <ul> <li><a href="#web-get-started">the web</a></li> <li><a href="#fediverse-get-started">the fediverse</a></li> <li><a href="#bluesky-get-started">Bluesky</a></li> </ul> </li> <li id="which-accounts" class="question">Which accounts do I need?</li> <li class="answer"> <p>None! At least, no more than the accounts you already have. Bridgy Fed doesn't cross-post (ie copy posts) between separate accounts. Instead, it <a href="https://en.wikipedia.org/wiki/Federation_(information_technology)"><em>federates</em></a>, or mirrors, your existing accounts into other networks.</p> <p>If you want to cross-post instead, check out <a href="https://brid.gy/">Bridgy classic</a>!</p> </li> <li id="login" class="question">How do I log into Bridgy Fed?</li> <li class="answer"> <p>You don't! Bridgy Fed doesn't have its own accounts or logins.</p> </li> <li id="update-profile" class="question">How do I update my profile?</li> <li class="answer"> <p>Click the <button class="btn btn-default glyphicon glyphicon-refresh"></button> button <a href="/web-site">on your user page</a>. Bridgy Fed will refresh your profile and send it to any networks you're bridged into. </li> <li id="troubleshooting" class="question">I tried it, and it didn't work!</li> <li class="answer"> <p>Here are a few reasons Bridgy Fed might not currently bridge your profile or posts. If any apply, fix them, then un-follow and re-follow the Bridgy Fed bot account.</p> <ul> <li>As basic spam filters, Bridgy Fed requires a couple things on your profile: <ul> <!-- <li>a display name that's different from your handle and username --> <li>a profile picture <li>if your server advertises account age (like Mastodon), your account needs to be at least one week old </ul> <li>Bridgy Fed generally only bridges posts going forward; it doesn't backfill older posts from before you enabled it. If you want to see it bridge your posts, try a new one! <li>Bridgy Fed <a href="#visibility">only bridges fully public posts and replies</a>, not unlisted, quiet public, followers-only, mentioned-only, or otherwise non-public ones. <li>The Bridgy Fed bot account will follow you back. If your account is set to accept follows, did you accept it? If not, and if you're on the fediverse, your instance won't send Bridgy Fed your posts, so they won't get bridged. <li>Have you blocked the Bridgy Fed bot account? If so, that <a href="#opt-out">disables the bridge for your account</a>. Un-block it and then follow it again to re-enable the bridge.</a> <li>Bridgy Fed currently doesn't bridge posts if they're over two weeks old. This is largely because some fediverse servers, notably Mastodon, <a href="https://github.com/mastodon/mastodon/issues/4030">don't</a> <a href="https://github.com/mastodon/mastodon/issues/15912#issuecomment-1465692557">fully honor</a> <a href="https://github.com/mastodon/mastodon/issues/33747#issuecomment-2618280976">backdated posts</a> and instead serve them in feeds as if they were new. <li>If you're looking at your bridged account in the fediverse, Bridgy Fed only delivers your posts to fediverse instances where you have at least one follower. (This is how the fediverse works in general.) <li>If you're on the fediverse, your server might be blocking or limiting Bridgy Fed. Check your server's <em>About</em> page to see if <code>bsky.brid.gy</code> or <code>brid.gy</code> are in the <em>Moderated servers</em> section. If they are, you can ask your server admin to reconsider, and include a link to this page for more details. <li>If you're on the fediverse, and your username - ie the first part of your handle, before the middle `@` character - begins or ends with <code>_</code>, <code>-</code>, or <code>~</code>, or contains any non-alphanumeric characters, ie anything other than <code>A-Z</code> <code>a-z</code> <code>0-9</code> <code>_</code> <code>-</code> <code>~</code>, Bridgy Fed can't currently bridge your account. Sorry. This may change in the future; <a href="https://github.com/snarfed/bridgy-fed/issues/1005">follow the GitHub issue for details</a>. </ul> <p>If none of that helps, <a href="#user-page">check out your user page!</a> It detects and describes common problems with <a href="#web-setup">your setup</a>, and it shows your recent interactions and detailed logs. </li> <li id="user-page" class="question">Can I see my account's status and recent activity?</li> <li class="answer"> <p>Definitely! <a href="/user-page">Use this form</a> to find your user page. It shows your account's current status in Bridgy Fed, recent interactions, remote follow UI, and links to your timeline feeds in various formats. </p> </li> <li id="follower-count" class="question">How does my bridged account's follower count work?</li> <li class="answer"> <p>Follower counts are inexact. Unlike profiles and posts and other interactions, we don't try too hard to match bridged accounts' follower counts with their followers across all networks. If they don't exactly reconcile, that's normal, for many possible reasons. Don't worry about it. </p> </li> <li id="mention" class="question">How do I @-mention a bridged user?</li> <li class="answer"> <p>The same way you @-mention people normally! Find them in your local social network, then @-mention them natively. No special syntax or anything else needed.</p> <p>(If they haven't enabled the bridge, then you won't be able to find them or @-mention them.)</p> </p> <li id="delete" class="question">How do I delete a post?</li> <li class="answer"> <p>Just delete it normally! Bridgy Fed will detect that and delete it in every other network that it was bridged to.</p> </li> <li id="block" class="question">How do I block someone in another network who's not bridged into mine?</li> <li class="answer"> <p>You can use the <code>block</code> <a href="#dm-commands">DM command</a>. First, find the Bridgy Fed bot account for the network they're in. Then, DM that account <code>block [handle]</code>, where handle is the address of the user you want to block.</p> <p>For example, if you're on the fediverse, and you want to block @badguy.bsky.social on Bluesky, find the @bsky.brid.gy@bsky.brid.gy account and send it a DM with the text <code>block badguy.bsky.social</code>. <p>If you change your mind, you can unblock them with the <code>unblock</code> command, eg <code>unblock badguy.bsky.social</code>. </li> <li id="enhanced" class="question">The <code>*.brid.gy</code> domain in my bridged account's handle is ugly. Can I get rid of it and use my own domain/web site instead?</li> <li class="answer"> <p>Yes! Many supported networks let you use <a href="https://indieweb.org/personal-domain">your own domain</a> as your handle one way or another. This takes a bit of technical setup with DNS or a web server, but it's very doable. Here are instructions for <a href="#bluesky-enhanced">web sites and fediverse accounts bridged into Bluesky</a>, and for <a href="#fediverse-enhanced">web sites bridged into the fediverse</a>.</p> </li> <li id="dm-commands" class="question">What commands can I chat or DM to the bot account?</li> <li class="answer"> <p>DM it <em>help</em> to see! Here's the full list: <ul> <li><em>start</em>: <a href="#get-started">enable bridging for your account</a> <li><em>stop</em>: <a href="#opt-out">disable bridging for your account</a> <li><em>username [domain]</em>: <a href="#enhanced">set a custom domain username (aka handle)</a> <li><em>[handle]</em>: <a href="#dm-request">ask it to DM a user to request that they bridge their account</a> <li><em>did</em>: get your bridged Bluesky account's <a href="https://atproto.com/guides/identity#identifiers">DID</a> (only supported with the Bluesky bot) <li><em>block [handle]</em>: <a href="#block">block a user on another network who's not bridged into your network</a> <li><em>unblock [handle]</em>: <a href="#block">unblock a user on another network who's not bridged into your network</a> <!-- <li><em>migrate-to [handle]</em>: <a href="#migrate-to">migrate your bridged account out of Bridgy Fed to a native account</a> --> </ul> </li> <li id="dm-request" class="question">I want to follow someone, but they're not bridged!</li> <li class="answer"> <p>Start a chat or DM with the Bridgy Fed account and send it their handle! Bridgy Fed will send them a message and say that you've requested that they enable the bridge.</p> <p>For example, if you're on Bluesky, and you want to follow the fediverse account <a href="https://indieweb.social/@snarfed">@snarfed@indieweb.social</a>, but they're not bridged, send a Bluesky chat message to <a href="https://bsky.app/profile/ap.brid.gy">@ap.brid.gy</a> with the text <code>@snarfed@indieweb.social</code>, and Bridgy Fed will send them a DM.</p> <p>Similarly, if you're on the fediverse, and you want to follow the Bluesky account <a href="https://bsky.app/profile/snarfed.bsky.social">@snarfed.bsky.social</a>, but they're not bridged, send a DM to @bsky.brid.gy@bsky.brid.gy with the text <code>@snarfed.bsky.social</code>, and Bridgy Fed will send them a chat message.</p> <p>Bridgy Fed will only message a given recipient once, the first time they're requested. If you or someone else request them again, Bridgy Fed won't message them again.</p> <p>Also, you can only request 10 users per day. Use them wisely!</p> <p>On Bluesky, Bridgy Fed has to poll for chat messages, so if you send it a message, it may not respond immediately. It will within a minute at most! <p>Also, Bluesky accounts <a href="https://bsky.social/about/blog/05-22-2024-direct-messages">default to only accepting DMs from people they follow</a>. If people on Bluesky aren't seeing Bridgy Fed's DMs, this is probably why. They can fix that by changing that setting to allow DMs from all accounts. (We definitely know this is inconvenient and makes this feature less useful!) <p>Here's an example of the exact text in the prompt DM: <blockquote> <p>Hi! <a href="https://bsky.app/profile/snarfed.indieweb.social.ap.brid.gy">Ryan Barrett · snarfed.indieweb.social.ap.brid.gy</a> is using Bridgy Fed to bridge their account from the fediverse into Bluesky here, and they'd like to follow you. You can bridge your account into the fediverse by following this account. <a href="https://fed.brid.gy/docs">See the docs</a> for more information. <p>If you do nothing, your account won't be bridged, and users on the fediverse won't be able to see or interact with you. <p>Bridgy Fed will only send you this message once. </blockquote> </li> <br> <h3 id="from-fediverse">From the fediverse</h3> <li id="fediverse-get-started" class="question">How do I get started?</li> <li class="answer"> <p>To bridge your fediverse account into Bluesky and interact with people there, search for and follow <code>@bsky.brid.gy@bsky.brid.gy</code>. That account will then follow you back. Accept its follow to make sure your fediverse posts get sent the bridge and make it into Bluesky.</p> <p>If your fediverse account is <code>@[user]@[instance]</code>, your bridged account will have the handle <code>[user].[instance].ap.brid.gy</code> in Bluesky. For example, <a href="https://indieweb.social/@snarfed">@snarfed@indieweb.social</a> is bridged into Bluesky as <a href="https://bsky.app/profile/snarfed.indieweb.social.ap.brid.gy">@snarfed.indieweb.social.ap.brid.gy</a>.</p> <p>If your fediverse username has <code>_</code> (underscore) or <code>~</code> (tilde) characters, they're converted to <code>-</code> (dash) characters. For example, <code>@a_b~c@my.social</code> is bridged into Bluesky as <code>@a-b-c.my.social.ap.brid.gy</code>.</p> <p><em>Fediverse usernames that begin or end with <code>_</code>, <code>-</code>, or <code>~</code>, or that contain any non-alphanumeric characters, ie anything other than <code>A-Z</code> <code>a-z</code> <code>0-9</code> <code>_</code> <code>-</code> <code>~</code>, are not currently supported.</em> Sorry. This may change in the future; <a href="https://github.com/snarfed/bridgy-fed/issues/982">follow this GitHub issue for details</a>.</p> <p>Bluesky limits profile bios to 256 characters, so if yours is longer in the fediverse, it will be truncated and ellipsized.</p> <p>You can also <a href="#fediverse-follow">find and follow bridged Bluesky accounts</a> without bridging your own account, but they won't see your posts or interactions.<p> </li> <li id="fediverse-follow-bluesky" class="question">How do I find a bridged Bluesky account?</li> <li class="answer"> <p>If a Bluesky account has enabled the bridge, it will appear in the fediverse as <code>@[handle]@bsky.brid.gy</code>. For example, <a href="https://bsky.app/profile/snarfed.bsky.social">@snarfed.bsky.social</a> on Bluesky is bridged into the fediverse as <code>@snarfed.bsky.social@bsky.brid.gy</code>.</p> </li> <li id="fediverse-protocol-bot-user-blocked" class="question">I can't find <code>@bsky.brid.gy@bsky.brid.gy</code> on the fediverse!</li> <li class="answer"> <p>If you search for <code>@bsky.brid.gy@bsky.brid.gy</code> on your fediverse instance and you don't see any results, your server may be blocking Bridgy Fed. Check your server's <em>About</em> page to see if <code>bsky.brid.gy</code> or <code>brid.gy</code> are in the <em>Moderated servers</em> section. If they are, you can ask your server admin to reconsider, and include a link to this page for more details.</p> </li> <li id="fediverse-follow-web" class="question">How do I find a bridged web site?</li> <li class="answer"> <p>To follow a web site, first <a href="/web-site">enter it here</a> to make sure it's set up, then wait a minute, then search for <code>@[domain]@web.brid.gy</code> in your fediverse instance. For example, to follow <a href="https://nature.com/">nature.com</a>, search for <code>@nature.com@web.brid.gy</code>.</p> <p>Bridged web sites appear in the fediverse as either <code>@[domain]@[domain]</code>, <code>@[domain]@web.brid.gy</code>, or <code>@[domain]@fed.brid.gy</code>, depending on the fediverse server and whether the web site owner has <a href="#fediverse-enhanced">connected their domain to Bridgy Fed</a>. All bridged web sites behave the same in the fediverse; the different instances in their handles are purely cosmetic.</p> </li> <!-- <li id="fediverse-DM" class="question">What is this DM I got from a <code>*.brid.gy</code> account?</li> --> <!-- <li class="answer"> --> <!-- <p>In the future, if you haven't opted into the bridge, and someone wants to follow you from a different network, they can request to follow you from the Bridgy Fed home page. The first time this happens, Bridgy Fed will send you a DM to introduce itself and ask if you want to opt into bridging your account. If you reply <em>yes</em>, or follow the Bridgy Fed account that DMed you, your account will be bridged. If you do nothing, or reply <em>no</em> or block the Bridgy Fed account, you won't be bridged.</p> --> <!-- </li> --> <!-- <li id="fediverse-no-DM" class="question">Someone requested to follow me, but I never got the DM!</li> --> <!-- <li class="answer"> --> <!-- <p>Does your fediverse instance support DMs? Only some do. Otherwise, <a href="#bluesky-protocol-bot-user-blocked">if your instance is blocking Bridgy Fed</a>, you won't receive the DM. Or if it's <a href="https://docs.joinmastodon.org/admin/moderation/#limit-server">limiting</a> Bridgy Fed, or you're filtering notifications (this is sometimes on by default!), check the <em>Filtered notifications</em> section of your mention notifications.</p> --> <!-- <p>Having said that, if you want to bridge your account, you don't need the DM! Just <a href="#fediverse-get-started">follow or DM <em>yes</em> to <code>@bsky.brid.gy@bsky.brid.gy</code></a>.</p> --> <!-- </li> --> <li id="fediverse-what" class="question">Which stuff of mine from the fediverse will get bridged?</li> <li class="answer"> <p>Once you've enabled the bridge, anything that's fully public and interacts with Bluesky users. This includes your posts, replies, likes, and reposts <em>if</em> the original post was bridged. Posts on Bluesky are limited to 300 characters, so longer posts from the fediverse are truncated and ellipsized. Hashtags, links, link previews, images, videos, and even alt text are also included.</p> </li> <li id="fediverse-admins" class="question">I'm a fediverse instance admin. What do I need to know?</li> <li class="answer"> <p>Thanks for asking! Beyond <a href="#">what Bridgy Fed is and what it does</a>, here's some useful info for fediverse instance admins.</p> <ul> <li>Bridgy Fed is opt in. When a fediverse user <a href="#fediverse-get-started">enables it</a> for a given network, eg Bluesky, it bridges their profile and posts and other interactions into that network giong forward. It doesn't bridge anything for users who haven't enabled it yet. <li>This means that fediverse users don't exist in Bluesky, and can't be followed or found in search there, unless they've enabled the bridge. <li>Users enable the bridge to Bluesky by following the <code>@bsky.brid.gy@bsky.brid.gy</code> user, and disable it by blocking that user. When they disable it, their profile and posts are all removed from Bluesky. <li>Bluesky users can also bridge themselves into the fediverse. Unbridged fediverse users may follow them and interact with them, but those follows and interactions aren't bridged back into Bluesky. <li>Only fully public posts are bridged into Bluesky. Unlisted aka quiet public, followers-only, and private mentions aka DMs are never bridged. <li>Replies, reposts, and quote posts are only bridged if the original post being replied to, reposted, or quote posted was also bridged. <li>Blocks are bridged too. If a fediverse user blocks a bridged Bluesky user, it works just like blocking a normal fediverse user. Bridgy Fed also converts it to a Bluesky block on that end. <li>Reports aka <code>Flag</code>s are similarly bridged. If a fediverse user reports a bridged Bluesky user or post, Bridgy Fed sends it to Bluesky's moderation service as a report. The Bluesky team is then able to act on that user or post just like normal. <li>In general, bridged Bluesky users in the fediverse work just like normal fediverse users. All admin-level and user-level tools apply to them like you'd expect. <li>If a user enables the bridge and it doesn't work for them, <a href="#troubleshooting">point them to our troubleshooting docs</a>. <li><a href="https://docs.joinmastodon.org/admin/moderation/#limit-server">Limiting</a> aka silencing <code>brid.gy</code> or its subdomains works, but will make it more difficult for your users to enable the bridge. We also hear that limiting Bridgy Fed can result in <a href="https://www.loomio.com/d/W6tL5cvp/the-bluesky-bridge/104">confusing visibility and behavior that appears buggy</a>. We don't fully understand the details here yet, or whether we can do much about it. </ul> <p>Here are some details on our federation, ActivityPub, and Webfinger support.</p> <ul> <li>Each bridged network has its users on a different <code>brid.gy</code> subdomain, eg <code>bsky.brid.gy</code> for Bluesky and <code>web.brid.gy</code> for web sites. You can block specific networks by blocking their subdomain, but you'll still need to allow <code>fed.brid.gy</code> and <code>brid.gy</code> for the bridge to work at all. <li>Bridgy Fed's instance actor for signing GETs (ie authorize fetch) is <code>https://fed.brid.gy/fed.brid.gy</code> aka <code>@fed.brid.gy@fed.brid.gy</code>. <li>Some web sites bridged into the fediverse will have Webfinger addresses on their own domains, eg <code>@snarfed.org@snarfed.org</code>. Webfinger requests to those domains redirect to <code>fed.brid.gy</code> and are served there. <li>Bridged ActivityPub actors are <code>type: Person</code>. Bot actors like <code>@bsky.brid.gy@bsky.brid.gy</code> and <code>@fed.brid.gy@fed.brid.gy</code> are <code>type: Service</code>. <li>When a fediverse user opts into the bridge, their profile and posts will be indexed and searchable in Bluesky's search even if they have the <code>discoverable</code> or <code>indexable</code> flags set to <code>false</code>. Bluesky doesn't currently have a way to opt individual users out of search. </ul> </li> <br> <h3 id="to-fediverse">To the fediverse</h3> <li id="mastodon-link-verification" class="question">How do I verify my profile links (ie get green checks) in Mastodon?</li> <li class="answer"> <p><a href="https://docs.joinmastodon.org/user/profile/#verification">Mastodon's verified profile links</a> with ✅ green checks are fun! If you've bridged your web site into the fediverse, <a href="https://docs.joinmastodon.org/user/profile/#verification"></a>follow these steps to get one:</p> <ul> <li>Add a <a href="https://indieweb.org/rel-me"><code>rel=me</code> link</a> on your site that points to <code>https://web.brid.gy/r/https://[DOMAIN]/</code> for your domain, eg <code>https://web.brid.gy/r/https://snarfed.org/</code></li> <li>Click the <button class="btn btn-default glyphicon glyphicon-refresh"></button> button on your Bridgy Fed <a href="#user-page">user page</a> to update your profile on all of your followers' instances.</li> <li>Log into any Mastodon instance where you have an account.</li> <li>Search for your fediverse handle, eg <code>@snarfed.org@snarfed.org</code>.</li> <li>Click on your fediverse user in the search results.</li> <li>Wait a minute or two (or ten 😐), then refresh the page. You should see a green check on the profile link for your web site.</li> </ul> <p>When you're logged into a Mastodon instance, <a href="#fediverse-follow-web">searching for your bridged web site</a> triggers that instance to check and verify its profile link(s) in the background. This only works when you're logged in with a native Mastodon account. Also, each instance does this independently; verified links are not synched across instances.</p> <p>Mastodon link verification can sometimes be finicky and unreliable. If this doesn't work for you, and you've waited a while, try changing your <code>rel=me</code> link to <code>https://web.brid.gy/[DOMAIN]</code> instead, eg <code>https://web.brid.gy/snarfed.org</code>, and then try the rest of the steps above again.</p> </li> <li id="fediverse-enhanced" class="question">Can I use my own domain as my fediverse handle?</li> <li class="answer"> <p>Yes! By default, fediverse handles for web sites use <code>web.brid.gy</code> as their instance, eg <code>@mysite.com@web.brid.gy</code>, but you can change that to your own domain. It takes a bit of setup and technical know-how, but it's very doable.</p> <p>First, your domain needs to serve HTTP requests. You don't need an actual web site, but you do need a minimal web server.<p> <p>Second, your web server needs to support SSL. Bridgy Fed uses your domain as your identity, so it depends on SSL to prove that you own it.</p> <p>Lastly, your web server needs to redirect a couple URL paths, including query parameters, to the same paths on <code>https://fed.brid.gy/</code>:</li> <pre> /.well-known/host-meta /.well-known/webfinger </pre> <p>Here are instructions for a few common web servers:</p> <ul> <li> <p><em><a href="http://wordpress.org/">WordPress</a> (self-hosted)</em>: install the <a href="https://wordpress.org/plugins/safe-redirect-manager/">Safe Redirect Manager</a> plugin, then add these entries:</p> <code> /.well-known/host-meta* => https://fed.brid.gy/.well-known/host-meta*<br/> /.well-known/webfinger* => https://fed.brid.gy/.well-known/webfinger* </code> </li> <li><em><a href="http://withknown.com/">Known</a></em> or <em><a href="https://drupal.org/project/indieweb">Drupal</a></em>: follow the <a href="#apache">Apache</a> or <a href="#nginx">nginx</a> instructions below. </li> <li id="apache"><em><a href="http://httpd.apache.org/">Apache</a></em>: add this to your <code>.htaccess</code> file:<br /> <pre>RewriteEngine on RewriteBase / RewriteRule ^.well-known/(host-meta|webfinger).* https://fed.brid.gy/$0 [redirect=302,last]</pre> (<code>RewriteEngine on</code> is optional if you already have it earlier in your <code>.htaccess</code>. <code>RewriteBase /</code> is optional if you don't have any other <code>RewriteBase</code> directives, or if you put this <code>RewriteRule</code> inside an existing <code>RewriteBase /</code> section.) </li> <li id="nginx"><em><a href="https://nginx.org/">nginx</a></em>: add this to your <code>nginx.conf</code> file, in the <code>server</code> section:<br /> <pre>rewrite ^/\.well-known/(host-meta|webfinger).* https://fed.brid.gy$request_uri? redirect;</pre> </li> <li id="netlify"><em><a href="https://docs.netlify.com/routing/redirects/">Netlify</a></em>: add this to your <code>netlify.toml</code> file. <pre> [[redirects]] from = "/.well-known/host-meta*" to = "https://fed.brid.gy/.well-known/host-meta:splat" status = 302 [[redirects]] from = "/.well-known/webfinger*" to = "https://fed.brid.gy/.well-known/webfinger" status = 302 </pre> </li> </ul> </li> <li id="fediverse-delete" class="question">I disabled my bridged profile, or deleted a post, but it's still visible in the fediverse!</li> <li class="answer"> <p>Sadly, this is a somewhat inherent part of the fediverse itself. When you disable the bridge for your account, Bridgy Fed sends <code>Delete</code>s to every fediverse instance where you had a follower, but it doesn't currently know about other instances that may have loaded and cached your profile. Same with posts bridged into the fediverse that you later delete. Those cached profiles and posts will eventually disappear over time. </li> <li id="instance-subdomains" class="question">Could other networks' instances get their own brid.gy subdomains, so that admins can federate with or block them individually?</li> <li class="answer"> <p>This is a great idea! <a href="https://github.com/snarfed/bridgy-fed/issues/711">It's difficult to implement technically</a> - I'd need to build and run my own DNS server with custom behavior for resolving multi-level wildcard records - but it's definitely doable.</p> <p>However, servers and domains on other networks are very different from fediverse instances:</p> <ul> <li>Bluesky <a href="https://atproto.com/guides/overview#federation">PDSes</a> are similar to shared web hosts; they're more generic and interchangeable than fediverse instances. They don't define affinity groups, user-visible communities, or moderation boundaries. It's not clear that they're useful for domain level federation decisions like fediverse instances are.</li> <li>IndieWeb sites generally represent a single person. They're often domains, but when they're subdomains, eg on <a href="https://wordpress.com/">wordpress.com</a> or <a href="https://blogspot.com">blogspot.com</a>, those are often shared hosting platforms that don't define clear communities or moderation boundaries either.</li> <!-- <li>Nostr users don't live on specific servers at all. They publish to <a href="https://nostr.com/relays">relays</a>, usually multiple at a time, and may change those relays often. Relays are primarily network infrastructure.</li> --> </ul> <p>Another difficulty is that accounts on Bluesky have long-lived, server-independent ids. If we used a Bluesky user's PDS domain in their fediverse handle, that handle would change every time they migrated to a new PDS, and they'd lose all of their followers and followings, even though their Bluesky account ID itself hadn't changed.</p> </li> <br> <h3 id="from-bluesky">From Bluesky</h3> <li id="bluesky-get-started" class="question">How do I get started?</li> <li class="answer"> <p>To bridge your Bluesky account into the fediverse and interact with people there, follow <a href="https://bsky.app/profile/ap.brid.gy">@ap.brid.gy</a> on Bluesky.</p> <p>After a few minutes, your Bluesky account will appear in the fediverse as <code>@[handle]@bsky.brid.gy</code>. For example, <a href="https://bsky.app/profile/snarfed.bsky.social">@snarfed.bsky.social</a> on Bluesky is bridged into the fediverse as <code>@snarfed.bsky.social@bsky.brid.gy</code>.</p> <p>Alternatively, <a href="#bluesky-follow">you can find and follow bridged fediverse accounts</a> without bridging your own account, but they won't see your posts or interactions.<p> </li> <li id="bluesky-follow-fediverse" class="question">How do I find a bridged fediverse account?</li> <li class="answer"> <p><a href="https://bsky.app/search">Search in Bluesky</a> for their fediverse address (eg <code>@snarfed@indieweb.social</code>) or profile URL (eg <code><a href="https://indieweb.social/@snarfed">https://indieweb.social/@snarfed</a></code>), and then click the <em>People</em> tab. If they've enabled the bridge, they'll show up there. <p>Bridged fediverse accounts will appear in Bluesky as <code>@[user].[instance].ap.brid.gy</code>. For example, <a href="https://indieweb.social/@snarfed">@snarfed@indieweb.social</a> is bridged into Bluesky as <a href="https://bsky.app/profile/snarfed.indieweb.social.ap.brid.gy">@snarfed.indieweb.social.ap.brid.gy</a>.</p> </li> <li id="bluesky-follow-web" class="question">How do I find a bridged web site?</li> <li class="answer"> <p>To follow a web site, first <a href="/web-site">enter it here</a> to make sure it's set up, then wait a minute, then <a href="https://bsky.app/search">search for it in Bluesky</a> as <code>[domain].web.brid.gy</code>. For example, <a href="https://nature.com/">nature.com</a> is bridged into Bluesky as <a href="https://bsky.app/profile/nature.com.web.brid.gy">nature.com.web.brid.gy</a>.</p> </li> <li id="bluesky-reply-controls" class="question">Can I use Bluesky's reply controls?</li> <li class="answer"> <p>Yes! Bluesky's <a href="https://bsky.app/profile/safety.bsky.app/post/3khhw67cxqg22">reply controls</a> apply to accounts bridged from the web and the fediverse as well as to native Bluesky accounts. Those platforms don't have reply controls, so if you bridge your Bluesky account and post with reply controls, people on the fediverse and the web will still be able to reply, but those replies won't show up in Bluesky.</p> </li> <br> <h3 id="to-bluesky">To Bluesky</h3> <li id="bluesky-what-to" class="question">Which stuff of mine can get bridged into Bluesky?</li> <li class="answer"> <p>Profiles, follows, posts, images, videos, hashtags, @-mentions, and <a href="https://docs.joinmastodon.org/user/posting/#cw">content warnings</a>. Also replies, likes, and reposts <em>if</em> the original post was already bridged.</p> </li> <li id="bluesky-what-not-to" class="question">Which stuff can't get bridged into Bluesky?</li> <li class="answer"> <p><a href="https://github.com/bluesky-social/atproto/discussions/1310">Polls</a>, <a href="https://github.com/snarfed/bridgy-fed/issues/947">edits/updates</a>, or (most) GIFs.</p> </li> <li id="bluesky-report" class="question">What happens when I report a bridged Bluesky user?</li> <li class="answer"> <p>Bridgy Fed sends your report to the Bluesky team's <a href="official moderation service">official moderation service</a>, which handles it, and takes action if necessary, just like with native Bluesky accounts.</p> <p>Also see Bridgy Fed's <a href="#moderation-policy">moderation policy</a> and <a href="#moderation">functionality</a>.</p> </li> <li id="bluesky-edits" class="question">I edited a post, but it didn't get edited in Bluesky!</li> <li class="answer"> <p>Bluesky doesn't support editing posts right now. Bridgy Fed currently sends edits via the underlying <a href="https://atproto.com/">AT Protocol</a>, which does currently support them, but the Bluesky app itself doesn't. Hopefully eventually!</p> </li> <li id="bluesky-video" class="question">Why can't I see a video?</li> <li class="answer"> <p><a href="https://bsky.social/about/blog/09-11-2024-video">Bluesky currently limits videos to 60 seconds, 50MB, and .mp4, .mpeg, .webm, or .mov.</a> If you're seeing a "Video not found. Retry" error, the original video may not satisfy those requirements.</p> </li> <li id="bluesky-enhanced" class="question">Can I use my own domain as my Bluesky handle?</li> <li class="answer"> <p>Yes! Just follow these three steps:</p> <ol> <li>Get your bridged account's <a href="https://atproto.com/guides/identity#identifiers">DID</a>. You can either DM <em>did</em> to the Bluesky Bridgy Fed bot account (eg <code>@bsky.brid.gy@bsky.brid.gy</code>), or go to your <a href="#user-page">user page</a> and click the <button class="btn btn-default glyphicon glyphicon-tag"></button> next to to your bridged Bluesky account link. <li>Connect your domain to your bridged Bluesky account. You can do this <a href="https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial#:~:text=navigate%20back%20to%20your%20domain%20registrar">with DNS</a> (just steps 5 and 6) or <a href="https://atproto.com/specs/handle#:~:text=HTTPS%20well-known%20method">with HTTPS</a>. Once you're done, <a href="https://bsky-debug.app/handle">check your work here</a>. <li>Add your domain to your DID. If your account is on the fediverse, send a DM to <code>@bsky.brid.gy@bsky.brid.gy</code> with the text <code>username [domain]</code> (eg <code>username my.site.com</code>). If you're bridging a website, click the <button class="btn btn-default glyphicon glyphicon-refresh"></button> button on your <a href="#user-page">user page</a>. </ol> </li> <li id="bluesky-fields" class="question">How can I see the full text or original URL for a bridged post?</li> <li class="answer"> <p>If a post bridged into Bluesky is truncated, it will include an embed with a link to the original post. You can also find the original post link indirectly by opening the author's profile and following the link in their bio to their original account. <p>For developers, Bridgy Fed includes the full text and URL for bridged posts and profiles inside their AT Protocol records. Bridged <code>app.bsky.actor.profile</code> records have <code>bridgyOriginalDescription</code> and <code>bridgyOriginalUrl</code> fields, and bridged <code>app.bsky.feed.post</code> records have <code>bridgyOriginalText</code> and <code>bridgyOriginalUrl</code> fields. Here's an example: <pre> { "$type": "app.bsky.feed.post", "text": "This is a very long post that got cut off and ...", "bridgyOriginalText": "&lt;p&gt;This is a very long post that got cut off and has more to say.&lt;/p&gt;", "bridgyOriginalUrl": "https://indieweb.social/@snarfed/abc123", "..." } </pre> </li> <li id="bluesky-image-cdn" class="question">My images or videos are blank in Bluesky!</li> <li class="answer"> <p>This usually means that the server hosting your images is blocking or otherwise not serving them to Bluesky's CDN. To confirm this, open an affected post in <a href="https://bsky.app/">bsky.app</a>, then open one of the blank images in a new browser tab. (Right click, Open image in new tab, or something similar.) If it shows the error <code>Source image is unreachable</code> instead of the image, your server is blocking Bluesky's CDN. <a href="https://github.com/snarfed/bridgy-fed/issues/1804">GoToSocial is one known example</a>; <a href="https://bsky.app/profile/isafashion.dev/post/3lgxsllqsv22n">here's a workaround</a>. Otherwise, check your Cloudflare, CDN, server or host settings, they might be configured overly aggressively to block bots. <a href="https://github.com/bluesky-social/atproto/discussions/3451">More background.</a> </li> <br> <h3>From the web</h3> <li id="web-get-started" class="question">How do I get started?</li> <li class="answer"> <p>Your web site will need either <a href="https://microformats.org/wiki/microformats2">microformats</a> and <a href="https://webmention.net/">webmention</a> support, or an <a href="http://www.atomenabled.org/">Atom</a> or <a href="https://www.rssboard.org/rss-specification">RSS</a> feed <a href="https://www.rssboard.org/rss-autodiscovery">discoverable from your home page</a>, so that Bridgy Fed can find your posts. When you're ready, <a href="/web-site">connect your site</a>, then <a href="/#fediverse-follow">try following your site from the fediverse</a>. If that looks good, <a href="web-follow">start following other fediverse users</a>! <p>We recommend that your site supports <a href="https://webmention.net/">webmentions</a>. You can see a <a href="web-notifications">notifications feed of your interactions from other networks</a> - replies, reposts, likes, etc - but to <a href="#web-backfeed"> get them back to your site, it needs to support webmentions</a>. Check out the <a href="https://indieweb.org/">IndieWeb wiki</a> for <a href="https://indieweb.org/webmention#Publishing_Software">instructions for your web server</a> and <a href="https://indieweb.org/content_management_system#Examples">examples of existing projects that support microformats and webmentions</a>. </p> <p>If your site serves <a href="https://webfinger.net/">WebFinger</a> requests itself, Bridgy Fed won't support it. This generally happens when your site is already a fediverse instance or has its own fediverse integration. If Bridgy Fed tried to work in these cases, it might conflict with your existing ActivityPub server. </li> <li id="web-profile" class="question">Where does my profile info come from?</li> <li class="answer"> <p>Your site's bridged profile can come from a few different things on your home page. Here's what Bridgy Fed looks for, in order of preference: <ul> <li>A <a href="https://microformats.org/wiki/microformats2">microformats2</a> <a href="https://microformats.org/wiki/representative-h-card-authoring">representative h-card</a> on your site's home page.</li> <li><a href="https://developer.twitter.com/en/docs/twitter-for-websites/cards/guides/getting-started">Twitter card</a>, <a href="https://ogp.me/">Open Graph</a>, and related meta tags in your HTML.</li> <li>Basic HTML meta tags like <code>&lt;title&gt;</code> and <code>&lt;meta name="description"&gt;</code>. </ul> <p>Here's a minimal example of <code>h-card</code> HTML that sets your name and a profile picture: <pre> &lt;span class="<span class='keyword'>h-card</span>"&gt; &lt;a class="<span class='keyword'>u-url</span>" rel="<span class='keyword'>me</span>" href="<span class='value'>/</span>"&gt;<span class='value'>Alice Foo</span>&lt;/a&gt; &lt;img class="<span class='keyword'>u-photo</span>" src="<span class='value'>/me.jpg</span>" /&gt; &lt;/span&gt; </pre> </p> <p>You can use <a href="https://indiewebify.me/">indiewebify.me</a> to check your site's h-card interactively, but note that that doesn't check that it's <em>representative</em>. In the common case, this just means that your h-card needs a link to your home page with the <code>u-url</code> class. See the <a href="https://microformats.org/wiki/representative-h-card-authoring">representative h-card spec</a> for more details.</p> <p>If you want to set a <a href="https://docs.joinmastodon.org/user/profile/#header">header image</a>, add a <code><a href="https://indieweb.org/featured">u-featured</a></code> image to your h-card, eg: <pre> &lt;img class="<span class='keyword'>u-featured</span>" src="<span class='value'>/my-header.png</span>" /&gt; </pre> </p> <p>Your Bluesky handle will be <code>yourdomain.com.web.brid.gy</code>.</p> <p>By default, your fediverse address will be <code>@yourdomain.com@yourdomain.com</code>. Many services (eg Mastodon) default to only showing the username, so this generally shows up as just <code>@yourdomain.com</code> in posts, and the full address appears on hover.</p> <p>We recommend this for simplicity and predictability, for everyone else as well as you, but if you want a different username, you can set it by adding an <code>acct:</code> <a href="https://microformats.org/wiki/rel-me">u-url</a> link inside your h-card with <code>username@yourdomain.com</code>, eg: <pre> &lt;a class="<span class='keyword'>u-url</span>" href="<span class='value'>acct:alice@yourdomain.com</span>"&gt;<span class='value'></span>&lt;/a&gt; </pre> </li> <li id="web-how-post" class="question">How does Bridgy Fed find my posts?</li> <li class="answer"> <p>Bridgy Fed can discover web site posts via <a href="https://webmention.net/">webmentions</a> and Atom/RSS feeds.</p> <p>The first time someone follows a web site via Bridgy Fed, it looks for an Atom or RSS feed. If it finds one, it extracts and bridges those posts, then periodically checks for new posts.</p> <p>Instead of waiting for that periodic poll, you can bridge a new or updated post immediately by including <a href="https://microformats.org/wiki/microformats2">microformats</a> in your HTML and sending Bridgy Fed a <a href="https://webmention.net/">webmention</a>. Include a link to <code><a href="fed.brid.gy">https://fed.brid.gy/</a></code> in your post, and if your web server supports webmentions, it should send one automatically. Alternatively <a href="https://indieweb.org/Webmention#Manual_Webmentions">you can send one manually.</a> (Note that triggering via webmention <em>requires</em> your post HTML to be marked up with <a href="https://microformats.org/wiki/microformats2">microformats</a>.)</p> <p>Once you send Bridgy Fed a webmention from your site - any webmention! - it will stop reading posts from your Atom or RSS feed, and expect webmentions instead for all posts in the future. You can use this to prevent automatically bridging all posts, and instead choose proactively which of your posts to bridge.</p> <p>Here's example HTML for a post: <pre>&lt;div class="<span class='keyword'>h-entry</span>"&gt; &lt;p class="<span class='keyword'>e-content</span>"&gt;<span class='value'>Two naked tags walk into a bar. The bartender exclaims, "Hey, you can't come in here without microformats, this is a classy joint!"</span>&lt;/p&gt; &lt;a class="<span class='keyword'>u-bridgy-fed</span>" href="<a href='https://fed.brid.gy/'>https://fed.brid.gy/</a>" hidden="from-humans"&gt;&lt;/a&gt; &lt;/div&gt; </pre> </p> <p>The link to <code><a href="fed.brid.gy">fed.brid.gy</a></code> may be blank. If so, it should include the <code>hidden</code> attribute to be kind to screen readers and keyboard navigation users. The <code>u-bridgy-fed</code> class is optional but useful in some cases to prevent microformats2 parsers from <a href="https://microformats.org/wiki/microformats2-implied-properties#hyperlink_and_url_property">interpreting the link as an implied <code>u-url</code></a>. </p> </li> <li id="web-interpret" class="question">How does it interpret and translate my posts?</li> <li class="answer"> <p>If your post has <a href="http://microformats.org/">microformats</a>, which many web servers include automatically, Bridgy Fed uses them to determine whether it's a <a href="https://indieweb.org/note#How_to">note</a>, <a href="https://indieweb.org/article">article</a>, <a href="#web-like">like</a>, <a href="#web-repost">repost</a>, <a href="#web-reply">reply</a>, or <a href="#web-follow">follow</a>. Here's an example of a note: <pre>&lt;div class="<span class='keyword'>h-entry</span>"&gt; &lt;p class="<span class='keyword'>e-content</span>"&gt;<span class='value'>Two naked tags walk into a bar. The bartender exclaims, "Hey, you can't come in here without microformats, this is a classy joint!"</span>&lt;/p&gt; &lt;/div&gt; </pre> </p> </li> <li id="web-which-parts" class="question">How does it decide which parts of my posts to include?</li> <li class="answer"> <p>If a post has <a href="http://microformats.org/">microformats</a>, Bridgy Fed looks first for the <code><a href="https://microformats.org/wiki/h-entry#Core_Properties">e-content</a></code> class, then the legacy <code><a href="https://microformats.org/wiki/hatom#Entry_Content">entry-content</a></code> class. It also understands and translates microformats2 classes like <code><a href="#web-image">u-photo</a></code>, <code><a href="#web-video">u-video</a></code>, <code><a href="#web-hashtags">p-category</a></code>, and more.</p> <p>Otherwise, Bridgy Fed uses <a href="https://developer.twitter.com/en/docs/twitter-for-websites/cards/guides/getting-started">Twitter card</a>, <a href="https://ogp.me/">Open Graph</a>, and related meta tags in your HTML.</p> <p>Bridgy Fed includes the full <code><a href="https://microformats.org/wiki/h-entry#Core_Properties">e-content</a></code> when possible, and only truncates if necessary. However, not all bridged networks currently <em>show</em> the full contents of all posts.</p> <p>For example, text-based posts fall into two broad buckets: short <a href="https://indieweb.org/note">notes</a> for microblogging and longer <a href="https://indieweb.org/article">articles</a> for long-form articles and blog posts. In the IndieWeb, <a href="https://indieweb.org/post-type-discovery#Algorithm">we differentiate based on whether the post has a title</a>: articles generally have titles, notes don't.</p> <p>In the fediverse, Mastodon currently shows the full text of notes, but for articles, it only shows their titles and a link to the full article. This is because it and most other fediverse apps are designed primarily for smaller notes, not longer articles.<p> <p>Also, <a href="https://docs.joinmastodon.org/spec/activitypub/#sanitization">Mastodon preserves HTML links and line breaks and some formatting, but not all</a>. Other fediverse servers vary in their HTML handling.</p> </li> <li id="web-visible-links" class="question">What's up with the visible fed.brid.gy links in my fediverse posts?</li> <li class="answer"> <p>These can happen for a couple reasons. For articles, this is expected behavior, <a href="#web-which-parts">as described above</a>. The link is a Bridgy Fed URL that redirects to the original post on your web site. This is <a href="https://github.com/mastodon/mastodon/pull/6219#issuecomment-429142747">because</a> Mastodon <a href="https://github.com/snarfed/bridgy-fed/issues/16#issuecomment-424799599">requires</a> ActivityPub (ie fediverse) object URLs to use the same domain that serves them, which in this case is fed.brid.gy. We know it's awkward; sorry for the ugliness! </p> <p>Otherwise, this may be the <a href="#web-how-post">invisible fed.brid.gy link that's required to trigger Bridgy Fed</a>. Mastodon will show a preview of links even if their text is blank, so if your link is inside your <code><a href="https://microformats.org/wiki/h-entry#Core_Properties">e-content</a></code> microformats2 element, that's probably what's happening. You can prevent that by moving it outside of <code>e-content</code>. It can go anywhere in your HTML! </p> </li> <li id="web-reply" class="question">How do I reply to a fediverse or Bluesky post?</li> <li class="answer"> <p> Put the reply in a new post on your web site, and include a link to the post you're replying to with class <code><a href="http://microformats.org/wiki/rel-in-reply-to">u-in-reply-to</a></code>, as if you were publishing a normal <a href="https://indieweb.org/comment">IndieWeb reply</a>. For example: <pre>&lt;div class="<span class='keyword'>h-entry</span>"&gt; &lt;p class="<span class='keyword'>e-content</span>"&gt;<span class='value'>Highly entertaining. Please subscribe me to your newsletter.</span>&lt;/p&gt; &lt;a class="<span class='keyword'>u-in-reply-to</span>" href="<a href='https://indieweb.social/@tchambers/109243684867780200'>https://indieweb.social/@tchambers/109243684867780200</a>"&gt;&lt;/a&gt; &lt;a class="<span class='keyword'>u-bridgy-fed</span>" href="<a href='https://fed.brid.gy/'>https://fed.brid.gy/</a>" hidden="from-humans"&gt;&lt;/a&gt; &lt;/div&gt; </pre> </p> </li> <li id="web-like" class="question">How do I like or repost a fediverse or Bluesky post?</li> <li class="answer"> <p>Liking and reposting are almost exactly the <a href="#web-reply">same as replying</a>. The only difference is that you use <code><a href="https://indieweb.org/like">u-like-of</a></code> for a like or <code><a href="https://indieweb.org/repost">u-repost-of</a></code> for a repost. <pre> &lt;a class="<span class='keyword'>u-like-of</span>" href="<a href='https://indieweb.social/@tchambers/109374703563569354'>https://indieweb.social/@tchambers/109374703563569354</a>"&gt;&lt;/a&gt; </pre> <pre> &lt;a class="<span class='keyword'>u-repost-of</span>" href="<a href='https://cosocial.ca/@evan/110290575042195305'>https://cosocial.ca/@evan/110290575042195305</a>"&gt;&lt;/a&gt; </pre> </p> </li> <li id="web-follow" class="question">How do I follow someone?</li> <li class="answer"> <p>If your web site supports <a href="https://indieauth.net/" style="white-space: nowrap"><img src="/oauth_dropins_static/indieauth_logo.png" style="height: 1em; margin-top: -.2em; white-space: nowrap" /> IndieAuth</a>, <a href="/web-site">go to your user page</a>, click the <em>Following</em> link, then enter the address of the account you want to follow. </p> <p>You can also follow someone by posting an <a href="https://indieweb.org/follow#How_to_markup">IndieWeb follow</a> on your site, including the <code>u-follow-of</code> microformats2 class, and sending a webmention to Bridgy Fed. Your site may do that automatically if it supports webmentions. For example: </p> <pre>&lt;div class="<span class='keyword'>h-entry</span>"&gt; I'm now following &lt;a class="<span class='keyword'>u-follow-of</span>" href="<a href='https://mastodon.social/@adactio'>https://mastodon.social/@adactio</a>"&gt;@adactio@mastodon.social&lt;/a&gt;! &lt;a class="<span class='keyword'>u-bridgy-fed</span>" href="<a href='https://fed.brid.gy/'>https://fed.brid.gy/</a>" hidden="from-humans"&gt;&lt;/a&gt; &lt;/div&gt; </pre> This method doesn't require IndieAuth, and it can be automated.</p> </li> <li id="web-unfollow" class="question">How do I unfollow someone?</li> <li class="answer"> <p><a href="/web-site">Go to your user page</a>, click the <em>Following</em> link, find the account you want to unfollow, and click the X next to their address. Like <a href="#web-follow">following</a>, this requires your web site to support <a href="https://indieauth.net/" style="white-space: nowrap"><img src="/oauth_dropins_static/indieauth_logo.png" style="height: 1em; margin-top: -.2em; white-space: nowrap" /> IndieAuth</a>. </p> </li> <li id="web-image" class="question">How do I include an image in a post?</li> <li class="answer"> <p> Use <code>&lt;img class="<span class='keyword'>u-photo</span>"&gt;</code> for the image in your post. For example: <pre> &lt;img class="<span class='keyword'>u-photo</span>" src="<span class='value'>/full_glass.jpg</span>" alt="<span class='value'>a drink</span>" /&gt; I love scotch. Scotchy scotchy scotch. </pre> </p> </li> <li id="web-video" class="question">How do I include a video in a post?</li> <li class="answer"> <p> Use <code>&lt;video class="<span class='keyword'>u-video</span>"&gt;</code> for the video in your post. For example: <pre> &lt;video class="<span class='keyword'>u-video</span>" src="<span class='value'>/dancing.mp4</span>"&gt;&lt;/video&gt; Dancing dancing dancing </pre> </p> </li> <li id="web-hashtags" class="question">How do I use hashtags?</li> <li class="answer"> <p>Use <code><span class='keyword'>p-category</span></code> and link the hashtag to a fully qualified URL. (Any URL you want!) Fediverse sites like Mastodon will generally rewrite the link to point to a search for that hashtag on the local instance. For example: <pre>&lt;div class="<span class='keyword'>h-entry</span>"&gt; &lt;p class="<span class='keyword'>e-content</span>"&gt; chasing the fun laser &lt;a href="<span class='value'>https://indieweb.social/tags/caturday</span>" class="<span class='keyword'>p-category</span>"&gt;<span class='value'>#caturday</span>&lt;/a&gt; &lt;/p&gt; &lt;/div&gt; </pre> </p> <p>The leading <code>#</code> character on the hashtag text is optional. If you don't include the hashtag in <code>e-content</code>, or include it but not inside an <code>&lt;a&gt;</code> link, fediverse sites won't add the hashtag text or link themselves, but your post will still be indexed in searches for that hashtag. </p> </li> <li id="web-mention" class="question">How do I @-mention someone?</li> <li class="answer"> <p>Include a link to their profile in your post's content with an <code>@</code> character at the beginning of the link text. For example: </p> <pre> Hi &lt;a href="<a href='https://mastodon.social/@adactio'>https://mastodon.social/@adactio</a>"&gt;<span class='value'>@adactio</span>&lt;/a&gt;! </pre> <p>The link and text are both necessary!</p> </li> <li id="web-update" class="question">How do I edit an existing post?</li> <li class="answer"> <p>Edit the post on your web site, then send another webmention to Bridgy Fed for it. Bridgy Fed will refetch the post and updated it everywhere it was originally bridged. </p> </li> <li id="web-delete" class="question">How do I delete a post?</li> <li class="answer"> <p>First, delete the post on your web site, so that HTTP requests for it return 410 Gone or 404 Not Found. Then, send another webmention to Bridgy Fed for it. Bridgy Fed will refetch the post, see that it's gone, and send an <a href="https://www.w3.org/TR/activitypub/#delete-activity-outbox"><code>Delete</code> activity</a> for it to the fediverse. </p> </li> <li id="web-fragment" class="question">Can I publish only one part of a page?</li> <li class="answer"> <p>If it's not your home page (ie path <code>/</code>), and the HTML element you want to publish has its own id, then sure! Put the id in the fragment of the URL that you publish. For example, to publish the <code>bar</code> post here:</p> <pre>&lt;div id="<span class='value'>a</span>" class="<span class='keyword'>h-entry</span>"&gt;<span class='value'>foo</span>&lt;/div&gt; &lt;div id="<span class='value'>b</span>" class="<span class='keyword'>h-entry</span>"&gt;<span class='value'>bar</span>&lt;/div&gt; &lt;div id="<span class='value'>c</span>" class="<span class='keyword'>h-entry</span>"&gt;<span class='value'>baz</span>&lt;/div&gt; </pre> <p>...add the id to your page's URL in a fragment, e.g. <code>http://site/post#b</code> here.</p> </li> <li id="web-backfeed" class="question">How do replies, likes, and other interactions show up on my site?</li> <li class="answer"> <p> To receive likes, reposts, replies, @-mentions, and follows from other networks, make sure your site accepts <a href="https://webmention.net/">webmentions</a>! Bridgy Fed translates those interactions and sends them to your site as webmentions. The source URL will usually be a proxy page on a subdomain of <code>brid.gy</code>. For best results, <a href="https://brid.gy/about#appspot">make sure your webmention handler detects and handles <code>u-url</code> links</a>. </p> </li> <li id="web-read" class="question">How do I read my timeline/feed?</li> <li class="answer"> <p><a href="#user-page">Your user page</a> has links to your timeline/feed, ie posts from people you follow, in HTML, Atom, and RSS formats. Add them to your feed <a href="https://indieweb.org/social_reader">reader</a> or read them in your browser! </p> <p>(Secret pro tip! Add <code>&quiet=true</code> to the end of any Bridgy Fed feed URL to omit likes, reposts, and follows, and only show original posts and mentions.)</p> </li> <li id="web-notifications" class="question">Are there notifications?</li> <li class="answer"> <p>Yes! <a href="#user-page">Your user page</a> has a feed of your notifications - mentions, replies, likes, reposts, follows, etc - in HTML, RSS, and Atom formats, which you can subscribe to in any <a href="https://indieweb.org/social_reader">reader</a>. (And <code>&quiet=true</code> - see above - works with these feeds too.) </p> </li> <li id="web-discovery" class="question">How can people find and follow me?</li> <li class="answer"> <p>They can search for your web site! Often you can enter your domain, eg <code>yourdomain.com</code>, in any fediverse or Bluesky search box. If that doesn't work, try your full address, either <code>@yourdomain.com@yourdomain.com</code> or <code>@yourdomain.com@web.brid.gy</code> in the fediverse and <code>yourdomain.com.web.brid.gy</code> in Bluesky.</p> <p><a href="#user-page">Your user page</a> has a <em>Followers</em> link that shows you all of your followers. It has a "remote follow" form where people can enter their fediverse address and follow you directly. </p> </li> <li id="web-see-posts" class="question">How can I see what my posts look like on other networks?</li> <li class="answer"> <p>On Bluesky, <a href="#Your+Bluesky+handle">just check out your bridged profile</a>! <p>In the fediverse, it <a href="fediverse-servers">varies by server</a>. For Mastodon, <a href="#currently+following_you">open your list of followers in Bridgy Fed</a> and click on one to open their profile. Then, inside that Mastodon instance, <a href="discovery">search for your site's address</a>, click on it in the search results, and you'll see your fediverse profile and all of your posts that were delivered to that instance. This may not be all of them, depending on how long and when people on that instance have been following you.</p> <p>This general process should often work in other fediverse servers too.</p> <p>Note: in Mastodon, each of your posts on a given instance will have a permalink inside that instance, eg <a href="https://mastodon.social/@snarfed.org@snarfed.org/109729052169033033">mastodon.social/@snarfed.org@snarfed.org/109729052169033033</a>, but those permalinks <em>only go to Mastodon if you're logged into that instance.</em> If you're not, they redirect to the original post on your site. </p> </li> <li id="web-searchable" class="question">Can I make my posts show up when people search for their URLs in the fediverse?</li> <li class="answer"> <p>Yes! Add this line of HTML to each post that you publish with Bridgy Fed and want to be searchable, replacing <code>[URL]</code> with that post's URL:</p> <pre>&lt;link rel="<span class='keyword'>alternate</span>" type="<span class='keyword'>application/activity+json</span>" href="<span class='value'>https://fed.brid.gy/r/[URL]</span>"&gt; </pre> <p><a href="https://docs.joinmastodon.org/user/network/#search">Search is limited in Mastodon and much of the overall fediverse</a>, so this won't index the full text of your posts, but it will make them show up in search results when you search for your post's full URL, which people commonly do in the fediverse to find and interact with posts.</p> </li> <li id="web-enhanced" class="question">Can I use my own domain as my handle on other networks?</li> <li class="answer"> <p>Yes! By default, your web site's bridged handle on other networks includes <code>web.brid.gy</code>, eg <code>@yoursite.com@web.brid.gy</code>, but you can use your own domain instead. Here are instructions for <a href="#fediverse-enhanced">fediverse handles</a> and <a href="#bluesky-enhanced">Bluesky handles</a>.</p> </li> <br> <h3 id="background">Background</h3> <li id="who" class="question">Who are you? Why did you make this?</li> <li class="answer"> <p> I'm <a href="https://snarfed.org/">Ryan Barrett</a>. I'm just a guy who likes <a href="https://snarfed.org/2012-07-25_why_i_have_my_own_web_site">the web</a> and <a href="https://indieweb.org/why">owning my data</a>. <a href="https://snarfed.org/2023-11-27_re-introducing-bridgy-fed">I build and run Bridgy Fed myself</a>, with <a href="https://github.com/snarfed/bridgy-fed/graphs/contributors">occasional contributors</a> and broader support via <a href="https://www.anew.social/hello-social-web/">A New Social</a>, a non-profit with <a href="https://quillmatiq.com/">Anuj Ahooja</a>. </p> <p>I love how decentralized social networks like the fediverse and the <a href="https://indieweb.org/">IndieWeb</a> let us move away from walled gardens controlled by single monolithic entities. I love that we can control our own destinies online, nurture and grow our own communities and instances, and still interact with people elsewhere. I want to be able to interact across networks just like we interact across servers. That's why I build bridges like Bridgy Fed.</p> </li> <li id="cost" class="question">How much does it cost?</li> <li class="answer"> <p>Nothing! Bridgy Fed is small, and it doesn't cost much to run. I don't need or want donations, paying customers, ads, venture capital, or any other form of money. Hosting costs are manageable right now, and it would have to grow 10-100x for that to change meaningfully. If that happens, I'll celebrate, and I'll still continue running it as is. I have experience scaling services like these as personal projects. I'm in the fortunate position to be able to do that; it's one way I try to give back to the open web and the decentralized social ecosystem.</p> <p>If you <em>really</em> want to contribute, <a href="https://github.com/snarfed/bridgy-fed/issues">file an issue</a> or <a href="https://github.com/snarfed/bridgy-fed">send a pull request</a>, or donate to your network or instance of choice! </p></li> <li id="privacy" class="question">What do you do with my data?</li> <li class="answer"> <p>Nothing! Bridgy Fed isn't a business, and never will be, so we don't have the same motivations to abuse your data that other services might. More concretely, we don't sell or otherwise expose any of your data to third parties, even in aggregate. <a href="#visibility">We only handle data that you've chosen to make fully public</a>. We never have access to any of your passwords, credentials, accounts, or other non-public information.</p> </li> <li id="history" class="question">How long has this been around?</li> <li class="answer"> <p>I started thinking about bridging different social networks when I discovered them in the early 2000s. I started talking about bridging decentralized social networks specifically in 2016, <a href="http://indieweb.org/2017/ostatusbridge">led a session on it at IndieWeb Summit</a> in July 2017, wrote up <a href="https://snarfed.org/indieweb-activitypub-bridge">concrete</a> <a href="https://snarfed.org/indieweb-ostatus-bridge"> designs</a> soon after, started working on Bridgy Fed in August 2017, and <a href="https://snarfed.org/2017-10-22_bridgy-fed">launched it on October 22, 2017</a>. </li> <li id="terms" class="question">What are the terms of service?</li> <li class="answer"> <p>Bridgy Fed's terms of service are simple. You agree not to deliberately attack, breach, or otherwise harm the service. If you manage to access private keys or other sensitive data, you agree to <a href="#vulnerability">report the vulnerability</a> and not use or disclose that data. </p> <p>Otherwise, you may use the service for any purpose you see fit. However, we may terminate or block your access for any reason, or no reason at all. (We've never done this, and we expect we never will. Just playing it safe.) </p> <p>Do you an administer an instance or other service that Bridgy Fed interacts with? If you have any concerns or questions, feel free to <a href="https://github.com/snarfed/bridgy-fed/issues">file an issue</a>!</p> </li> <li id="moderation-policy" class="question">What is your content moderation policy?</li> <li class="answer"> <p><a href="https://snarfed.org/2024-01-19_moderate-people-not-code">Content moderation for decentralized social networks, and for bridges, is complicated.</a> Bridgy Fed itself doesn't have an exhaustive content moderation policy. Instead, I try to keep these principles in mind:</p> <ul> <li> <p><strong>My primary goal is to <a href="#moderation">empower each network's existing moderation ecosystem</a>.</strong> Most decentralized social networks have existing, often mature mechanisms for content moderation. The fediverse has <a href="https://docs.joinmastodon.org/user/moderating/#block">blocks</a> and <a href="https://docs.joinmastodon.org/admin/moderation/#server-wide-moderation">defederation</a> and <a href="https://about.iftas.org/">IFTAS</a>, the IndieWeb has <a href="https://indieweb.org/Vouch">Vouch</a> and <a href="https://akismet.com/">Akismet</a>, Bluesky has <a href="https://bsky.social/about/blog/4-13-2023-moderation">labeling</a>, even Nostr has <a href="https://github.com/nostr-protocol/nips/blob/master/28.md">mutes</a> and <a href="https://github.com/nostr-protocol/nips/blob/master/51.md#standard-lists">shared mutelists</a> and <a href="https://github.com/nostr-protocol/nips/blob/master/72.md">moderated groups</a>.</p> <p>I try to ensure that those mechanisms all work with bridged accounts just as well as with native accounts, up to and including defederation. I'm always ready to hear admins' concerns and try to help! But if an instance determines that they need to block a Bridgy Fed network (domain) entirely, that's their prerogative, and I'll support them.</p> </li> <li> <p><strong>Bridgy Fed is more network infrastructure than content platform.</strong> Bridgy Fed is not a social network, nor is it an instance in one. It's a relay: it copies and translates content and interactions between existing networks and platforms. It stores some content for a moderate period of time, in order to do its job, but not forever, and it doesn't host images or media at all.</p> </li> <li> <p><strong><a href="https://snarfed.org/2023-11-27_re-introducing-bridgy-fed">I build run Bridgy Fed largely alone, as a side project.</a></strong> It's open source, and <a href="https://github.com/snarfed/bridgy-fed/graphs/contributors">other people contribute occasionally</a>, which is great! But so far, there isn't a robust community building it. <a href="https://www.anew.social/hello-social-web/">We're working on building one!</a> But mostly, right now, it's just me, sometimes full time, usually alongside a day job. I can't hire a dedicated trust and safety team, I don't expect to recruit volunteer moderators, and I'm unlikely to become an expert myself. I'm just doing my best as an amateur, with the support of organizations like <a href="https://about.iftas.org/">IFTAS</a>.</p> </li> <li> <p>Having said all that, <strong>I don't plan to run a <a href="https://en.wiktionary.org/wiki/Nazi_bar">Nazi bar</a>.</strong> I have no interest in enabling harmful behavior like harassment or incitements to violence, whether knowingly or unknowingly. I reserve the right to remove content and accounts from Bridgy Fed for any reason, or no reason at all.</p> </li> </ul> <p>These are principles, not a policy. When a user or post gets reported to me, I don't follow this letter by letter to determine what to do. The language here will evolve over time. However, I hope to live up to this <em>in spirit</em> for the long run.</p> <p>Please reach out and let me know your thoughts! And feel free to report anything you see on Bridgy Fed that you think shouldn't be there. You can <a href="https://github.com/snarfed/bridgy-fed/issues">file an issue on GitHub</a> or <a href="https://fed.brid.gy/web/snarfed.org">ping me on your social network of choice</a>.</p> </li> <li id="bug" class="question">I found a bug! I have a feature request!</li> <li class="answer"> <p>Great! Please <a href="https://github.com/snarfed/bridgy-fed/issues">file it in GitHub</a>. Thank you! </p> </li> <li id="vulnerability" class="question">I found a security vulnerability!</li> <li class="answer"> <p>Oof. Thank you for reporting it! Please <a href="https://github.com/snarfed/bridgy-fed/security/advisories">file an advisory on GitHub</a>. We may provide monetary awards for reports of significant vulnerabilities, eg reading or modifying users' private keys, <em>if</em> you follow these rules:</p> <ul> <li>Vulnerabilities must be in the application itself, not unrelated services like email (eg SPF/DKIM/DMARC).</li> <li>Out of scope: rate limiting, XSS/CSRF attacks (Bridgy Fed has no authenticated sessions or private data accessible to users). <li>Public user data is intentionally public. That's not a vulnerability.</li> <li>No automated fuzzing, DoSes, or other high volume traffic. We block this traffic, and it will disqualify you from any possible award.</li> </ul> <p>Otherwise, <a href="https://github.com/snarfed/bridgy-fed/">the code is open source</a>, feel free to try to break in, let us know if you succeed!</p> </li> <li id="succession" class="question">What's your succession plan if you can't run Bridgy Fed any more?</li> <li class="answer"> <p>The succession plan for Bridgy Fed is largely the same as for any other non-commercial open source project. Ideally, I find someone willing to take it over, transfer the hosting and development accounts to them, and it continues running as is. Worst case, <a href="https://github.com/snarfed/bridgy-fed/">the code is open source</a> and licensed as public domain, so anyone can set up their own instance and continue development. If that happens, bridged accounts based on on <code>*.brid.gy</code> subdomains and existing private keys would be orphaned, but the new instance could continue to bridge them with its new domain(s) and keys.</p> </li> <br> <h3 id="development">Development</h3> <!-- Mostly duplicated in Bridgy's docs! Keep both copies in sync! --> <li id="values" class="question">What are Bridgy Fed's product and engineering values?</li> <li class="answer"> <p>What's important to Bridgy Fed and its development? How do we make technical and design decisions and prioritize work? One way to do this is to explicitly enumerate its product and engineering <em>values</em>, along with their priorities. <a href="https://archive.org/details/vimeo-230142234">Bryan Cantrill describes this well.</a></p> <p>Bridgy Fed's top product and engineering values are:</p> <ul> <li><b>Quality</b>: expected functionality works consistently, with minimal bugs, <a href="https://en.wikipedia.org/wiki/Principle_of_least_astonishment">surprises</a>, or outages.</li> <li><b>Functionality</b>: common features and use cases are supported as broadly and comprehensively as possible.</li> <li><b>Safety and security</b>: Bridgy Fed minimizes harm to its users. The primary way this currently manifests is that it only bridges fully public data, and it <a href="#moderation-policy">enables and supports the networks' own moderation features</a> (blocking, reporting, etc). It also uses modern secure coding and ops practices to <a href="#vulnerability">minimize vulnerabilities</a> that could expose private keys or other sensitive information.</li> </ul> <p>Bridgy Fed's second tier of product and engineering values are:</p> <ul> <li><b>Accessibility</b>: users should mostly fall into a <a href="https://blog.codinghorror.com/falling-into-the-pit-of-success/">"pit of success"</a> with minimal work on their end. Discovering and following users on other networks should be as easy as possible. After that, all interactions should work automatically, transparently.</li> <li><b>Transparency</b>: it should be easy for users to understand what Bridgy Fed is doing. This includes per-user dashboard pages in the web UI, verbose public logs, and comprehensive documentation.</li> <li><b>Scalability</b>: we want to handle as much usage as we receive, as automatically as possible. This doesn't mean that Bridgy Fed is designed to handle millions of users today, just that it could be, and that we'd prioritize it.</li> </ul> </li> <p>Other possible values include maintainability, operability, feature velocity, innovation, debuggability, performance, efficiency, standards compliance, user growth, and more. Those can all be good, and we may aim at some of them too, but less than the explicitly chosen values above.</p> </li> <li id="compare" class="question">How do the different protocols compare?</li> <li class="answer"> <p>Here's a table showing how they stack up on a number of factors. It's obviously oversimplified, but hopefully still right in spirit, focusing on how they're deployed and used in the real world. For example, <a href="https://www.w3.org/TR/activitypub/#obj-id">identity in ActivityPub is technically URL-based</a>, but in practice the fediverse uses <a href="https://webfinger.net/">WebFinger</a> <a href="https://datatracker.ietf.org/doc/html/rfc7565#section-4"><code>user@domain</code> identifiers</a> more or less universally, so the table reflects that.</p> <p><a href="https://github.com/snarfed/bridgy-fed/issues">Feedback is welcome!</a></p> <table> <thead> <tr> <th></th> <th><a href="https://indieweb.org/">IndieWeb</a></th> <th><a href="https://activitypub.rocks/">ActivityPub</a> + <a href="https://webfinger.net/">WebFinger</a></th> <th><a href="https://atproto.com/">AT Protocol</a></th> <th><a href="https://nostr.com/">Nostr</a></th> <th><a href="https://www.farcaster.xyz/">Farcaster</a></th> </tr> </thead> <tbody> <tr> <th>governance</th> <td><a href="https://www.oscollective.org/">non-profit</a>, <a href="https://www.w3.org/community/socialcg/">W3C</a></td> <td><a href="https://www.w3.org/community/socialcg/">W3C</a>, <a href="https://socialhub.activitypub.rocks/t/about-the-fediverse-enhancement-proposals/1168">FEPs</a></td> <td><a href="https://bsky.social/about/blog/7-05-2023-business-plan">C-corp now</a>, <a href="https://blue.amazingca.dev/user/did:plc:44ybard66vv44zksje25o7dz/post/3k3p6upex4x2l">IETF eventually?</a></td> <td><a href="https://fiatjaf.com/">BDFL</a>, <a href="https://github.com/nostr-protocol/nips">NIPs</a>, adoption based</td> <td><a href="https://docs.farcaster.xyz/learn/contributing/fips">FIPs</a>, <a href="https://docs.farcaster.xyz/learn/contributing/governance">adoption based</a></td> </tr> <tr> <th>user identity</th> <td><a href="https://indieweb.org/personal-domain">DNS</a></td> <td>username + DNS</td> <td><a href="https://atproto.com/specs/did-plc"><code>did:plc</code></a> + <a href="https://w3c-ccg.github.io/did-method-web/"><code>did:web</code></a>,<br> <a href="https://atproto.com/specs/handle">DNS handles</a></td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/01.md#events-and-signatures">public key</a>, <a href="https://github.com/nostr-protocol/nips/blob/master/05.md">DNS handles</a></td> <td><a href="https://docs.farcaster.xyz/learn/what-is-farcaster/accounts">public key, blockchain</a>, <a href="https://docs.farcaster.xyz/learn/what-is-farcaster/usernames">ENS usernames</a></td> </tr> <tr> <th>object ids</th> <td><a href="https://indieweb.org/permalink">URL</a></td> <td><a href="https://www.w3.org/TR/activitypub/#obj-id">URL</a></td> <td><a href="https://atproto.com/specs/at-uri-scheme"><code>at://</code> URI</a>, <br><a href="https://atproto.com/specs/repository">data hash</a></td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/01.md#events-and-signatures">data hash</a></td> <td><a href="https://github.com/farcasterxyz/protocol/blob/main/docs/SPECIFICATION.md#24-casts">user id + data hash</a></td> </tr> <tr> <th>data format</th> <td><a href="https://microformats.org/wiki/microformats2">microformats2</a></td> <td><a href="https://www.w3.org/TR/activitystreams-core/">ActivityStreams 2</a></td> <td><a href="https://github.com/bluesky-social/atproto/tree/main/lexicons/app/bsky"><code>app.bsky</code> lexicons</a></td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/01.md#events-and-signatures">Nostr events</a></td> <td><a href="https://github.com/farcasterxyz/protocol/blob/main/docs/SPECIFICATION.md#21-message-data">Custom schema</a></td> </tr> <tr> <th>serialization</th> <td>HTML</td> <td>JSON</td> <td>JSON (<a href="https://atproto.com/specs/lexicon">Lexicon</a>), <a href="https://atproto.com/specs/data-model">DAG-CBOR</a>, <a href="https://atproto.com/specs/repository#car-file-serialization">CAR</a></td> <td>JSON</td> <td><a href="https://protobuf.dev/programming-guides/encoding/">Protocol Buffers</a></td> </tr> <tr> <th>delivery</th> <td><a href="https://websub.net/">push</a>/<a href="https://indieweb.org/Microsub">pull</a> posts</a>,<br> <a href="https://webmention.net/">push responses</a></td> <td><a href="https://www.w3.org/TR/activitypub/#delivery">push</a></td> <td><a href="https://bsky.social/about/blog/5-5-2023-federation-architecture">pull</a></td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/01.md#from-client-to-relay-sending-events-and-creating-subscriptions">pull</a></td> <td><a href="https://docs.farcaster.xyz/learn/architecture/hubs">gossip + pull</a></td> </tr> <tr> <th>transport</th> <td>HTTP</td> <td><a href="https://www.w3.org/TR/activitypub/#retrieving-objects">HTTP</a></td> <td>HTTP + <a href="https://atproto.com/specs/event-stream">WebSocket</a> (<a href="https://atproto.com/specs/xrpc">XRPC</a>)</td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/01.md#communication-between-clients-and-relays">WebSocket</a></td> <td><a href="https://github.com/farcasterxyz/protocol/blob/main/docs/SPECIFICATION.md#423-rpc-endpoints">gRPC</a> + <a href="https://github.com/farcasterxyz/protocol/blob/main/docs/SPECIFICATION.md#41-gossip-specifications">libp2p</a></td> </tr> <tr> <th>topology</th> <td>peer to peer</td> <td><a href="https://activitypub.rocks/">federated servers, two tier</a></td> <td><a href="https://bsky.social/about/blog/5-5-2023-federation-architecture">federated servers</a>,<br> <a href="https://bsky.social/about/blog/4-13-2023-moderation">decoupled</a> <a href="https://bsky.social/about/blog/3-30-2023-algorithmic-choice">services</a>, multi-tier</td> <td><a href="https://github.com/nostr-protocol/nostr#how-does-nostr-work">interchangeable relays,<br>two tier</a></td> <td><a href="https://docs.farcaster.xyz/learn/architecture/hubs">interchangeable hubs,<br>two tier</a></td> </tr> <tr> <th>security model</th> <td>SSL, one user per domain</td> <td><a href="https://www.w3.org/wiki/SocialCG/ActivityPub/Authentication_Authorization#Signing_requests_using_HTTP_Signatures">transport signatures,<br> custodial keys</a></td> <td><a href="https://atproto.com/specs/repository">data signatures</a>,<br> <a href="https://atproto.com/guides/overview#account-portability">custodial + user-owned keys</a></td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/01.md#events-and-signatures">data signatures,<br>user-owned keys</a></td> <td><a href="https://github.com/farcasterxyz/protocol/blob/main/docs/SPECIFICATION.md#2-message-specifications">data signatures,<br>user-owned keys</a></td> </tr> <tr> <th>app semantics live in...</th> <td>servers, clients</td> <td>servers, clients</td> <td><a href="https://bsky.social/about/blog/5-5-2023-federation-architecture">dedicated service</a>, clients</td> <td>clients</td> <td><a href="https://github.com/farcasterxyz/protocol/blob/main/docs/SPECIFICATION.md#user-content-423-rpc-endpoints">servers (hubs)</a></td> </tr> <tr> <th>blockchain</th> <td>no</td> <td>no</td> <td><a href="https://atproto.com/guides/faq#is-the-at-protocol-a-blockchain">no</a></td> <td>no</td> <td><a href="https://docs.farcaster.xyz/learn/what-is-farcaster/accounts">yes</a></td> </tr> <tr> <th>monetization</th> <td><a href="https://indieweb.org/business-models">hosting</a></td> <td>donations</td> <td><a href="https://bsky.social/about/blog/7-05-2023-business-plan">services</a></td> <td><a href="https://nostr.how/en/zaps">microtransactions</a></td> <td><a href="https://docs.farcaster.xyz/reference/contracts/reference/id-gateway#price">signup</a>, <a href="https://docs.farcaster.xyz/learn/what-is-farcaster/messages#storage">storage</a>, <a href="https://docs.farcaster.xyz/developers/frames/spec#tx">microtransactions</a> </td> </tr> <tr> <th>user base estimates<br> (as of Oct 2024)</th> <td> <!-- <a href="https://indiemap.org/">2k</a>, <a href="https://w3techs.com/technologies/overview/content_management">43M</a><br> --> <a href="https://indiemap.org/docs.html#sites">not well defined</a></td> <td><a href="https://fedidb.org/">1M MAU</a>, <a href="https://fedidb.org/">11M</a>-<a href="https://fediverse.observer/stats#user_growth_active">15M</a> total</td> <td><a href="https://bskycharts.edavis.dev/edavis.dev/bskycharts.edavis.dev/bsky_users_total.html">4.8M MAU, 1.2M DAU</a>, <a href="https://bsky.jazco.dev/stats">10.8M total</a> </td> <td><a href="https://stats.nostr.band/">32k WAU, 15k DAU, 190k total</a></a></td> <td><a href="https://dune.com/pixelhack/farcaster">167k MAU, 50k DAU, 690k total, <a href="https://bsky.app/profile/kualta.dev/post/3l6x6csytz62i">but probably</a> <a href="https://dune.com/moesalih/web3-social">much less</a></td> </tr> <tr> <th>server estimates<br> (as of Oct 2024)</th> <td><a href="https://indiemap.org/docs.html#sites">not well defined</a></td> <td><a href="https://fediverse.observer/stats#pod_growth">21k</a>-<a href="https://fedidb.org/">30k</a></td> <!-- https://the-federation.info/ --> <td><a href="https://blue.mackuba.eu/directory/pdses">~300 PDSes</a>, <a href="https://discord.com/channels/1097580399187738645/1099808924691075293" title="whtwnd, frontpage.fyi, smoke signal, atproto.camp">5+ AppViews</a>, <a href="https://bsky.app/profile/did:plc:2cxgdrgtsmrbqnjkwyplmp43/post/3l37herhgxh2r">? relays</a></td> <td><a href="https://legacy.nostr.watch/relays/statistics">800</a>-<a href="https://stats.nostr.band/">2800</a></td> <td><a href="https://www.farcaster.network/">19k</a></td> </tr> </tbody> </table> </li> <li id="translate" class="question">How are the different protocols translated?</li> <li class="answer"> <p>Here are internal details on how Bridgy Fed translates user identity and events between protocols, including some like <a href="https://github.com/nostr-protocol/nostr">Nostr</a>/<a href="https://atproto.com/">AT Protocol</a> that aren't launched here, or even fully implemented or thought through yet. Caveat hacker!</p> <p>In the tables below, BF is Bridgy Fed. <span class="done">Green parts</span> have been implemented and running here for years, the rest are still in the early design phase.</p> <p>Here's how we translate <em>user identity</em> between protocols. Specifically, each cell shows how a user in a given column is identified to the protocol in a given row. These identities uniquely identify users, and are intended primarily to be machine readable and usable. (Scroll down for the equivalent table for translating human-meaningful user handles.)</p> <p>Note that Bridgy Fed generates some of these ids itself behind the scenes, notably <a href="https://atproto.com/specs/did-plc"><code>did:plc</code>s</a> for Bluesky/AT Protocol and <a href="https://github.com/nostr-protocol/nips/blob/master/19.md#bare-keys-and-ids">npub</a></code> public keys</a> for Nostr.</p> <table> <thead> <tr> <th></th> <th>Web</th> <th>ActivityPub</th> <th>AT Protocol</th> <th>Nostr</th> </tr> </thead> <tbody> <tr> <th>Web URL</th> <td class="na">-</td> <td class="done">Fediverse profile URL</td> <td class="done"><code>https://bsky.app/profile/[<a href="https://atproto.com/specs/handle">handle</a>]</code><br> (<a href="https://github.com/bluesky-social/atproto/discussions/1652">can we avoid hard-coding bsky.app?</a>)</td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05</a> domain or BF user page</td> </tr> <tr> <th>WebFinger <a href="https://docs.joinmastodon.org/user/signup/#address">address</a></th> <td class="done"><code>@[domain]@web.brid.gy</code></td> <td class="na">-</td> <td class="done"><code>@[<a href="https://atproto.com/specs/handle">handle</a>]@bsky.brid.gy</code></td> <td><code>@[<a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05</a> or <a href="https://github.com/nostr-protocol/nips/blob/master/19.md#bare-keys-and-ids">npub</a>]@nostr.brid.gy</code></td> </tr> <tr> <th>ActivityPub <a href="https://www.w3.org/TR/activitypub/#actors">actor</a></th> <td class="done"><code>https://web.brid.gy/ap/[domain]</code></td> <td class="na">-</td> <td class="done"><code>https://bsky.brid.gy/ap/[<a href="https://atproto.com/specs/did">did</a>]</code></td> <td><code>https://nostr.brid.gy/ap/[<a href="https://github.com/nostr-protocol/nips/blob/master/19.md#bare-keys-and-ids">npub</a>]</code></td> </tr> <tr> <th>AT Protocol</th> <td class="done"><a href="https://atproto.com/specs/did-plc"><code>did:plc</code></a></td> <td class="done"><a href="https://atproto.com/specs/did-plc"><code>did:plc</code></a></td> <td class="na">-</td> <td><a href="https://atproto.com/specs/did-plc"><code>did:plc</code></a></td> </tr> <tr> <th>Nostr</th> <td><code><a href="https://github.com/nostr-protocol/nips/blob/master/19.md#bare-keys-and-ids">npub</a></code></td> <td><code><a href="https://github.com/nostr-protocol/nips/blob/master/19.md#bare-keys-and-ids">npub</a></code></td> <td><code><a href="https://github.com/nostr-protocol/nips/blob/master/19.md#bare-keys-and-ids">npub</a></code></td> <td class="na">-</td> </tr> </tbody> </table> <p>Here's how we translate <em>user handles</em> (aka usernames) between protocols. Each cell shows how a user's handle in a given column is translated to the protocol in a given row. These handles are human-chosen, human-meaningful, generally unique, but may not be the primary machine-usable ids in each protocol. Scroll down to the next table for examples, up to the previous table for machine-usable ids.</p> <p><em>Basic</em> is the default, <em>enhanced</em> requires extra setup on the user's part (or their fediverse instance's) to forward some of their <code>/.well-known</code> HTTP requests to Bridgy Fed.</p> <table> <thead> <tr> <th></th> <th></th> <th>Web</th> <th>ActivityPub</th> <th>AT Protocol</th> <th>Nostr</th> </tr> </thead> <tbody> <tr> <th>Web</th> <th></th> <td class="na">-</td> <td class="done">Fediverse profile URL</td> <td class="done">bare <a href="https://atproto.com/specs/handle">handle</a></td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05</a> domain or BF user page</td> </tr> <tr> <th rowspan="2">AP <a href="https://docs.joinmastodon.org/user/signup/#address">address</a></th> <th class="subhead">basic</th> <td class="done"><code>@[domain]@web.brid.gy</code></td> <td rowspan="2" class="na">-</td> <td class="done"><code>@[<a href="https://atproto.com/specs/handle">handle</a>]@bsky.brid.gy</code></td> <td><code>@[<a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05</a> or <a href="https://github.com/nostr-protocol/nips/blob/master/19.md#bare-keys-and-ids">npub</a>]@nostr.brid.gy</code></td> </tr> <tr> <th class="subhead">enhanced</th> <td class="done"><code>@[domain]@[domain]</code></td> <td><code>@[<a href="https://atproto.com/specs/handle">handle</a>]@[<a href="https://atproto.com/specs/handle">handle</a>]</code></td> <td><code>@[<a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05</a>]</code></td> </tr> <tr> <th rowspan="2">ATP <a href="https://atproto.com/specs/handle">handle</a></th> <th class="subhead">basic</th> <td class="done"><code>[domain].web.brid.gy</code></td> <td class="done"><code>[username].[instance].ap.brid.gy</code></td> <td rowspan="2" class="na">-</td> <td><code>[<a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05</a> or <a href="https://github.com/nostr-protocol/nips/blob/master/19.md#bare-keys-and-ids">npub</a>].nostr.brid.gy</code><br> (convert <code>@</code> to <code>.</code>)</td> </tr> <tr> <th class="subhead">enhanced</th> <td class="done">bare domain</td> <td class="done">bare domain</td> <td>bare <a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05</a> domain<br> (<code>_</code> username)</td> </tr> <tr> <th rowspan="2">Nostr <a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05</a> domain</th> <th class="subhead">basic</th> <td><code>[domain]@web.brid.gy</code></td> <td><code>[username].[instance]@ap.brid.gy</code></td> <td><code>[<a href="https://atproto.com/specs/handle">handle</a>]@bsky.brid.gy</code></td> <td rowspan="2" class="na">-</td> </tr> <tr> <th class="subhead">enhanced</th> <td>bare domain</td> <td><code>[username]@[instance]</code></td> <td>bare <a href="https://atproto.com/specs/handle0">handle</a></td> </tr> </tbody> </table> <p>Here are concrete examples:</p> <table> <thead> <tr> <th></th> <th></th> <th>Web<br><code>me.com</code></th> <th>ActivityPub<br><code>@me@instance.com</code></th> <th>AT Protocol<br><code>me.com</code></th> <th>Nostr<br><code>me@domain.com</code><br><code>[_@]me.com</code></th> </tr> </thead> <tbody> <tr> <th>Web</th> <th></th> <td class="na">-</td> <td class="done"><code>https://instance.com/@me</code><br> (varies by instance)</td> <td class="done"><code>me.com</code></td> <td>?<br><code>me.com</code></td> </tr> <tr> <th rowspan="2">ActivityPub</th> <th class="subhead">basic</th> <td><code>@me.com@web.brid.gy</code></td> <td rowspan="2" class="na">-</td> <td class="done"><code>@me.com@bsky.brid.gy</code></td> <td><code>@me[domain.]com@nostr.brid.gy</code></td> </tr> <tr> <th class="subhead">enhanced</th> <td class="done"><code>@me.com@me.com</code></td> <td><code>@me.com@me.com</code></td> <td><code>@me@domain.com</code><br> <code>@me.com@me.com</code></td> </tr> <tr> <th rowspan="2">AT Protocol</th> <th class="subhead">basic</th> <td class="done"><code>me.com.web.brid.gy</code></td> <td class="done"><code>me.instance.com.ap.brid.gy</code></td> <td rowspan="2" class="na">-</td> <td><code>me.[domain.]com.nostr.brid.gy</code></td> </tr> <tr> <th class="subhead">enhanced</th> <td class="done"><code>me.com</code></td> <td class="done"><code>me.com</code></td> <td><code>me.[domain.]com</code></td> </tr> <tr> <th rowspan="2">Nostr</th> <th class="subhead">basic</th> <td><code>me.com@web.brid.gy</code></td> <td><code>me.instance.com@ap.brid.gy</code></td> <td><code>me.com@bsky.brid.gy</code></td> <td rowspan="2" class="na">-</td> </tr> <tr> <th class="subhead">enhanced</th> <td><code>[_@]me.com</code></td> <td><code>[_@]me.instance.com</code></td> <td><code>[_@]me.com</code></td> </tr> </tbody> </table> <p>Here's how we infer the protocol for any string id. In the Format column, <span class="yes">green parts</span> are deterministic, ie they conclusively determine that a matching id belongs to the protocol, and <span class="maybe">yellow parts</span> are ambiguous, ie a matching id may or may not belong to the protocol: </p> <table> <thead> <tr> <th></th> <th></th> <th>Example(s)</th> <th>Format</th> <th>Network discovery</th> </tr> </thead> <tbody> <tr> <th rowspan="2">Web</th> <th class="subhead">user</th> <td><a href="https://snarfed.org/">https://snarfed.org/</a></td> <td class="maybe">http(s) URL with empty path</td> <td rowspan="2"><code>HTTP GET</code> succeeds and returns HTML</td> </tr> <tr> <th class="subhead">object</th> <td><a href="https://snarfed.org/2023-05-26_50328">https://snarfed.org/2023-05-26_50328</a></td> <td class="maybe">http(s) URL with non-empty path</td> </tr> <tr> <th rowspan="2">ActivityPub</th> <th class="subhead">user</th> <td><a href="https://indieweb.social/users/snarfed">https://indieweb.social/users/snarfed</a></td> <td rowspan="2" class="maybe">http(s) URL</td> <td><code>HTTP GET</code> <a href="https://www.w3.org/TR/activitypub/#retrieving-objects">with AS2 conneg</a> returns valid AS2 with <a href="https://www.w3.org/TR/activitystreams-core/#actors"><code>Actor type</code></a></td> </tr> <tr> <th class="subhead">object</th> <td><a href="https://mitra.social/post/01885fad-85ee-c6c3-191e-0a4f132c8113">https://mitra.social/post/01885fad</a></td> <td><code>HTTP GET</code> <a href="https://www.w3.org/TR/activitypub/#retrieving-objects">with AS2 conneg</a> returns valid AS2 with <a href="https://www.w3.org/TR/activitystreams-core/#actors"><code>non-Actor type</code></a></td> </tr> <tr> <th rowspan="2">AT Protocol</th> <th class="subhead">user</th> <td> <code>did:plc:abc123</code><br> <code>did:web:snarfed.org</code> </td> <td class="yes"><a href="https://atproto.com/specs/did-plc"><code>did:plc</code></a> or <a href="https://w3c-ccg.github.io/did-method-web/"><code>did:web:</code></a> prefix<br> <nobr>(TODO: <a href="https://atproto.com/specs/handle">domain handles</a>)</nobr> </td> <td class="done"> <a href="https://github.com/did-method-plc/did-method-plc#did-resolution">resolve <code>did:plc</code></a>,<br> <a href="https://w3c-ccg.github.io/did-method-web/#read-resolve">resolve <code>did:web</code></a> </td> </tr> <tr> <th class="subhead">object</th> <td><code>at://did:plc:asdf/post/abc-123</code></td> <td class="yes"><a href="https://atproto.com/specs/at-uri-scheme"><code>at://</code> URI</a></td> <td><a href="https://github.com/snarfed/atproto/blob/main/lexicons/com/atproto/repo/getRecord.json"><code>com.atproto.repo.getRecord</code></a> XRPC</td> </tr> <tr> <th rowspan="2">Nostr</th> <th class="subhead">user</th> <td> <code>abc123...</code> (<a href="https://github.com/nostr-protocol/nips/blob/master/01.md#events-and-signatures">32 chars</a>)<br> <code>npub10hx886...</code> (<a href="https://github.com/nostr-protocol/nips/blob/master/19.md">bech32</a>) </td> <td> <span class="maybe">32 char hex</span> or <a href="https://github.com/nostr-protocol/nips/blob/master/19.md#bare-keys-and-ids" class="yes"><code>npub</code> prefix</a> <nobr>(TODO: <a href="https://github.com/nostr-protocol/nips/blob/master/05.md">NIP-05</a> domains)</nobr> </td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/65.md">NIP-65</a> or <a href="https://github.com/nostr-protocol/nips/blob/master/39.md">NIP-39</a> lookup</td> </tr> <tr> <th class="subhead">object</th> <td> <code>def456...</code> (<a href="https://github.com/nostr-protocol/nips/blob/master/01.md#events-and-signatures">32 chars</a>)<br> <code>nevent10hx886...</code> (<a href="https://github.com/nostr-protocol/nips/blob/master/19.md">bech32</a>)<br> <code>note10hx886...</code> (<a href="https://github.com/nostr-protocol/nips/blob/master/19.md">bech32</a>) </td> <td> <span class="maybe">32 char hex</span> or <a href="https://github.com/nostr-protocol/nips/blob/master/19.md#bare-keys-and-ids" class="yes"><code>nevent</code>, <code>note</code>, etc</a> prefix</a> </td> <td><code><a href="https://github.com/nostr-protocol/nips/blob/master/01.md#from-client-to-relay-sending-events-and-creating-subscriptions">REQ</a></code> request</td> </tr> </tbody> </table> <p>Here's how we translate <em>events and operations</em> between protocols, both inbound to and outbound from Bridgy Fed: </p> <table> <thead> <tr> <th></th> <th>Web</th> <th>ActivityPub</th> <th>AT Protocol</th> <th>Nostr</th> </tr> </thead> <tbody> <tr> <th>User discovery inbound</th> <td class="done">serve <code><a href="https://microformats.org/wiki/h-card">h-card</a></code> on BF user page</td> <td class="done"><em>basic</em>: serve <a href="https://webfinger.net/">WebFinger</a> and <a href="https://www.w3.org/TR/activitypub/#actors">AP actor</a> on fed.brid.gy<br> <em>enhanced</em>: user's site serves and redirects <a href="https://webfinger.net/">WebFinger</a> to fed.brid.gy </td> <td class="done">resolve <a href="https://www.w3.org/TR/did-core/">DID</a>, serve DID document with fed.brid.gy <a href="https://atproto.com/guides/data-repos">PDS</a></td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/39.md">NIP-39</a> (kind 0) query to BF (or other?) relay</td> </tr> <tr> <th>User discovery outbound</th> <td class="done">Fetch home page, parse <code><a href="https://microformats.org/wiki/h-card">h-card</a></code></td> <td class="done">look up <a href="https://webfinger.net/">WebFinger</a>, fetch <a href="https://www.w3.org/TR/activitypub/#actors">AP actor</a></td> <td class="done">resolve <a href="https://www.w3.org/TR/did-core/">DID</a>, subscribe to <a href="https://atproto.com/guides/data-repos">PDS</a> repo, extract profile object?</td> <td>discover user's relays with <a href="https://github.com/nostr-protocol/nips/blob/master/65.md">NIP-65</a>, query <a href="https://github.com/nostr-protocol/nips/blob/master/39.md">NIP-39</a> to get profile</td> </tr> <tr> <th>Publish inbound</th> <td class="done"><a href="https://webmention.net/">webmention</a> to fed.brid.gy</td> <td class="done">deliver to fed.brid.gy <a href="https://www.w3.org/TR/activitypub/#inbox">inbox</a>, user or shared</td> <td class="done">receive post via <a href="https://docs.bsky.app/docs/advanced-guides/firehose">firehose</a> from relay</td> <td>publish <a href="https://github.com/nostr-protocol/nips/blob/master/01.md#events-and-signatures">event</a> to BF relay</td> </tr> <tr> <th>Publish outbound</th> <td class="done">serve on BF user page followings <code><a href="https://microformats.org/wiki/h-feed">h-feed</a></code></td> <td class="done">deliver to recipient's <a href="https://www.w3.org/TR/activitypub/#inbox">inbox</a></td> <td class="done">serve commit via <a href="https://atproto.com/lexicons/com-atproto-sync"><code>subscribeRepos</code> XRPCs</a> to subscribing <a href="https://bsky.social/about/blog/5-5-2023-federation-architecture">relays</a></td> <td>serve to subscribers</td> </tr> <tr> <th>Follow inbound</th> <td class="done"><em>users</em>: UI on BF user page<br> <em>code</em>: <a href="https://webmention.net/">webmention</a> with <code><a href="https://indieweb.org/follow#How_to_publish">u-follow-of</a></code></td> <td class="done"><code><a href="https://www.w3.org/TR/activitystreams-vocabulary/#dfn-follow">Follow</a></code> activity delivered to BF user <a href="https://www.w3.org/TR/activitypub/#inbox">inbox</a></td> <td class="done">receive follow via <a href="https://docs.bsky.app/docs/advanced-guides/firehose">firehose</a> from relay</td> <td>user's client sends <code><a href="https://github.com/nostr-protocol/nips/blob/master/01.md#from-client-to-relay-sending-events-and-creating-subscriptions">REQ</a></code> to BF relay</td> </tr> <tr> <th>Follow outbound</th> <td class="done"><a href="https://webmention.net/">webmention</a> with BF proxy HTML page as source</td> <td class="done">deliver <code><a href="https://www.w3.org/TR/activitystreams-vocabulary/#dfn-follow">Follow</a></code> to followee's <a href="https://www.w3.org/TR/activitypub/#inbox">inbox</a></td> <td class="done">call <code><a href="https://atproto.com/lexicons/com-atproto-sync#comatprotosyncsubscriberepos">sync.subscribeRepos</a></code> on followee's <a href="https://atproto.com/guides/data-repos">PDS</a>?</td> <td>discover followee's relay(s) with <a href="https://github.com/nostr-protocol/nips/blob/master/65.md">NIP-65</a>, send them a <code><a href="https://github.com/nostr-protocol/nips/blob/master/01.md#from-client-to-relay-sending-events-and-creating-subscriptions">REQ</a></code></td> </tr> <tr> <th>Response inbound</th> <td class="done"><a href="https://webmention.net/">webmention</a> to a BF proxy page</td> <td class="done"><code><a href="https://www.w3.org/TR/activitystreams-vocabulary/#dfn-create">Create</a></code>, <code><a href="https://www.w3.org/TR/activitystreams-vocabulary/#dfn-like">Like</a></code>, <code><a href="https://www.w3.org/TR/activitystreams-vocabulary/#dfn-announce">Announce</a></code> delivered to BF user <a href="https://www.w3.org/TR/activitypub/#inbox">inbox</a></td> <td class="done">receive response via <a href="https://docs.bsky.app/docs/advanced-guides/firehose">firehose</a> from relay</td> <td><a href="https://github.com/nostr-protocol/nips/blob/master/10.md">NIP-10</a> response <a href="https://github.com/nostr-protocol/nips/blob/master/01.md#events-and-signatures">event</a> received at BF relay or other relay</td> </tr> <tr> <th>Response outbound</th> <td colspan="4">same as follow outbound, with the corresponding response data type</td> </tr> </tbody> </table> </li> <li id="router" class="question">How are activities routed?</li> <li class="answer"> <p>A bridge does more than just translate protocols and formats. It processes activities (events) based on domain-specific logic and semantics. The domain Bridgy Fed currently handles is public social microblogging, the kind popularized by Twitter. There are many other related social domains, with fuzzy boundaries and lots of overlap, eg forums (Reddit), questions and answers (StackOverflow), project trackers (GitHub), and many more, but here we're currently focused on microblogging.</p> <p>Even within that domain, behavior logic varies. Twitter follows are one way, but Facebook friends are bidirectional. Your Bluesky timeline (skyline) includes your followings' replies, but your fediverse timeline generally doesn't. LinkedIn...honestly I have no clue how LinkedIn works, but I'm sure it has its own logic, workfluencers and all.</p> <p>Here's what Bridgy Fed's activity router does. I've tried to make it follow "least common denominator" logic, ie do the most common and least surprising thing, and I've explicitly tried not to innovate or invent anything new here. It's a bridge, not a product, after all.</p> <table class="list"> <thead> <tr> <th>When Bridgy Fed receives a...</th> <th>The router will...</th> </tr> </thead> <tbody> <tr> <th>follow</th> <td><ul> <li>deliver the follow activity to the followee</li> <li>automatically send an accept activity to the follower<br> (we may eventually add UX for this)</li> <li>store the follower locally</li> <li>generate a local notification to the follower</li> </ul></td> </tr> <tr> <th>unfollow</th> <td><ul> <li>deliver the unfollow activity to the followee</li> <li>deactivate the locally stored follower</li> </ul></td> </tr> <tr> <th>new post</th> <td><ul> <li>deliver to all active stored followers</li> <li>store the post locally</li> </ul></td> </tr> <tr> <th>update post</th> <td><ul> <li>deliver to all active stored followers</li> <li>update the locally stored post</li> </ul></td> </tr> <tr> <th>delete post</th> <td><ul> <li>deliver to all active stored followers</li> <li>mark the locally stored post deleted</li> </ul></td> </tr> <tr> <th>delete actor</th> <td><ul> <li>deactivate their locally stored follows, to and from</li> </ul></td> </tr> <tr> <th>reply</th> <td><ul> <li>deliver to the original post</li> <li>store locally</li> <li>generate a local notification to the original post's author</li> </ul></td> </tr> <tr> <th>repost</th> <td><ul> <li>deliver to all active stored followers</li> <li>store locally</li> <li>generate a local notification to the original post's author</li> </ul></td> </tr> <tr> <th>like</th> <td><ul> <li>deliver to the original post</li> <li>generate a local notification to the original post's author</li> </ul></td> </tr> </tbody> </table> </li> <!-- <li id="error-handling" class="question">How are errors handled?</li> --> <!-- <li class="answer"> --> <!-- <p>"It's complicated." ...well, at least a bit. There are different philosophies on how to architect request handling and error propagation in these kinds of server-to-server protocols. --> <!-- </p> --> <!-- <p>One common bit of received wisdom is to handle all requests asynchronously, in the background. Do minimal request validation synchronously, if necessary, then return HTTP 202 (or 201) and enqueue the request in a background task queue to be processed offline. This is widespread in ActivityPub implementations, for example. Webmention even <a href="https://webmention.net/draft/#receiving-webmentions">recommends it as a SHOULD</a>! --> <!-- </p> --> <!-- <blockquote> --> <!-- Upon receipt of a POST request containing the source and target parameters, the receiver SHOULD verify the parameters (see Request Verification below) and then SHOULD queue and process the request asynchronously, to prevent DoS attacks. --> <!-- </blockquote> --> <!-- <p>It's a good idea, but it has drawbacks. Most importantly, it hides errors. Sending side implementations always receive HTTP 202 responses, even when their requests fail in the background, and there's no standard or widely implemented way to get more information or debug. Webmention nods to this and says <a href="https://webmention.net/draft/#receiving-webmentions">receivers can return a per-request status URL in the <code>Location</code> response header</a>, but that's not widely implemented, and ActivityPub has no corresponding mechanism. This makes development and interop materially harder, especially in these protocols' loosely connected ecosystems. <a href="https://github.com/mastodon/mastodon/issues">Mastodon's issue tracker</a>, for example, is full of issues complaining "Mastodon isn't working with my code, but I can't tell why!" --> <!-- </p> --> <!-- <p>Bridgy Fed currently takes a compromise position. It handles most requests synchronously, blocks on delivering them to the destination protocol, and propagates any errors back to the sender with the appropriate HTTP response status code and body (often JSON). Delivering posts to ActivityPub followers is one exception; it currently delivers to inboxes serially, so it often takes many minutes, which is uncomfortably long for many HTTP clients. --> <!-- </p> --> <!-- <p>Converting to webmention is another exception. Bridgy Fed uses webmentions and microformats2 to provide social interactions for web sites, but unlike with other protocols, it doesn't require web sites to support them. So, Bridgy Fed doesn't currently convert webmention failures (or lack of support) to errors in other protocols. It records those failures, and shows them in the UI on your user page, but returns success to the sending side in its own protocol. --> <!-- </p> --> <!-- </li> --> </ul> </div> <div id="footer" class="row"> <p class="header-links"> <a href="/docs">Docs</a> &nbsp; <a href="https://snarfed.org/?s=%22bridgy+fed%22">News</a> &nbsp; <a href="https://github.com/snarfed/bridgy-fed">Code</a> &nbsp; <a href="https://github.com/snarfed/bridgy-fed/issues">Issues</a> </p> </div> </main> <script src="/static/fragmention.js"></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10