Labelers are a means of appending metadata to Authenticated Transfer Protocol (ATProto) records—primarily Bluesky accounts and posts at the time of writing—for the primary, though not exclusive, purpose of enabling community moderation. Labeler Relay discovers labelers as they are created and aggregates all known ATProto labeler streams into a single unified output. Instead of connecting to each labeler individually, consumers can then subscribe to one endpoint and receive all labels re-sequenced under a single monotonic cursor.

I maintain a running example at wss://relay.labeler.community/xrpc/community.labeler.sync.subscribeLabelers

The code itself is available on github and is licensed under an MIT License.

What it does

Each labeler on Bluesky exposes a com.atproto.label.subscribeLabels WebSocket endpoint. The relay watches for new labeler declarations, connects to all detected labelers simultaneously, ingests their label events, and rebroadcasts them as one stream under community.labeler.sync.subscribeLabelers. Downstream consumers track a single cursor regardless of how many upstream labelers exist.

Labels are passed through byte-faithfully, allowing consumers to verify any label against the origin labeler’s #atproto_label signing key.

Automatic discovery is handled by watching the AT Protocol firehose for app.bsky.labeler.service records, and an admin API is exposed to allow manual registration.

Endpoints

The relay broadcasts the following endpoint:

ws://localhost:8080/xrpc/community.labeler.sync.subscribeLabelers

community.labeler.sync.subscribeLabelers accepts the parameter cursor, allowing label replay.

ws://localhost:8080/xrpc/community.labeler.sync.subscribeLabelers?cursor=100

A simple typescript stream client is included in the repo, allowing users to decode the labeler stream.

Lexicon

The full specification for community.labeler.sync.subscribeLabelers is available here. It passes through two record types of interest.

com.atproto.label.subscribeLabels#labels

Relayed labels from an upstream labeler:

{
  "type": "label",
  "seq": 42,
  "src": "did:plc:ar7c4by46qjdydhdevvrndac",
  "record": {
    "$type": "com.atproto.label.subscribeLabels#labels",
    "seq": 35916330,
    "labels": [
      {
        "src": "did:plc:ar7c4by46qjdydhdevvrndac",
        "uri": "at://did:plc:example/app.bsky.feed.post/abc123",
        "cid": "bafyrei...",
        "val": "porn",
        "cts": "2026-06-02T14:05:50.164Z",
        "ver": 1,
        "sig": { "$bytes": "base64..." }
      }
    ]
  }
}

app.bsky.labeler.service

An upstream labeler’s service declaration as it is created, updated, or deleted.

{
  "type": "service",
  "seq": 43,
  "src": "did:plc:example",
  "op": "create",
  "record": {
    "$type": "app.bsky.labeler.service",
    "policies": { "labelValues": ["spam", "nsfw"], "labelValueDefinitions": [...] },
    "createdAt": "2026-06-01T00:00:00Z",
    "reasonTypes": [...],
    "subjectTypes": [...],
    "subjectCollections": [...]
  }
}