music on atproto
plyr.fm
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:
- enumerate all repos with
fm.plyr.trackviacom.atproto.sync.listReposByCollection - backfill those repos, extracting any
fm.plyr.*records - stream the firehose for new records
- serve events via websocket at
ws://localhost:2480/channel
what we found#
initial network scan (dec 2025):
- 35 repos with
fm.plyr.trackrecords - 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 checkPOST /repos/add- track a DIDPOST /repos/remove- stop trackingGET /stats/repo-count- tracked reposGET /stats/record-count- indexed recordsWS /channel- event stream
resources#
- tap README
- bailey's guide
- @atproto/tap - typescript client