Bovine Timeline
The goal here is to design a component for a Fediverse application that serves HTML. This means only public content is handled. Also this is not meant as a service to be used by the author of the content, but by the readers.
This simplifies a lot of stuff, as permissions become trivial. Also one should note here that the data is duplicated to be served in a permission free environment. So there will be a different copy of the data for the author's consumption.
Technical note
For public content only. bovine_timeline
should be considered as an actor.
However, it is not an ActivityPub actor. It basically has none of the
ActivityPub properties.
This bovine_timeline
actor may have an cryptographic identity to sign
generated objects.
By only doing public stuff, one doesn't need to know anything about collections in particular followers. This will be relevant when building a parallel version for private stuff (only visible to the user). This private version should probably duplicate the public stuff. One could call this private version the client (not an actual client but more a layer between client and server)
Posting a status or liking/sharing something (outbox)
This happens when I post a status
graph LR
A[client] -->|amqp| B[bovine_timeline];
B[bovine_timeline] -->|amqp| C[bovine_process];
C[Bovine_process] ==>|POST| D[Remote 1];
C ==>|POST| E[Remote 2];
B -->|store| F[(BT DB)]
F -->|get id| B
- bovine_timeline could use signed input
- bovine_timeline creates the Note, Create, etc ... stuff one can stick the signed thing in source
- bovine_timeline has to assign id and shares, likes, replies collections
- bovine_timeline assigns an url ... as the stuff where html lives
- client can be in charge of only sending public stuff ... this way if it wants to duplicate storage, it knows what not to assign ids.
Accessing status
Remote makes get
graph LR
A[remote] ==>|GET| B[cattle_grid]
B ==>|GET| C[bovine_timeline]
C --> D[(BT DB)]
- cattle_grid checks the signature
- For json get bovine timeline DB is sufficient as everything in there is public
Interactions (inbox)
graph LR
A[remote] ==>|POST| B[bovine_herd]
B -->|amqp| C[bovine_timeline]
C --> D[(BT DB)]
- Want to store all elements of conversation so, if reply to reply, store
- Manage likes, shares, replies collections
- bovine_herd should ensure that the actor goes over the
amqp
wire (not hard) - One needs to listen for actor updates (possibly do some fetching for actors 6 months old or just get rid of the data)
World
One of the reasons to build this is to be able to serve HTML from an isolated source
graph LR
A[browser] ==>|GET| C[bovine_timeline]
C --> D[(BT DB)]