Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Filament Search Spotlight Laravel Package

wezlo/filament-search-spotlight

A full-screen Spotlight command palette for Filament panels. Hit ⌘K to search records, resources, pages, and actions in one overlay, with recents and pins saved to localStorage. Composes Filament's GlobalSearchProvider, so globally searchable resources appear automatically. Configurable key binding,...

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. The package is a Filament panel plugin with a deliberately thin footprint: no migrations, no server-side state, no queue workers, no external services. Recent/pinned items live in browser localStorage; search results are produced on demand by category classes. The Records category composes Filament's existing GlobalSearchProvider rather than reimplementing it, which is the architecturally correct choice — it means the palette's usefulness is a direct function of how much of your resource layer already implements getGloballySearchableAttributes(), getGlobalSearchResultTitle(), getGlobalSearchResultUrl() and getGlobalSearchResultDetails(). That makes this less a new subsystem and more a new surface over an existing one. For a TPM that is the dominant fact: adoption cost is concentrated in resource-layer completeness, not in the package.

Integration feasibility. Install is composer require plus one ->plugins([...]) entry. The two real friction points are (1) the Tailwind @source directive for panels using a compiled theme — the package's Blade utilities are purged otherwise and the overlay renders unstyled; and (2) resource search-method coverage, which determines whether the demo feels like magic or like an empty box. Both are discoverable in under an hour, but the Tailwind step must be treated as part of the install, not a follow-up ticket, because it interacts with deploy ordering (see Operational Impact).

Technical risk. Four items, ranked:

  1. Authorization on custom actions — highest severity. Records inherit Filament resource policies. SpotlightActions and custom Category classes are plain label+URL objects with no policy hook shown. A globally registered action (e.g. "Impersonate user", "Clear cache") becomes reachable by anyone who can open any panel, and the global registry in AppServiceProvider::boot() spans every panel by design. In a multi-panel or multi-tenant install this is a horizontal-privilege surface, not a UI nicety. Mitigation: authorize inside url() closures, prefer panel-scoped actions over the global registry, and require a security review of every registered action.
  2. Multi-panel/tenant leakage. The by-name override mechanic is elegant but silent — a panel-scoped action shadows a global one with no warning. Combined with overrideActions() for hiding, the effective action set per panel is the product of a global registry, per-panel additions, and per-panel removals. That is a matrix an operator cannot read from any single file. Needs a documented convention (e.g. panel name as keyword/group prefix) before it spreads.
  3. Client-side persistence side effects. localStorage avoids migrations and logout-cleanup work, which is genuinely good. But recent items store record titles, which can contain customer names or PII, on shared workstations; and pinned entries are frozen URLs that can 404 after a route or label rename. Both are low-severity, non-blocking, and policy decisions rather than bugs.
  4. Ecosystem signal. 5 stars, 0 dependents, a single maintainer, and a 1.0.x release cadence. This is a real bus-factor risk — but the blast radius is a UI overlay with a small, readable codebase. Exit cost is low: the Category contract is four methods and you can fork or reimplement in a day. Treat it as "vendored dependency with an upgrade-optional posture," not as a platform commitment.

Key questions for the maintainer / to resolve internally.

  • Which Filament major versions are supported (v3, v4, both), and is there a compatibility matrix? Plugin registration APIs have broken across majors before.
  • Is there a debounce and request-cancellation strategy on the search input, and are category searches executed per keystroke against the DB? What is the expected query volume for resultLimitPerCategory(8) across 4 categories?
  • Is there any authorization hook on SpotlightAction or Category, or is authorization entirely the consumer's responsibility inside url()?
  • Does the global registry respect panel access at all, or is it strictly app-wide without filtering?
  • Translation coverage: ckb and cs exist — which locales are complete, and what's the fallback behavior for missing keys?
  • Are the feature tests shipped with the package or only as consumer-app tests under tests/Feature/? The README implies the latter, which means we own the regression suite.

Integration Approach

Stack fit. Native fit for a Filament-based admin panel; irrelevant outside it. Prerequisites are a working GlobalSearchProvider (i.e. at least a few resources with getGloballySearchableAttributes() populated) and, if the panel uses a compiled Tailwind theme, ownership of the asset build pipeline. No new infrastructure, no new secrets, no new runtime.

Migration path. Purely additive and reversible. The plugin installs alongside Filament's topbar global search by default — disableDefaultGlobalSearch() is opt-in. That gives a genuine two-phase rollout: ship the overlay as a secondary entry point, measure whether anyone presses ⌘K, then remove the topbar input only once usage is proven. Rollback is a one-line plugin removal plus an asset rebuild. There is no data to migrate and no state to unwind.

