Federating servers

So, one part of the popular imagination about ActivityPub I've seen is the idea of server federation.

I think the idea is that if two servers have interacted in some way, all (?) public (?) content from one server will be sent to the other server, and vice versa.

This comes up a lot with new servers; people ask to have a post shared broadly so that their server rubs shoulders with others, getting the federated feed flow going.

ActivityPub does in fact have a mechanism defined for this:

Additionally, if an object is addressed to the Public special collection, a server MAY deliver that object to all known sharedInbox endpoints on the network.

As far as I've seen, most (?) servers don't implement this; it would overwhelm small servers pretty quickly.

However, some (?) servers do implement it for some (?) activities, especially profile update and delete activities.

Is this the origin of the idea that new servers need to have their content shared around? Are people misunderstanding the way that relays work? Is it just a trick to get your content shared?

Replying to @⁨julian@activitypub.space⁩

@julian To which point do you refer? For my first mentioned one we have got a special document at .well-known/x-social-relay that every Friendica server publishes that contains information about the subscribed hash tags.

And concerning the second point, I imagine some relay service that does not simply forward everything, but that knows which content you you are interested in. So when you subscribed to user A and user B posted something in a thread that user A started, then the relay would forward it to you, although you never subscribed to B. And when then the account B got deleted or blocked, then of course you would be notified as well.

en

Replying to @⁨heluecht@pirati.ca⁩

@heluecht @julian

This can be done with inbox forwarding or special activities (FEP-171b or FEP-1b12).

Selective relays may be used for other things though. There is https://github.com/dtp-mstdn-jp/selective-relay that apparently can filter activities by hashtags, domains and number of attachments

Summary card of repository fediverse/fep, described as: Fediverse Enhancement ProposalsCodeberg.orgfep/fep/171b/fep-171b.md at mainfep - Fediverse Enhancement Proposals

Replying to @⁨silverpill@mitra.social⁩

@silverpill @julian When A follows B and C comments in a thread from A, but on the server from B no one follows C, how will then A be notified by comments or edits from C? And what happens when C got banned for spam. How does this information reach A? On C's server you can see where the now banned contact wrote comments. But you don't see, that comments from C where distributed (or fetched) from A.

And it gets worse, when you simply fetch messages, that hadn't been pushed to you. Then you won't get any updates, except when you would pull it from time to time.

And of course some "give me all posts with that specific hashtag but only in these languages" will not work quite well, when you are on a stand alone server.

Replying to @⁨heluecht@pirati.ca⁩

@heluecht @julian I am not sure if I understood your example correctly, but here is how it all works with FEP-171b / Conversation Containers:

- A follows B
- C comments on B's post (Create activity)
- B generates Add<Create> activity and sends it to A
- A receives Add and adds C's comment to their copy of the conversation

If C is banned for spam (and their comment removed):

- B removes C's comment (Delete activity)
- B generates Add<Delete> activity and sends it to A
- A receives activity and removes C's comment from the conversation

Replying to @⁨heluecht@pirati.ca⁩

@heluecht @julian

So C's server have send an activity - that would reach B but not A.

With conversation containers:

- B receives Delete<Person> for C
- C participated in the conversation, so B generates Add<Delete<Person>> activity and sends it to A
- A receives Add activity and deletes C

A doesn't follow B, but simply fetched that thread

"A" could periodically re-fetch the thread.

I have also heard that some of Friendica descendants have "subscribe on fetch" feature.

@silverpill

Btw, I noticed that this @-mention in your post contains a wrong URL: https://tinyap.izkluxcvy.foo/@silverpill@mitra.social (it points to some other server instead of mine)

tinyap.izkluxcvy.foosilverpill@silverpill@mitra.social - TinyAP

Replying to @⁨silverpill@mitra.social⁩

@silverpill sorry to butt in, but all of this would be solved by respecting what the canonical representation of a reply thread is: the replies collection of the top post[1]. I think it makes much more sense to built that correctly and rely on it instead of trying to keep all the nodes of the network in sync with countless activities.

[1] Caveat, this requires that all replies to a post, include in their inReplyTo property at least their parent and the top post - ideally they should include the whole chain of parents to the top post.

@heluecht @technical-discussion @julian

Replying to @⁨mariusor@metalhead.club⁩

@mariusor @heluecht @julian I think both solutions have advantages and disadvantages. Activities are more efficient

the canonical representation of a reply thread is: the replies collection of the top post

The most popular representation is context collection containing posts. I know 10 implementers, including some big ones: https://codeberg.org/fediverse/fep/src/branch/main/fep/f228/fep-f228.md

Summary card of repository fediverse/fep, described as: Fediverse Enhancement ProposalsCodeberg.orgfep/fep/f228/fep-f228.md at mainfep - Fediverse Enhancement Proposals

Replying to @⁨silverpill@mitra.social⁩

@mariusor @silverpill @julian I'd loved it, if AP had followed more the way that the Diaspora protocol pursuits. There every comment, every "like", whatsover is always only transmitted to the thread starter. And the thread starter then redistributes it. And you also can send a command to be included in this distrivution, although you never participated.

This would had solved a lot of problems, especially when it comes to non public posts.

Replying to @⁨silverpill@mitra.social⁩

@silverpill I think you're saying this from a position where identifiers in ActivityPub are no longer unique URLs and therefore "canonical representations" are harder to reason about, but in my opinion that's not where the protocol is now, and hopefully, not also in the future. And yes, I am aware of context, I am pretty sure I have one the first implementations that made use of it as a thread container, but that whole fep is over engineered and IMHO missed what I consider the obvious and simpler solution: put all parents in the inReplyTo and include all parents' authors as recipients. 🤷

@technical-discussion @heluecht @julian

Replying to @⁨mariusor@metalhead.club⁩

@mariusor@metalhead.club said:

that whole fep is over engineered and IMHO missed what I consider the obvious and simpler solution: put all parents in the inReplyTo and include all parents' authors as recipients.

Over-engineered how? Most people read 7888 and decide it's too complicated. I get that, it's a tough read.

But the tl;dr of f228 is: context is a property on Note-like objects, it resolves to an OrderedCollection, put ids of those Note-like objects in that collection. Done.

I'm okay with shoving all parents into inReplyTo too, as long as you put the most direct parent first. Then I can just .shift() and ignore the rest.

Replying to @⁨julian@activitypub.space⁩

@julian my perspective is that the fep is addressing _only_ server to server logic. From a client to server perspective, you're building the context ordered collection out of thin air (ie, no Create for it), which is not conducive to good consistency between nodes. Additionally that collection is not needed because it already exists in the form of the /replies collection of the top post. If you would use that a context, I'd feel better about it. (I use(d) a similar method in brutalinks - but I had the top level comment itself as a context, not the /replies directly.)

Replying to @⁨julian@activitypub.space⁩

@julian see my caveat in one of the replies above:

> Caveat, this requires that all replies to a post, include in their inReplyTo property at least their parent and the top post - ideally they should include the whole chain of parents to the top post.

(Also, when I said "overcomplicated" I really meant, "possible in the framework of what current vanilla ActivityPub provides, _without_ needing extra operations or concepts", the idea is simple enough, and sound at its core: a container where all replies can be found.)

Replying to @⁨silverpill@mitra.social⁩

@silverpill sorry if I misunderstood :( I was under the impression that you're working towards embracing DIDs as identifiers as far as I remember. To my mind that moves away from "you get the canonical representation of an object by fetching the URL of its ID" to any representation of the object that passes identity proofs. (perhaps I'm wrong in thinking this anyway, my investigation on how DIDs relate to canonical object representation was cursory and incidental) That's what I meant.

@technical-discussion @heluecht @julian