Help! I've migrated to a new PDS, and my Bluesky doesn't work

This is a checklist to hopefully help you find out what the issue is if you cannot use Bluesky after an account migration. This list is meant to be read from top to bottom. If the header with a number does not pertain to you, you can go to the next numbered header and continue through the checklist.

If you have questions, you can join the ATProto Touchers Discord and go to the #pds-operators channel and ask us there. Or just @ me on an alt.

1. My profile says, "Invalid handle"

This happens sometimes after a migration if you have a new handle that has the PDS domain in it like bailey.selfhosted.social. Bluesky has a tool to check if your handle can resolve at bsky-debug.app/handle

I just moved to the PDS, I'm not an admin

If you just migrated to a PDS and are not the admin, it usually takes 10-20mins before your new handle kicks in. You can usually make a post or like something, then mention your handle with the @, it will not autocomplete but is important to do @yourhandle.com, and that will usually fix it after mentioning.

I have a custom handle

If you have a custom handle like baileytownsend.dev you need to check your DNS record or the file on the server serving your domain. That can be verified with https://bsky-debug.app/handle . If neither returns that they passed verification you can see how to set that up inside of bsky.app via settings -> account -> Handle-> I have my own domain.

I am a PDS admin, I just setup a new PDS

If your new PDS is failing the debug check here's a few things to check

Check your handle via https://bsky-debug.app/handle

If the debug passed, read under "I just moved to the PDS, I'm not an admin" and try that first. Just takes a while sometimes. Can request a crawl with pdsadmin request-crawl or goat relay host request-crawl yourpdshost.com

That you have a DNS rule for *.pdsurl.com. If your pds is pds.pdsurl.com or similar you need a DNS rule for *.pds.pdsurl.com which is sometimes not supported with their included SSL (like on cloudflare) without paying extra.

That your caddy file has the wildcard route like *.pdsurl.com. If you followed the official install script this probably isn't it and is more than likely the wild card DNS record

2. Says my account is deactivated?

You may have tried to log in to your previous account. When you migrate, it actually creates a new account on the new PDS with all of your data from the previous one. The old one is deactivated and the new one is activated and what you'll use from now on.

1. Select "sign in or create an account" or "cancel" and go to the sign in screen

2. Click "Hosting Provider" above the account entry.

3. Click "Custom"

4. Enter your full PDS url with https into it. Like https://selfhosted.social and click "Done"

5. Fill in your handle you chose when migrating (can also use your email) and your password.

6. You should now be signed in on your new PDS.

3. New posts do not load/My account does not load

Try loading your profile using https://reddwarf.app the profile url will look like https://reddwarf.app/profile/yourhandle.com or https://reddwarf.app/profile/did:your:did. reddwarf loads your profile and posts directly from your PDS. So, your PDS appears to be saving and creating the records as you would expect.

