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

  1. S3-compatible disk. One Flysystem s3 disk everywhere. Swap endpoints and keys between MinIO (local), Bunny Storage, AWS, or R2 — no SDK lock-in.
  2. Two CDN layers. Object CDN via AWS_URL in front of public uploads; asset CDN via ASSET_URL in front of built Vite assets. Both env-gated, default off.
  3. Passport OAuth2 + Shield RBAC. The Content API is OAuth2, not Sanctum-as-default. The Filament panel keeps the session/web guard. Spatie permission backs resource-module and entity-level policies; Filament Shield is the panel UI on top, not a second model.
  4. 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 app process 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.

See also

Built by Qcentic