Starting a separate discussion after introducing atmospheric groups during a discussion yesterday about the principles I’m thinking about when it comes to designing for the group management layer. Here is an example of what that layer includes:
- Protocol layer - Permissioned data, PDS, where the individual data lives and how it’s stored
- Group management layer - Where group management apps like OpenSocial and the Arbiter fit in
- Application layer - Where applications build on the underlying structure of groups to surface public/open groups across multiple applications
With this, there are a few guiding principles I have been thinking about while working on OpenSocial, and occasionally chatting with @zicklag.dev about who is working on the Arbiter:
- I don’t think that the group management layer should be required. Applications can very likely allow the creation of groups without requiring any integration with a group management layer. For example, Bluesky communities could be created just within Bluesky with a basic group management setup just managed within Bluesky that allow folks to handle the moderation of a basic public group. However, if a group grows to the point where they need more structure, then I’d also like Bluesky to be compatible with whatever contract we come up with for atmospheric groups so that those could also be surfaced as Bluesky communities.
- I don’t think that the member list will have to be public. Some groups might benefit from a public member list so that an app like PopFeed could easily show a group and indicate which media is popular with group members. However, for more privacy-focused groups having either an internal-only member list or a member list that is only available at the group management layer to group admins might be important.
- I also don’t think that all groups need to be discoverable. We will likely need some sort of public lexicon to indicate that a DID represents a group (example below) to be able to surface groups publicly across multiple applications, but some groups will be either private or invite-only, so the absence of that lexicon can serve to prevent those groups from showing up in group lists (but then they’ll need that record to be in a permissioned space in a consistent spot if groups want apps to know things like their name/avatar).
- Modularity is important to group management. Groups can span from a small DM with some friends to groups with 10s of thousands of individuals, and creating systems that can be modularly applied to group management and moderation is likely to be important (more focused conversation around moderation is being kicked off here).
- Keep the group management layer as lightweight and modular as possible. We want to primarily focus on what is a requirement for interoperability of groups. That means we should optimize for the minimum requirements and allow the group management layer and application layers to grow more complex as needed (for example, I love @zicklag.dev ‘s idea with the arbiter to primarily use XRPC procedures as the lexicon vs. standard records, so that something like
getGroupMemberscould be as simple or as complex as the group actually needs)
{
"$type": "community.opensocial.group.profile",
"communityType": "open",
"displayName": "ATProto PDX Community",
"description": "A community for folks interested in ATProto in the Portland, Oregon area!",
"codeOfConduct": "Don't be a jerk",
"createdAt": "2026-04-17T18:27:00.471Z",
}