If you try to load your profile on Bluesky, and it looks like bellow saying it cannot be found even if you just logged in and clicked on your profile icon. But it loads in reddwarf you may have a label on your account from Bluesky that is blocking your access to the application(Bluesky's AppView)

You can test this with debug.hose.cam , enter your handle in the search bar and scroll to the section "Labels" that is under the card that starts with "DID". If you see any labels, you will need to contact Bluesky support

If it says "no labels applied by mod.bsky.app" onto the next section.

I have found that these labels usually result in your profile not loading

needs-review

!takedown

!suspend

impersonation (maybe was with the others in the codebase)

Like I said, if you have a moderation label, then it's up to Bluesky to decide if they want to remove that label and regain access to Bluesky. You can make a request to their support via email. To make it easy to contact here is a template you can use if you found you have a label on your account, just fill in the {placeholders} and email support@bsky.app

Hello,
This is {yourhandle.com}({your did if you know it}).
I have just migrated from {bluesky or other PDS} to
{the new pds}. The migration was successful, but when I
try to load my profile after login it says "Not Found".
I also cannot make new posts. When I post the record shows
in my PDS, but not on Bluesky. I have checked and found that
mod.bsky.app has given me the following labels: {the labels}.
Can you please help me resolve removing these labels?

If your label is needs-review most likely they just need to review it and removal if it's a false positive. If it's !takedown then it was a manual or automated moderation action, and they can give you more details on that. Reminder, this is up to Bluesky to remove this label since they control their own application (Bluesky) on the atmosphere, and they are using this to bar your access to their AppView. You can actually still use your atproto application elsewhere and have limited Bluesky features via blacksky.community or reddwarf.app

Anything beyond this point is more so for PDS admins and a bit more technical. If you did not set up or manage your PDS direct your PDS admin to this document and let them know what issues you are having or reach out to us on the Discord mentioned at the top. Someone can go through the steps with you.

4. Gather some debug info

Before we go to the next section, we need to gather 3 pieces of info to help debug. Your handle, did, and PDS. This is also partly a rubber ducky step to make sure everything is as you expect.

You can find all 3 via https://pdsls.dev if you search by your handle, click on the identity tab

Did -> did

alias -> handle minus at://

PDS -> services under #atproto_pds

If you're having issues with your handle and the above did not help, can search for your PDS by entering the full url like https://selfhosted.social and go through the repos till you find yours. Which, if it's a PDS you just created, should only be one or a few repos.

A quick checklist if any of that info doesn't match what you expect

That's not my handle

If you're not seeing the handle you expect, you can change it a couple of ways

Bluesky social. Settings -> account -> handle. Can login via your did or email. Make sure you are logging in with your new PDS as the hosting provider

Goat . Helpful if the UI doesn't work. Worked for me setting a custom domain for an account that was the same as a PDS's url. The UI was failing, but goat worked for me.

Login via your did goat account login -u {your did} -p {your full password, can't use an app password}

goat account update-handle yournewhandle.com

That's not my did

You can also search by did on https://pdsls.dev to get a better idea what's going on. If it's a did:web, I wish you god speed and probably should ask us on the discord at the top or just go on to section 5.

That's not my new PDS, It's my old one

Migration most likely did not complete? Did you get a PLC token and enter it in the tool? If not, then you will need to retry your migration. Don't worry; it won't hurt anything to rerun it.

Does the did, handle, and PDS all look as you would expect?

Onward to the next one! We'll get it figured out.

5. What you're still here???

You are probably seeing.

1. Can login to the correct PDS

2. It shows all your old Posts and profile

3. New likes posts, etc are sent and created and can be viewed via reddwarf or https://pdsls.dev . But do not show on anything branded Bluesky.

If that's the case, your PDS/Repo is probably not being picked up by the Relay, the part that takes records from your PDS and sends it over the firehose that Bluesky listens to and adds to its AppView.

Request crawl

You can make a request to Bluesky's relay to check your PDS and add it to the list to pick up on requests. Here's a simple curl for it. Make sure to replace the placeholder with your ads host name in the body.

curl https://bsky.network/xrpc/com.atproto.sync.requestCrawl -X POST -H "Content-Type: application/json" -d '{ "hostname": "yourpds.com"}'

Should see a success response. If so, wait about 30 minutes, try making a post again and see if that works.

Yeah, still doesn't work

Back to debug.hose.cam search via your handle or did and scroll down to the section with "Relay repo status"

None of the relays say active

There's a chance something is blocking your WebSocket from being accessible to the Relay or the request crawl is not working. You can check the WebSocket by using goat . Run goat firehose --relay-host wss://yourpds.com and try to create a new record via a Bluesky post or liking a post. You should see some JSON go by and some JSON on connect that says "starting firehose consumer". If it cannot connect there's an issue with connecting to the /xrpc/com.atproto.sync.subscribeRepos endpoint on your PDS. If it shows JSON go by after creating a new record onward to the next section.

It may be a bug on the relay

At this point, it's very tricky to troubleshoot without a member of the Bluesky team to check their relays. But there is a known bug on Bluesky's old/current relay (listed as current' and can't check on debug.hose.cam ). This is the current (1/7/2026) production version of the Relay that Bluesky uses for their AppView. There's actually is not an API endpoint to query to check the state of your repo. So we're kind of guessing at this point. The Bluesky East and West are the new ones that will hopefully resolve this bug when moved to production. If those are showing active, and still seeing these issues, there's a very good chance its this bug or similar. You're down to two choices now.

Migrate back to your previous PDS. You can now migrate back to bsky.social using that as the target url in migration tools if you came from there. And wait until the new relays are put into production and try again later. Also welcome to migrate to selfhosted.social

OR create a new PDS with a new domain/sub domain and migrate to it and it should resolve the issuse. Very extreme, but it does work in every instance I've seen.

Nothing is working

More than welcome to join us in the ATProto Touchers Discord and go to the #pds-operators channel. Usually there is someone on to help you debug your issue, and hopefully we can get it figured out for you!