usamamuneerchaudhary/filament-command-palette
A Spotlight/CMD+K style command palette for Filament panels. Press Cmd+K (Mac) or Ctrl+K (Windows/Linux) to open, then jump to any page, resource, or navigation item with fast search and keyboard navigation. Includes an optional topbar button for click-to-open access.
Architecture fit
A Filament panel plugin registered in the panel provider. No migrations, no schema, no persisted state, no separate JS build — it rides Filament's existing Alpine/Livewire bundle and inherits panel theming and dark mode. The entire public surface is small: roughly six config keys plus a CommandItem value object with a fluent builder. That is the right shape for an admin-UX enhancement: additive, reversible, and cheap to evaluate.
Integration feasibility
Two steps to first value (composer require, one line in panel()), one optional step to configure (vendor:publish --tag=command-palette-config). Custom commands are closures returning CommandItem[]. There is nothing here that requires a database change, a queue, a cron, or an infrastructure decision — which is exactly what makes it safe to trial.
Technical risk
custom_commands example puts PHP closures in config/command-palette.php. php artisan config:cache cannot serialize closures — custom commands vanish silently in production while working perfectly in dev. This is the single most likely way this package fails for us.resources/views/vendor/command-palette/ stops receiving upstream changes the moment we publish; 1.4 explicitly reworked templates, so any pre-1.4 customization is already divergent.template and max_results are single config keys. Multiple panels with different audiences cannot be styled independently.Key questions
Stack fit Laravel 11/12 (13 via 1.3), PHP 8.2+, Filament v4/v5. Aligns cleanly with a modern Filament admin panel. No new runtime dependencies, no queue workers, no storage.
Migration path None required. There is no data migration, no backfill, no cutover window — the palette is a UI layer over routes that already exist. The removal path is equally clean: delete the plugin line, delete the command class, delete the config file. That reversibility is the primary reason to trial it rather than build it.
Compatibility
Pin the package version in composer.json rather than floating. Confirm our Filament version against the release notes (v4 vs v5 support arrived in different releases). Check whether published views exist in the codebase before any minor upgrade — if they do, that upgrade becomes a manual merge.
Sequencing
Config::set() in AppServiceProvider::boot() — never in config/command-palette.php. This makes the commands unit-testable and makes removal a one-file deletion.auth()->user()?->can() at generation time. Do not cache the resulting array across users.include_publish_views_command => false — there is no reason to ship a developer tool to end users. Consider show_topbar_button => false on internal panels where the shortcut alone suffices; keep it on for discoverability on broader audiences. Add a CI step that runs config:cache then config:clear and asserts commands still resolve.standard until a concrete styling requirement exists. preview looks best in a demo and costs the most to maintain — every command you care about needs description() and preview() metadata or the detail pane reads as a stub.Maintenance Small footprint, but we own the glue: the command class, the provider wiring, the permission logic. Pin the version, subscribe to releases, and treat any published views as a fork with a re-merge cost at every upgrade. Budget a periodic review of whether the package is still alive before our next Filament major.
Support Community-only, no SLA, single maintainer. However, the surface area is genuinely small — a plugin class and a view set. If the package is abandoned, forking is an afternoon, not a project. That asymmetry materially lowers the support risk and should be stated explicitly when this goes to a review.
Scaling
Closures execute per request. Static arrays are free; per-command database lookups are not, and a poorly written closure turns every admin page load into N queries. If commands must be data-driven, cache per-user with a short TTL — never cache across users, or permissions leak between sessions. max_results (default 10 per category) caps payload size, which matters more on wide permission sets than on large tables.
Failure modes
| Failure | Likelihood | Detection | Mitigation |
|---|---|---|---|
config:cache silently drops custom commands |
High | Only by user report, unless tested | CI round-trip check; register via provider boot(), not config file |
| Unauthorized entries shown → 403 + enumeration | High | QA or user report | Permission gating at generation time |
| Filament v6 upgrade strands the plugin | Medium | Blocked upgrade | Pin version; fork contingency assessed now |
| "Publish views" visible in production | Medium | Visual review | Config flag off in prod |
| Keybinding collides with global search or another plugin | Medium | User report | key_bindings remap |
| Published views diverge from upstream templates | Medium | Visual regression after upgrade | Don't publish without a concrete requirement |
| Record search expected but absent | Medium | Stakeholder demo | Verify capability before scoping |
Ramp-up Developer: roughly an hour to first working palette, half a day to a gated, tested, production-grade custom command set. End user: near zero — Cmd+K is an established idiom. The real ramp-up question is discoverability, which is precisely what the topbar button toggles; ship it on first, then measure whether the keyboard shortcut carries the load alone.
Recommendation for the TPM Trial on one internal panel, instrumented, with zero custom commands and a two-week measurement window. Proceed to custom commands only if the invocation data justifies the integration glue we'd then own. The decision to adopt is cheap and reversible; the decision to build a command layer on top of it is neither, and should be gated on evidence.
How can I help you explore Laravel packages today?