backstage/mails
Backstage Mails is a Laravel package for creating and managing dynamic email templates. Build reusable mail layouts, pass data into them, preview messages, and update transactional emails without redeploying your application.
Architecture fit. Unchanged. The package remains a Laravel service-provider package that renders logged mail and mail events inside a Filament admin panel — a developer-observability surface over data captured from Laravel's mail pipeline, not application infrastructure. It fits Laravel monoliths/modular monoliths that already run (or plan) a Filament panel, and misfits API-only services, headless backends, and teams on Nova/Backpack/custom admin. One update to the prior framing: the supported admin surface now demonstrably includes Filament 5.x, which widens the fit for teams that have already moved to Filament 5 but had to skip this package.
Integration feasibility. Still mechanically trivial — composer require, publish config and migrations, migrate, register the plugin in the PanelProvider. Two amendments from this release:
composer install/update itself dies in the deploy pipeline, before your app boots. This is a version-selection constraint, not an integration task.3.0.x. Anyone who pinned per the earlier guidance must bump the pin deliberately.Technical risk.
ListMails::unmountAction() against BasePage::unmountAction(). Because the break lands during package discovery, the failure mode is a fatal error at composer install / artisan package:discover, not a rendering glitch in one admin page. This is a materially higher severity than the "silent drift" scenario previously documented, and it validates the concern about single-maintainer Filament plugins — the package overrides framework internals (unmountAction), so every Filament minor is a potential boot-time fatal.filament/filament: ^5.0 range rather than pinned to one version. That is the right shape of fix and is mild evidence against abandonment risk.^5.0 support and say nothing about Filament 3 or 4. Do not assume the package still supports Filament 3/4 — verify the composer.json constraint. The prior assessment's "Filament 3 or 4" statement is stale either way.Key questions for the maintainer / spike.
MessageSending/MessageSent, or replace the mail transport? How does it behave with queued mailables?Stack fit. Target profile: Laravel 10/11/12, PHP 8.1+, Filament 5.x (^5.0, including 5.7.0+ for package 3.0.15+), an existing admin panel with authentication and an authorization layer. Confirm Filament 3/4 support explicitly before relying on it. If the team is not already on Filament, the cost of adopting this package still includes adopting Filament — a much larger decision than the package itself.
Migration path.
backstage/mails to 3.0.15 or later before anything else — on Filament 5.7.0+, earlier versions break composer install during package discovery.created_at, with a retention window agreed with security/legal (30–90 days typical).MAIL_LOG_ENABLED), production last.Compatibility. Two constraints now, not one. The Filament major determines whether the package is usable at all; the Filament minor determines whether the app boots, because the package overrides framework methods. Practical controls:
composer install plus php artisan package:discover and php artisan route:list — so a discovery-time fatal fails the pipeline instead of the deploy. An app-test-suite run is necessary but not sufficient: this class of break happens before tests execute.Sequencing. Version bump and boot smoke test in CI (immediate, days) → install and observe in staging (week 1) → retention, access control, and classification sign-off (week 2) → production enablement for a pilot team (week 3) → decide on long-term ownership, including whether to vendor-fork if upstream stalls. Do not enable capture in production before retention exists; the table grows monotonically from the first send.
Maintenance. Low but vigilant rather than passive. The package overrides Filament page internals, so the realistic cadence is a required patch on some Filament minors — as happened here. Budget a small recurring allowance (a few days per year) and assign a named owner who watches Filament releases and package releases together. MIT and small enough to vendor-fork; that remains the appropriate contingency, and this release shows the upstream is currently responsive enough that forking is a fallback rather than a plan.
Support. No SLA, community-only, effectively single-maintainer, zero dependents — no peer ecosystem for bug reports or upgrade guidance. Keep the fallback defined: Laravel Telescope already provides mail inspection, and a ~50-line event listener writing to a table is a credible in-house replacement. Treat the package as replaceable by design, and keep the blast radius contained by not letting other code depend on its models or table schema.
Scaling. Cost scales linearly with outbound mail volume: table bloat, index degradation, storage cost from HTML bodies. Mitigations unchanged — separate database connection for the log table, retention window, attachment references rather than binaries, and sampling or disabled capture in high-volume environments. For apps sending into the millions per month, prefer metadata-only capture or a dedicated observability sink.
Failure modes.
package:discover, taking down composer install and therefore the deploy pipeline for every environment on that version. Loud and diagnosable, but it blocks releases and, if it reaches production autoload, blocks the app — including mail sending. Mitigate with an exact pin, a boot smoke test in CI, and no auto-merge on Filament minors.Ramp-up. Very low for a Laravel/Filament developer — hours to first value. The constraint is documentation quality and capture semantics, not implementation complexity. The decision still hinges on two facts that cannot be assumed from the README — whether bodies are stored, and whether logging can fail safely — plus one now-answered fact: on Filament 5.7.0+, nothing works below 3.0.15.
How can I help you explore Laravel packages today?