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)# yesBridgy Feddistbin.comdokieligo-fedKroegMastodonmicroblog.pubPeerTubeplaces.pubPleromaPubstrateSmilodontags.pub
Client-to-Server Client5NoYesYesNoYesNoYesNoNoNoYesNoNo
Client-to-Server Server5NoYesNoYesYesNoYesNoNoNoYesNoNo
Federated (Server-to-Server) Server12YesYesNoYesYesYesYesYesYesYesYesYesYes
client:submission:discovers-url-from-profile5N/AYesYesN/AYesN/AYesN/AN/AN/AYesN/AN/A
client:submission:submit-post-with-content-type5N/AYesYesN/AYesN/AYesN/AN/AN/AYesN/AN/A
client:submission:submit-objects5N/AYesYesN/AYesN/AYesN/AN/AN/AYesN/AN/A
client:submission:submit-objects:provide-object4N/ANoYesN/AYesN/AYesN/AN/AN/AYesN/AN/A
client:submission:submit-objects:provide-target3N/ANoYesN/AYesN/ANoN/AN/AN/AYesN/AN/A
client:submission:authenticated4N/ANoYesN/AYesN/AYesN/AN/AN/AYesN/AN/A
client:submission:recursively-add-targets5N/AYesYesN/AYesN/AYesN/AN/AN/AYesN/AN/A
client:submission:recursively-add-targets:limits-depth5N/AYesYesN/AYesN/AYesN/AN/AN/AYesN/AN/A
client:retrieval:accept-header5N/AYesYesN/AYesN/AYesN/AN/AN/AYesN/AN/A
outbox:accepts-activities5N/AYesN/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:accepts-non-activity-objects5N/AYesN/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:removes-bto-and-bcc4N/A*NoN/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:ignores-id5N/AYesN/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:responds-201-created5N/AYesN/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:location-header5N/AYesN/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:update4N/A*No*N/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:update:partial4N/A*No*N/AYesYesN/AYesN/AN/AN/AYesN/A*N/A*
outbox:create4N/A*NoN/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:create:merges-audience-properties3N/A*NoN/AYesYesN/AInconclusive*N/AN/AN/AYesN/AN/A
outbox:create:actor-to-attributed-to3N/A*NoN/AYesYesN/AInconclusive*N/AN/AN/AYesN/AN/A
outbox:follow4N/ANoN/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:follow:adds-followed-object2N/ANoN/ANoYesN/ANoN/AN/AN/AYesN/AN/A
outbox:add3N/ANoN/AYesYesN/ANo*N/AN/AN/AYesN/AN/A
outbox:add:adds-object-to-target2N/ANoN/AInconclusive*YesN/ANo*N/AN/AN/AYesN/AN/A
outbox:remove2N/ANoN/AInconclusive*YesN/ANo*N/AN/AN/AYesN/AN/A
outbox:remove:removes-from-target2N/ANoN/AInconclusive*YesN/ANo*N/AN/AN/AYesN/AN/A
outbox:like3N/ANoN/AInconclusive*YesN/AYesN/AN/AN/AYesN/AN/A
outbox:like:adds-object-to-liked3N/ANoN/AInconclusive*YesN/AYesN/AN/AN/AYesN/AN/A
outbox:block4N/ANoN/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:block:prevent-interaction-with-actor4N/ANoN/AYesYesN/AYesN/AN/AN/AYesN/AN/A
outbox:undo3N/ANoN/ANo*YesN/AYesN/AN/AN/AYesN/AN/A
outbox:undo:ensures-activity-and-actor-are-same3N/ANoN/ANoYesN/AYesN/AN/AN/AYesN/AN/A
inbox:delivery:performs-delivery6YesYesN/AYesYesN/A*YesN/A*N/A*N/A*YesN/A*N/A*
inbox:delivery:addressing6YesYesN/AYesYesN/A*YesN/A*N/A*N/A*YesN/A*N/A*
inbox:delivery:adds-id6YesYesN/AYesYesN/A*YesN/A*N/A*N/A*YesN/A*N/A*
inbox:delivery:submit-with-credentials4YesNoN/AYesYesN/A*YesN/A*N/A*N/A*NoN/A*N/A*
inbox:delivery:deliver-to-collection5YesNoN/AYesYesN/A*YesN/A*N/A*N/A*YesN/A*N/A*
inbox:delivery:deliver-to-collection:recursively4NoNoN/AYesYesN/A*YesN/A*N/A*N/A*YesN/A*N/A*
inbox:delivery:delivers-with-object-for-certain-activities8YesNoN/AYesYesYesYesYesNoYesYesNoNo
inbox:delivery:delivers-with-target-for-certain-activities6N/ANoN/AYesYesYesNoYesNoYesYesNoNo
inbox:delivery:deduplicates-final-recipient-list8YesYesN/AYesYesNoYesYesNoYesNoYesNo
inbox:delivery:do-not-deliver-to-actor7NoNoN/AYesYesYesYesYesNoYesNoNoYes
inbox:delivery:do-not-deliver-block6N/ANoN/AYesYesYesYesYesNoYesNoNoNo
inbox:delivery:sharedInbox5NoNoN/ANoYesYesYesYesMissingYesNoNoMissing
inbox:delivery:sharedInbox:deliver-to-inbox-if-no-sharedInbox5N/ANoN/ANoYesYesYesYesMissingYesN/A*NoMissing
inbox:accept:deduplicate7NoYesN/AYesYesYesYesNoNoYesNoYesNo
inbox:accept:special-forward4NoNoN/AYesYesNoNoNoNoYesYesNoNo
inbox:accept:special-forward:recurses4NoNoN/AYesYesNoNoNoNoYesYesNoNo
inbox:accept:special-forward:limits-recursion4NoNoN/AYesYesNoNoNoNoYesYesNoNo
inbox:accept:create9NoYesN/AYesYesYesYesYesMissingYesYesYesMissing
inbox:accept:delete6NoNoN/AYesYesYesYesYesMissingYesNoNoMissing
inbox:accept:delete:tombstone3NoNoN/AYesYesYesNoNoMissingNoNoNoMissing
inbox:accept:update:is-authorized6N/ANoN/AYesYesYesYesYesNoYesNoNoNo
inbox:accept:update:completely-replace7YesNoN/AYesYesYesYesYesNoYesNoNoNo
inbox:accept:dont-blindly-trust6N/ANoN/ANoYesYesYesYesNoYesNoNoYes
inbox:accept:follow:add-actor-to-users-followers9N/ANoN/AYesYesYesYesYesNoYesYesYesYes
inbox:accept:follow:generate-accept-or-reject7N/ANoN/AYesYesYesYesYesMissingYesNoYesMissing
inbox:accept:accept:add-actor-to-users-following7N/ANoN/AYesYesYesYesYesMissingYesNoYesMissing
inbox:accept:reject:does-not-add-actor-to-users-following7N/ANoN/AYesYesYesYesYesMissingYesNoYesMissing
inbox:accept:add:to-collection4N/ANoN/AYesYesNoNoNoNoYesYesNoNo
inbox:accept:remove:from-collection4N/ANoN/AYesYesNoNoNoNoYesYesNoNo
inbox:accept:like:indicate-like-performed8YesNoN/AYesYesYesYesYesNoYesNoYesNo
inbox:accept:announce:add-to-shares-collection6Yes*NoN/ANoYesYesYesYesMissingYesNoNoMissing
inbox:accept:undo5NoNoN/ANoYesYesYesYesMissingYesNoNoMissing
server:inbox:responds-to-get8NoYesN/AYesYesNoYesNoNoYesYesYesYes
server:inbox:is-orderedcollection8N/AYesN/AYesYesNoYesNoNoYesYesYesYes
server:inbox:filtered-per-permissions5N/ANoN/ANoYesNoYesNoNoYesYesNoYes
server:object-retrieval:get-id10NoYesN/AYesYesYesYesYesYesYesYesNoYes
server:object-retrieval:respond-with-as2-re-ld-json10NoYesN/AYesYesYesYesYesYesYesYesNoYes
server:object-retrieval:respond-with-as2-re-activity-json10NoYesN/AYesYesYesYesYesYesYesYesNoYes
server:object-retrieval:deleted-object:tombstone3NoNoN/AYesYesNoNoNoNoNoYesNoNo
server:object-retrieval:deleted-object:410-status6NoNoN/AYesYesYesYesNoNoYesYesNoNo
server:object-retrieval:deleted-object:404-status6NoNoN/ANoYesYesYesYesNoYesYesNoNo
server:object-retrieval:private-403-or-4044NoNoN/ANoYesYesNoNoNoYesNoNoYes
server:security-considerations:actually-posted-by-actor6NoNoN/ANoYesYesYesYesNoYesNoNoYes
server:security-considerations:do-not-post-to-localhost6NoYesN/ANoYesYesYesNoNoYesYesNoNo
server:security-considerations:uri-scheme-whitelist5NoNoN/ANoYesYesYesNoNoYesYesNoNo
server:security-considerations:filter-incoming-content4NoYesN/ANoYesNoNoNoNoYesYesNoNo
server:security-considerations:sanitize-fields4YesYesN/AMissingYesYesMissingMissingNoMissingNoNoNo

