anselmokossa/filament-sentinel
Drop-in branded error pages for Filament 500, 403, 404, 419 and 503, built from native Filament UI so they inherit your panel's colours and dark mode. Real exception details, stable SAP-style message numbers, request ids and EN/PT/PT-BR translations.
Architecture fit. Filament Sentinel is a presentation-layer package, not an infrastructure component. Its entire surface area is Laravel's exception-rendering pipeline (registered via withExceptions() in bootstrap/app.php) plus a set of Blade views composed from native Filament components (<x-filament::button>, badge, section, icon). That is a deliberately small footprint: no service provider boot logic to speak of, no database, no queue, no middleware stack insertion, no schema. For a team already running Filament, the architectural fit is close to ideal because the pages inherit the panel's design tokens (colours, fonts, logo, dark mode) rather than introducing a second design system that must be kept in sync. The "no bespoke theme" claim is the single most important architectural property here — it means the error pages degrade gracefully as the panel is re-themed, and it removes a class of visual drift that plagues hand-rolled error views.
Integration feasibility. Low effort, low ambiguity. Composer install, optionally publish config/views, register a render hook keyed on status code (500, 403, 404, 419, 503), verify. A competent Laravel developer should complete a staging integration in under a day including review of the 500 page's information-disclosure behaviour. There is no data migration, no backfill, no consumer contract to negotiate. The package's own 26 passing tests are a reasonable signal that the happy paths for each status code are covered, though they say nothing about behaviour under a partially-booted application.
Technical risk. Three risks dominate, in order:
local/staging, or to authenticated super-admins, turns every unhandled exception into a reconnaissance gift: file paths, class names, framework internals, sometimes connection strings in messages. This must be treated as a mandatory configuration gate in the integration, not an optional hardening step.anselmokossa/filament-sentinel while the repository URL is github.com/anselmocossa/filament-sentinel — kossa versus cossa. One of these is a typo. Confirm the canonical Composer vendor name and the Packagist entry before pinning a dependency, because a near-miss vendor name is a routine typosquatting vector.Secondary risks: HTML error pages leaking into JSON/API responses if the render hook is not scoped correctly; interaction with existing exception instrumentation (Sentry, Flare, Telescope, Ignition) which may also register a render callback and win or lose the ordering race.
Key questions.
$request->expectsJson(), or will it attempt to return HTML to API clients?app()->isProduction() internally, or is gating entirely the integrator's responsibility?Stack fit. This is a targeted fit: Laravel 12 + PHP 8.2+ + Filament v5. It is a non-starter for Laravel 10/11 estates or Filament v3/v4 panels, and there is no indication of a backport path. Confirm your fleet's actual versions before evaluating further — if any product surface is still on Filament v4, this package fragments your error-page strategy rather than unifying it. Because the value proposition is brand consistency, a partial rollout (some panels branded, some default) is arguably worse than no rollout.
Migration path. Effectively greenfield — there is no incumbent to migrate off, only Laravel's default error views. The one-way door is stylistic: once 500/403/404/419/503 render through Filament scaffolding, reverting means accepting a visible regression in branded experience. Treat it as a low-cost, easily reversible decision (delete the render hook and the views), which is why a time-boxed evaluation is cheap.
Compatibility. Verify three things before committing: (a) the Composer constraint actually resolves against your locked Filament v5 minor; (b) custom error views or an existing errors/ directory override do not shadow the package; (c) your error-reporting vendor's render hook coexists cleanly — the two should be composable, since one reports and one renders, but ordering determines whether the branded page or the debug page wins in non-production.
Sequencing.
composer.json.Accept: application/json and confirm the package stands down.php artisan down.Maintenance. The good news is the surface is small: Blade views and a render hook. Upgrades to Filament will occasionally rename or restyle Blade components, and because these pages are built from those components, a breaking Filament major is a breaking Sentinel change. That creates a coupling you do not control: your Filament upgrade calendar now has an external dependency with a single maintainer and 9 stars of social proof. Mitigation is straightforward — publish the views into your own repository rather than consuming them from vendor/, and treat the package as a seed rather than a runtime dependency. That converts an upstream risk into a five-file maintenance burden you own.
Support. No commercial support, no discussion forum, no dependents to consult. The changelog suggests an active author but no evidence of an SLA or a deprecation policy. Realistically, first-line support is your own team reading the source — which is fine at this size (a few Blade files) but should be an explicit, stated assumption rather than discovered at 2am.
Scaling. Negligible runtime cost — these are static-ish views rendered only on error paths, and the volume is bounded by however often your app errs. The real scaling concern is inverted: error pages fire precisely when the application is unhealthy (cold caches, saturated workers, failed deploys), so the page must be cheap and dependency-free. Confirm views are precompiled and that no Vite manifest lookup or panel-context resolution can fail under degraded conditions. A branded 503 that itself 500s is a worse outcome than Laravel's plain default.
Failure modes to plan for.
Ramp-up. Low: a Filament-fluent developer understands the component vocabulary immediately, and the integration is measured in hours. The organisational ramp-up is the cost — the gating rule for the 500 detail panel, the "publish views, don't depend" convention, and the fail-open test need to land in the runbook and be understood by whoever is on call, not just the person who integrated it. The 9-star / 0-dependent profile also means you should expect to justify the choice to a security reviewer; arrive with the disclosure gate already implemented and a documented fallback, or the conversation will stall on the "View more" panel alone.
How can I help you explore Laravel packages today?