Bluesky labelers let community managers and moderators add tags to posts or accounts without deleting content. A custom labeler can mark posts as misleading, flag accounts as trusted, or add context to discussions inside your community. This article explains how a labeler works, what you need to set one up, and the exact steps to deploy your own labeler service. You will learn how to configure moderation labels, publish a labeler feed, and avoid common setup mistakes.
Key Takeaways: Building a Bluesky Labeler for Your Community
- AT Protocol + Labeler Service: A custom labeler requires a running server that publishes label definitions and applies labels via the Bluesky API.
- GitHub + Docker or Node.js: Most labelers are deployed using the official labeler starter kit on GitHub, run in a Docker container or Node.js environment.
- Moderation > Labeler Config: After deployment, you register the labeler with Bluesky and configure which labels appear in the community’s moderation tools.
What a Bluesky Labeler Does and Why You Need One
A labeler on Bluesky is a service that attaches labels to posts, accounts, or feeds. Labels are simple tags such as misleading, spam, trusted, or any custom string you define. When a label is applied, the Bluesky client shows a visual badge or hides the content based on the user’s moderation settings.
You need a labeler if your community has more than a few hundred members and you want consistent moderation without deleting posts. Labelers let you mark content without removing it, giving members the choice to see or hide labeled items. The labeler runs as its own service, separate from your personal account, so multiple moderators can manage labels through a shared tool.
Before you build a labeler, you need three things:
- A Bluesky account with a handle that will “own” the labeler. This can be a dedicated community account.
- A server or cloud instance where the labeler service will run. A small virtual machine with 1 GB of RAM and a public IP address is enough for most communities.
- Basic familiarity with the command line, Docker, or Node.js. The starter kit handles most of the complexity, but you need to edit configuration files and start the service.
Steps to Deploy a Custom Bluesky Labeler
Follow these steps to set up a labeler for your community. The instructions use the official Bluesky labeler starter kit available on GitHub. All commands assume a Linux server with Docker installed.
- Create a Dedicated Bluesky Account for the Labeler
Sign up for a new Bluesky account. Use a handle that represents your community, such as @mods.yourcommunity.bsky.social. This account will be the labeler’s identity. Do not use your personal account for the labeler. - Generate an API Key for the Labeler Account
Log into the labeler account on Bluesky. Go to Settings > App Passwords. Click Add App Password. Name it labeler-service and copy the generated password. Store it securely. - Clone the Labeler Starter Kit
On your server, run:git clone https://github.com/bluesky-social/labeler-starter-kit.git. Then change into the directory:cd labeler-starter-kit. - Configure the Labeler Settings
Copy the example configuration file:cp config.example.yaml config.yaml. Openconfig.yamlin a text editor. Set the following values:– handle: The handle of your labeler account (e.g., mods.yourcommunity.bsky.social).
– password: The app password you generated in step 2.
– service: Set to https://bsky.social for the main Bluesky network.
– labels: Define the labels your community will use. Each label needs arkey(a short ID), adisplayName, and adescription. Example:labels: - rkey: misleading displayName: Misleading description: Content that contains false or misleading information - rkey: trusted displayName: Trusted Source description: Verified community member or reliable source - Build and Start the Labeler Service
Rundocker compose up -d. Docker will build the labeler image and start the service. The labeler listens on port 2583 by default. Verify the service is running withdocker compose ps. - Register the Labeler with Bluesky
Once the service is running, it needs to announce itself to the Bluesky network. Run:docker compose exec labeler node register.js. This script sends a registration request to the Bluesky relay. You should see a success message with your labeler’s DID. - Grant Moderator Access to Your Team
Only the labeler account can apply labels by default. To let other community moderators use the labeler, you need to add their DIDs to the configuration. Inconfig.yaml, add amoderatorslist:moderators: - did:plc:xxxxxxxxxxxxx - did:plc:yyyyyyyyyyyyy
Find a user’s DID by visiting their profile on Bluesky and looking at the URL:
bsky.app/profile/did:plc:xxxxxxxxxxxxx. Restart the service withdocker compose restartafter adding moderators. - Test the Labeler
Open the Bluesky app. Search for your labeler account’s handle. You should see a labeler badge on the profile. Go to any post, click the three-dot menu, and select Report or label. If you are a moderator, you will see your custom labels in the list. Apply one and check that the post shows the label badge.
Common Mistakes and Limitations When Building a Labeler
Labeler service fails to register with Bluesky
If the registration step fails, check that your server’s firewall allows inbound connections on port 2583. Also verify that the handle and password in config.yaml are correct. The app password must be generated from the labeler account, not your personal account.
Custom labels do not appear in the Bluesky client
Bluesky caches label definitions for up to 30 minutes. After adding new labels to config.yaml, restart the service and wait. Also confirm that the labels are defined under the labels key in the YAML file and that the YAML indentation is correct. Use an online YAML validator if needed.
Moderators cannot see or apply labels
Only DIDs listed in the moderators section of config.yaml can apply labels through the labeler. Make sure you added the correct DID and restarted the service. Also check that the moderator is logged into Bluesky with the account that matches the DID.
Labeler stops working after a Bluesky update
The AT Protocol evolves frequently. Watch the Bluesky developer blog and the labeler starter kit repository for breaking changes. Update your local clone with git pull and rebuild the Docker image with docker compose up -d --build.
Labeler Options: Self-Hosted vs Managed Services
| Item | Self-Hosted Labeler | Managed Labeler Service |
|---|---|---|
| Setup effort | Requires server, Docker, and CLI skills | Minimal; provided by a third party |
| Cost | Server hosting fees only | Monthly subscription or per-label fees |
| Customizability | Full control over label definitions and logic | Limited to predefined label types |
| Data privacy | All label data stays on your server | Label data is processed by the service provider |
| Maintenance | You handle updates, backups, and uptime | Provider handles maintenance |
You can now deploy a custom Bluesky labeler for your community and give your moderators a shared tool to tag content without deleting it. After the labeler is running, explore the labeler’s moderation dashboard at http://your-server-ip:2583 to see applied labels in real time. For advanced use, look into the labeler’s webhook feature, which lets you trigger automatic label applications based on external data sources such as blocklists or community reports.