Implementation details

Bridgy Fed
Homepagehttps://fed.brid.gy/
Source Repohttps://github.com/snarfed/bridgy-fed
Developers

Ryan Barrett

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.

Details

Users 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 example.com, the ActivityPub actor id would be @example.com@example.com. (This is subject to change; more background here.)

Bridgy Fed can do all this via OStatus as well.

About the Server-to-Server implementation

The Bridgy Fed Server:

  • Accepts activity submissions via webmention, and updates the server's Objects per rules described below
  • Delivers these submissions to the inboxes of other Servers
  • Receives Activity from other servers in an inbox, and updates the server's Objects per rules described below
  • Delivers Objects to Clients via webmention
Interoperability with other implementations

Various IndieWeb sites, Mastodon, Hubzilla, and others

Publicly Accessible?yes
Free/Libre/Open Source?yes
License

Public Domain / CC0

Programming Language

Python

distbin.com
Homepagehttps://distbin.com
Developers

Benjamin Goering

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:

  • core - Speaks only JSON/ActivityPub
  • distbin-html

    • Renders a homepage with a form that helps an end-user build Create Note activites
    • Renders created activities to HTML
    • Renders the public collection to HTML
Publicly Accessible?yes
Free/Libre/Open Source?no
Programming Language

JavaScript

