Contributing
Thanks for helping improve Campaigns.
Development setup
composer install
cp .env.example .env
php artisan key:generate
php artisan migrate
npm ci
npm run dev # Vite; separate terminal:
php artisan serve
php artisan queue:work
php artisan schedule:workcomposer dev is the one-command runner for day-to-day development (it invokes php artisan dev); the commands above are the manual equivalent.
For anything that sends mail (SMTP connections, invitations), use a local mail catcher such as Mailpit and point MAIL_HOST / MAIL_PORT at it.
PHP 8.4, Node 22, and Composer are expected. SQLite is the default local DB.
Production self-hosting uses Docker Compose — see README.md.
Before you open a PR
php artisan test --compact
vendor/bin/phpstan analyse --no-progress
vendor/bin/pint --dirty
npm run types:check
npm run check- Prefer small, focused pull requests
- Add or update Pest tests for backend behavior changes
- Do not commit
.env, secrets, or personal OAuth credentials - Match existing code style (Laravel Pint / project Prettier via
vp check)
AI assistants
Project rules for AI coding assistants live in .ai/rules/ and are committed. AGENTS.md and CLAUDE.md are gitignored: they are generated locally by php artisan boost:install (Laravel Boost, a dev dependency). Don't commit them.
Scope notes
Campaigns is email-campaign focused. Large new surfaces (SMS, non-email steps, AI composer, billing) should be discussed in an issue first.
Code of conduct
This project follows the Code of Conduct. Report security issues privately via SECURITY.md.
License
By contributing, you agree that your contributions are licensed under the MIT License (LICENSE).
Documentation site
The contributing guide above is included from CONTRIBUTING.md.
This site lives in docs-site/ (VitePress) and is published to GitHub Pages from main. It does not use the Laravel app's package.json.
cd docs-site
npm ci
npm run docs:dev # http://localhost:5173/campaigns/
npm run docs:build # writes .vitepress/distNode 22. Architecture prose is included from docs/architecture.md; edit that file rather than pasting a second copy here.