kestrel welcomes contributions to the core library, mock site, documentation, and example adapter. Contributions targeting real aggregators are also welcome but governed by additional rules below.
- Read LEGAL.md and PRIVACY.md. Both shape what does and does not get accepted.
- Read CONVENTIONS.md for commit, code, and doc style.
- Read ADAPTERS.md if you plan to contribute an adapter.
By submitting a pull request you agree your contribution is licensed under AGPL-3.0-or-later, the same as the project. If your contribution incorporates code from another source, that source must be license-compatible with AGPL-3.0-or-later. Document the origin in the PR description.
Every commit must carry a Signed-off-by: trailer (DCO). Use:
git commit -sWhich appends:
Signed-off-by: Your Name <your@email>
By signing off, you certify that you wrote the code or have the right to submit it under AGPL-3.0-or-later. Full text: https://developercertificate.org/
Pull requests with unsigned commits will not be merged.
- Fork the repo
- Branch from
mainusing one of:feat/<slug>,fix/<slug>,chore/<slug>,docs/<slug> - Make commits following CONVENTIONS.md
- Open the PR with the template (auto-populated)
- Maintainer runs the three-pass review pipeline (see CONVENTIONS.md)
- Address review comments; force-push the same branch (we rebase, not squash-merge)
- Maintainer merges via rebase
Adapters targeting real third-party sites carry additional rules:
- The maintainer does not write or maintain such adapters; you do
- You attest in your PR that you have read and accepted the target site's Terms of Service
- You attest the data flow (which fields the adapter submits, where they go) is documented in the adapter README
- The adapter must not include your personal data; submit only adapter logic and selectors, not test profiles
- Tests for the adapter run against the mock site, not the real one
PRs that fail to attest these will be closed.
Mandatory. Install with:
pre-commit installHooks run on every commit. CI re-runs the same hooks; bypassing locally does not help.
uv run pytestTests must pass on Python 3.12 and 3.13. The mock site spins up automatically for integration tests. No test should hit any real third-party host.
uv run ruff format
uv run ruff check
uv run mypyCI runs the same. PRs failing any of these will be marked needs-work.
Discussions: GitHub Issues for feature ideas, bug reports, and design questions.
Chat: none. Email the maintainer for sensitive matters.
- Adapters performing personal-detail misrepresentation
- Code introducing telemetry, analytics, error reporting, or any phone-home behavior
- Code targeting real aggregators that ships in the maintainer's tree (versus a community plugin)
- Commit messages with vocabulary blocklist hits (see CONVENTIONS.md)
- Unsigned commits
Look for issues tagged good-first-issue. Documentation improvements, mock site enhancements, and example adapter polish are all reasonable starting points.