alice from A makes a post “Hello, world” to B
Alice can't make a post to B, but I assume you mean a community on B, let's call it foo. When Alice makes a post it first goes through A's local API and creates the local (and canonical) version of Alice's post. Once A has finished processing Alice's post, it will create an ActivityPub representation of Alice's post to send to B.
ActivityPub is basically a bunch of assumptions laid on top of JSON. An ActivityPub 'file' can be divided into broadly 3 types, Object
, Activity
and actors.[^note1] These types then have subtypes; for example, both Alice and foo are actors but Alice is a Person
while foo is a Group
.
A second important assumption of ActivityPub is the concept of inboxs and outboxs, but, for Lemmy, only inboxs matter. An inbox is just a URL where Lemmy can send activities and it's something all actors have.
So when instance A is finished processing Alice's post, it will turn it into a Page
object, wrap that in a Create
activity and send it foo's inbox.
Round about what the JSON would look like
{
"@context": [
"https://join-lemmy.org/context.json",
"https://www.w3.org/ns/activitystreams"
],
"actor": "https://a/u/alice",
"type": "Create",
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"cc": ["https://b/c/foo"],
"id": "https://a/activities/create/19199919009100",
"object": {
"type": "Page",
"id": "https://a/post/1",
"attributedTo": "https://a/u/alice",
"to": [
"https://b/c/foo",
"https://www.w3.org/ns/activitystreams#Public"
],
"audience": "https://b/c/main",
"name": "Hello world",
"attachment": [],
"sensitive": false,
"language": {
"identifier": "en",
"name": "English"
},
"published": "2024-12-29T15:10:51.557399Z"
}
}
.
Now instance B will then receive this and do the same kind of processing A did when Alice created the post via the API. Once it has finished, it will turn the post back into a Page
but this time wrap it in an Announce
activity. B will then look at all the actors that follow the foo (i.e. are subscribed to it) and send this Announce to all of their inboxs. Assuming a user on instance C follows foo, it will receive this Announce
and process it like A and B before it, creating the local version of Alice's post.
Edit: I made a small mistake, I said that foo wrapped the Page
in an Announce
, when it actually wraps the Create
in an Announce
.
[^note1]: Technically, Activity
and actors are themselves objects, but they're treated differently. There's also Collection
's which are their own type, but Lemmy doesn't really utilise them.