koassi/filament-rail
Filament Rail is a Laravel Filament plugin that adds a compact navigation rail to your admin panel. It provides an icon-first, space-saving way to organize links to resources and pages, with configurable items and icons, keeping key actions accessible while reducing sidebar clutter.
filament-rail adds a rail-style navigation element to Filament panels. v1.0.0 is the first stable release, so the API should now be treated as semver-stable — pin ^1.0 rather than tracking dev-main.
composer show koassi-akakpo/filament-rail resolves to 1.0.x and that your filament/filament constraint is in the range the package declares (this is the single most common install failure for Filament plugins).https://github.com/KoassiAkakpo/filament-rail/compare/v.0.9.5...v1.0.0 and scan specifically for: namespace moves (0.x plugins frequently relocate from Vendor\Package to Vendor\Package\Filament), config key renames, and removed fluent methods. Those are the three that break silently.README.md → config/filament-rail.php (once published) → src/ for the plugin class and any Rail facade-ish entry point → resources/views/ for the Blade surface you can override → src/Http/Livewire or src/Pages for anything stateful.If you are already on 0.9.5, the pragmatic first step is a throwaway upgrade branch: bump the constraint, run php artisan vendor:publish --tag=filament-rail-config --force and --tag=filament-rail-views --force into git, then diff the published files against your overrides. That diff is your upgrade guide when the release notes are just a compare URL.
Panel-scoped registration. Register the plugin in app/Providers/Filament/AdminPanelProvider.php via ->plugin(RailPlugin::make()) rather than globally in a service provider. Filament plugins are panel-scoped by design; registering globally causes the rail to leak into auth pages and any secondary panels you didn't intend to touch.
Treat it as layout, not navigation source. The cleanest pattern is to let Filament keep owning navigation (resources, pages, clusters) and let the rail be a presentation/entry layer over it. If v1.0.0 exposes a ->navigation() or items API, prefer declaring fewer rail items than sidebar items — a rail is a glanceable surface, and cramming every resource into it is where these designs fall apart.
Config-first customisation. Publish the config file and make changes there for anything static (position, width, collapse behaviour, visibility predicate). Reserve view publishing for structural changes. Once you publish a view you own it forever, and every minor release can silently desync it — keep an overrides file listing exactly which package views you've forked.
Compose with custom Filament themes. If you have a compiled Tailwind theme in resources/css/filament/admin/theme.css, add the package's view path to your theme's @source directives. Filament plugin classes in v3+ ship their own CSS via FilamentAsset, and unpublished vendor views are not scanned by your theme build by default. Skipping this is the classic "rail renders unstyled" symptom.
Testing. Assert on the rendered panel rather than the plugin object: a Pest/Livewire test that hits /admin as an authenticated user and assertSee()s a rail marker catches registration, auth-gating, and asset-loading regressions in one shot. Add it before you upgrade next time.
Multi-panel setups. If the rail only belongs on the admin panel, keep it out of the app/user panel provider entirely. When you do want it in both, prefer a shared trait or base provider method over copy-pasting registration, so a 1.x config key rename is a one-line fix.
"1.0.0") until you've done so — otherwise a future 1.0.1 can move under you while you're still discovering what 1.0.0 changed.php artisan config:clear and php artisan filament:optimize-clear. Filament panels cache component and asset registries aggressively; a "my change does nothing" report is almost always stale cache, not a bug.php artisan filament:assets (or filament:upgrade on 3.x) after the upgrade. Major versions commonly change asset IDs, and a stale manifest yields a rail that renders but lacks styles or JS.AdminPanelProvider or a custom page imports KoassiAkakpo\FilamentRail\... directly, re-check each import against src/ — IDE autocompletion will happily fail silently on a use that resolves to nothing until instantiation.canAccessPanel() / canViewAny() gates. A layout component registered at panel level can bypass resource-level authorisation if it enumerates items itself — check whether the package honours shouldRegisterNavigation() and canAccess() on the resources it surfaces.sm/md breakpoints against a page with a long title and a page with breadcrumbs; these are where fixed-width layout chrome overlaps content.style attributes; and Filament's own getNavigationItems() overrides over reimplementing item lists. Anything you can express as config survives a minor bump; anything expressed as a forked Blade view does not.FILAMENT_RAIL_ENABLED) for one release cycle. If 1.0.0 turns out to have a layout regression on your densest page, you flip a flag instead of hotfixing on a Friday.How can I help you explore Laravel packages today?