To submit an implementation report, use the ActivityPub test suite to generate an implementation report and then submit that report to the ActivityPub issue tracker. (Or, file a PR directly to this site's repository.)
Implementation reports
(hover for description) | # yes | Bridgy Fed | distbin.com | dokieli | go-fed | Kroeg | Mastodon | microblog.pub | PeerTube | places.pub | Pleroma | Pubstrate | Smilodon | tags.pub |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Client-to-Server Client | 5 | No | Yes | Yes | No | Yes | No | Yes | No | No | No | Yes | No | No |
Client-to-Server Server | 6 | No | Yes | No | Yes | Yes | No | Yes | No | No | Yes | Yes | No | No |
Federated (Server-to-Server) Server | 12 | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
client:submission:discovers-url-from-profile | 5 | N/A | Yes | Yes | N/A | Yes | N/A | Yes | N/A | N/A | N/A | Yes | N/A | N/A |
client:submission:submit-post-with-content-type | 5 | N/A | Yes | Yes | N/A | Yes | N/A | Yes | N/A | N/A | N/A | Yes | N/A | N/A |
client:submission:submit-objects | 5 | N/A | Yes | Yes | N/A | Yes | N/A | Yes | N/A | N/A | N/A | Yes | N/A | N/A |
client:submission:submit-objects:provide-object | 4 | N/A | No | Yes | N/A | Yes | N/A | Yes | N/A | N/A | N/A | Yes | N/A | N/A |
client:submission:submit-objects:provide-target | 3 | N/A | No | Yes | N/A | Yes | N/A | No | N/A | N/A | N/A | Yes | N/A | N/A |
client:submission:authenticated | 4 | N/A | No | Yes | N/A | Yes | N/A | Yes | N/A | N/A | N/A | Yes | N/A | N/A |
client:submission:recursively-add-targets | 5 | N/A | Yes | Yes | N/A | Yes | N/A | Yes | N/A | N/A | N/A | Yes | N/A | N/A |
client:submission:recursively-add-targets:limits-depth | 5 | N/A | Yes | Yes | N/A | Yes | N/A | Yes | N/A | N/A | N/A | Yes | N/A | N/A |
client:retrieval:accept-header | 5 | N/A | Yes | Yes | N/A | Yes | N/A | Yes | N/A | N/A | N/A | Yes | N/A | N/A |
outbox:accepts-activities | 6 | N/A | Yes | N/A | Yes | Yes | N/A | Yes | N/A | N/A | Yes | Yes | N/A | N/A |
outbox:accepts-non-activity-objects | 5 | N/A | Yes | N/A | Yes | Yes | N/A | Yes | N/A | N/A | No | Yes | N/A | N/A |
outbox:removes-bto-and-bcc | 5 | N/A* | No | N/A | Yes | Yes | N/A | Yes | N/A | N/A | Yes* | Yes | N/A | N/A |
outbox:ignores-id | 6 | N/A | Yes | N/A | Yes | Yes | N/A | Yes | N/A | N/A | Yes | Yes | N/A | N/A |
outbox:responds-201-created | 6 | N/A | Yes | N/A | Yes | Yes | N/A | Yes | N/A | N/A | Yes | Yes | N/A | N/A |
outbox:location-header | 6 | N/A | Yes | N/A | Yes | Yes | N/A | Yes | N/A | N/A | Yes | Yes | N/A | N/A |
outbox:update | 4 | N/A* | No* | N/A | Yes | Yes | N/A | Yes | N/A | N/A | No | Yes | N/A | N/A |
outbox:update:partial | 4 | N/A* | No* | N/A | Yes | Yes | N/A | Yes | N/A | N/A | Inconclusive | Yes | N/A* | N/A* |
outbox:create | 5 | N/A* | No | N/A | Yes | Yes | N/A | Yes | N/A | N/A | Yes | Yes | N/A | N/A |
outbox:create:merges-audience-properties | 4 | N/A* | No | N/A | Yes | Yes | N/A | Inconclusive* | N/A | N/A | Yes* | Yes | N/A | N/A |
outbox:create:actor-to-attributed-to | 4 | N/A* | No | N/A | Yes | Yes | N/A | Inconclusive* | N/A | N/A | Yes* | Yes | N/A | N/A |
outbox:follow | 4 | N/A | No | N/A | Yes | Yes | N/A | Yes | N/A | N/A | No | Yes | N/A | N/A |
outbox:follow:adds-followed-object | 2 | N/A | No | N/A | No | Yes | N/A | No | N/A | N/A | No | Yes | N/A | N/A |
outbox:add | 3 | N/A | No | N/A | Yes | Yes | N/A | No* | N/A | N/A | No | Yes | N/A | N/A |
outbox:add:adds-object-to-target | 2 | N/A | No | N/A | Inconclusive* | Yes | N/A | No* | N/A | N/A | No | Yes | N/A | N/A |
outbox:remove | 2 | N/A | No | N/A | Inconclusive* | Yes | N/A | No* | N/A | N/A | No | Yes | N/A | N/A |
outbox:remove:removes-from-target | 2 | N/A | No | N/A | Inconclusive* | Yes | N/A | No* | N/A | N/A | No | Yes | N/A | N/A |
outbox:like | 4 | N/A | No | N/A | Inconclusive* | Yes | N/A | Yes | N/A | N/A | Yes | Yes | N/A | N/A |
outbox:like:adds-object-to-liked | 4 | N/A | No | N/A | Inconclusive* | Yes | N/A | Yes | N/A | N/A | Yes | Yes | N/A | N/A |
outbox:block | 4 | N/A | No | N/A | Yes | Yes | N/A | Yes | N/A | N/A | No | Yes | N/A | N/A |
outbox:block:prevent-interaction-with-actor | 4 | N/A | No | N/A | Yes | Yes | N/A | Yes | N/A | N/A | Inconclusive | Yes | N/A | N/A |
outbox:undo | 3 | N/A | No | N/A | No* | Yes | N/A | Yes | N/A | N/A | No | Yes | N/A | N/A |
outbox:undo:ensures-activity-and-actor-are-same | 3 | N/A | No | N/A | No | Yes | N/A | Yes | N/A | N/A | No | Yes | N/A | N/A |
inbox:delivery:performs-delivery | 7 | Yes | Yes | N/A | Yes | Yes | N/A* | Yes | N/A* | N/A* | Yes | Yes | N/A* | N/A* |
inbox:delivery:addressing | 7 | Yes | Yes | N/A | Yes | Yes | N/A* | Yes | N/A* | N/A* | Yes | Yes | N/A* | N/A* |
inbox:delivery:adds-id | 7 | Yes | Yes | N/A | Yes | Yes | N/A* | Yes | N/A* | N/A* | Yes | Yes | N/A* | N/A* |
inbox:delivery:submit-with-credentials | 4 | Yes | No | N/A | Yes | Yes | N/A* | Yes | N/A* | N/A* | Inconclusive | No | N/A* | N/A* |
inbox:delivery:deliver-to-collection | 5 | Yes | No | N/A | Yes | Yes | N/A* | Yes | N/A* | N/A* | N/A* | Yes | N/A* | N/A* |
inbox:delivery:deliver-to-collection:recursively | 4 | No | No | N/A | Yes | Yes | N/A* | Yes | N/A* | N/A* | No | Yes | N/A* | N/A* |
inbox:delivery:delivers-with-object-for-certain-activities | 8 | Yes | No | N/A | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | No | No |
inbox:delivery:delivers-with-target-for-certain-activities | 6 | N/A | No | N/A | Yes | Yes | Yes | No | Yes | No | Yes | Yes | No | No |
inbox:delivery:deduplicates-final-recipient-list | 8 | Yes | Yes | N/A | Yes | Yes | No | Yes | Yes | No | Yes | No | Yes | No |
inbox:delivery:do-not-deliver-to-actor | 7 | No | No | N/A | Yes | Yes | Yes | Yes | Yes | No | Yes | No | No | Yes |
inbox:delivery:do-not-deliver-block | 6 | N/A | No | N/A | Yes | Yes | Yes | Yes | Yes | No | Yes | No | No | No |
inbox:delivery:sharedInbox | 5 | No | No | N/A | No | Yes | Yes | Yes | Yes | Missing | Yes | No | No | Missing |
inbox:delivery:sharedInbox:deliver-to-inbox-if-no-sharedInbox | 5 | N/A | No | N/A | No | Yes | Yes | Yes | Yes | Missing | Yes | N/A* | No | Missing |
inbox:accept:deduplicate | 7 | No | Yes | N/A | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | No |
inbox:accept:special-forward | 4 | No | No | N/A | Yes | Yes | No | No | No | No | Yes | Yes | No | No |
inbox:accept:special-forward:recurses | 4 | No | No | N/A | Yes | Yes | No | No | No | No | Yes | Yes | No | No |
inbox:accept:special-forward:limits-recursion | 4 | No | No | N/A | Yes | Yes | No | No | No | No | Yes | Yes | No | No |
inbox:accept:create | 9 | No | Yes | N/A | Yes | Yes | Yes | Yes | Yes | Missing | Yes | Yes | Yes | Missing |
inbox:accept:delete | 6 | No | No | N/A | Yes | Yes | Yes | Yes | Yes | Missing | Yes | No | No | Missing |
inbox:accept:delete:tombstone | 3 | No | No | N/A | Yes | Yes | Yes | No | No | Missing | No | No | No | Missing |
inbox:accept:update:is-authorized | 6 | N/A | No | N/A | Yes | Yes | Yes | Yes | Yes | No | Yes | No | No | No |
inbox:accept:update:completely-replace | 7 | Yes | No | N/A | Yes | Yes | Yes | Yes | Yes | No | Yes | No | No | No |
inbox:accept:dont-blindly-trust | 6 | N/A | No | N/A | No | Yes | Yes | Yes | Yes | No | Yes | No | No | Yes |
inbox:accept:follow:add-actor-to-users-followers | 9 | N/A | No | N/A | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes |
inbox:accept:follow:generate-accept-or-reject | 7 | N/A | No | N/A | Yes | Yes | Yes | Yes | Yes | Missing | Yes | No | Yes | Missing |
inbox:accept:accept:add-actor-to-users-following | 7 | N/A | No | N/A | Yes | Yes | Yes | Yes | Yes | Missing | Yes | No | Yes | Missing |
inbox:accept:reject:does-not-add-actor-to-users-following | 7 | N/A | No | N/A | Yes | Yes | Yes | Yes | Yes | Missing | Yes | No | Yes | Missing |
inbox:accept:add:to-collection | 4 | N/A | No | N/A | Yes | Yes | No | No | No | No | Yes | Yes | No | No |
inbox:accept:remove:from-collection | 4 | N/A | No | N/A | Yes | Yes | No | No | No | No | Yes | Yes | No | No |
inbox:accept:like:indicate-like-performed | 8 | Yes | No | N/A | Yes | Yes | Yes | Yes | Yes | No | Yes | No | Yes | No |
inbox:accept:announce:add-to-shares-collection | 6 | Yes* | No | N/A | No | Yes | Yes | Yes | Yes | Missing | Yes | No | No | Missing |
inbox:accept:undo | 5 | No | No | N/A | No | Yes | Yes | Yes | Yes | Missing | Yes | No | No | Missing |
server:inbox:responds-to-get | 8 | No | Yes | N/A | Yes | Yes | No | Yes | No | No | Yes | Yes | Yes | Yes |
server:inbox:is-orderedcollection | 8 | N/A | Yes | N/A | Yes | Yes | No | Yes | No | No | Yes | Yes | Yes | Yes |
server:inbox:filtered-per-permissions | 5 | N/A | No | N/A | No | Yes | No | Yes | No | No | Yes | Yes | No | Yes |
server:object-retrieval:get-id | 10 | No | Yes | N/A | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes |
server:object-retrieval:respond-with-as2-re-ld-json | 10 | No | Yes | N/A | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes |
server:object-retrieval:respond-with-as2-re-activity-json | 10 | No | Yes | N/A | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes |
server:object-retrieval:deleted-object:tombstone | 3 | No | No | N/A | Yes | Yes | No | No | No | No | No | Yes | No | No |
server:object-retrieval:deleted-object:410-status | 6 | No | No | N/A | Yes | Yes | Yes | Yes | No | No | Yes | Yes | No | No |
server:object-retrieval:deleted-object:404-status | 6 | No | No | N/A | No | Yes | Yes | Yes | Yes | No | Yes | Yes | No | No |
server:object-retrieval:private-403-or-404 | 4 | No | No | N/A | No | Yes | Yes | No | No | No | Yes | No | No | Yes |
server:security-considerations:actually-posted-by-actor | 6 | No | No | N/A | No | Yes | Yes | Yes | Yes | No | Yes | No | No | Yes |
server:security-considerations:do-not-post-to-localhost | 6 | No | Yes | N/A | No | Yes | Yes | Yes | No | No | Yes | Yes | No | No |
server:security-considerations:uri-scheme-whitelist | 5 | No | No | N/A | No | Yes | Yes | Yes | No | No | Yes | Yes | No | No |
server:security-considerations:filter-incoming-content | 4 | No | Yes | N/A | No | Yes | No | No | No | No | Yes | Yes | No | No |
server:security-considerations:sanitize-fields | 5 | Yes | Yes | N/A | Missing | Yes | Yes | Missing | Missing | No | Yes | No | No | No |
Implementation details
Bridgy Fed | |
---|---|
Homepage | https://fed.brid.gy/ |
Source Repo | https://github.com/snarfed/bridgy-fed |
Developers | |
Notes / About | Bridgy Fed is a bridge that converts between webmentions, ActivityPub and OStatus. It connects the IndieWeb with federated social networks like Mastodon, Hubzilla, and others in the fediverse that support two protocols. Bridgy Fed is a loose extension of Bridgy, which is a similar bridge between the IndieWeb and social media sites. As of November 2017, it has >4k users and has successfully sent >900k webmentions for responses inside those sites. DetailsUsers use Bridgy Fed by creating an IndieWeb post (in HTML with microformats2) on their own web site that replies, likes, or reposts (aka announces) a post on a federated social network. They then send a webmention to Bridgy Fed to trigger it to fetch their IndieWeb post, convert it to ActivityStreams 2 (via granary), and deliver it to the target post's author and other recipients via ActivityPub. Bridgy Fed handles the other direction too. If a federated social network user replies to, likes, or reposts an IndieWeb post, Bridgy Fed will accept it in their inbox, translate it into a webmention, send it to the IndieWeb post, and convert the AS2 object to HTML with microformats2 to be rendered for the webmention receiver. This is federation, not syndication. IndieWeb posts translated to AS2 objects have both post object and actor based at the IndieWeb site's domain, with appropriate ids and URLs. If the IndieWeb site is Bridgy Fed can do all this via OStatus as well. About the Server-to-Server implementationThe Bridgy Fed Server:
|
Interoperability with other implementations | |
Publicly Accessible? | yes |
Free/Libre/Open Source? | yes |
License | Public Domain / CC0 |
Programming Language | Python |
distbin.com | |
---|---|
Homepage | https://distbin.com |
Developers | |
Notes / About | Distbin is a distributed pastebin. Anyone can anonymously create little text posts, and anyone else can reply to them. You can even create posts that are inReplyTo parent posts that are hosted elsewhere on the web (like another distbin.com installation), and distbin will tell the parent about it via ActivityPub. distbin is made up of at least two components:
|
Publicly Accessible? | yes |
Free/Libre/Open Source? | no |
Programming Language | JavaScript |
dokieli | |
---|---|
Homepage | https://dokie.li/ |
Source Repo | https://github.com/linkeddata/dokieli |
Developers | |
Notes / About | dokieli is a clientside editor for decentralised article publishing, annotations and social interactions. It can work as a single-page application or as a Web browser extension.
|
License | Apache License 2.0 |
Programming Language | Javascript |
go-fed | |
---|---|
Homepage | https://go-fed.org |
Source Repo | https://github.com/go-fed/activity |
Notes / About | go-fed is a library that implements ActivityStreams and ActivityPub in Go. Whether you wish to create a new application, add ActivityPub to an existing one, or just use ActivityStreams data types, go-fed is here to help. The website hosts a tutorial geared for developers who may not be familiar with the ActivityStreams and ActivityPub protocols. It also hosts GoDoc-like documentation for each versioned release. Applications using go-fed can turn many of the "No" entries in this implementation report to "Yes". Use the security protocols, spam filtering, and administrative tooling required for your application's needs. "Why wait 'til tomorrow? go-fed.today!" Official implementation reports were first generated using go-fed |
Publicly Accessible? | yes |
Free/Libre/Open Source? | yes |
License | BSD 3-Clause |
Programming Language | Go |
Kroeg | |
---|---|
Source Repo | https://git.puckipedia.com/kroeg/server |
Developers | |
Notes / About | Serves ActivityPub and has bridges to OStatus. ActivityPub federation tested against Mastodon. |
Interoperability with other implementations | |
Publicly Accessible? | yes |
Free/Libre/Open Source? | yes |
License | Expat (MIT) |
Programming Language | Rust |
Mastodon | |
---|---|
Homepage | https://joinmastodon.org |
Source Repo | https://github.com/tootsuite/mastodon |
Developers | Over 400 contributors at time of report submission |
Notes / About | Mastodon is a free, open-source, decentralized microblogging application with support for the ActivityPub and OStatus protocols. Built for global networks of close-knit communities, Mastodon puts social networking back in the hands of users. |
Interoperability with other implementations | Applications interoperating with Mastodon over ActivityPub must support Webfinger resolution, with a unique preferredUsername per host, so that they can be interacted with by other users. Posts to the inbox must be signed using the HTTP Signatures draft spec with a public key that can be fetched from the actor, using the publicKey object format from the WebPayments JSON-LD Security Vocabulary. |
Publicly Accessible? | yes |
Free/Libre/Open Source? | yes |
License | AGPLv3 |
Programming Language | Ruby, Javascript |
microblog.pub | |
---|---|
Homepage | https://microblog.pub |
Source Repo | https://github.com/tsileo/microblog.pub |
Notes / About | A self-hosted, single-user, ActivityPub powered microblog. |
Publicly Accessible? | yes |
Free/Libre/Open Source? | yes |
License | GNU AGPLv3 |
Programming Language | Python |
PeerTube | |
---|---|
Homepage | https://peertube.cpy.re |
Source Repo | https://github.com/Chocobozzz/PeerTube |
Notes / About | Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent. Under heavy development, implementation might be improved in the future :) |
places.pub | |
---|---|
Homepage | https://places.pub/ |
Source Repo | https://gitlab.com/evanp/places-pub |
Developers | |
Notes / About | places.pub is a place server for the ActivityPub network. It represents places in the world as AS2 'Place' objects. Plan is to add inboxes to the Place objects so they can be addressed, and when they receive activities related to that Place, they will re-share them. Also will allow Follow, stop follow. Only fetching Place objects is implemented now. |
Publicly Accessible? | yes |
Free/Libre/Open Source? | yes |
License | Apache v2 |
Programming Language | Javascript |
Pleroma | |
---|---|
Homepage | https://pleroma.social/ |
Source Repo | https://git.pleroma.social/pleroma/pleroma |
Publicly Accessible? | yes |
Free/Libre/Open Source? | yes |
License | GNU AGPLv3 |
Programming Language | Elixir |
Pubstrate | |
---|---|
Source Repo | https://gitlab.com/dustyweb/pubstrate |
Developers | |
Notes / About | ActivityPub / ActivityStreams focused social networking application written in Guile. |
Free/Libre/Open Source? | yes |
License | GPLv3 or later |
Programming Language | Guile Scheme |
Smilodon | |
---|---|
Homepage | https://populator.smilodon.social |
Source Repo | https://github.com/rowanlupton/smilodon |
Developers | |
Notes / About | very unfinished, intent to eventually federate with any server that supports activitypub (primary objective Mastodon, as the name implies) |
Interoperability with other implementations | Some testing against Mastodon, WIP |
Publicly Accessible? | yes |
Free/Libre/Open Source? | yes |
License | Expat (MIT) |
Programming Language | Python |
tags.pub | |
---|---|
Homepage | https://tags.pub |
Source Repo | https://gitlab.com/evanp/tags-pub |
Developers | |
Notes / About | tags.pub is a hashtag server for the ActivityPub network. Tags can be addressed and followed. Tags will reshare public activities that are tagged with their tag, or that create or update an object tagged with their tag. |
Publicly Accessible? | yes |
Free/Libre/Open Source? | yes |
License | Apache v2 |
Programming Language | Javascript |