dokieli
Homepagehttps://dokie.li/
Source Repohttps://github.com/linkeddata/dokieli
Developers

Sarven Capadisli

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.

  • dokieli can create and consume content in different RDF serializations (RDFa in HTML and SVG, Turtle, JSON-LD) for fine-grained semantic structure;
  • can work with Linked Data Platform based servers for personal data storage;
  • implements the sender and consumer roles of Linked Data Notifications;
  • Web Annotation for structured annotations;
  • WebID for identity discovery and profile use;
  • ActivityPub and ActivityStreams 2 to send and consume activities/objects
License

Apache License 2.0

Programming Language

Javascript

go-fed
Homepagehttps://go-fed.org
Source Repohttps://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 v0.2.0.

Publicly Accessible?yes
Free/Libre/Open Source?yes
License

BSD 3-Clause

Programming Language

Go

Kroeg
Source Repohttps://github.com/puckipedia/kroeg
Developers

Puck Meerburg

Notes / About

Serves ActivityPub and has bridges to OStatus. ActivityPub federation tested against Mastodon.

Interoperability with other implementations

Mastodon

Publicly Accessible?yes
Free/Libre/Open Source?yes
License

Expat (MIT)

Programming Language

C#

Mastodon
Homepagehttps://joinmastodon.org
Source Repohttps://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
Homepagehttps://microblog.pub
Source Repohttps://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
Homepagehttps://peertube.cpy.re
Source Repohttps://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
Homepagehttps://places.pub/
Source Repohttps://gitlab.com/evanp/places-pub
Developers

Evan Prodromou

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
Homepagehttps://pleroma.social/
Source Repohttps://git.pleroma.social/pleroma/pleroma
Publicly Accessible?yes
Free/Libre/Open Source?yes
License

GNU AGPLv3

Programming Language

Elixir

Pubstrate
Source Repohttps://gitlab.com/dustyweb/pubstrate
Developers

Christopher Allan Webber

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
Homepagehttps://populator.smilodon.social
Source Repohttps://github.com/rowanlupton/smilodon
Developers

Rowan Lupton

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
Homepagehttps://tags.pub
Source Repohttps://gitlab.com/evanp/tags-pub
Developers

Evan Prodromou

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