🐧 #Linux #*BSD #FLOSS #sysadmin #infosec #OSdev #EuroStack #fedivers #etc 🐧

The Nuts and Bolts of Decentralized Social Media

Published on: by Florin Ionescu

Updated on: • 22 min read

(This is the complete text written for my presentation from 16th of October 2026, "The Nuts and Bolts of Decentralized Social Media", at OmniOpenCon, in Bucharest. A raw video recording can be found on my PeerTube channel, but I recommend reading this instead. Due to time limit, most of my talk was just about ActivityPub (with one exception, people in the audience were a bit more familiar with ActivityPub than with ATproto and were seemingly more favorably biased towards the former; I tried to strike a balance, though you'll learn in the end what my personal judgment turned out to be). Many thanks to ROSedu, the organizers of OmniOpenCon, who accepted my talk despite my lack of experience and who kindly assisted with technical matters! And thanks to all of those who attended, see you next year!)

Before I introduce myself, let me tell you a story.

July 2026. One day, a man called Gustav thought to himself, "I am the incarnation of the spirit of TikTok"... So he decides to register on W Social, a new social media network promoted by the European Comission, so he verifies his identity in 13 steps...

(source: Elena Rossini - @elena@aseachange.com)

...and then he can finally create his profile. Now the entire planet will know him as mister... TikTok.

Except there is one problem. Within hours, Gustav's wonderful account was marked as spam. And he received this notice...

...from the moderators of Bluesky, which is a different social media network, based in the US. Wait, wasn't this W Social supposed to be social media made in Europe?

Well, W Social is actually derived from Bluesky, users from both platforms interact with each other thanks to something called ATproto (Authenticated Transfer Protocol). You and I can use different apps, different servers, but still be able to see and interact with each other, as the networks we use share a certain "technical language" - or protocol. Think of it like email. Most ATproto users are on Bluesky, but, in principle, anyone can self-host their own PDS or even a full stack of ATproto services, including a decentralized moderation service (Ozone). If you create an account on Bluesky, by default, your account will be subscribed to Bluesky's moderation; but if you go instead to Blacksky, which is another fork of Bluesky, there your account would be subscribed to Blacksky's moderation, which has different policies, such as these ones...

...but on W Social, the moderation service is only used so far to label verified accounts, not addressing user content whatsoever, which critics have decried with comments such as "W Social is speedrunning from scratch to become like X, but made in Europe".

Do you feel confused? I hope you feel challenged as we are entering the rabbit hole of decentralized social media... Fair to say, just like with Linux, it's a deep rabbit hole with an intimidating variety of choice... Today we discuss ATproto and ActivityPub, and the latter alone has this many major implementations:

  • Conversational fediverse: Friendica, Hubzilla, (streams), Forte
  • Microblogging fediverse: Mastodon, Hometown, Threads, Micro.blog, Pleroma, Akkoma, Misskey, Sharkey, Wafrn, Mitra, GoToSocial, honk, snac, littleFedi, Almost Static ActivityPub
  • Macroblogging fediverse: Wordpress, Drupal, Ghost, WriteFreely
  • Threadiverse/forum systems: Lemmy, kbin, mbin, Piefed, PyLova, NodeBB, Discourse
  • Media sharing/streaming: Pixelfed, PeerTube, Loops, Funkwhale, Owncast, Castopod
  • Event planning/group management: Mobilizon
  • Social cataloging/socialized databases: BookWyrm, NeoDB, Cookifed, Gush!
  • Social coding: Gitlab, Forgejo
  • Toolkits: Fedify, Emissary
  • Feed/algorithm builders/link aggregation: FediAlgo, RaccoonBits, Mastodon Algorithms, Mastodon Feed
  • Third party apps/clients/alternate web frontends: Elk, Tusky, Tokodon, Agora, Croissant, Fread, Feather, Herd, Ice Cubes, Ivory, Tuba, Fedilab, Husky, Phanpy, Subway Tooter, Mammut, Cuckoo+, Ebou, Sengi, Kaiteki, Mastodeck, Sweetfish, Mast, Whalebird, Shitter, TheDesk, Semaphore, OpenVibe, Sora (SNS), Nootti, Metatext, Pinafore, Nomad, Fedicat, chan-fe, Nicolium, Bloat, Brutaldon, toot, tut, Gomphotherium, mastodon.el, DOStodon --

The equivalent list for ATproto also looks almost like an iceberg meme:

  • Microblogging: Bluesky, Blacksky, Northsky, anisota, SkySpace
  • Macroblogging: Leaflet.pub, Whitewind, Pastesphere
  • Forum systems: nooki, PinkSea
  • Messaging: Roomy
  • Media sharing/streaming: Pinksky, Skylight, Flashes, Grain, Spark, Bluescreen, Skyswipe, Omni, SoundSky, Stream.place, Plyr.fm, GrayHaze
  • Event planning/group management: Smoke Signal, OpenMeet
  • Business networking: at://work
  • Social cataloging/socialized databases: BookHive, Popfeed, Skylights, recipe.exchange
  • Social coding: Tangled, RutHub
  • Feed/algorithm builders/link aggregation: Graze, Surf, SkyFeed, Germ, Sill, Frontpage, Feedly
  • Third party clients/alternate frontends: anisota, Pinksky, Graysky, Darksky, Bluefeed, deer.social, Dragonfly, Skeets, deck.blue, Beeskie, Red Dwarf, Klearsky, Tokimeki, Ouranos, picosky, Kite, sunrise, Skywalker, Bluejeans, Boost Blue, Fread, Croissant, Agora, OpenVibe, Sora (SNS), Nootti, anartia, Skyscraper, bluesky_tui, tuisky, emacs-bluesky

We'll get back in the end to these overwhelming lists. Now it's time I introduce myself... I am Florin... Speakers at conferences frequently use "whoami", but I'll type something more interactive, that you can type as well:

finger fionescu@plan.cat

"finger" either can be installed quickly through your package manager of choice or it's already installed by your operating system, though you might have to adjust your security settings, because finger was used as an attack vector in the past... it dates back to 1971 and it's the ancestor of all social media - or at least microblogging - services. Want me to read aloud?

Hello there, people of OmniOpenCon 2026! I am Florin Ionescu and I am here because earlier this year I decided to self-host not just MediaWiki (for a poetry book database I've previously hosted on... Blogger) and XMPP, but also my own social media instances based on ActivityPub as well as ATproto. I've done this despite having no prior experience as a webmaster and being for a long time very far from "cyberpunk"; my father is a tech support guy with a hobby for drawing circuits to extend the capabilities of retro computers like CoBra, yet I chose not to focus as much on IT, but instead on literature, which enabled me to learn critical thinking and be concerned about power relationships and infrastructure.

Despite how much I was deconstructing everything else, there was one blind spot: my tools, my computers and phone, the software and the websites I used. Then comes 2025 and suddenly I became involved in the #BuyFromEU movement, as a protest. After 30 years of Windows, I switched to Linux, and around the same time I started using Bluesky, Mastodon and Lemmy. But this was just the beginning of a long quest to rethink the relationship with my data, my computing.

Having a chronologically-sorted timeline with no ads squeezed in between people's posts is already an improvement, and, up until now, most people can just make an account on the largest instances on Bluesky and Mastodon, like I did at first. But then I didn't just want a Twitter clone, I'm from Romania and most people in Romania use Facebook, we talk too much to be confined to the length of a tweet (or "toot", as Mastodon folks like to call it, which gives me the cringe!).

(source: hamea.net)

Then I learned about Friendica, which kind of looks like old-school Facebook and is compatible with both Bluesky and Mastodon (this would be my recommendation for people who don't care about more features), and then there's Hubzilla, which I ended up choosing because it has multiple separate identities under one account (like you would have on modern Facebook), as well as fully portable data AKA "nomadic identity", and a ton of other features (let's consider it the KDE or the Emacs of the fediverse; just look up the rich history of Friendica and Hubzilla: https://hubzilla.org/page/info/timeline).

I initially signed up to someone else's Hubzilla instance, but it was either slow or not working at all. Once I managed to rent a VPS and get Hubzilla running in a Docker container (more on that later), it runs much faster now and I could actually migrate all of my posts, follows, followers, everything! This is part of something which is called "nomadic identity" - it's decentralized identity management with remote access control: "All of your accounts are aware of each other. If you switch to a new primary, you can trigger an update to all of your existing conversation threads and comments to switch the author, and replicate the data on your end" (source).

"Nomadic identity" does not exist yet on the rest of ActivityPub; on Hubzilla it is enabled by an auxiliary protocol called Zot; the original creator of Hubzilla, Mike Macgirvin, also maintains an experimental fork called (streams), where he has been trying over the last few years to implement nomadic identity directly through ActivityPub, innovation which was cataloged officially as a Fediverse Enhancement Proposal - FEP-ef61: Portable Objects; however, I've been told that, for reasons yet to be investigated, this feature is still experimental, doesn't always work as expected, and the problem remains that a bigger developer team such as that of Mastodon would have to spend more resources on this challenge!

Full disclosure, the old Hubzilla and my new one were running different versions, so the automatic migration tool failed, but I could quickly manually import the files from my old account and it worked. This was actually the simplest part of my troubleshooting. I was only able to make Hubzilla work after a session of troubleshooting with Saiwal, a Hubzilla developer who kindly explained to me what I should do in Docker, as I had a botched container image and volume which I had to prune, but also it didn't help that I insisted on running Nginx on my host VPS as opposed to inside the container itself (however, taking this step assured a painless transition to Caddy months later), or that I was unaware that SSMTP_ROOT can be something like administrator@mydomain.tld while SSMTP_AUTHUSER should be an actual e-mail address (no, I don't self-host a mail server... yet).

While quite happy about Hubzilla as a self-publishing tool, I decided to not use it for all of my social media activities. One reason is that the best experience one might have on decentralized social media is by having different accounts with different communities that are sufficiently well connected so that their timelines have a high ratio of interesting content. This was also an opportunity for me to try out some other kinds of ActivityPub software - for instance, Akkoma with the Mangane front-end had at one point a better implementation of the infinite feed than any Big Tech network: if you were at the top of the page, posts would continously be displayed as they are received, but scroll down and you can read at your own pace - without posts getting displaced by ad blocks or for some other obscure CSS reason - while still getting notified about new unread posts (they seem to have recently replaced it with a static view, probably because that old view was still a too "FOMO" experience for some people).

To be honest, another reason is that Hubzilla posts may not always send successfully to the rest of the fediverse, and - it happened to me once - even other Hubzilla instances might receive them with delay. However, I can't blame them as Hubzilla receives, I imagine, few donations and only last year did they receive some NLnet funding; also, take into account the historical clashes between Hubzilla and Mastodon.

By the way, time for a little Wikipedia: ActivityPub was elaborated in 2017-18 together with the World Wide Web Consortium, being a fork of ActivityPump and designed as a response to the protocol behind GNU social, OStatus, which was too complex and only allowed for microblogging, whereas with ActivityPub you can now have everything from Reddit-style message boards (Lemmy and Piefed) to YouTube or TikTok style videos (PeerTube and Loops), as well as anything else that can work with ActivityPub integration... here's the core ActivityPub spec:

  • Introduces the concept of an Actor as a fundamental primitive component of the social web. (It’s similar to, but more powerful and flexible than, the traditional “account” of previous social media efforts.)
  • Defines the core “distributed event log” architectural model for the open social web – that is, to model any social interaction, use an extensible Object, wrapped in an Activity.
  • Defines a Server-to-Server (S2S) protocol for distributing Objects and Activities to interested parties.
  • Defines a Client-to-Server (C2S) protocol for client software to interact with Actors and their data.
  • Uses the ActivityStreams 2 (AS2) core data model to describe some commonly used social web activities, and the corresponding ActivityStreams Vocabulary that describes common extensions to AS2.
  • Uses Linked Data (JSON-LD) as a decentralized mechanism for publishing data model extensions.

Notice the use of JSON-LD: fortunately for servers that want to bridge the two protocols, ATproto also consists of JSON records; however, ATproto is designed not with the mail server in mind, but rather closer to a version control system like Git, which is ironic considering that Gitlab and Forgejo, two increasingly popular alternative to GitHub, have chosen to federate instead with... ActivityPub. (However, there are similar alternatives built on ATproto: Tangled and RutHub.)

So in ActivityPub, user accounts are identified as Actors; the content they post, update or delete is called an Object, and for this, the protocol provides a client-to-server API, as well as a server-to-server API so that content from my server can be delivered to your server.

Objects are forwarded or received just like emails, there's an inbox and an outbox. All these are specified as endpoints, URLs in an Actor's description. Sounds simple enough...?

Back in 2017, Hubzilla was the first to implement ActivityPub and it was sending its posts as "Article"-type Objects complete with HTML text formatting. Shortly afterwards, Mastodon, with their focus on pure microblogging, rejected text formatting - even though allowed by the ActivityPub specs - by using an "HTML sanitiser" until 2022, before they decided to stop showing "Article"-type Objects and only show their title and a link to the original post, to which they recently added a "content warning" that can be used as post summary (I'm paraphrasing this text by Jupiter Rowland).

Another thing is that Hubzilla's default web client shows federated posts in the timeline, but it does not generate views of the posts that could be perma-linked - it just gives you links to the original sources - and profiles of accounts outside Hubzilla and its forks are not displayed directly at all, even though the "friends" management screen treats them as channels. That's less comfortable for my usage of social media, so I turned off the timeline. Which is fine, as I anyway have limited storage on my VPS. I am not the only one, many ActivityPub instances are run by volunteers who have limited disk space, yet the software usually fetches and stores all federated media locally, which is why a recent ActivityPub implementation called littleFedi enables an instance to proxy the media or fetch it directly from originating instances (see their four-tier media management).

I haven't run littleFedi yet, but it's very interesting to me as it is optimized to run on even a Raspberry Pi Zero W, and yet it's very featureful, and also the fact that instances can federate solely through cryptographic identities, within a LAN/through a mesh (see littleMesh). Also, it can turn a post into a static page; if not for "nomadic identity", I would pivot away from Hubzilla!

I've tried another couple of minimalistic ActivityPub implementations that inspired littleFedi: Mitra - which controversially features federation with Tor and I2P as well as user incentivization with cryptocurrency-based subscriptions, but you can disable those like I did and what remains is a solid lightweight alternative to Mastodon with more privacy and security features, such as unguessable paths that challenge AI bots! - and snac (lowercase acronym standing for "social networks are crap"). It weighs only 5-10 MB of RAM, so it's perfect for frugal computing; it has great documentation and I like that it uses no JavaScript. No killer features, but it's good at what it does. (I haven't tried GoToSocial and Starling, but they also might interest you if you're using a low-to-mid-budget VPS.)

Speaking of frugal computing, remember what I was saying about "finger", the ancestor of microblogging? Recently, there has been a revival of interest in finger as part of a movement called the "smolweb", and also included there is the so-called Gemini network/protocol (not developed by Google, by the way). Webpages on Gemini are generally static text pages with no inline images, just emojis and hyperlinks; how could you have social media on it?

Well, I am running my own ActivityPub server on Gemini, thanks to a software called tootik. From inside this 50-year old operating system called Emacs, I posted and then edited this test post. In the server logs, it looks like this:

{"time":"2026-10-10T17:47:05.954615825Z","level":"INFO","msg":"Forwarding activity to followers of thread starter","domain":"tootik.princeps-poesis.xyz","activity":"https://tootik.princeps-poesis.xyz/.well-known/apgateway/did:key:z6MkmwtBeL81vcCJQyBe9gxXuTzDa7krX9UneSCxXu8XJDeY/actor/create/01a126ec-f55d-79a3-b013-2ee2f1ce311f","note":"https://tootik.princeps-poesis.xyz/.well-known/apgateway/did:key:z6MkmwtBeL81vcCJQyBe9gxXuTzDa7krX9UneSCxXu8XJDeY/actor/post/01a126ec-f55c-7cba-aeb4-bdd84aed5354","thread":"https://tootik.princeps-poesis.xyz/.well-known/apgateway/did:key:z6MkmwtBeL81vcCJQyBe9gxXuTzDa7krX9UneSCxXu8XJDeY/actor/post/01a126ec-f55c-7cba-aeb4-bdd84aed5354","starter":"https://tootik.princeps-poesis.xyz/.well-known/apgateway/did:key:z6MkmwtBeL81vcCJQyBe9gxXuTzDa7krX9UneSCxXu8XJDeY/actor"}
{"time":"2026-10-10T17:47:05.954650136Z","level":"INFO","msg":"Received a new post","activity":{"id":"https://tootik.princeps-poesis.xyz/.well-known/apgateway/did:key:z6MkmwtBeL81vcCJQyBe9gxXuTzDa7krX9UneSCxXu8XJDeY/actor/create/01a126ec-f55d-79a3-b013-2ee2f1ce311f","type":"Create","actor":"https://tootik.princeps-poesis.xyz/.well-known/apgateway/did:key:z6MkmwtBeL81vcCJQyBe9gxXuTzDa7krX9UneSCxXu8XJDeY/actor","object":{"kind":"object","id":"https://tootik.princeps-poesis.xyz/.well-known/apgateway/did:key:z6MkmwtBeL81vcCJQyBe9gxXuTzDa7krX9UneSCxXu8XJDeY/actor/post/01a126ec-f55c-7cba-aeb4-bdd84aed5354","type":"Note","attributed_to":"https://tootik.princeps-poesis.xyz/.well-known/apgateway/did:key:z6MkmwtBeL81vcCJQyBe9gxXuTzDa7krX9UneSCxXu8XJDeY/actor"}},"post":"https://tootik.princeps-poesis.xyz/.well-known/apgateway/did:key:z6MkmwtBeL81vcCJQyBe9gxXuTzDa7krX9UneSCxXu8XJDeY/actor/post/01a126ec-f55c-7cba-aeb4-bdd84aed5354"}
{"time":"2026-10-10T17:47:07.606313479Z","level":"INFO","msg":"Viewing post","request":{"path":"/users/view/3hgvu54j8Npsz4TW","user":"testyz"},"post":"3hgvu54j8Npsz4TW"}
{"time":"2026-10-10T17:47:09.597286687Z","level":"INFO","msg":"Successfully delivered an activity to all recipients","id":"https://tootik.princeps-poesis.xyz/.well-known/apgateway/did:key:z6MkmwtBeL81vcCJQyBe9gxXuTzDa7krX9UneSCxXu8XJDeY/actor/create/01a126ec-f55d-79a3-b013-2ee2f1ce311f"

And then the post looks like this from an Android-based Gemini browser (Buran):

As you can see, this is not HTTPS. However, that does not mean that my server cannot federate with those outside the Gemini network (for those in the know: it's all TCP, it always has been!). Before I edited my test post, I used a web browser to log into a Mastodon instance where I have a non-admin account, then I searched the handle of my Tootik account...

Here you can experience what is considered the biggest UX limitation of ActivityPub: this Mastodon instance or any other has never exchanged information before with my new Tootik instance. If you search, you can discover the account, but if nobody followed it before, that account's posts are not fetched automatically, by design.

Remember that I was testing if anyone from the WWW can see if I write on Gemini? After I followed "myself" from Mastodon, I go back to Tootik to edit my post; ta-dam, this instance of Mastodon now knows not just about my account, but also about this post.

Don't worry if your network isn't directly compatible, as there can be bridges to another protocol or several of them. For instance, some of you may be familiar with Nostr, which takes a different approach to identity, defining it solely as a keypair; due to features like monetary incentive through crypto, it isn't used by almost anyone outside of the crypto space. Not the same happened with ATproto and ActivityPub, which is why I'm focusing on these two protocols that have the most users - especially if you count Threads, the app from Meta that basically exists just so that Meta can scrape the fediverse, or whatever is left of it after some instances blocked Threads...

So yeah, ActivityPub and ATproto are not the only decentralized social media protocols that exist; one of the creators of ActivityPub, Christine Lemmer-Weber, is working on another project which is called Spritely / OCapN, or Object Capability Network, based on CapTP, the Capability Transport Protocol, which is focused on "intentional collaboration amongst networked objects"; there's no space here to further discuss it, but it's a potential future avenue you might want to consider if you're a developer. Also, there's a promising project from the Social Coding Commons group, who are trying to improve the ActivityPub API by pushing for a decoupling of client and server software, and if that's not going to be accepted, they'll implement instead an ActivityPub extension called Protosocial, which they define as a "social graph of addressible actors that exchange activities with an object payload"; they want ActivityPub to have a clear separation of Transport and Data layers so that implementation developers won't have to negotiate the wire-level plumbing anymore, and then users wouldn't have to worry anymore about incompatibilities such as those between Hubzilla and Mastodon.

Enough about ActivityPub... the reason I've dedicated less space to ATproto is simple: it's very interesting in some aspects (and here I disagree with certain fediverse advocates who claim there's nothing redeeming to ATproto and that it's all too corporate and centralized), the protocol does solve in theory some problems of ActivityPub, but in practice it can still be cumbersome to self-host, as we'll see in a bit.

You see, the major difference between ActivityPub and ATproto is that while ActivityPub assumes a monolithic server, ATproto assumes a modular architecture with a stack of microservices: a Personal Data Server (which is esentially a portable repository), a Relay or Jetstream (both are services which stream activities, but the former merges all of them into a massive firehose, while the latter provides a plain JSON digest that requires far less storage), an AppView (repo content distributor/data aggregator and user-facing application), and Ozone (a Labeler AKA moderation service), to which one might add other infrastructure services such as Rainbow (an event firehose splitter that reduces load on the upstream relays), Constellation (a backlink index), Spacedust (interactions firehose), Slingshot (cache and resolver for records and identities) or Tap (synchronization and backfill tool).

These services can have different implementations; for instance, there's an alternative PDS implementation that is designed to run on just a Cloudflare Worker, Cirrus. What glues together all this infrastructure is the usage of an HTTP API for and client and service interoperability, called XRPC (Cross-organizational Remote Procedure Calls), and by the fact that records and XRPC calls are designed along the lines of so-called lexicon schema (these are listed on the Lexicon Garden platform). ATproto AppViews can re-use some of these schema and/or implement new ones. Some AppViews, such as Tokimeki, choose to expose whatever lexicon endpoints an account uses; for instance, you can see here that my Eurosky account, seen from Tokimeki, was plugged also into an AppView called anisota, as it uses several unique lexicons for the purpose of turning the ATproto social feed into a sort of card game with a finite deck instead of infinite scroll feeds (unfortunately, anisota is closed-source, but I expect at least some of its features to be cloned for ActivityPub any time soon).

(illustration credit: overreacted.io)

Software engineer Dan Abramov appreciates the fact that ATproto is more like RSS, in the sense that hosting and aggregation are detachable, and the ways aggregation work in ATproto enable far more discoverability (the maximum of it is illustrated by the peculiar Red Dwarf client, which uses Constellation and Slingshot to fetch records directly from each user’s PDS and then reconstruct the relationships through backlinks). By contrast, he dismisses ActivityPub as medieval, with its users being defined by their presumed allegiance to this or that instance...

Admittedly, this can happen, especially on the threadiverse, the Reddit-like side of the fediverse, where many larger instances are not "general", "big tent" instances that claim to represent no political position in particular, but tend to be ideologically opinionated, a social phenomenon which I believe is quite inevitabile, especially in this historical era... However, this concern for politics can reach malicious extremes, as illustrated recently when the developer of third-party front-end Tesseract was caught implementing a hardcoded instance defederation/block list disguised with API errors! However, single-user instances on either ATproto or ActivityPub don't suffer from this possibility of you getting blocked by mere association with a certain community, so it's a no-brainer that self-hosting would be the best idea, right?... Right?...

In principle, the average user could just self-host a PDS and accept a standard PLC DID identity, provided by the centralized service plc.directory. But when I read a blogpost tutorial by Mai Lapyst, detailing how it is possible to use a DID WEB identity to become allegedly independent from Bluesky, I decided that I want to follow these steps and thus start hosting my own entire ATproto stack, in the hopes of no longer having to stay associated with Eurosky, who have recently also embraced, within the client Mu Social, the privacy and security disaster known as age verification, or "Age Assurance System"... (Not all ATproto clients have implemented it though!)

Easier said than done! Beyond the relatively trivial process of setting up the PDS instance itself, the challenge of preparing, creating and especially validating a decentralized DID account proved to be... hardcore. For me, JWT tokens proved a big pain point, beginning with the compiling errors that I encountered on my first attempt of running the recommended Ruby and Go scripts, problem which only went away with another Ruby update a few weeks later. While trying to understand and troubleshoot, the JWT tokens expired more than once in between. But then even after ironing out the DNS records and fixing small mistakes here and there, I was still not privileged enough to finally reach "validDid": true, nor did I figure out if there's any level of debugging I could access to grasp the root cause...

Am I not intelligent enough? Maybe, but there's a case to be made that setting up your server shouldn't have to be this difficult and tedious and it shouldn't have to depend on APIs controlled by a company that can go bust at any time! Mai Lapyst further mentioned that they still had to activate the account by directly logging into the official Bluesky web app - which as of recently prompts for age verifications immediately. In other words, I am not sure if it's even possible to truly have a decentralized ATproto account anymore - and how much would have it even been worth it? Before and after I moved my Bluesky account to Eurosky (I actually wanted initially to switch to Northsky, but by the time they reached my position in the waiting list, I was already no longer on Bluesky), I experienced more than once instability, with one atrociously generic message popping up fairly regularly both on conventional AppViews, not just Red Dwarf, and on infrastructure tools such as the Relay Directory:

My personal conclusion is that, at least for the time being, ATproto misses its potential by quite a large margin. ATproto fans might complain about ActivityPub spaces being too "collectivist" and dominated by group thinking and boast about Bluesky et al. being more friendly towards individual users who are not tech-savvy, but in my experience with several kinds of ActivityPub servers, both more minimal and more complex, it's way easier to deploy ActivityPub, not to mention one can easily get advice directly from developers and other power users.

Otherwise, with both ATproto and ActivityPub expecting the user to discover at least some of the content on their own or with the help of community-sourced lists, and with bridges being available standalone (Bridgy Fed) or bundled with several apps (Agora, Fread, OpenVibe, Sora and others) and server implementations (Friendica, Wafrn), the differences in experience aren't as significant anymore, overall...

Most of the implementations listed in the beginnings were pulled from resources such as Delightful Fediverse Experience and Awesome ATproto.

F.I.