Contributing¶
rpodder is open source and contributions are welcome!
Development setup¶
git clone https://github.com/thekoma/rpodder.git
cd rpodder
# Start PostgreSQL + dev server with live reload
docker compose up -d
# Or build locally
cd web && bun install && bun run build && cd ..
cargo build
cargo test
Running tests¶
cargo test # all tests (~90)
cargo test -p rpodder-core # single crate
cargo test -p rpodder-db # DB tests (uses in-memory SQLite)
cargo clippy --workspace -- -D warnings # lint
cargo fmt --all -- --check # formatting
All tests use in-memory SQLite databases — no external services needed.
Code style¶
- Clippy clean — CI enforces
clippy -- -D warnings - Formatted —
cargo fmtwith default settings - No compile-time DB macros — use
query_aswithFromRow, notquery! - Idempotent migrations — every SQL migration must be safe to re-run
Adding a new feature¶
- If it needs new data, add a migration in
migrations/postgresql/andmigrations/sqlite/ - If it needs a new domain type, add it to
rpodder-core/src/types.rs - If it needs DB access, add a trait method to
rpodder-core/src/repo.rsand implement it in bothpostgres.rsandsqlite.rs - Add the HTTP handler in
rpodder-server/src/routes/ - Register the route in
main.rs - Update the web UI in
web/src/ - Add tests
Project philosophy¶
About vibe coding¶
rpodder is built through human-AI collaboration. We use Claude (Anthropic) as a development partner — not as a code generator that we blindly copy-paste from, but as a collaborator that we discuss architecture with, review output from, and iterate on together.
We believe this is a legitimate and increasingly common way to build software. The code is tested, reviewed, and functional. We're transparent about our process because we think the industry benefits from honesty about how software is actually made.
Design decisions¶
- Why Rust? — performance, safety, single binary deployment, great async ecosystem
- Why axum? — lightweight, composable, tower middleware ecosystem
- Why Svelte? — small bundles, reactive without virtual DOM, great DX
- Why both PG and SQLite? — PG for multi-user production, SQLite for Raspberry Pi self-hosting
- Why not MySQL? — two databases is enough complexity. PG and SQLite cover all use cases
- Why UUID v7? — time-sortable, globally unique, no sequence coordination needed
Filing issues¶
Please report bugs and feature requests at github.com/thekoma/rpodder/issues.
License¶
By contributing, you agree that your contributions will be licensed under AGPL-3.0-or-later.