Python 56.0%
Svelte 32.0%
Rust 6.1%
TypeScript 4.4%
CSS 0.5%
JavaScript 0.3%
Just 0.2%
Dockerfile 0.2%
Shell 0.1%
HTML 0.1%
Mako 0.1%
Other 0.2%
794 3 50

Clone this repository

https://tangled.org/zzstoatzz.io/plyr.fm
git@tangled.org:zzstoatzz.io/plyr.fm

For self-hosted knots, clone URLs may differ based on your setup.

README.md

plyr.fm#

music on atproto

check the plyr.fm artist page for the latest auto-generated development podcast!

tech stack

backend#

frontend#

services#

  • moderation: Rust ATProto labeler for copyright/sensitive content
  • transcoder: Rust audio conversion service (ffmpeg)
local development

prerequisites#

  • uv for Python
  • bun for frontend
  • just for task running
  • docker for dev services (redis)

quick start#

# install dependencies
uv sync
cd frontend && bun install && cd ..

# start dev services (redis for background tasks)
just dev-services

# run backend (hot reloads at http://localhost:8001)
just backend run

# run frontend (hot reloads at http://localhost:5173)
just frontend run

useful commands#

# run tests
just backend test

# run linting
just backend lint
just frontend check

# database migrations
just backend migrate "migration message"
just backend migrate-up

# stop dev services
just dev-services-down
features

listening#

  • audio playback with persistent queue across tabs
  • like tracks, add to playlists
  • browse artist profiles and discographies
  • share tracks, albums, and playlists with link previews
  • unified search with Cmd/Ctrl+K
  • teal.fm scrobbling

creating#

  • OAuth authentication via ATProto (bluesky accounts)
  • upload tracks with title, artwork, tags, and featured artists
  • organize tracks into albums and playlists
  • drag-and-drop reordering
  • timed comments with clickable timestamps
  • artist support links (ko-fi, patreon, etc.)

data ownership#

  • tracks, likes, playlists synced to your PDS as ATProto records
  • portable identity - your data travels with you
  • public by default - any client can read your music records
project structure
plyr.fm/
├── backend/              # FastAPI app
│   ├── src/backend/      # application code
│   │   ├── api/          # public endpoints
│   │   ├── _internal/    # services (auth, atproto, background tasks)
│   │   ├── models/       # database schemas
│   │   └── storage/      # R2 adapter
│   ├── tests/            # pytest suite
│   └── alembic/          # migrations
├── frontend/             # SvelteKit app
│   ├── src/lib/          # components & state
│   └── src/routes/       # pages
├── moderation/           # Rust labeler service
├── transcoder/           # Rust audio service
├── redis/                # self-hosted Redis config
├── docs/                 # documentation
└── justfile              # task runner
costs

~$20/month:

  • fly.io (backend + redis + moderation): ~$14/month
  • neon postgres: $5/month
  • cloudflare (pages + r2): ~$1/month
  • audd audio fingerprinting: $5-10/month (usage-based)

live dashboard: https://plyr.fm/costs

mirrors#