audio streaming app
plyr.fm
1---
2title: "contributing"
3description: "contribute to plyr.fm development"
4---
5
6plyr.fm is open source. development happens on [GitHub](https://github.com/zzstoatzz/plyr.fm) (mirrored to [tangled.org](https://tangled.org/zzstoatzz.io/plyr.fm)). contributions welcome — fork the repo and open a PR.
7
8## using a coding assistant?
9
10if you're using Claude Code, Cursor, Codex, or similar — copy the prompt below into your assistant to get oriented:
11
12```
13i want to contribute to plyr.fm. the repo is at https://github.com/zzstoatzz/plyr.fm
14
15read the CLAUDE.md at the repo root for project context, then read STATUS.md
16for active tasks. fork the repo, make your change on a branch, run linting
17(just backend lint / just frontend check), add tests for bug fixes, and open a PR.
18
19the stack is FastAPI + SvelteKit + Postgres + Redis. use `uv` for Python, `bun`
20for frontend, and `just` as the task runner. see backend/.env.example for all
21environment variables.
22```
23
24or install the [contribute skill](https://github.com/zzstoatzz/plyr.fm/tree/main/skills/contribute) for richer agent context.
25
26## prerequisites
27
28- [uv](https://docs.astral.sh/uv/) (Python 3.11+)
29- [bun](https://bun.sh/) (frontend)
30- [just](https://just.systems/) (task runner)
31- [docker](https://www.docker.com/) (for Redis and test databases)
32
33## quickstart
34
35```bash
36# fork on github, then clone your fork
37gh repo fork zzstoatzz/plyr.fm --clone
38cd plyr.fm
39
40# install dependencies
41uv sync
42cd frontend && bun install && cd ..
43
44# configure environment
45cp backend/.env.example backend/.env
46# edit backend/.env — see the setup guide linked below for details
47```
48
49### running the stack
50
51```bash
52# start redis (required for background tasks)
53just dev-services
54
55# terminal 1 — backend (port 8001, hot reloads)
56just backend run
57
58# terminal 2 — frontend (port 5173, hot reloads)
59just frontend run
60```
61
62the backend needs a Postgres connection. you can use the [Neon](https://neon.tech) dev instance or a local Postgres — set `DATABASE_URL` in your `.env`. see [`backend/.env.example`](https://github.com/zzstoatzz/plyr.fm/blob/main/backend/.env.example) for all configuration options and the [local development setup guide](https://github.com/zzstoatzz/plyr.fm/blob/main/docs-internal/local-development/setup.md) for detailed walkthrough.
63
64## workflow
65
661. check [`STATUS.md`](https://github.com/zzstoatzz/plyr.fm/blob/main/STATUS.md) for active tasks
672. [open an issue](https://github.com/zzstoatzz/plyr.fm/issues) describing the change
683. fork the repo, branch from `main`, make your changes
694. open a PR from your fork
70
71## useful commands
72
73```bash
74just backend run # start backend
75just frontend run # start frontend
76just dev-services # start redis
77just backend test # run tests (spins up isolated postgres + redis)
78just backend lint # type check + ruff
79just frontend check # svelte type check
80just backend migrate-up # apply database migrations
81```
82
83## conventions
84
85- **type hints** required everywhere (Python and TypeScript)
86- **async everywhere** — never block the event loop
87- **lowercase aesthetic** in naming, docs, and commits
88- SvelteKit with **Svelte 5 Runes** (`$state`, `$derived`, `$effect`)
89- use `uv` for Python (never `pip`)
90- add regression tests when fixing bugs
91
92detailed internal documentation (environment setup, deployment, architecture) is in [`docs-internal/`](https://github.com/zzstoatzz/plyr.fm/tree/main/docs-internal).