The source code is on GitHub.
Looking for help with your own site rather than to contribute? See getting help.
Use the issue tracker.
Send contributions as pull requests. See Code architecture for the monorepo setup.
See Code Architecture > Development environment
Documentation is Markdown under packages/docs/content.
On each push to main, GitHub Actions builds and publishes the documentation on pushword.piedweb.com. A rendering failure stops publication.
Prefer a dedicated extension for a self-contained feature. Propose it for the monorepo when it serves a broad need and benefits from cross-package testing; otherwise maintain it separately and submit a documentation link once it is tested and usable.
Before opening a pull request, run the formatter, Rector and PHPStan:
composer rector
composer stan
PHPStan includes ShipMonk’s dead code detector. Unused internal members fail composer stan. The configuration recognizes EasyAdmin routes, service listener tags and the starter project’s Composer hooks. Public extension contracts use @api PHPDoc to account for downstream callers. Use that tag only for supported APIs; remove obsolete internal code rather than adding ignores or a baseline. Before removing a public member, check downstream PHP services, Twig templates and service configuration. The monorepo analysis alone cannot prove that an API is unused.
composer test
The suite runs against SQLite by default. The two server-backed variants are:
composer test-mariadb
composer test-postgresql
This requires a one-time setup of a pushword user owning a pushword_test* database prefix (each parallel worker gets its own pushword_test_w<n> database):
CREATE USER 'pushword'@'%' IDENTIFIED BY 'pushword';
GRANT ALL PRIVILEGES ON `pushword\_test%`.* TO 'pushword'@'%';
The DSN lives in the test-mariadb script (composer.json); override it by exporting PUSHWORD_TEST_DATABASE_BASE_URL before running composer test. The PostgreSQL role must be allowed to create databases because each ParaTest worker gets its own:
CREATE ROLE pushword LOGIN PASSWORD 'pushword' CREATEDB;
With MariaDB and PostgreSQL listening on the test URLs above, run:
composer bench-databases
See Database and pipeline benchmarks for the workloads, environment variables, methodology and dated reference results.
composer test-coverage
Writes coverage/index.html and coverage.xml. It needs the pcov extension (dnf install php-pecl-pcov, apt install php-pcov, …); pcov ships disabled, but the script enables it per run, so no php.ini change is required. Like CI, it runs the suite in three batches — parallel, serial, worker — and merges their reports, so a batch left out never silently reads as uncovered.