Contributing
Thanks for your interest in improving Loupe! This guide covers the essentials.
Getting set up
Follow From source to get a local environment running.
Before you open a pull request
Run these in order; the checks must pass cleanly — including any pre-existing failures you notice:
just cs # applies PHP CS Fixer + Rector fixes — commit anything it changesjust ci # check-only: PHPStan (level 8), phparkitect, gamache, ESLint, PHPUnitjust e2e # Playwright end-to-end testsjust ci never rewrites files, so run just cs first — otherwise style and
Rector violations will fail ci with nothing having been fixed.
Conventions
Loupe follows a set of project conventions (module layout, the command + handler
pattern, authorization voters, translations, and more). The .claude/skills/
directory documents them in detail — please skim the relevant skill before
working in an area. In short:
- Source lives in domain modules under
src/Module/. - Controller actions with logic are backed by a command + handler pair.
- All user-facing strings are translated.
- Access control goes through Symfony voters, not inline checks.
Commits and pull requests
- Work on a branch and open a pull request against
main. - Keep the PR focused; describe what changed and why.
- Add or update tests for behavior changes.
Reporting bugs and security issues
- Regular bugs: open an issue using the templates.
- Security vulnerabilities: do not open a public issue — see SECURITY.md.
License
By contributing, you agree that your contributions are licensed under the project’s AGPL-3.0-or-later license.