Instead of @name.bsky.social, you can use your own domain as your Bluesky handle, for example @example.com. This works with a Bluesky account just as it does with your own PDS. Your posts and followers stay as they are.
Step 1: Get the value in Bluesky
- Log in to Bluesky. With your own PDS, choose a custom hosting provider when logging in and enter its address.
- Go to Settings, Account, Handle.
- Choose I have my own domain and enter the domain.
- Bluesky shows you a value starting with
did=did:plc:. Keep the window open.
Step 2, option A: DNS record
This is the easiest way:
| Name | Type | Value |
|---|---|---|
_atproto | TXT | did=did:plc:…, exactly as shown |
For a handle like name.example.com, the record is called _atproto.name.
Step 2, option B: File on your web server
If you cannot change DNS, your web server answers on /.well-known/atproto-did. The response contains only your DID, without did=.
nginx
In the server block for port 443:
location = /.well-known/atproto-did {
default_type text/plain;
return 200 'did:plc:abcdefghijklmnopqrstuvwx';
}
Apache 2
Create the file .well-known/atproto-did in the web root. It contains only your DID, with no spaces. Add this to the VirtualHost:
<Location "/.well-known/atproto-did">
ForceType text/plain
</Location>
Step 3: Test and confirm
dig +short TXT _atproto.example.com
curl https://example.com/.well-known/atproto-did
The first line checks option A, the second option B. Once it shows your DID, click the verify button in Bluesky and save.
If it does not work
- Verification fails: DNS changes take a little time. Try again after a few minutes.
- Wrong DID: There can only be one
_atprotorecord withdid=. With several different ones, verification fails. - Doubled name: Some providers add the domain themselves. In that case, enter only
_atproto. - Option B does not work: The address has to be reachable over HTTPS, and the file may only contain the DID.
Your own Bluesky server?
I run your Personal Data Server for Bluesky on servers in Germany.