I was interested to find out how the different pieces of software that make up the fediverse connect together so I tried to investigate. I got confused about all the different cases and exceptions, so I wanted to write it down in a post. I’ll keep updating this post when I learn more.

Specs

The relevant specs are ActivityPub, ActivityStreams (AS2) and the AS2 Vocabulary.

ActivityStreams and its Vocabulary define the elements that make up posts, timelines, followers and likes, the kind of stuff we know from social media. ActivityPub defines how these messages can be exchanged between servers. This creates a decentralised web of servers and services where users can follow and message each other. This is the fediverse.

Imagine being able to use your Twitter account to follow someone’s Instagram account and reply with praise about their photos. And imagine your sister setting up her own Twitter server and giving you an account on that. The fediverse is like that. Except of course Twitter and Instagram don’t support that, they want to keep you within their systems because they need your clicks to make money. Instead most software in the fediverse is open source software.

Mastodon

Mastodon (see https://joinmastodon.org/) is a Twitter like service where you post short messages, follow other people’s messages and reply to them.

The posts are modelled as objects with type Note. The text is in the attribute content (and/or contentMap?) and is assumed to be plain text or html. The summary attribute has a special meaning: it is not shown as a short excerpt of the post followed by a ‘read more’ link, but as a content warning or trigger warning, followed by a link to read anyway; the result is the same.

If the content contains html, it is completely stripped and presented as plain text. Except hyperlinks, which remain functional even though there’s no way in the Mastodon UI itself to create hyperlinks.

If a post of type Article comes in, it is converted to a Note and treated as such.

When someone posts a message, it is sent to other servers as a Create activity of the Note object. If someone likes a post, it is sent as a Like activity. If someone shares a message (reposts, reblogs, retweets, boosts) it is sent as an Announce activity. Like and Announce can be undone by sending the Undo activity. The Delete activity of posts is supported. The Update activity for posts is not.

Media (photo’s, video’s, audio files) are accepted as content of the attachments attribute of the Note object. Such an Image object contains a Link object. Mastodon will retrieve the media from the remote server and store it internally. This media will be kept. Mastodon allows either four images, or one video or one audio file.

Direct media objects (e.g. a Create activity with an Image object) are not supported.

Following someone is done by sending a Follow activity to the server of the person you want to follow, with the Actor object as the object of the activity. That server responds with an Accept or Reject activity (with the Follow activity as object) either immediately, or after the followed user manually accepted/rejected the request. You stop following someone by sending an Undo activity with the original Follow as object. The other server can stop the follow relationship as well by sending a Reject (with the Follow as object) even after first accepting it.

Note that because Mastodon doesn’t store the original activities, it will not include the original Follow activity in any Reject or Undo, but create a fake new one. In that Mastodon is not spec compliant.

If a user blocks another user, Mastodon sends a Block activity (with the user’s Actor as object) to inform the other server (and possibly that user) that they are blocked and will they please stop reading these messages.

If a post contains text that looks like a web address, the UI tries to fetch and show a preview of that page when showing the post. This preview is not part of the post as created and sent to other servers.

(to check: polls)

Glitch-soc

Glitch-soc (see https://glitch-soc.github.io/docs/) is a fork of Mastodon and it does basically the same thing, but a little more. E.g. glitch-soc is able to receive rich text (as html in the content attribute) and show it to the users.

Pleroma

Pleroma (see https://pleroma.social/) is also a Twitter like service. It interacts with other servers in much the same way as Mastodon, with some exceptions.

Pleroma tries to be more spec compliant. It stores ActivityStream objects internally, so if the spec says to include the original activity, e.g. in an Undo, it does so.

Pleroma accepts rich text as html content and only strips dangerous tags. It also provides users with a UI to enter rich text in several formats like html, markdown, bbcode, but they are all converted to html. Users can also enter hyperlinks.

It accepts Article posts without the need to convert them.

Media are also modelled the same as Mastodon does (as Image, Video, etc, objects in the attachment attribute which has Link objects pointing to the original), and retrieves the content from the remote server. These remote media contents are however only cached temporarily and refetched if needed.

Direct media objects (e.g. a Create activity with an Image object) are not supported.

To check: is audio supported?

Pleroma also doesn’t send Block activities to the affected servers or users. Blocking is handled internally by making sure the blocking user doesn’t see posts or notifications by the blocked user.

If a post contains text that looks like a web address, the UI tries to fetch and show a preview of that page when showing the post. This preview is not part of the post as created and sent to other servers.

(to check: polls)

Pleroma is also the only implementation I know of that supports the Client to Server part of the ActivityPub spec.

Friendica

Friendica (see https://friendi.ca/) can do everything. It tries to connect to all other services and be the spider in the web. At its heart it is a Facebook alternative, where by default accounts are set to need a mutual connection (so a manual Accept to a Follow request), though a user can set their account to soapbox-style so Follow requests are accepted automatically.

It also has concepts like Events, Photo Albums, etc, though I don’t know how these are communicated over ActivityPub, if at all.

Friendica seems to accept any ActivityPub message, even though it can not always display it right. E.g. a direct image post (a Create activity with an Image as object) is accepted, but the image doesn’t show.

It tries to distinguish between flavours of ActivityPub, e.g. it knows when it’s talking to a Pleroma server or a Mastodon server.

Friendica also connects over the OStatus protocol, with Diaspora, and integates with Twitter, Tumblr, WordPress, etc.

The post editor allows posts to be created in bbcode. If a photo is inserted, the editor creates a post with a hyperlink to the original and a smaller preview as attachment. This is how the post is sent to other servers. This differs from the behaviour of Mastodon and Pleroma, which just attach (a reference to) the image and leave stuff like previews to the UI of the system the receiving user is using.

Friendica also supports groups in the form of Forums, that can be addressed by using “!” instead of “@” in a mention. The forums can be located on a different server than the user’s server, but the forum server will still be able to authenticate the user as a member of the forum because Friendica supports OpenWebAuth.

Pixelfed

Pixelfed (see https://pixelfed.org/) is a photo sharing application like Instagram.

It supports communication with Mastodon, Pleroma, etc over ActivityPub. If a user makes a post of a photo (or multiple photos) a Create activity with a Note object is sent to that user’s followers. The Note object contains the caption in the content (or contentMap) attribute. The attachments attribute contains a list of Image objects, one for each photo. Each contains a Link object that refers to the photo on the originating server. (to do: check) Similar for a video post.

This is also the way Pixelfed expects to receive posts (and the way Mastodon sends them). If a Note object is received as part of a Create activity, its attachments are checked for video or image content. If it is just a text post, or has just an audio attachment, it is not received. If it is a direct media post (a Create activity with a Image object) it is not received as there is currently no other software that sends such messages reliably.

If the object is of type Article it is also not received, even if it has media attachments.

PeerTube

PeerTube (see https://joinpeertube.org/) is a video sharing platform like Youtube. Users can have multiple channels in which they can post videos. Within the platform users can subscribe to (follow) specific channels of other users, they can’t follow the user’s account itself.

PeerTube accounts and channels can be followed over ActivityPub from Mastodon, Pleroma, etc. Which gives the weird situation that PeerTube accounts (rather than channels) can be followed by non-PeerTube accounts only.

Non-PeerTube accounts can comment on (reply to) video’s by normal Note messages. Like messages are also supported, as are Dislike messages. The latter seem only the available to Peertube accounts within the platform.

If a user posts a video, after it has been processed by the server, a Create activity is sent with a Video object. This is different from the other ActivityPub software which sends media as attachments to Note or Article objects.

Other PeerTube servers will only receive a Create activity with a Video object if it conforms to strict criteria. E.g. the content attribute which contains the caption needs to be encoded in markdown (not html). Also the url needs to be a webtorrent link.

If someone viewed a video (or the majority of it) a View activity is sent to indicate the video has been seen. The server hosting the video can update the view count.

WordPress

A WordPress blog can be attached to the fediverse by installing the ActivityPub plugin. It can also cooperate with other IndieWeb sites using the relevant IndieWeb plugins. These plugins are compatible.

There’s another plugin that attaches WordPress to the fediverse: Pterotype. I don’t have experience with that one. It is not fully compatible with the Indieweb plugins.

When a WordPress post or page is published, a Create activity is sent to the blog’s followers on the fediverse. The object in the Create activity is either a Note or an Article or any other type like Image, Video, depending on user settings. It is best to keep this setting at Note for compatibility with e.g. Pixelfed.

Delete is not yet supported as an activity to send. Update neither (to do: check).

The WordPress ActivityPub plugin supports received Follow activities (will automatically send an Accept) and replies in the form of Notes.

Funkwhale

Funkwhale is an audio sharing platform like Soundcloud. I have no experience with it. I believe it is using a part of the ActivityStreams vocabulary which is not supported by the other software.

SocialHome

Will soon support ActivityPub. Besides that I think it supports the Diaspora protocol (to do: check).

Plume

To do

Writefreely

To do

Misskey

To do

Osada

Supports both ActivityPub and Zot as protocols.

Hubzilla

Only supports ActivityPub if the admin has installed it as plugin. The demonstration instance for new users does not have it installed.

See https://zotlabs.org/page/hubzilla/hubzilla-project.

Hubzilla (as a Zot implementation I think, to do: check) supports nomadic identities. This means that a user account is not linked to a single server (Hub), but can be used on multiple hubs. This solves the problem of servers going out of service and users moving home.

Zap

See https://zotlabs.com/zap/. Supports Zot as protocol, not ActivityPub. Is migrating to a new version of Zot which will make it incompatible with Osada and other Zot implementations.

Diaspora

Does their own thing and uses only its own protocol. I’ve been told it connects with Friendica and Hubzilla.

Relays

In Mastodon and several other services, messages are only delivered to a server if there is someone on that server following that author. Even if the message is a publically visible message. This means that the network timeline of public messages can remain quite empty especially for new or small servers.

Mastodon has the ability for one server to follow another server. This is not commonly done. Peertube does have the same ability, though here it is much more common as I understand.

Pleroma has relay functionality built in in the software, where the administrator can subscribe to a relay. This relay is separate software (Litepub Relay, see https://git.pleroma.social/pleroma/relay) which is provided by Pleroma and which creates Announce (reblogs) activities for each Create activity it receives. Mastodon can follow such a relay as well.

I think Friendica also has such a separate relay software. (to do: check)

Diaspora seems to have separate relay software where servers (pods in their terminology) can subscribe to hashtags instead of the whole feed. To do: check.

Profile directories

Mastodon has an optional, opt-in, profile directory with the scope of the local server. There is no global directory.

Friendica has a Site Directory (for the local server) as well as a Global Directory as a separate but decentralised application. Both are opt-in only. See https://dir.friendica.social/.