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

Passkey Bundle Laravel Package

mulertech/passkey-bundle

mulertech/passkey-bundle adds passwordless passkey authentication to Laravel and PHP applications. It handles WebAuthn registration and login flows, letting users sign in with device biometrics or security keys for faster, phishing-resistant access and simpler integration.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • Laravel/Composer package shipping a browser-side ES module for passkey (WebAuthn) ceremonies, alongside server-side registration/authentication endpoints. Fits conventional Laravel apps rendering Blade views, and — post-fix — apps using Turbo, Livewire wire:navigate, or any morphing DOM strategy.
  • v2.0.1 replaces per-element listener binding with a single delegated listener on document, resolving the clicked button and its container at click time. This is a more appropriate architecture for any app where markup is replaced without a full page load, and removes a hard coupling between module evaluation time and DOM lifetime.
  • The package still depends on an implicit DOM contract (button/container selectors or data attributes) that is not described in the notes. That contract is now the primary integration surface and should be treated as such.

Integration feasibility

  • Trivially low: composer update, no configuration change, no migration, no API surface change. Patch-level semver.
  • One caveat to verify rather than assume: if the JS asset is published to public/ (rather than served from the vendor path), Composer will not refresh it. A re-publish step or asset-version bump may be required for the fix to actually reach browsers — this is the most likely cause of a "we upgraded but it still doesn't work" report.
  • Browser cache of the hashed/unhashed module is the second gate; confirm the asset URL changes or cache headers are correct.

Technical risk

  • Low for the upgrade itself; the change is a refactor of event binding, not of ceremony logic.
  • Residual risk sits in the delegated listener's resolution logic: it must correctly identify the button and its owning container when multiple passkey forms exist on one page, when buttons are nested in shadow DOM, and when clicks land on inner elements (icons, spans) rather than the button node.
  • Inherent (not release-specific) risk remains: WebAuthn requires HTTPS, a correct RP ID/origin, secure challenge storage and session binding, and a recovery path for lost authenticators. None of that is addressed by this patch.
  • The bug being fixed was silent — no console error, no exception, no server log. That is a class of failure this package can produce again; test coverage, not monitoring, is the mitigation.

Key questions

  • Which selectors/data attributes does the delegated listener resolve against, and are they documented as a stable contract?
  • Does the delegated handler scope correctly when two passkey containers coexist (e.g. login + re-auth modal)?
  • Is the JS published to public/ or served from the package? What is the documented upgrade step for asset refresh?
  • Confirmed coverage for Turbo, Livewire navigate/morph, htmx, and Inertia? The notes say "any morphing equivalent" — that needs verification, not acceptance.
  • Minimum Laravel/PHP versions and browser support matrix for v2.x?

Integration Approach

Stack fit

  • Laravel + Blade with Turbo/Livewire/htmx, or any setup where the <body> is swapped. The fix specifically targets this profile, so teams previously blocked on passkeys in a Turbo or Livewire app are the primary beneficiaries.
  • Requires PHP 8.x and a current Laravel major; requires HTTPS in all non-local environments and a correctly configured RP ID. Front-end must load the package's ES module — no build-step changes are implied.

Migration path

  1. composer update to pull v2.0.1.
  2. Determine asset delivery: if published, re-publish or bump the asset version; if vendor-served, confirm the URL/content hash changes.
  3. Clear view/config caches and any CDN or browser cache in front of the JS.
  4. No data migration, no config changes, no server-side code changes.

Compatibility

  • Drop-in from v2.0.0. No deprecations, no signature changes, no schema changes.
  • Should be backward compatible with environments that never triggered the bug (full page loads), since delegation is a superset of direct binding — but confirm the delegated handler does not capture clicks on non-passkey buttons that happen to share ancestor containers.

Sequencing

  1. Upgrade on a feature branch; re-publish assets; verify the served module is the new build.
  2. QA matrix: passkey registration and authentication after a full load, after a Turbo/Livewire navigation, after a morph, and with two passkey forms on one page.
  3. Staging soak with real authenticators (platform + roaming) before production.
  4. Production rollout; watch for the absence of click events rather than errors — success here is silent, so instrument the ceremony start explicitly.

Operational Impact

Maintenance

  • Near-zero incremental maintenance: patch release, no config drift, no new dependencies implied.
  • Adopt a standing practice of reviewing the module's DOM contract on every minor bump; the selector/attribute surface is the fragile boundary between package and application markup.

Support

  • This release should reduce support load: the prior failure produced no error, no log entry, and no user-visible feedback beyond "the button does nothing," which is expensive to diagnose from a ticket.
  • Support documentation should state the asset-refresh step explicitly, or a meaningful share of upgrade tickets will be false negatives.

Scaling

  • No server-side or performance implications. A single document-level listener is marginally cheaper than N per-button listeners and does not affect ceremony latency.
  • Passkey adoption itself scales well operationally (no OTP/SMS costs, fewer reset tickets) — a reason to prioritize this fix if passkeys were previously unusable in a Turbo/Livewire app.

Failure modes

  • Pre-fix: silent no-op clicks after any DOM-replacing navigation — highest-severity, lowest-observability failure; users cannot authenticate and nothing reports why.
  • Post-fix: possible over-capture if the delegated handler resolves containers too broadly, or mis-resolution if multiple containers match; a stale published asset would reproduce the original symptom and be misattributed to the package.
  • Unchanged: origin/RP ID misconfiguration, challenge replay or session-binding gaps, and users with no registered authenticator — all outside this release's scope but inside the operational blast radius.

Ramp-up

  • Low. A developer familiar with Laravel can integrate in under a day; the real cost is WebAuthn prerequisites (HTTPS, domain/RP ID, credential storage, account recovery) and QA across navigation patterns.
  • Recommend a short internal note covering: how to verify the new asset is live, the four-scenario QA matrix, and where ceremony failures surface (since they often surface nowhere).
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.
diephp/sequences
users-au/socialite-provider
twidpay/twid-logger
mrnewport/laravel-plaid
mrnewport/laravel-repo
mrnewport/laravel-docsign
mrnewport/laravel-stow
mrnewport/laravel-flow
mrnewport/laravel-priceable
mrnewport/laravel-nestedterms
fredmeng/laravel-apidoc-generator
itstructure/laravel-multilingual-tools
pdustdar/elasticsearch
markupai/php-sdk
rlacerda83/lumem-microservice-shipment
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle