henryonsoftware/filament-panel-switcher
A Filament plugin that adds a panel switcher to your admin interface, letting users jump between multiple Filament panels quickly. Simple to install and configure, it keeps navigation tidy when your app ships several panels.
henryonsoftware/filament-panel-switcher is a small Filament plugin that adds a panel-switcher UI (a menu/dropdown listing the panels a user can access) so multi-panel apps don't require users to know URLs.
Minimal setup:
composer require henryonsoftware/filament-panel-switcher
Register the plugin on each panel you want the switcher to appear on, typically in a panel provider:
use HenryOnSoftware\FilamentPanelSwitcher\PanelSwitcherPlugin;
public function panel(Panel $panel): Panel
{
return $panel
->plugin(PanelSwitcherPlugin::make());
}
First places to look:
src/PanelSwitcherPlugin.php) — it will expose the fluent configuration surface (->panels(), visibility callbacks, label/icon options depending on version).config/filament-panel-switcher.php if publishable (php artisan vendor:publish --tag="filament-panel-switcher-config") — that's where panel lists and display defaults usually live.composer.json constraints — v0.6.6 adds Laravel 13 support, so confirm the illuminate/* and filament/* constraints match your stack before upgrading.First use case: an admin panel plus a separate "app"/customer panel, where staff need to hop between them without logging out or hand-editing the URL. Wire the plugin onto both panels, then verify the switcher only lists panels the current user can actually enter.
Register per panel, not globally. Filament plugins are panel-scoped by design. If you register the switcher only on the admin panel, users on the app panel get no way back. Register on every panel in the set — usually via a shared trait or base panel provider so the config stays in one place.
Drive the panel list from a single source of truth. Keep a config array (or an enum) of panel IDs → labels → URLs, and have each panel provider resolve from it. This avoids drift where the switcher offers a panel that no longer exists.
Gate visibility with authorization. Wrap the switcher in a canAccess()/canViewPanel() check per target panel — Filament's canAccessPanel() on the User model is the natural hook. Rendering a link to a panel the user will be 403'd from is the most common complaint with this class of plugin.
Combine with tenancy carefully. In multi-tenant setups the target panel URL usually needs a tenant slug. Prefer generating links through Filament's panel URL resolution ($panel->getUrl()) rather than string concatenation, and test with a non-default tenant.
Upgrade posture for v0.6.6. This release is a compatibility bump (Laravel 13). In composer.json, widen your constraints and run the suite; there are no reported API changes, so no code edits should be needed. Pin ^0.6.6 if you're on Laravel 13, and keep the lockfile pinned otherwise.
php artisan filament:optimize-clear (or optimize:clear) and route:clear. A stale panel list in the switcher is nearly always a cache issue, not a bug.APP_URL and any reverse-proxy TrustProxies config before patching the view.--tag="filament-panel-switcher-views") to restyle the switcher rather than subclassing internals; published views survive minor upgrades far better than method overrides.canAccessPanel(), then confirm the plugin is registered on the current panel (not just the target).composer why-not henryonsoftware/filament-panel-switcher ^0.6.6 after the bump — it surfaces any transitive Filament/Laravel constraint still holding you back, which is the usual failure mode for a compatibility-only release.How can I help you explore Laravel packages today?