The problem: Every Laravel starter kit ships a different frontend answer — Livewire, Inertia.js, or Alpine.js — and picking the wrong one for your project means a rewrite six months in.
Environment: Laravel 11.x, Livewire 3.x, Inertia.js 1.x (Vue or React adapter), Alpine.js 3.x, Vite as the build layer for all three.
The Error
Livewire\Features\SupportEvents\CannotBindToComponentProperty
Unable to set component data. Public property [$search] not found on component: [dashboard]
at vendor/livewire/livewire/src/Wrapped.php:52
// caused by wiring Inertia's client-side router into a page
// that ALSO mounts a Livewire component expecting its own
// wire:model binding — the two request lifecycles collided
Why It Happens
This exact trace shows up when a team starts a project on Livewire, later adds Inertia for "a few SPA-like pages," and stitches them together on the same route without realizing the two tools manage page state in fundamentally incompatible ways. That collision is really a symptom of a decision that should've been made on day one. Here's the actual difference between the three:
Alpine.js → sprinkles of interactivity inside normal Blade views.
No routing changes, no build of a separate app. Good
for dropdowns, toggles, tabs, small reactive widgets.
Livewire → full server-driven components. PHP stays the source
of truth; the DOM is diffed and patched over AJAX.
No JS state management to write, but every interaction
round-trips to the server.
Inertia.js → a real Vue or React SPA, but routed and controlled by
Laravel controllers instead of a separate API + router.
Full client-side component state, no PHP round-trip
for UI-only interactions — but you're writing Vue/React.
They're not competing on features — they're competing on where state lives. Alpine keeps state in the DOM. Livewire keeps state on the server. Inertia keeps state in a JS framework. Mixing two of these on the same page (like the error above) means two systems both think they own the same piece of state.
The Fix
Pick based on your team and UI complexity, not trend:
- Choose Alpine.js if most of your app is server-rendered Blade and you only need small interactive touches — a mobile nav, a modal, a live character counter. Zero build complexity beyond what Vite already does.
- Choose Livewire if your team is PHP-first, you want to avoid writing a separate JS state layer, and your app is mostly forms, tables, and CRUD-heavy admin panels. Pair it with Alpine for the small client-side polish Livewire doesn't handle (it already ships with Alpine bundled).
- Choose Inertia if you're building something that genuinely needs SPA-grade interactivity — drag-and-drop boards, real-time dashboards, complex multi-step client state — and you either have Vue/React experience on the team or are willing to invest in it.
The one combination to avoid is Livewire and Inertia managing the same page. Livewire components expect to own their DOM subtree through the server round-trip; Inertia expects to own the entire page through client-side routing. Use Livewire pages OR Inertia pages — Alpine is the only one of the three designed to sit safely inside either.
Step-by-Step
- List the 3-5 most interaction-heavy screens in your app (dashboards, editors, real-time views) — if there are none, you likely don't need Inertia at all.
- Check your team's actual JS comfort level honestly. Inertia with Vue/React has a real learning curve if nobody on the team writes frontend code regularly.
- If your app is 90% CRUD (admin panels, settings pages, forms), default to Livewire + Alpine — you'll ship faster with less total code.
- If you already picked Livewire and later hit a screen that genuinely needs SPA behavior, don't bolt on Inertia for that one page — either push through with Livewire's
wire:poll/events, or accept that page is the exception and build it with plain Alpine + a JSON endpoint instead of introducing a second framework. - Whichever you pick, standardize on it for the whole app. The error above almost always comes from "just this one page" exceptions that quietly multiply.
Not sure which fits your specific project? Describe your app on the Contact page and I'll give you a straight answer.