So you wanna use your domain name as your bluesky handle?

2023-03-07

Hey! You don't have to do this anymore. There's a handy dandy flow available in the in-app settings.

If successful, you will immediately give up control of your current *.bsky.social handle, which may then be available for registration by other people.

Required

  • Bluesky account
  • A domain name you purchased through a registrar
  • (In the future, alternatively): XRPC server

Before You Proceed

This is an unsupported, bleeding-edge feature.

Please only proceed if you feel comfortable with bugs, account access issues, lost data, temporal shifts, and potential space invasion. I do not work for Bluesky PBLLC and this is not legal advice. Actions often have consequences.

Seriously. You'll be able to do this through the app in like a week.

You Must Determine Your True Name, Eragon

Since the @-protocol allows you to change your handle, your account is identified by a DID document, and in turn by its hash To find out what that is, you can send an HTTP request to the handle update() method.

Here's a few ways to do that:

Using Postman:

GET: https://bsky.social/xrpc/com.atproto.handle.resolve
- Params:
	- Key: handle
	- Value: your.current.handle
- Authorization: None
- Body: None

Using cURL

curl https://bsky.social/xrpc/com.atproto.handle.resolve?handle=your.current.handle

Using httpie

http get https://bsky.social/xrpc/com.atproto.handle.resolve \
handle==your.current.handle

If you get a response of "did:fake:donotuse", then something went wrong. If it looks like gibberish, you're in business.

Domain Name Server Settings

You need to add a TXT record to your domain.

  • Subdomain: _atproto
  • Value: did=did:plc:<your-did-hash-here>
  • TTL: Default or 3600

Mine looks like this:

dns configuration screenshot

Authenticate with bsky.social PDS

Using Postman:

GET: https://bsky.social/xrpc/com.atproto.session.create
- Params:
	- Key: handle
	- Value: your.current.handle
- Authorization: None
- Body:

{
    "identifier": "your.current.handle",
    "password": "password"
}

We need the accessJwt token from the reponse. Be careful to not copy any quotes or whitespace.

Paste the token into Authorization > Type: Bearer Token.

Using cURL


Using httpie

http post https://bsky.social/xrpc/com.atproto.session.create identifier=your.current.handle password=<your-password>

Request Handle Rotation

POST: https://bsky.social/xrpc/com.atproto.handle.update

- Authorization: Bearer Token = <accessJwt>
- Params: None
- Body:
	- Encoding: application/json (click the dropdown menu)

{
    "handle": "your.domain.handle",
}

Using cURL:


Using httpie:

http post https://bsky.social/xrpc/com.atproto.handle.update Authorization:"Bearer <accessJwt>" handle=your.domain.name

If you don't get an error, then it probably worked.

You can confirm that your request was successful if your new handle shows up in the DID:PLC server operation logs (https://plc.directory/export?after=2023-03-XXT00:00).

You can relog into Bluesky now. If you are using the beta iOS app, you will have to log in using your email address for the time being.