Piggybacking off a previous thread:
I think this is The Question™, and I didn’t see a clear answer to it. I have my own opinion, but first two possibilities:
Option 1: Record
I’ve explained why I don’t like this option in the thread itself:
I didn’t elaborate but aside from my NSID point, what I said in another thread remains: you cannot make assumptions about what groups have. Display name? Description? Code of conduct? I can think of groups that require none of these. And if we start listing it, does it mean we need to have one for individual? Where does it end?
Option 2: the DID doc
Something like:
{
"id": "did:plc:na4zxzadynur6enl3ufohils",
"alsoKnownAs": [
...
],
"type": "group"
}
Set aside that I don’t think "type": "group" is the best we can do, this isn’t a terrible idea per se. We go to the DID doc all the time to get handles, may as well get some more info from there.
…and speaking of “not a terrible idea per se”… ![]()
Proposal 3 (the actual one): Group Service
Ok, bear with me. I already brought this up in my Concierge article, and for how weird it may sound it’s actually the one that makes the most sense and is supported by prior protocol history:
An Atmospheric Group is a DID with
#atproto_groupentries in its DID document and a public service URL that responds toGET /xrpc/com.atproto.group.getMembers.
If this sounds weird, consider: I literally took it from the “how to configure a labeler” tutorial:
Personally, I think the “when you configure an account as a labeler" plainly written there is a great representation of how this mental model is actually already present in the protocol (and we’re expanding, not creating).
Potential objection #1: editing the DID doc is A Lot™ to ask
Well, it should be! We’re talking about changing the whole dynamic of an account. Do we really want someone to be able to just delete a record and make something not be a group anymore?
Plus, so it is for creating a PDS the first time, but we do it anyway: at that point we’re already in the DID doc editing… let’s just put more in it!
And if one didn’t do it at account creation? Well x 2… do you want them to change the way their account is represented in so many places without a scary operation explaining the consequences?
It makes sense that this be an “expensive” operation.
Potential objection #2: the member list Lexicon endpoint is “problematic”
We know a big point of tension is that “membership needs to be able to be private”.
And at the same time, if there’s one thing we know of a group is that it has members. That may be the only thing we know.
And here’s the thing: responding to GET /xrpc/com.atproto.group.getMembers doesn’t mean that the answer needs to make membership not private! Potential answers include:
- 401, non authenticated
- 403, unauthorized
- Empty list (oooh, wonder if there’s some you may not be able to see
) - A list of DID that are associated with this group
- A total number of members (or
nullfor “you don’t get to know") => accounts for " you can know how many there is but not who they are” - Etc. etc.
We can work on what this looks like, but it’s not too far fetched as a contract. There may be more, there may be not… but the more I think about this the more this feels correct.
[edit: SPEAKING OF
]
(also, I don’t want to get too into this yet, but what better candidate to proxy requests around to other services, just like a PDS does)
That’s all (for now), folks!
So, with this… thoughts? objections? or answers: when do you think a DID becomes an Atmospheric Group?

