Contributing
Issues and pull requests are welcome. This page summarizes local setup and the
quality gates; the canonical, always-current source is
CONTRIBUTING.md
in the repository.
Local setup
Section titled “Local setup”PosterPilot is a SvelteKit app that runs on Bun.
bun installcp .env.example .env # fill PLEX_URL / PLEX_TOKEN / TMDB_KEY (or use the Settings UI)bun run db:generate # generate SQL migrations from the Drizzle schema (already committed)bun run dev # http://localhost:5173Migrations apply automatically on server start.
Quality gates
Section titled “Quality gates”Every change must pass these before review — CI runs the same:
bun run check # svelte-check type checkingbun run test # vitest unit testsbun run lint # prettier --check (run `bun run format` to auto-fix)The project follows test-driven development for server logic — write a failing
test first, then the implementation. Keep pure, testable logic free of
$env / $app imports so it can be unit-tested in isolation (see the existing
tests for the pattern).
Commit messages
Section titled “Commit messages”The project uses Conventional Commits. The type prefix drives the automated changelog and version bump via release-please:
feat:— a new feature (minor bump)fix:— a bug fix (patch bump)docs:,chore:,refactor:,test:,ci:— no release on their ownfeat!:/ aBREAKING CHANGE:footer — major bump
Example: feat(library): add genre filter.
Pull requests
Section titled “Pull requests”- Branch from
main. - Make focused changes; keep the diff scoped to one concern.
- Ensure
check,test, andlintare green. - Open a PR using the template and link any related issue.
Spec-driven changes
Section titled “Spec-driven changes”Larger features are planned with
OpenSpec under openspec/changes/. For a
substantial change, propose a spec first, then implement against its tasks. The
capability specs live under openspec/specs/.
Translating
Section titled “Translating”No coding is required to help translate the UI — see Translating for the Weblate workflow.
PosterPilot is an independent project, not affiliated with or endorsed by Plex, Jellyfin, Emby, MediUX, Fanart.tv, TMDB, ThePosterDB, or Kometa. Trademarks belong to their respective owners. This product uses the TMDB API but is not endorsed or certified by TMDB.