Choosing Between Livewire and Inertia.js in Laravel Jetstream
A decision guide for choosing Laravel Jetstream’s Livewire or Inertia.js stack, covering constraints, a comparison table, trade‑offs, and a step‑by‑step install‑and‑validate walkthrough.
06 Jun 2026, 13:57 UTC

Decision overview
When you install Laravel Jetstream you must pick a frontend stack: Livewire (Blade + Alpine.js) or Inertia.js (Vue 3). The choice is made once, during the php artisan jetstream:install command, and Jetstream scaffolds views, action classes and configuration into your application. There is no supported migration path between the two stacks; switching later requires re‑scaffolding a fresh app and porting customizations. Therefore treat the decision as a pre‑commit architectural choice.
Constraints to consider
- Team skill‑set: Livewire keeps most logic in PHP, while Inertia requires Vue proficiency.
- Desired UI feel: Livewire results in traditional round‑trip requests; Inertia gives a single‑page‑app experience with client‑side routing.
- Tooling tolerance: Inertia adds a JavaScript build step (Vite) and a larger frontend dependency set.
- Feature parity: Both stacks expose the same backend features supplied by Laravel Fortify (authentication, password reset, email verification, two‑factor) and Laravel Sanctum (personal API tokens).
Option comparison
| Aspect | Livewire | Inertia (Vue 3) |
|---|---|---|
| Primary language | PHP (Blade) + Alpine.js sprinkles | Vue 3 single‑file components |
| Request model | Server round‑trip per interaction (AJAX) | Client‑side navigation; data fetched via JSON endpoints |
| Build tooling | Vite used only for asset compilation; minimal JS setup | Full Vite‑powered JS build, npm dependencies for Vue |
| Learning curve | Low for Laravel‑only teams | Requires Vue knowledge and familiarity with Inertia adapters |
| State management | Server‑side state; limited client‑side reactivity | Rich client‑state; suitable for interactive dashboards |
| Deployment impact | Smaller frontend bundle, simpler CI | Larger bundle, longer build step |
Trade‑off summary
Livewire keeps the entire feature set inside the Laravel ecosystem. A developer can write action classes, Blade templates and minimal Alpine.js without leaving PHP. The downside is that each user interaction triggers a request to the server, which can feel sluggish for highly stateful interfaces (e.g., real‑time form validation with many fields). The asset pipeline stays lightweight because Jetstream still uses Vite only for compiling CSS and a small Alpine.js bundle.
Inertia replaces full page reloads with Vue‑driven client‑side routing, giving an SPA‑like navigation experience while still rendering server‑side data. This enables richer client‑side state and smoother UI interactions, but it introduces a genuine JavaScript build workflow. Teams must maintain Vue component files, manage npm packages, and ensure the Vite build succeeds in CI. Backend behavior (Fortify/Sanctum) is identical, so the decision is purely about the frontend authoring model.
Concrete implementation walkthrough
The steps below assume a brand‑new Laravel application (Laravel 11 with Jetstream 4, for example). Adjust version numbers if you are using a different major release.
- Install Jetstream – run in the project root:
Required permissions: write access to the project filesystem and network access to Composer and npm registries. Risk: if the application already contains authentication scaffolding, the command will overwrite existing files; therefore start with a fresh Laravel install.composer require laravel/jetstream php artisan jetstream:install livewire --teams --api --verification - Publish dependencies and compile assets:
This installs Vite, Vue (if you chose inertia) or Alpine.js (if you chose livewire) and compiles CSS/JS.npm install npm run build - Migrate the database:
Jetstream’s migration files create users, passwords, personal access tokens, teams, etc.php artisan migrate - Verify the stack selection: open
config/jetstream.phpand confirm thestackkey matches your choice ('livewire'or'inertia'). Also check that thefeaturesarray reflects the flags you passed (teams,api,verification). - End‑to‑end validation:
- Register a new user via the UI.
- Log in and navigate to the profile page; enable two‑factor authentication (if
--verificationwas used). - Generate a Sanctum personal access token from the “API Tokens” section.
- If you installed with
--teams, create a team and invite a teammate using the email input; verify the invitation appears in the team management view.
- Run the test suite (optional but recommended):
If you added thephp artisan test--pestflag, the command will execute Pest tests instead of PHPUnit. The generated auth and team tests should pass.
Limitations and practical checks
- One‑way decision: Jetstream does not provide a migration script to change stacks after scaffolding. If your team’s frontend expertise or product requirements evolve, you will need to create a new Jetstream‑based project and migrate custom code manually.
- Version coupling: Jetstream major versions track Laravel major versions (Jetstream 4 → Laravel 11, Jetstream 3 → Laravel 10). Install flags and configuration keys can shift between majors; always verify against the documentation for the installed Jetstream major (
composer show laravel/jetstream). - Configuration drift: Feature toggles exist in both
config/jetstream.phpandconfig/fortify.php. After install, inspect both files to ensure UI and backend behavior match (e.g., email verification enabled in both). - Verification method: The most reliable check is to exercise the full user flow (registration, 2FA, token creation, team invitation) as described above. Automated tests that hit the same endpoints provide regression safety.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.