Thank you for your interest in contributing to PROPS. This document explains how to contribute effectively and what to expect during the review process.
PROPS is built using specification-driven development. A formal specification governs what the application does and how it behaves. While the full specification is not publicly published, the intended behaviour can be inferred from the application itself.
All contributions are assessed against this specification:
- Changes that align with the specification are straightforward to accept.
- Changes that extend the specification (new features or behaviour) require a spec update before or alongside the code change.
- Changes that conflict with or break the specification will need discussion — we may adjust the spec, adjust the contribution, or decline the change.
This is how we verify that the application does what it is supposed to do. Please don't be discouraged if your contribution triggers a spec discussion — it's a normal part of the process.
If you use Claude Code or other agentic coding tools, we recommend the /implement skill for implementation work. It plans from spec documents, tracks progress against requirements, and verifies that changes stay aligned with the specification. This matches how we develop PROPS internally.
Before writing code, open an issue describing what you want to change and why. This lets us assess alignment with the specification early, before you invest time in implementation.
- Fork the repository
- Create a feature branch from
main(e.g.feature/add-widgetorfix/broken-checkout) - Keep commits focused and well-described
This project follows test-driven development. For every change:
- Write a failing test that describes the expected behaviour
- Run
pytestand confirm it fails - Implement the code
- Run
pytestand confirm it passes - Verify tests also pass inside Docker:
docker compose exec web pytest
Target 80%+ test coverage on changed code.
black src/ # Formatting (line-length 79)
isort src/ # Import sorting
flake8 src/ # LintingConfiguration is in pyproject.toml.
If you add or change a dependency, edit requirements.in and regenerate requirements.txt:
pip-compile requirements.inNever commit a modified requirements.in without the corresponding requirements.txt update.
Use the PR template provided. Your PR should include:
- Summary — what the change does and why
- Spec alignment — whether this implements an existing spec requirement, extends the spec, or is a new feature not yet in the spec
- Test plan — what tests were added or modified, and confirmation they pass in both local and Docker environments
- Screenshots — for any UI changes
During review we will:
- Verify the change against the specification
- Run the test suite
- Check code style compliance
- Assess whether the spec needs updating to accommodate the change
PRs may take longer to merge if they require spec discussion. We appreciate your patience.
Please use the Bug Report issue template. Good bug reports include:
- Steps to reproduce the problem
- What you expected to happen vs what actually happened
- Logs (browser console, Django logs, Docker logs)
- Screenshots or screen recordings
- Your environment details (browser, OS, deployment method)
The more detail you provide, the faster we can investigate.
PROPS is dual-licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) and a commercial license.
By submitting a contribution (pull request, patch, or any other form), you:
- Grant Real World Technology Solutions a perpetual, worldwide, non-exclusive, royalty-free, irrevocable license to use, reproduce, modify, distribute, and sublicense your contribution under both the AGPL-3.0 and any commercial license offered for PROPS.
- Confirm that you have the right to grant this license and that your contribution does not infringe any third-party rights.
This dual-license grant ensures that contributions can be included in both the open-source and commercially-licensed versions of PROPS.
Open an issue or reach out to the maintainers. We're happy to help you find the right approach before you start coding.