You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.7 KiB


Bovine is meant to be a modular FediVerse server that supports ActivityPub. During its history, as how to split the tasks between different modules has become clearer, and the split is not done yet. A lot of the changes are due to the realization that parts can be split away as an ActivityPub Client. Here an ActivityPub Client is an application that communicates with just a single ActivityPub Server.

Parts of bovine

When done, these parts should only depend on the parts above them. So bovine_process can be used with only bovine and bovine_store. Furthermore, bovine_store and bovine_process should just provide simple interfaces that can be swapped out.

  • bovine (pypi, docs) provides the basic ActivityPub communication with some form of authorization. Currently, HTTP Signatures and Moo-Auth-1 are supported.

  • bovine_store is used to store json-ld by their id and provide a certain level of visibility and access control.

    • Serves requests directly represented by objects
    • Contains the actor storage code, and methods to manage actors
    • Tested with both PostgreSQL and sqlite3 databases
  • bovine_process contains the Activity processing described in ActivityPub.

    • Contains tests for the side effects of activities
    • Supported: follow, accept, create, update, delete
  • bovine_pubsub allows events to be propagated to subscribers. Two variants exist

    • Using asyncio.Queue in the case of a single worker
    • Using Redis for multiple workers. Enabled through setting the environment variable BOVINE_REDIS to the URI of the redis server.
  • bovine_herd the FediVerse server implementation. This contains

    • Webfinger, nodeinfo
    • Requests to endpoints not directly represented by objects, i.e. POST inbox
    • Glue code to make everything work together
  • tests contains a test suite that ensures that bovine_fedi properly implements a FediVerse server

Existing ActivityPub Clients

  • mechanical_bull automatically accepts follow requests. This was part of the evolution of my thinking how to separate out ActivityPub Clients.
  • longhorn is a blog. One can visit mine at
  • calf provides a simple terminal user interface for the inbox. This might get expanded into a full client in the future.