2.3 KiB
Contributing
Thank you for your interest in contributing to Raiju!
How to Contribute
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -m 'Add my feature') - Push to the branch (
git push origin feature/my-feature) - Open a Pull Request
Code Standards
- PHP 8.1+ syntax; validate on a supported PHP release.
- Use consistent indentation (4 spaces)
- Follow existing naming conventions
- Add comments for complex logic
- Ensure security: validate inputs, sanitize outputs, use CSRF tokens
Reporting Issues
- Use GitHub Issues
- Include steps to reproduce
- Include browser/PHP version if relevant
Feature Requests
- Open an issue with the "enhancement" label
- Describe the use case
- Discuss before implementing large changes
Releases
Follow RELEASES.md to keep VERSION, changelog dates, tested tags
and GitHub releases synchronized. Document compatibility changes in the upgrade
guide before publishing a release.
Offline validation
Run python3 tests/run-smoke.py from the repository root. The runner needs PHP
(with mbstring, DOM, cURL and ZIP), Node.js and Python 3. It creates disposable
site copies, uses generated fixture accounts, and makes no paid AI calls or
external email deliveries. Live configuration and customer content are not copied.
The suite covers PHP/JavaScript syntax, translation JSON, permissions, sessions, CSRF, safe HTML, routing, forms, backup/restore, concurrent file writes, and mocked AI provider requests. Browser checks are separate from the offline runner.
Routing tests in this suite run on the PHP development server, not Apache.
For routing, login-destination or handler-directory changes, also complete the
Apache routing checks and include that evidence
in the PR. The focused local regression command is python3 tests/system-smoke.py.
With Playwright and Chromium installed locally, run python3 tests/browser-check.py.
This also uses an isolated fixture and reports the location of its screenshots.
For shared JSON records use includes/json-store.php: raijuJsonUpdate() locks
the complete read/change/write transaction; raijuJsonAtomicWrite() alone only
prevents partially written files. Never remove a lock file after releasing it.