Skip to content

Parts of a Fediverse application

The design proposed here is about separating concerns, and how stuff is stored. In this part, I want to discuss where what is.

Part What is stored
cattle_grid cryptographic identities
bovine_herd Own actors, inbox resolution table. Probably a cache for remote objects / actors. The stuff collected here is needed to communicate with other Fediverse servers. This dataset includes the private keys needed to make signed HTTP requests
bovine_timeline The ActivityPub objects by the user. The remote objects that are considered part of the user's dataset. This should be the entire dataset a user will want to take with them when moving instances, so for example all private messages and their replies. There are probably some caveats here, as the followers / following collections will be migrated by different means, see FEP-7628
Device Gateway A list of devices, and their state, to e.g. keep what has been read synchronized. Probably also the backlog of stuff to send to each device (parts can be dropped if read on another device). As this is not build yet, it will require more planning
Device 1/X The data necessary to work with

Some of these choices lead to some duplicated work. The worst case are actor updates, that have to be handled by

  • cattle_grid to check if a cryptographic identifier was updated
  • bovine_herd to update an inbox
  • bovine_herd to update the cache
  • bovine_timeline to copy the stored copy

On the flip side certain activities such as Announce or Like only have side effects in bovine_timeline.