cmsmaxinc/filament-error-pages
Filament Error Pages replaces Laravel’s default error screens with branded, Filament-styled pages for your admin panel. Customize 404, 403, 500 and other error views to match your app, with simple configuration and a consistent user experience.
Install the package alongside a Filament panel (v3/v4 depending on the release line):
composer require cmsmax/filament-error-pages
Publish and run the migrations (the package stores error page content in the database, keyed by HTTP status code):
php artisan vendor:publish --tag="filament-error-pages-migrations"
php artisan migrate
Register the plugin on the panel(s) that should manage error content:
use CMSMax\FilamentErrorPages\FilamentErrorPagesPlugin;
public function panel(Panel $panel): Panel
{
return $panel
->plugin(FilamentErrorPagesPlugin::make());
}
Look first at the generated Error Pages resource in the panel — that is where each status code (404, 403, 500, 503, …) gets its title/body content. Create one record per status code you care about.
First use case: replace the default Laravel 404 with a branded page. Create the 404 entry in the resource, hit a non-existent URL on the front end, and confirm the rendered page. From there, add 403/500/503 as needed.
acme.example.com 404 can show Acme's copy while beta.example.com shows Beta's. The pattern that works:
->tenant(Team::class)).try { resolve page } catch { use packaged view }. This keeps 500s renderable when the app is degraded.php artisan vendor:publish --tag=laravel-errors) if you need static fallbacks for the cases where the package cannot resolve a page (DB down, migrations not yet run, queue-worker context).status + tenant key with a short TTL and clear it on save from the resource.DB_HOST at a dead host.500 may be caused by something that also breaks rendering (bad config cache, broken service provider). A 503 typically comes from php artisan down, where the app is intentionally minimal — verify your custom 503 actually renders during maintenance mode.404 from your fallback record or an exception, and cover it with a test.composer.json until you've validated the panel.503), do it in a small subclass or a view-level conditional rather than patching vendor code./does-not-exist (expect 404 + your marker string), a forbidden route (403), and a deliberately throwing route (500). Run them in CI — error pages regress silently because nobody looks at them manually.How can I help you explore Laravel packages today?