Stack
The Qcentic Edge template is four first-class systems, not a generic Laravel kitchen sink. Each one is wired end-to-end and env-parameterized so the same code runs in local compose and on bunny.net Magic Containers. The decisions and the explicit rejections are recorded in ADR 0001.
The four systems
- S3-compatible disk. One Flysystem
s3disk everywhere. Swap endpoints and keys between MinIO (local), Bunny Storage, AWS, or R2 — no SDK lock-in. - Two CDN layers. Object CDN via
AWS_URLin front of public uploads; asset CDN viaASSET_URLin front of built Vite assets. Both env-gated, default off. - Passport OAuth2 + Shield RBAC. The Content API is OAuth2, not Sanctum-as-default. The Filament panel keeps the session/
webguard. Spatie permission backs resource-module and entity-level policies; Filament Shield is the panel UI on top, not a second model. - Reverb as its own container.
php artisan reverb:start, same PHP image, Pusher protocol to Echo — not Pusher Cloud, not Node, not in-process.
Rejected on purpose
- Password-grant OAuth and Sanctum-as-default.
- Reverb inside the
appprocess or "optional later". - Paid third-party Filament plugins.
- Alpine as the PHP image — the libSQL FFI client is glibc-only, so the base is FrankenPHP Debian.