Compatibility. Two axes to pin before committing: Filament major version, and the Tailwind/asset build. For the latter, the @source line must live in the theme CSS and the compiled assets must be built after composer install populates vendor/. Any pipeline that prunes vendor/ post-build, or builds assets in a layer without the dependency installed, will ship an unstyled overlay. Verify this in staging, not production.

Sequencing.

  1. Audit (½ day). Inventory resources implementing getGloballySearchableAttributes(); identify the gap between "resources that exist" and "resources that are searchable." This is the real scope estimate, and it is not the package's cost — it's your resource layer's backlog.
  2. Normalize navigation metadata (½ day). The Resources category surfaces $navigationLabel / $pluralModelLabel directly; inconsistent values become visible confusion the moment the palette ships. Cheap to fix, high perceived-quality return.
  3. Pilot on one internal panel (1 day). Install, add the @source directive, rebuild, register three or four SpotlightActions representing actual daily operations. Do not start with custom categories.
  4. Security review of the action registry. Every action authorized inside its closure; panel-scoped rather than global wherever the verb isn't genuinely cross-cutting.
  5. Measure, then expand (2–4 weeks). Instrument palette opens and action activations. Expand to customer-facing panels only after adoption is demonstrable, and only then consider disableDefaultGlobalSearch().
  6. Complete resource search coverage as a parallel, ongoing track — this is the lever that determines long-term value and it is entirely within your control.

Operational Impact

Maintenance. Low and bounded. No database objects, no scheduled jobs, no external calls, no server state to reconcile. The ongoing cost is threefold: (a) tracking Filament major-version compatibility, (b) keeping the @source directive aligned with the vendor path, and (c) owning the regression suite, since the README's test layout implies tests live in the consumer app rather than with the package. Assume a fork is plausible within 12–18 months given the maintainer profile; budget one engineer familiar with the codebase, not a team.

Support. The support surface is user expectation, not uptime. Users who press ⌘K and find only three of fifteen resources will conclude the feature is broken rather than incompletely configured. The single highest-leverage support investment is closing the getGloballySearchableAttributes() gap before broad rollout. Second is keyword curation: users type flush, imp, new inv — not your label text. Expect to revise keywords for weeks after launch; that is normal, not a defect.

Scaling. Two distinct concerns, only one of which is real. Horizontal scale is a non-issue — the package adds no server-side state, so it scales exactly as the host app does. The genuine scaling risk is query load per keystroke: an aggregation across records, resources, pages and actions firing on each input event, where the records category hits the database. On small tables this is invisible; on large ones with unindexed LIKE predicates it degrades quickly and multiplies across concurrent admin users. Confirm debounce and request cancellation exist, and consider Laravel Scout-backed GlobalSearchProvider implementations before enabling the overlay on high-cardinality resources.

Failure modes.

  • Unstyled overlay — Tailwind purged the package's utilities because @source was missing or assets were built before vendor/ was populated. Highest-probability production failure; caught by a staging asset build.
  • Empty or sparse palette — reads as broken to users; root cause is resource search-method coverage, not the package.
  • Unauthorized action reachable — the security failure mode; mitigated only by authorizing in url() closures and preferring panel-scoped registration.
  • Cross-panel action leakage — global registry entries appearing in panels where they don't belong, or silent by-name shadowing producing unexpected labels/URLs.
  • Stale pinned links — localStorage pins survive route renames and return 404s; no server-side cleanup path exists by design.
  • PII on shared workstations — recent-item titles persist in browser storage past logout; a policy call, not a bug.

Ramp-up. Measured in hours. A developer who knows Filament can be productive in half a day; the only non-obvious step is the Tailwind @source requirement. The Category contract is four methods (key, label, search, plus mapping to SpotlightResult), so extending the palette requires no framework archaeology. User-side ramp-up is the longer curve and is entirely a function of keyword quality and result coverage — plan for a two-week tuning window after the pilot, and treat adoption telemetry as the gate for wider rollout rather than a launch-day assumption.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
roundly-consulting/kubernetes-api-for-laravel
roundly-consulting/plausible-for-laravel
gvp/gvp-laravel-template
metasyncsite/laravel-metasync-client
roundly-consulting/onboarding-for-laravel
andydefer/laravel-notification
adachsoft/cli-process-tester
jhaskell13/laraflow
sebastienheyd/boilerplate-media-manager
ccast/tagixo-primix
pretendtrue/laravel-builder
sawmainek/laravel-scout-tntsearch-driver
tomshaw/laravel-calendar-table
dibakar/laravel-ownership
steadrun/laravel-monitor
labyrinthe/connect-laravel
elmogy/layan
drewdan/sentinel-client
dskripchenko/laravel-llm
fatryst/nuonuo