Modular ActivityPub/Fediverse Server
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.
Go to file
helge 0c8c4621f4
ci/woodpecker/push/test Pipeline was successful Details
Merge pull request 'bovine 0.2.5' (#21) from helge/bovine:dev into main
Reviewed-on: #21
2 days ago
.woodpecker bovine 0.2.5 2 days ago
bovine bovine 0.2.5 2 days ago
bovine_herd bovine 0.2.5 2 days ago
bovine_process bovine 0.2.5 2 days ago
bovine_pubsub bovine 0.2.5 2 days ago
bovine_store bovine 0.2.5 2 days ago
bovine_tool bovine 0.2.5 2 days ago
bovine_web Move specific code to bovine_web 2 days ago
ci Repair messaging for CI 1 month ago
docs Move specific code to bovine_web 2 days ago
examples improve_user_management (#7) 1 month ago
tests Move specific code to bovine_web 2 days ago
.gitignore bovine.bovine 0.2.3 2 days ago
.readthedocs.yaml Trying to get readthedocs working 2 months ago
LICENSE Initial commit 4 months ago Bovine 0.2.2 4 days ago Prepare for the release of bovine* 1 week ago
pyproject.toml Trying to get readthedocs working 2 months ago


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.