FEP-1d80: Feed Actor - a way to federate a collection of Group actors

Over at PieFed we, like Lemmy and Mbin have gotten requests for a way to have a grouping of communities type feature.

We experimented with trying to use the existing Group actor, but found that it was not a perfect fit. So we decided that a new AP Actor was the way to go.

The linked Fep PR defines the Feed actor, based on how its working in production on Piefed instances.

WIP FEP PR

3 Likes

Hi, a few questions:

  1. How would this work with the idea of regular custom feed generators? i.e., not just a collection of groups, but actually things like a theoretical custom feed concept borrowed from say Bluesky, such as a service like https://www.graze.social/
  2. It seems like this actor only announces other groups? Why doesn’t it announce the activities of those groups?
  3. Why call it a Feed and not a GroupCollection or Community or something?
  4. Is it the Feed actor doing the Announce/Add? Or is it the Group that is announcing that the Feed actor did a Add to it’s followers collection?
  5. You mention a moderators property, however, I’m not aware of a spec for such a property yet (we are wanting to define discovery of moderation actors for Actors as part of the ActivityPub Trust & Safety Taskforce)
2 Likes

Answering out of order a bit.

Why call it a Feed and not a GroupCollection or Community or something? - We had a community discussion on what to call it and Feed won by a fair margin. What shall we name the Lemmy/PieFed equivalent to a "Multireddit"?

Is it the Feed actor doing the Announce/Add? Or is it the Group that is announcing that the Feed actor did a Add to it’s followers collection? - The Feed actor announces a change to the Feed actor’s following collection with an announce/add or announce/remove.

The human who owns the feed picks what communities they want in the Feed’s following collection, but the Feed actor is what is being followed by other people’s Person actors.

-at work atm, will come back and answer more when I can

Why doesn’t it announce the activities of those groups? The purpose of this is a collection of groups. Its a way for a user to organize their own communities that they follow, and share that organization to other users if they choose.

Think of the old Reddit Multi-Reddits feature. Its similar to that. When a human follows a Feed they are just getting a list of communities on the fediverse that exist. Implementations of this can choose to then have the user subscribe to those communities or not. On piefed it defaults to a user auto-following communities in a feed. Lots of our users are using it to discover new communities.

So the feed just points out the groups. The user can then follow the groups they then ‘know’ about. And the groups themselves then just announce their own activities. Does that answer the question?

Is it the Feed actor doing the Announce/Add? Or is it the Group that is announcing that the Feed actor did a Add to it’s followers collection?

The Feed actor uses announce/add to tell the feed’s followers that there is a new community in the feed following collection. Same with a removal of a community, but with an announce/remove.

The Groups don’t ‘know’ they are in a Feed. The humans involved may know that, like if a community owner also has that community in a feed that human owns.

Okay, but that’s a product decision, and the Fediverse / ActivityPub does already have the notion of feeds, so calling this actor type a “Feed” may be confusing / conflicting.

1 Like

Fair enough. AP already has Collections too, which was my original name I was using in the draft stage. Naming things is hard, lol.

How would this work with the idea of regular custom feed generators? i.e., not just a collection of groups, but actually things like a theoretical custom feed concept borrowed from say Bluesky, such as a service like https://www.graze.social/

I’m not familiar with that one. At the moment the idea is a collection of Groups. Just speculating here, but a feed generator could follow a Feed actor and then have the Groups in the Feed’s following collection as part of the items the generator then shows to the generator’s users. But thats just speculation. :slight_smile:

These are for sure custom curated groups of groups, which is similar to what that graze.social thing seems to offer. This does not have an algorithm per say though, so that is different.

You mention a moderators property, however, I’m not aware of a spec for such a property yet (we are wanting to define discovery of moderation actors for Actors as part of the ActivityPub Trust & Safety Taskforce)

Hmm, thats a good point. This was built as a kind of combination of Group AP actor functionality and the PieFed Topics. We wanted a way to identify the owner of the Feed. So that is done in the attributedTo property or the moderators property.

attributedTo is Activity Vocabulary of course. Up until just now I thought the moderators property was something that Lemmy used, but it may be just a PieFed thing. I’ll ask the other PieFed devs and adjust as needed.

1 Like

Right, so per one of the other devs the moderators came from interoperability with KBin code. But Lemmy and MBin just used attributedTo.

I’ll adjust that part of the FEP to remove the moderators reference.

Do you have an example of an activity/object with this moderators property? I’ve never seen it pop up in the wild, and it’d be great to see what they did for the T&S taskforce.

@JollyRoberts How could you describe a relationship between a Feed and its owner? In Fediverse, attributedTo is often used to specify an actor that created the object. If your use case is different, a new property may be preferable.

@protocol

Yeah, I don’t think “Feed” here is the right name for this actor type. It sounds like it’s just a specialisation of the Group type, perhaps MetaGroup or something — then again, per this thread Proposed FEP-a974: All Actor types should be followable - #16 by trwnh you generally shouldn’t really care that much about the type of an Actor, but rather how it behaves.

E.g., your MetaGroup actor might have a “groups” collection instead of a “followers” collection. I’m not sure what you gain in “following” a group of groups, if it doesn’t automatically aggregate all the sub groups.

It sounds like this would require you to follow each individual group, not just the group of groups.

I think we’d be better leaving a Feed actor type for something like custom subscribable feeds or something, since Feed is just what you’re calling this in the UI of Piefed, not what it actually is: a group of groups.

This is the piefed_meta@piefed.social community:

