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

Laravel Ninja Keys Laravel Package

amjadiqbal/laravel-ninja-keys

Laravel Ninja Keys adds a fast keyboard-driven command palette to Laravel apps, letting users search and run actions, navigate pages, and trigger shortcuts through an elegant Ninja Keys interface with simple configuration.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit — The package is a thin, server-driven wrapper around the ninja-keys Lit web component. It slots into the presentation layer only: a Blade component, a directive, and a manager that collects action definitions at render time and serialises them into the page. Nothing touches the domain model, the database, or the queue, so architectural coupling is deliberately shallow. That is the right shape for a command palette, but it also means the package is a convenience layer over a third-party web component — the risk sits in the dependency and the browser contract, not in the PHP.

Integration feasibility — High for a Laravel shop already on the required baseline. The v1.0.0 work materially improves feasibility versus dev-main: a first tagged release gives you a pinning target, the bundled ninja-keys 1.2.2 with locked Lit 2 and hotkeys-js versions removes the CDN version-drift class of bug entirely, and first-class href()/route() actions, data-ninja-keys-open triggers, and the onSelected hook cover the majority of real command-palette use cases without custom JS. Livewire navigate() support and the wire:navigate hotkey-duplication fix indicate the maintainer is actively tracking the modern Laravel front end.

Technical risk — Moderate, concentrated in four places:

  • Hard version floor. PHP 8.3+ and Laravel 12 or 13 only. Any application on 10/11, or on a PHP 8.1/8.2 runtime, is excluded outright. This is the single biggest adoption constraint and should be treated as a gating decision rather than a detail.
  • Breaking surface in a 1.0. Config keys were renamed (use_cdn/asset_path → script/asset_url), three options were removed (hotKeys, searchPlaceholder, noHeader), the publish tag changed to ninja-keys-config, and actions missing id or title now throw InvalidArgumentException. A 1.0 tag signals API stability going forward, but only after a config-breaking consolidation.
  • Exception on malformed actions. Throwing on a missing id/title is the correct strictness call, but it converts a previously silent degradation into a render-time failure. Any conditionally-registered action without an id becomes a potential page-level 500.
  • Asset pipeline dependency. Bundled assets must be published to public/vendor/ninja-keys. That introduces a deploy step that can silently 404 if laravel-assets/ninja-keys-assets isn't wired into the release process, plus cache-busting concerns across deploys.

