External Publication
Visit Post

Universal AT Profile Converter Service

Zicklag May 19, 2026
Source

This is a draft specification for the implementation of a kind of ATProto universal profile service. Developed during discussion with @lou.gg and @felinus.fish.

Assumption: For now we'll assume that the service is scoped under atmosphere.onl for lexicon / hosting purposes. This might change

tl;dr:

Target User Experiences

To start will focus on target user experiences and how they will be implemented.

Set My Profile In a New App

Situation: I login to an ATProto app and I want to set up my profile.

Configure a Universal Default Profile

Situation: I want a centralized place I can manage all my profiles, and set a "default" profile that I can use in anything supporting the profile service.

Universal Profile Endpoint

Situation: I'm making an ATProto app and I want to be able to fetch the user's profile, but I'm not really interested in providing an app-specific profile. I just want a sensible way to get their profile without being Bluesky specific.

Implementation Notes

Service Complexity and Features

I think that we should start off by making the service as simple as possible, and avoid any state, other than possibly some simple caching.

This will allow the service to be easily self-hosted, and allow us to reasonably provide a public instance for free.

That means that the service will not index profiles across the network. We don't want to have to build a database of all profiles across the entire network. We can just fetch the profiles directly from the PDS like pdsls.dev when the API requests them.

Multiple Profiles Per App

I think most if not all apps generally use the self rkey for the profile record. Some apps like Roomy might allow you to have different profiles for different chat spaces that you join, so there may be more than one profile in the same collection.

The server should resolve all the profiles regardless of the rkey.

API Endpoints

xrpc/onl.atmosphere.getProfile

This will resolve to the user's default profile.

Determining the Default Profile

The default profile can be set through the atmosphere.onl app, or it will be inferred by some mechanism which is undefined, other than that it must return the same profile deterministically for multiple request. This doesn't need to remain stable across versions of the service.

Query Parameters

xrpc/onl.atmosphere.getProfiles

This will return the full list of user profiles that can be found across any app lexicon.

This can be used by apps for the "Set My Profile In a New App".

Query Parameters

Discussion in the ATmosphere

Loading comments...