I read this comment & this post from @jesseplusplus.com and they got me thinking.
What if we could make our boring auth even more boring-er?
Basically, I don’t think the members list is actually necessary to have on protocol. In the same way we can kick write access up to the application layer, I think we can kick “enumerating readers” up to the application layer. A space host still needs to know who has access to a given space so they can decide whether to mint a credential to a requesting user. But that access doesn’t need to be materialized or broadcast as a list. It could be modeled arbitrarily by the space host.
I’ll discuss the concerns that came up for me, my thoughts on those concerns & then some of the benefits to removing the member list.
Three concerns came up:
- How do I, as an author in a space (but not the owner), know what the perimeter is for the stuff I write?
- Does this hurt the “space migration” story?
- How does an syncer know the boundary to sync from?
After thinking about it, I don’t think either of the first two are concerns.
If a given space host or application cares about either of these they can still materialize the member list or access logic in records in the space! At the end of the day, the space host wasn’t bound to only minting space credentials for accounts on the list. A space host could mint a credential for anyone, regardless of if they were on the space member list or not. This just owns up to that reality, makes the space credential the first-class mechanism, and leaves the member list up to the application.
I believe the space migration story is similar. If migrate-ability is a concern (which I think it generally should be), then you should model access logic in records within the space owner’s repo in the space. This is basically exactly the same as modeling membership in the member list (which was in a repo-like data structure, but not technically a repo). All the same threats are available from a malicious space host: misrepresenting access data, refusing to export, deleting the space without consent, etc.
On the data boundary, I think we can have the space host help facilitate this. The space host should be aware of all repos that have published something in the space (since it helps route write notifications). So to backfill a space, it can just provide that list to any syncer. This is a list of writers not readers. So it’s more efficient to do backfill this way & doesn’t give away reader visibility. This would involve introducing a new method on space hosts to help list all known writers in a space.
Okay now onto benefits:
Applications get to decide how they want to handle reader visibility. This enables apps like Frequency. Removing the memberlist as a required concept is still just as featureful for applicaionts,
We get to ditch the member list data structure! Honestly, I thought this piece felt a little weird. “It kinda functions & syncs like a repo, but isn’t actually a repo”. Now it’s just space credentials & permissioned repos.
Complex access logic doesn’t need to be materialized as a list. Two spaces under the same community DID have basically (but not quite) overlapping member lists? If the member list is part of the protocol: too bad, you have to materialize it twice! Now a space host can store it in whatever way it sees fit. I think the folks at Roomy will be very happy about this one.
Less state needed for minting credentials. Related to the prev benefit^ Imagine a space on your PDS for your “follower-only posts” (this space would be under your DID). If you’re materializing the member list, then an application-aware service (like the Bluesky app) needs to hold an OAuth credential for your account & add/remove members from the list as you gain/lose followers. Without a member list, the managing app doesn’t have to control a list on the PDS. I think we could introduce a com.atproto method that you could configure a space to reach out to to determine if a credential should be minted. So if I configured my “follower-only posts” space as such, then when someone reaches out to my PDS for a space credential for the space, my PDS reaches out (generically) to the configured application to determine if it should mint the credential or not. Just an idea! But this seems like a much less clunky way for PDSes/space hosts & applications to coordinate