tap#

bluesky's ATProto sync utility for backfilling and streaming custom lexicons.

install#

go install github.com/bluesky-social/indigo/cmd/tap@latest

binary lands at ~/go/bin/tap

run locally#

TAP_SIGNAL_COLLECTION=fm.plyr.track \
TAP_COLLECTION_FILTERS=fm.plyr.* \
TAP_LOG_LEVEL=info \
~/go/bin/tap run

this will:

  1. enumerate all repos with fm.plyr.track via com.atproto.sync.listReposByCollection
  2. backfill those repos, extracting any fm.plyr.* records
  3. stream the firehose for new records
  4. serve events via websocket at ws://localhost:2480/channel

what we found#

initial network scan (dec 2025):

  • 35 repos with fm.plyr.track records
  • 497 total records indexed

breakdown:

fm.plyr.track           273
fm.plyr.like             90
fm.plyr.list             41
fm.plyr.dev.track        18
fm.plyr.comment          15
fm.plyr.actor.profile    13
(plus staging/dev variants)

consuming events#

events come through /channel websocket as JSON:

{
  "id": 439,
  "type": "record",
  "record": {
    "live": false,
    "did": "did:plc:...",
    "collection": "fm.plyr.track",
    "rkey": "3m7m3wyasmi2l",
    "action": "create",
    "record": {
      "title": "...",
      "artist": "...",
      "audioUrl": "https://..."
    }
  }
}

ack events to consume them: {"ack": <id>}

see sandbox/tap/read_events.py for example consumer.

api endpoints#

  • GET /health - status check
  • POST /repos/add - track a DID
  • POST /repos/remove - stop tracking
  • GET /stats/repo-count - tracked repos
  • GET /stats/record-count - indexed records
  • WS /channel - event stream

resources#