Positive risk offsets are real: the CSP nonce on both scripts, the Octane-safe per-request manager scope, the global const ninja collision fix, and the RegExp escaping fix (which was a genuine per-keystroke crash on any input containing ( or [) all point to a package that has been exercised in production rather than only in a demo.

Key questions — What is the committed support window and update cadence now that 1.0.0 is tagged, and is there a CI matrix covering PHP 8.3/8.4 and Laravel 12/13? What does the removal of hotKeys, searchPlaceholder, and noHeader mean for teams that were setting them — is there a documented equivalent via component attributes or the onSelected/NinjaKeys::define() surface? Has the rendered palette been validated for keyboard navigation and screen-reader semantics (the underlying component uses shadow DOM, so styling and ARIA overrides need explicit guidance)? Does gate filtering preventing enumeration of action names matter for the intended audience, or is the palette only exposed to trusted back-office users? What is the per-request overhead of define() callbacks executing at render time on action-heavy pages? Is there a path for dynamically registered actions after initial render, or is construction strictly server-side?

Integration Approach

Stack fit — Natural fit for a Laravel monolith or Livewire-heavy application on Laravel 12/13, particularly one that already uses Blade components and an asset-publishing convention. Poor fit for anything on older Laravel, and worth questioning for Inertia/Vue or React front ends, where the Blade component wrapper adds less value than using ninja-keys directly.

Migration path — Straightforward but not zero-touch for anyone tracking dev-main:

  1. Pin dev-main to ^1.0.0 and confirm the PHP 8.3 / Laravel 12–13 baseline is met before anything else.
  2. Re-publish configuration under the new ninja-keys-config tag; the old tag will no longer match.
  3. Rewrite config keys to script and asset_url, and relocate removed options (hotKeys, searchPlaceholder, noHeader) into per-page component attributes or custom JS.
  4. Audit every registered action for id and title — this is the step most likely to cause an outage if skipped, since the failure is now a thrown exception rather than a skipped row.
  5. Update any handler() implementations to accept the action argument, and any code relying on the old string-based handler dispatch.
  6. Replace CDN-dependent setups with the published local assets and verify the deploy pipeline runs the asset publishing step.

Compatibility — Livewire navigate() is supported explicitly, and the wire:navigate hotkey duplication bug is fixed, so SPA-style navigation is a supported mode rather than an accidental one. Octane compatibility is asserted via per-request manager scoping — verify this under load rather than trusting the note, since singleton leakage is exactly the class of bug that only surfaces in long-running workers. CSP is handled via nonce on both scripts, which is a meaningful checkmark for regulated or security-reviewed environments.

Sequencing — Introduce in this order: (1) a spike branch on one low-traffic admin page to validate PHP/Laravel baseline, asset publishing, and CSP nonce behaviour; (2) a single pilot surface with a small, fully-specified action set to prove the id/title discipline and handler signature; (3) expand to Livewire-navigated pages to confirm hotkey lifecycle; (4) only then standardise via a shared action-definition convention so teams aren't hand-rolling palettes per page. Defer any gate-filtered or permission-sensitive palettes until the enumeration question is answered.

Operational Impact

Maintenance — Low ongoing code maintenance: the package is a wrapper, and the heavy dependency (ninja-keys, Lit, hotkeys-js) is vendored at pinned versions, so upstream churn only reaches you on deliberate upgrades. The offsetting cost is that vendored assets are your responsibility to republish and cache-bust. The 1.0 tag is welcome, but a single release with this many breaking changes means the maintenance question is really about the maintainer's cadence and responsiveness, not the code volume.

Support — Support burden will concentrate in onboarding and in the two failure classes: missing id/title exceptions and asset 404s. Both are preventable with a lint rule or a test that asserts every registered action is well-formed, plus a deploy check that public/vendor/ninja-keys exists and is current. Front-end customisation of the web component (shadow DOM styling, custom icons, layout) is the likely source of "how do I…" tickets and should be documented up front.

Scaling — Negligible server-side cost: definitions are assembled per request and serialised, with the manager scoped per request. Watch two things at scale: the size of the serialised action payload on pages that register many actions (it ships on every render), and the bundle weight of Lit plus the component on first paint. Both are bounded and cacheable. Octane safety is asserted and should be load-tested, not assumed.

Failure modes —

  • A conditionally registered action missing id/title throws InvalidArgumentException and takes down the page render.
  • Assets not published, or published to a stale path, yield a silently inert palette or a 404 — a degraded rather than broken page, which makes it easy to miss in testing.
  • Stale cached assets after deploy cause version skew between the bundled component and the expected markup.
  • CSP nonce misconfiguration blocks the inline scripts, disabling the palette without an obvious server-side signal.
  • Hotkey collisions with host-application shortcuts; the wire:navigate duplication fix removes one known cause but not all.
  • Gate filtering hides actions and now correctly hides their nested children, but action names may still be inferable from payloads if filtering is applied at the wrong layer — worth verifying for permission-sensitive deployments.

Ramp-up — Roughly half a day for a Laravel developer to ship a working palette on a single page: the fluent action API, define() callbacks, and the href()/route() helpers are self-explanatory, and the php artisan about entry gives a quick sanity check. Budget additional time for the operational pieces that trip people up — asset publishing in CI, CSP nonce wiring, and the well-formedness discipline around id/title. Teams without prior web-component experience should expect a short second learning curve when they need to restyle or extend the palette beyond what component attributes expose.

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.
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums
rlacerda83/query-parser
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings