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.
A drop-in replacement for Laravel's default 500, 403, 404, 419 and 503 pages, built from native Filament UI so they inherit your panel's colours, fonts, brand logo and dark mode automatically.
<x-filament::button>, badge, section and icon, on a light theme-aware
scaffold. No design system to maintain.Retry-After on 503, and
on 500 the real exception behind a "View more" panel — class, location,
message and a structured, debugger-style stack trace, unwrapped to the root
cause. Exposure follows APP_DEBUG by default; force it on/off with
show_exception_details.SNT-500-087), stable per error signature —
the same failure always quotes the same number, easy to give to support.composer require anselmokossa/filament-sentinel
That's it. The package auto-registers and its pages become the default for aborted
requests — nothing to publish. Your app can still override any page by adding its
own resources/views/errors/{code}.blade.php.
The pages reuse Filament's published base stylesheet (
public/css/filament/filament/app.css). It is created byphp artisan filament:assets, which Filament already runs on install and deploy.
Add the plugin to a panel to configure it fluently. This is optional — the pages work without it.
use Filament\Sentinel\SentinelPlugin;
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
SentinelPlugin::make()
->brand('Acme') // defaults to the panel/app name
->messagePrefix('ACM') // ACM-500-087
->windowPosition('bottom-right') // or ->fullPage() for a full-page 500
->email('[email protected]') // "Contact support" mailto:
->homeUrl('/admin'),
]);
}
Publish the config to tweak defaults:
php artisan vendor:publish --tag=sentinel-config
| Option | Description | Default |
|---|---|---|
enabled |
Serve the branded pages at all | true |
codes |
Status codes Sentinel provides | [500, 403, 404, 419, 503] |
brand |
Wordmark shown on each page | panel / app name |
message_number.enabled |
Show the SNT-500-087 reference |
true |
message_number.prefix |
Message-number prefix | SNT |
request_id.enabled |
Show and assign a request id | true |
show_exception_details |
Reveal the real exception on 500: null follows APP_DEBUG, true always, false never |
null |
window.style |
500 presentation: window (small docked) or page (full page, like the other codes) |
window |
window.position |
Docked window placement: bottom-left, bottom-right, top-left, top-right, top-center, bottom-center, center, or a full-height slide-over with slide-right / slide-left |
bottom-left |
window.width |
Docked window width — a number (pixels) or CSS length ("28rem") |
400 |
support_url |
URL / mailto: for "Contact support" |
null |
home_url |
Destination of the primary button | / |
Every option above is also settable on SentinelPlugin::make(); anything left unset
falls back to config/sentinel.php.
| Method | Purpose |
|---|---|
->brand($name) |
Wordmark on every page |
->messagePrefix($prefix) |
Prefix of the message number |
->messageNumbers($bool) |
Toggle message numbers |
->requestId($bool) |
Toggle the request id |
->showExceptionDetails($bool) |
Force the 500 exception panel on (true) or off (false); omit to follow APP_DEBUG |
->windowPosition($position) |
Where the docked 500 window sits (center, top-right, slide-right, …) |
->windowWidth($width) |
Docked window width (460 or "28rem") |
->fullPage($bool = true) |
Render the 500 as a full page like the other codes |
->supportUrl($url) |
"Contact support" link |
->email($address) |
"Contact support" as a mailto: link |
->homeUrl($url) |
Primary "back to safety" destination |
->codes($array) |
Status codes to brand |
->enabled($bool) |
Disable the whole package |
php artisan vendor:publish --tag=sentinel-config # config/sentinel.php
php artisan vendor:publish --tag=sentinel-translations # lang files to edit the wording
php artisan vendor:publish --tag=sentinel-views # the Blade views, to restyle
Because the pages register as the default errors::{code} views, you override any of
them the standard Laravel way — add your own resources/views/errors/404.blade.php
and it wins.
php artisan vendor:publish --tag=sentinel-errors
This drops a self-contained set of error pages (500, 403, 404, 419, 503) straight
into resources/views/errors/. They have no dependency on this package — or even on
Filament (their own palette, inlined styles and icons, only Laravel core for the
message number, request id and exception detail), so they stay branded and keep
working even after you composer remove the plugin. From then on they are yours to
edit. The published copies live in your app, so they take precedence over the plugin
immediately.
composer test
MIT. See LICENSE.md.
How can I help you explore Laravel packages today?