diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..61721a06 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,62 @@ +# Contributing to Montage + +Montage is a small project maintained by volunteers. Contributions are welcome — please read this before opening a PR. + +We follow the [Wikimedia technical spaces Code of Conduct](https://www.mediawiki.org/wiki/Code_of_Conduct). + +## Getting started + +Check the [open issues](https://github.com/hatnote/montage/issues) for something to pick up. Issues tagged [`good-first-issue`](https://github.com/hatnote/montage/issues?q=is%3Aissue+is%3Aopen+label%3Agood-first-issue) are a good starting point. + +Before writing any code, leave a comment on the issue to let maintainers know you're working on it and to confirm the approach. If no issue exists for what you want to do, open one first. **Do not open a PR without a corresponding issue that has received a response from a maintainer** — especially if you are a new contributor. This avoids wasted effort on both sides. + +See [dev.md](dev.md) for local setup instructions. + +## Before opening a PR + +Follow the setup instructions in [dev.md](dev.md), including installing pre-commit hooks and running tests locally. Make sure tests pass before opening a PR. + +## Pull request expectations + +- CI must pass +- One focused change per PR — link the issue it addresses (`Fixes #NNN`) +- If your PR adds or changes database columns, include the SQL migration and flag it in the PR description +- Do not commit screenshots, generated files, or large binaries + +## Code quality + +- Follow existing patterns in the file you're editing +- Backend: read `montage/rdb.py` before writing queries — column names are authoritative there. Note that `.filter()` and `.order_by()` return new objects — always reassign +- Backend: write code that works with both MySQL (production) and SQLite (tests) — no MySQL-only syntax +- Frontend: use Composition API with `