Best Laravel Livewire + Inertia.js Boilerplates 2026
Best Laravel Livewire + Inertia.js Boilerplates in 2026
TL;DR
The PHP and JavaScript camps have mostly settled their debates in 2026. Laravel with Livewire or Inertia.js is a genuinely excellent choice for SaaS applications — particularly for solo developers and small teams where server-side simplicity beats JavaScript ecosystem complexity. Laravel Breeze and Laravel Jetstream are the official starting points, Laravel Spark is the paid SaaS-ready starter, and the community has produced mature starters for every combination. The Livewire vs Inertia choice isn't about philosophy — it's about interactivity requirements. Livewire works with blade templates for most CRUD UIs; Inertia.js gives you a React/Vue frontend while keeping Laravel's backend routing.
Key Takeaways
- Laravel Livewire lets you write reactive UIs in PHP — component updates via AJAX without leaving PHP; ideal for CRUD, forms, and data tables with minimal JavaScript
- Inertia.js is the "modern monolith" approach — React or Vue components on the frontend, Laravel routing and ORM on the backend, no API layer needed
- Laravel Breeze is the free official starter (simple auth scaffolding); Jetstream adds teams, billing, 2FA; Spark (~$99) is the full-featured SaaS starter
- Laravel Reverb (2024) is Laravel's native WebSocket server — real-time features without third-party services
- Filament is the premier admin panel for Laravel — used by thousands of production apps as the admin interface in boilerplates
- Sail provides Docker-based local development out of the box
Livewire vs Inertia: Choosing the Right Approach
Both Livewire and Inertia.js keep Laravel as the backbone while improving frontend capabilities. They solve different problems.
Laravel Livewire: Reactive PHP
Livewire runs PHP components that sync with the DOM via AJAX. No separate API layer, no JavaScript build step for your PHP components:
// app/Livewire/ProductTable.php
class ProductTable extends Component
{
public string $search = '';
public string $sortBy = 'name';
public string $sortDir = 'asc';
public int $perPage = 25;
#[Url] // Syncs with URL query params
public string $category = '';
public function sort(string $column): void
{
if ($this->sortBy === $column) {
$this->sortDir = $this->sortDir === 'asc' ? 'desc' : 'asc';
} else {
$this->sortBy = $column;
$this->sortDir = 'asc';
}
}
public function render(): View
{
$products = Product::query()
->when($this->search, fn($q) => $q->where('name', 'like', "%{$this->search}%"))
->when($this->category, fn($q) => $q->where('category', $this->category))
->orderBy($this->sortBy, $this->sortDir)
->paginate($this->perPage);
return view('livewire.product-table', ['products' => $products]);
}
}
<!-- resources/views/livewire/product-table.blade.php -->
<div>
<input wire:model.live.debounce.300ms="search" placeholder="Search..." />
<table>
<thead>
<tr>
<th wire:click="sort('name')" class="cursor-pointer">Name</th>
<th wire:click="sort('price')" class="cursor-pointer">Price</th>
</tr>
</thead>
<tbody>
@foreach($products as $product)
<tr>
<td>{{ $product->name }}</td>
<td>{{ $product->price }}</td>
</tr>
@endforeach
</tbody>
</table>
{{ $products->links() }}
</div>
wire:model.live.debounce.300ms syncs the input with the PHP $search property in real-time with 300ms debounce. The table re-renders server-side. No JavaScript written.
Livewire wins for: Admin panels, CRUD apps, forms, data tables, anything where server-side rendering is a good fit.
Inertia.js: The Modern Monolith
Inertia.js uses Laravel's routing and controllers but renders components with React or Vue. No REST API, no GraphQL — your controller returns Inertia response objects:
// routes/web.php
Route::get('/products', [ProductController::class, 'index'])->middleware('auth');
// app/Http/Controllers/ProductController.php
class ProductController extends Controller
{
public function index(Request $request): Response
{
$products = Product::query()
->when($request->search, fn($q) => $q->where('name', 'like', "%{$request->search}%"))
->orderBy($request->sortBy ?? 'name')
->paginate(25);
return Inertia::render('Products/Index', [
'products' => $products,
'filters' => $request->only('search', 'sortBy'),
]);
}
}
// resources/js/Pages/Products/Index.tsx
import { Head, Link, router } from '@inertiajs/react'
import { useState } from 'react'
interface Props {
products: Paginated<Product>
filters: { search: string; sortBy: string }
}
export default function ProductsIndex({ products, filters }: Props) {
const [search, setSearch] = useState(filters.search)
function handleSearch(value: string) {
setSearch(value)
router.get('/products', { search: value }, { preserveState: true })
}
return (
<>
<Head title="Products" />
<input value={search} onChange={e => handleSearch(e.target.value)} />
{products.data.map(product => (
<div key={product.id}>{product.name}</div>
))}
</>
)
}
Inertia.js wins for: Complex frontends needing React ecosystem (charts, complex drag-and-drop, advanced state), teams with React experience, apps that may need a public API later.
The Official Starters
Laravel Breeze
The lightest official starter — auth scaffolding only:
laravel new my-app
cd my-app
composer require laravel/breeze --dev
php artisan breeze:install # Choose: Blade, Livewire, React (Inertia), Vue (Inertia), or API
npm install && npm run dev
php artisan migrate
Breeze provides:
- Login, registration, password reset, email verification
- Tailwind CSS
- Your choice of frontend stack
Best for: Starting from minimal, building up your own SaaS layer on top.
Laravel Jetstream
Jetstream is Breeze with teams and billing-ready architecture:
laravel new my-app
composer require laravel/jetstream
php artisan jetstream:install livewire # or inertia
Adds on top of Breeze:
- Team management (invite members, roles)
- Two-factor authentication (TOTP)
- Session management (see/revoke active sessions)
- Profile photo upload
- API token management (for building APIs)
- Filament admin (optional)
Jetstream uses either Livewire + Blade or Inertia.js + Vue — choose at install time.
Laravel Spark (Paid ~$99/year)
Laravel Spark is Taylor Otwell's official SaaS starter:
Adds on top of Jetstream:
- Stripe subscriptions (plans, trials, cancellation, upgrade/downgrade)
- Paddle subscriptions (European billing, VAT handling)
- Billing portal and invoice history
- Per-seat pricing support
- Team billing (team owners pay for all members)
For a Laravel-first SaaS, Spark is the equivalent of ShipFast — it handles the subscription billing that would otherwise take days to implement correctly.
Filament: The Admin Panel Layer
Filament is not itself a boilerplate, but it's the component that makes Laravel SaaS admin panels exceptional:
composer require filament/filament
php artisan filament:install --panels
php artisan filament:make-resource Product --generate
Filament generates full CRUD admin panels with complex filters, bulk actions, relationship management, and custom actions. It's used by thousands of production SaaS apps as the admin interface. Most Laravel SaaS boilerplates now include Filament for the admin panel.
Laravel Reverb: Real-Time Without Third Parties
Laravel Reverb (launched 2024) is Laravel's native WebSocket server — no more Pusher dependency:
php artisan install:broadcasting # Installs Reverb
php artisan reverb:start # Start WebSocket server
// Broadcasting an event
class OrderUpdated implements ShouldBroadcast
{
public function broadcastOn(): array
{
return [new PrivateChannel('orders.' . $this->order->id)];
}
}
// In your controller
broadcast(new OrderUpdated($order))->toOthers();
// Frontend (Echo + Pusher JS compatible)
window.Echo.private(`orders.${orderId}`)
.listen('OrderUpdated', (event) => {
updateOrderStatus(event.order)
})
Reverb runs as a standalone process alongside your Laravel app. For small to medium apps, it runs on the same server; for larger apps, you can run Reverb on separate workers.
Community SaaS Boilerplates
Beyond the official starters, the Laravel community has built comprehensive SaaS templates:
Saas-web (GitHub): Jetstream + Filament + Stripe + Reverb — covers auth, teams, billing, admin, real-time. MIT licensed.
Laravolt Foundation: Enterprise-grade Livewire + Filament + multi-tenancy with tenant database isolation.
Larafast (paid): Laravel equivalent of ShipFast — Jetstream, Stripe, Filament, blog, SEO, email. ~$149.
Multi-Tenancy in Laravel: Tenant DB vs Shared DB
Laravel has two dominant multi-tenancy approaches, both with mature packages:
Shared Database with Tenant Scoping (Tenancy for Laravel — Stancl)
composer require stancl/tenancy
php artisan tenancy:install
All tenants share one database; a global scope adds WHERE tenant_id = ? to every query:
// Automatic tenant scoping via Eloquent global scope
class Order extends Model
{
use BelongsToTenant; // Auto-adds tenant_id to all queries
}
// In middleware — identifies current tenant from subdomain/domain
class InitializeTenancyByDomain implements Middleware
{
public function handle(Request $request, Closure $next): Response
{
$domain = $request->getHost()
$tenant = Tenant::whereHas('domains', fn($q) => $q->where('domain', $domain))->first()
tenancy()->initialize($tenant)
return $next($request)
}
}
Pros: Simpler deployment, lower infrastructure cost, easier cross-tenant reporting Cons: One noisy tenant can affect others; compliance requirements may prohibit shared DB
Separate Database Per Tenant
// Each tenant gets their own database
class Tenant extends Model implements TenantWithDatabase
{
use HasDatabase, HasDomains;
}
// Migrations run per-tenant
php artisan tenants:migrate // Runs migrations on all tenant databases
php artisan tenants:migrate --tenants=tenant1 // Single tenant
Pros: True data isolation, better for SOC 2 / HIPAA compliance, noisy neighbors contained Cons: More complex deployment, higher DB costs, harder cross-tenant queries
Stancl's Tenancy for Laravel supports both approaches and integrates with Jetstream's team model. Most Laravel SaaS boilerplates default to single-database multi-tenancy for simplicity.
Testing in Laravel SaaS
Laravel's built-in test support is exceptional — PHPUnit is pre-configured, and Pest (the newer testing framework) is increasingly standard in boilerplates:
// Feature test with Pest
test('users can view their own orders', function () {
$user = User::factory()->create()
$order = Order::factory()->for($user)->create()
$otherOrder = Order::factory()->create() // Another user's order
$response = $this->actingAs($user)->get('/orders')
$response->assertOk()
$response->assertSee($order->reference)
$response->assertDontSee($otherOrder->reference) // Tenant scoping works
})
test('stripe webhook creates subscription', function () {
$user = User::factory()->create()
$event = stripe()->webhooks()->construct(
file_get_contents(base_path('tests/fixtures/subscription.created.json'))
)
$this->post('/stripe/webhook', $event->toArray())
->assertOk()
expect($user->fresh()->subscribed('default'))->toBeTrue()
})
Laravel Feature Test advantages:
actingAs($user)sets up auth in one line- Database transactions wrap each test — database is rolled back automatically
- Laravel's HTTP client fake (
Http::fake()) mocks external APIs Queue::fake(),Mail::fake(),Event::fake()isolate side effects
When Laravel Beats JavaScript Frameworks
Laravel + Livewire or Inertia is often the better choice when:
- Solo developer or small team — one developer can maintain a Laravel monolith that would require a frontend team + backend team in a React/Node.js split
- Complex database relationships — Eloquent ORM and Laravel's query builder are genuinely excellent; Prisma and Drizzle are catching up but Laravel's 10+ year head start shows
- Queue/jobs are critical — Laravel Queues + Horizon is the most mature job queue for web apps
- Mail-heavy apps — Laravel Mailables + Mail are significantly simpler than equivalent Node.js solutions
- Admin heavy — Filament is unmatched for rapid admin panel development
- The team knows PHP — retraining cost is real; Laravel's DX is excellent
Deployment Options for Laravel SaaS
| Platform | Best For | Notes |
|---|---|---|
| Laravel Forge ($19/mo) | VPS management | Spins up servers on DO/AWS/Vultr, handles nginx, PHP, SSL, queues |
| Laravel Vapor | Serverless AWS | Lambda + RDS/Aurora, scales to zero, managed by Laravel team |
| Ploi ($8/mo) | Forge alternative | Same VPS management concept, cheaper |
| DigitalOcean App Platform | Simple deploys | Docker-based, less control than Forge |
| Railway / Render | Docker + Postgres | Good for smaller apps, simple CI/CD |
Laravel Forge is the standard for production Laravel apps — it provisions a VPS (DigitalOcean, AWS, Vultr, Linode), configures nginx + PHP-FPM, SSL via Let's Encrypt, Redis, MySQL/PostgreSQL, and Laravel Queue workers. $19/month for unlimited servers.
Laravel Vapor is serverless Laravel on AWS — cold start times are acceptable (< 500ms for PHP), and it scales automatically. Best for apps with unpredictable traffic spikes. More expensive than Forge for steady traffic.
Methodology
- Sources: Laravel official documentation (laravel.com), Filament documentation, Laravel Spark documentation, Inertia.js documentation (inertiajs.com)
- Versions: Laravel 11.x, Livewire 3.x, Inertia.js 2.x, Filament 3.x, Laravel Reverb 1.x
- npm/Packagist download data from packagist.org and npmjs.com, March 2026
Find Laravel boilerplates and compare with Next.js alternatives on StarterPick — see which PHP-based starters have the most community adoption.
Related: Best Laravel Boilerplates and Starter Kits 2026 · Laravel Spark vs ShipFast: PHP vs JavaScript SaaS Starters · Best Full-Stack TypeScript Boilerplates 2026