bastinald/laravel-livewire-loader
Laravel Livewire Loader adds a simple loading indicator for Livewire requests, so users see feedback while components update. Drop it in and get a spinner/overlay during network activity without writing custom JavaScript. Lightweight and easy to configure for Laravel apps using Livewire.
Architecture fit. bastinald/laravel-livewire-loader is a presentation-layer convenience package, not infrastructure. It provides a global "something is loading" indicator that fires on every Livewire request, typically by hooking Livewire's client-side lifecycle events (message.sent / message.processed in Livewire 2, the renamed equivalents in v3) and rendering a spinner overlay. It does not touch the server request path, the database, queues, or application domain logic. That makes it architecturally inert: easy to adopt, easy to remove, and almost impossible to build core business behavior on top of. Treat it as a UX nicety for Livewire-heavy admin panels, dashboards, and CRUD screens where users otherwise get no feedback during a network round-trip.
Integration feasibility. Expected path is composer require bastinald/laravel-livewire-loader, then a Blade include or @-directive in the root layout (or the Livewire layout template) plus an asset publish for the JS/CSS. Real effort is the layout change, not the install. The main unknowns to verify before committing:
composer.json — the JS hook names are a breaking surface between Livewire 2 and 3, and an unmaintained package is likely pinned to one.wire:loading / wire:dirty states and with wire:navigate page transitions.Technical risk. Low blast radius, but non-trivial vendor risk: 25 stars, single maintainer, and a score of 0.335 all point to a hobby-scale project with no support contract, no CI signal, and likely no semver discipline. The failure mode isn't data loss — it's a spinner that sticks, flickers, or blocks clicks after a Livewire upgrade. That is recoverable but embarrassing in production. The package is also functionally a few dozen lines of JavaScript; the cost of replacing it in-house is hours, not weeks. That caps the downside.
Key questions for the maintainer/vetting. Does it support our Livewire version and PHP constraint? Is the loading state cleaned up on failed/aborted requests? Can we scope it to specific components rather than globally? Is the spinner accessible (aria-live, reduced-motion) and themeable without forking? What is the license?
Stack fit. Good fit if the application is a conventional Laravel monolith using Blade layouts plus Livewire components — the typical target for this class of package. Poor fit for Inertia/Vue/React front ends, API-only services, or Livewire usage confined to a single isolated widget (a global spinner buys nothing there). It suits teams that want a consistent, low-effort loading affordance without building a design-system-level loading pattern.
Migration path. Purely additive: one Composer dependency, one published asset, one layout edit. No schema changes, no service providers altering the request lifecycle, no data migration. Removal is equally clean — delete the include and composer remove. Recommend vendoring or snapshotting the published JS into our own asset pipeline so a future package abandonment or a Livewire upgrade can't strand us; that converts a dependency into a copy we control.
Compatibility. Verify three things against the target project before writing any tickets: the Livewire version constraint, the PHP version floor (older Laravel packages often cap at 7.x/8.x), and whether the asset delivery assumes Laravel Mix rather than Vite. Vite-based apps are the likeliest friction point — a Mix-era asset reference needs re-plumbing into resources/js. Also check that the overlay's z-index doesn't sit above modals and toasts, which is the most common visual regression.
Sequencing. (1) Spike in a branch: install, include in one layout, confirm the spinner fires and clears. (2) Test against slow endpoints and deliberate 500s to confirm cleanup on failure. (3) Reconcile with existing wire:loading states so users don't see two competing indicators. (4) Decide global vs. opt-in; default to opt-in if the app has many background-polling components, otherwise every poll flashes the overlay. (5) Theme to brand tokens and add reduced-motion handling. (6) Roll out behind a feature flag with a one-line kill switch.
Maintenance. Near-zero ongoing effort while it works, but the maintenance burden is latent: an abandoned package pinned against a moving Livewire JS API becomes a breaking change at the worst possible time, usually during a framework upgrade. Budget a half-day per Livewire major upgrade to re-verify, and assign explicit ownership so it doesn't become orphaned config.
Support. Community-only, no SLA, no vendor escalation path. Internal support should be framed as "we own the 40 lines of JS," not "we depend on a third party." Document where the asset is included so on-call engineers aren't hunting for the source of an overlay in an incident.
Scaling. Runtime cost is negligible — client-side only, no added requests, no server work, no measurable throughput impact. The scaling concern is perceptual and UX-based: a global spinner on every request makes a fast app feel slower and can produce visible flicker on polling components. That argues for a minimum-display delay and scoping to user-initiated actions.
Failure modes. Stuck overlay after an aborted/errored request (blocks the UI — highest severity); flicker on sub-100ms requests; double indicators alongside wire:loading; z-index collisions with modals and dropdowns; silent no-op after a Livewire upgrade if hook names changed; CSP violations if scripts are inline; accessibility gaps for screen-reader and reduced-motion users. Each has a cheap mitigation, but only if tested deliberately rather than discovered in production.
Ramp-up. Minimal. A mid-level Laravel developer integrates and themes this in under a day, including testing. No specialized knowledge required beyond familiarity with Blade layouts and Livewire's loading semantics. The real onboarding cost is institutional memory — recording why the package exists and what replaces it — which is worth a short ADR given the abandonment risk.
How can I help you explore Laravel packages today?