{
  "@context": [                                                                                                                                                          
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/security/v1"
  ],
  "attributedTo": "https://piefed.social/c/piefed_meta/moderators",
  "endpoints": {
    "sharedInbox": "https://piefed.social/inbox"
  },
  "featured": "https://piefed.social/c/piefed_meta/featured",
  "followers": "https://piefed.social/c/piefed_meta/followers",
  "icon": {
    "type": "Image",
    "url": "https://piefed.social/static/media/communities/HG/yB/HGyB58LEAHeHwdN.png"
  },
  "id": "https://piefed.social/c/piefed_meta",
  "inbox": "https://piefed.social/c/piefed_meta/inbox",
  "moderators": "https://piefed.social/c/piefed_meta/moderators",
  "name": "PieFed Meta",
  "newModsWanted": false,
  "outbox": "https://piefed.social/c/piefed_meta/outbox",
  "postingRestrictedToMods": false,
  "preferredUsername": "piefed_meta",
  "privateMods": false,
  "publicKey": {
    "id": "https://piefed.social/c/piefed_meta#main-key",
    "owner": "https://piefed.social/c/piefed_meta",
    "publicKeyPem": "-----BEGIN PUBLIC KEY-----.....-----END PUBLIC KEY-----\n"
  },
  "published": "2024-01-04T08:55:20.668181+00:00",
  "sensitive": false,
  "source": {
    "content": "Discuss PieFed project direction, provide feedback, ask questions, suggest improvements, and engage in conversations related to the platform organization, policies, features, and community dynamics.\r\n\r\n## [Wiki](https://piefed.social/community/piefed_meta/wiki/index)",
    "mediaType": "text/markdown"
  },
  "summary": "<p>Discuss PieFed project direction, provide feedback, ask questions, suggest improvements, and engage in conversations related to the platform organization, policies, features, 
and community dynamics.</p>\n<h2><a href=\"https://piefed.social/community/piefed_meta/wiki/index\" rel=\"nofollow ugc\" target=\"\">Wiki</a></h2>\n",
  "type": "Group",
  "updated": "2025-03-11T10:40:48.892395+00:00",
  "url": "https://piefed.social/c/piefed_meta"
}

Then the /moderators collection:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/security/v1"
  ],
  "id": "https://piefed.social/c/piefed_meta/moderators",
  "orderedItems": [
    "https://piefed.social/u/rimu"
  ],
  "totalItems": 1,
  "type": "OrderedCollection"
}

I pulled some lemmy.world and fedia.io (MBin) communities but they /don’t/ have the moderators property.

And since KBin isn’t maintained anymore I suspect we (PieFed) will just stop using moderators in favor of attributedTo. At least i’ll put in an issue for it and get the discussion going.

So at the moment we have the human who makes the feed as the only item in the attributedTo property.

Example feed on piefed.social:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/security/v1"
  ],
  "attributedTo": "https://piefed.social/f/fediverse/moderators",
  "endpoints": {
    "sharedInbox": "https://piefed.social/inbox"
  },
  "followers": "https://piefed.social/f/fediverse/followers",
  "following": "https://piefed.social/f/fediverse/following",
  "id": "https://piefed.social/f/fediverse",
  "inbox": "https://piefed.social/f/fediverse/inbox",
  "moderators": "https://piefed.social/f/fediverse/moderators",
  "name": "Fediverse",
  "outbox": "https://piefed.social/f/fediverse/outbox",
  "preferredUsername": "fediverse",
  "publicKey": {
    "id": "https://piefed.social/f/fediverse#main-key",
    "owner": "https://piefed.social/f/fediverse",
    "publicKeyPem": "-----BEGIN PUBLIC KEY-----.....-----END PUBLIC KEY-----\n"
  },
  "published": "2025-02-26T23:19:40.672055+00:00",
  "sensitive": false,
  "type": "Feed",
  "updated": "2025-02-26T23:19:40.672058+00:00",
  "url": "https://piefed.social/f/fediverse"
}

attributedTo points to /moderators:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/security/v1"
  ],
  "id": "https://piefed.social/f/fediverse/moderators",
  "orderedItems": [
    "https://piefed.social/u/rimu"
  ],
  "totalItems": 1,
  "type": "OrderedCollection"
}

At this moment we also have the moderators property, but as I have found out in this thread thats not a real property in AP as yet, so I’ll adjust the code to not use that in the future.

We made the /moderators be a collection to give us some future proofing. Ie right now one person can own a given feed. But if we want to add the ability to have more than one person moderate a feed in the future its easier if this starts life as some kind of collection, so we can just add items to it if we want in the future.

@JollyRoberts You can define a new property in https://w3id.org/fep namespace (see FEP-888d), along with the Feed type.
I think this is better than attributing actor to a collection, which is very unusual (though I don't expect that to cause any interop issues). Another option is to use an array value for attributedTo, this is also uncommon but some implementations do this (If I remember correctly, PeerTube is one of them).

@protocol

all have similar themes, and all have their own valid ways of running a federated forum

so what is really desired here – a collection of groups, or a sort of omni-group?

The proposed Feedactor is a named collection ofGroupactors, administered by aPerson actor.

so then why isn’t it a Collection?

Every feed actor MUST have a following collection. This is a list of every Group that the actor has collected.

When a `Group` is added to a Feed's `following` collection, implementations MUST represent that as an `Add` activity, where the object is the `Group` being added, and the target is the `following` collection of the feed

what? why? this is not how a following collection should be managed.

the feed MUST wrap it in an `Announce` activity

this is completely unnecessary; why not use Add directly or better yet why not use Follow if the target is the following collection?

Feeds MUST provide ownership information. This SHOULD be provided as the `attributedTo` property of the feed actor [...] Implementations MAY provide this information as a single actor, an OrderedCollection of actors, or a Collection of actors.

it would be better to avoid collections here because attributedTo as a relation is a direct relation and not an indirect relation. arguably the use of collections to represent indirect relations is itself an anti-pattern.