Moving to Bluesky with a custom domain handle

I've been exploring Bluesky as Twitter/X alternative for a year. The tech community made the move 5 weeks ago when Kelsey Hightower closed his X account. Since then, user and follower counts have skyrocketed. Learn how to set up your Bluesky account with a custom domain and a few tips and tricks to get started.

Account Setup

Account registration is straightforward - register an account on https://bsky.app/, verify your email, add a birth date (for viewing moderated adult content), and update your profile with a headshot, biography, and header. Install the available apps for iOS or Android.

By default, you can use the .bsky.social instance and choose your nickname in this environment. But you can also use your domain (website, personal domain for everything, or a nickname) as your custom Bluesky handle.

This website runs on dnsmichi.at but the .at ccTLD is more historical, folks often get confused about my location (Germany, not Austria anymore). To better reflect my current focus and scope, I've registered a .dev domain and let dnsmichi.dev redirect to this website as well. That way, I can use dnsmichi.dev as a custom domain on Bluesky which will be explained in the following steps.

Custom domain

The instructions are shown with Namecheap as a domain registrar and DNS server host, but the setup is super easy with a single TXT record with any provider and domain.

Note: If you are considering moving to a custom domain handle, do it as early as possible. Historical name tags and quotes are kept, but all incoming URLs (starter packs, lists, etc.) will be broken and not redirected and require external site updates. I was late to the game but fixed a GitLab handbook MR before review,

First, navigate into Bluesky web > Account > Handle > Change Handle (mobile app: Settings > Advanced > Change Handle).

Add the domain you want to use. Bluesky will generate an authentication record with _atproto as Host key, and a string as value. The web view provides convenient copy actions for later operations.

Open your domain provider's interface to manage the domain records. For Namecheap, navigate into the domain view and select Advanced DNS for manually adding entries. Then select Add new record and select TXT record in the dropdown.

For the Host field, copy/enter the _atproto key. For the Value field, copy the Bluesky generated string. Leave TTL and other settings as default, and hit the green checkmark to save the entry.

When in doubt, you can manually test the new DNS record on your CLI, or in your web browser, for example using the Google Admin Toolbox for Dig: https://toolbox.googleapps.com/apps/dig/

The web UI call is equivalent to dig _atproto.domain TXT on the CLI.

Navigate back to Bluesky to verify the domain and use the new handle.

The old handle.bsky.social will be free to use again. To avoid namesquatting with the handle and URLs, register the handle immediately using a secondary email address or alias, and verify the account's email address. Edit the profile and add a biography and/or post, saying that it moved to @newhandle .

Example: https://bsky.app/profile/dnsmichi.bsky.social moved to https://bsky.app/profile/dnsmichi.dev

More tips to get started

  1. Secure your account and enable email 2FA, and require ALT text for images by default.
  2. Follow starter packs - GitLab Community, DevRel, DevOps, Cloud Native, Platform Engineering, AI/ML Diversify Tech, and more in this thread.
  3. Ask friends to get added to Starter Packs to drive engagement and followers.
  4. Add a biography, profile picture and header, summarize your role, interests and topics to offer.
  5. Review the complete Getting Started guide by Dean Lofts:
Complete Guide to Getting Started with Bluesky: The New Home of Tech Twitter - Dean “Loftwah” Lofts
Learn how to set up your Bluesky account, customize your profile, connect with the tech community, and discover the best starter packs to follow.

I've started documenting more engagement tips for the Dev Advocacy GitLab handbook in this MR (edit: 2024-11-28 - merged and live here):

Dev Advocacy: Add Bluesky social media tips (starter packs, etc.), refine messaging/media tips, handbook cleanup (!9821) · Merge requests · GitLab.com / Content Sites / handbook · GitLab
Why is this change being made? 💡 Provide a detailed answer to the question…

Ready to leave Twitter/X behind and start fresh? Join me on Bluesky!

🦊 Michael Friedrich 🌈 (@dnsmichi.dev)
🦊 Staff Developer Advocate @GitLab.com 🌐 Austrian living in Germany, working all-remote 👀 Efficient DevSecOps workflows with AI 🗺️ #lego #travel #remotework #drageekeksi #embedded #ai 🌈 https://dnsmichi.at/about/

Edit 2024-11-28:

Domain redirect with TLS certificates

If you need to redirect the new domain, or configure it on a host, here is an example how dnsmichi.dev now redirects to dnsmichi.at/about, requiring a TLS certificate with Lets Encrypt for .dev domains, integrated into an Nginx proxy.

Note: The .dev domain is special, it needs a TLS certificate and https certificate at the root HTTPS entry. Otherwise, browsers will immediately reject and mark the domain unsafe. Other domains may just use DNS provider tools that can redirect the HTTP host.

Edit the DNS entries and add A/AAAA recordings from the current host (dnsmichi.at) to the new host, use @ for the root domain entries.

Then setup TLS certificates with Lets Encrypt and certbot.

$ vim /etc/nginx/sites-available/dnsmichi.dev.conf

server {
    if ($host = dnsmichi.dev) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name dnsmichi.dev;

    return 301 https://dnsmichi.at/about;
}
server {
    listen 443; listen [::]:443;
    server_name dnsmichi.dev;

    return 301 https://dnsmichi.at/about;

    ssl_certificate /etc/letsencrypt/live/dnsmichi.dev/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/dnsmichi.dev/privkey.pem; # managed by Certbot
}
server {

    listen 80; listen [::]:80;
    server_name dnsmichi.dev;
}
$ ln -s /etc/nginx/sites-available/dnsmichi.dev.conf /etc/nginx/sites-enabled/dnsmichi.dev.conf

$ certbot --nginx -d dnsmichi.dev

$ systemctl restart nginx