Thanks for wanting to help! The short version:
- Start from an issue. Every PR needs an accepted issue behind it — open one first (or pick an existing one) so the change is agreed before the code exists. PRs with no linked issue from new contributors get flagged by the triage bot.
- Fork and branch from
dev.devis the default and integration branch;maintracks releases. - Follow the code around you. Kotlin official conventions, Compose single-source-of-truth, Clean Architecture layer rules — match what the neighbouring files already do.
- Fill in the PR template. All of it, including the checkboxes — one of them is machine-checked.
- Translations go through Crowdin, not PRs that edit the string files directly.
AI-assisted contributions are welcome. AI-driven ones are not:
- A human must have written or personally reviewed every line of the PR and be able to answer review comments about it. "The agent wrote it, I skimmed it" does not count.
- Unattended agent submissions — PRs fired at this repository by coding agents
(Jules, Devin, OpenHands, and friends) without a human shaping and checking the
result — are closed automatically by the triage workflow, on sight, without
individual discussion. Their fingerprints (agent names, session ids, or bare commit
hashes in the title) are matched by
.github/workflows/pr-triage.yml. - Commits carrying AI co-author trailers (
Co-Authored-By: Claude/Copilot/…) or "Generated with …" markers are rejected the same way — a leftover trailer is the tell that nobody proofread the output. Squash them out before opening the PR. - Repeat offenders get blocked from the repository.
This is not hostility toward AI tooling — half this project is built with it. It is the difference between a contribution someone stands behind and unreviewed output pointed at volunteer maintainers. Review time is the scarcest resource this project has; spending it on machine-generated PRs nobody proofread takes it away from contributors who did the work.
See CODE_OF_CONDUCT.md.