Why I Use React 19 + Inertia v2 for Every Laravel App
I've built three products this year: Laravel Translations (free + Pro) and kit. All three use the same frontend stack: React 19, Inertia v2, Tailwind CSS v4, and TypeScript. Here's why this combination works so well.
Why Not a Separate SPA?
I tried the separate SPA approach. React frontend, Laravel API backend, token-based auth, CORS headers, separate deployments. It works, but the overhead is brutal:
- Duplicate validation (server + client)
- Token management and refresh logic
- CORS configuration that breaks in mysterious ways
- Two deployment pipelines
- Two repositories (or a monorepo with its own complexity)
Inertia eliminates all of this. Your routing, controllers, middleware, and validation stay in Laravel. Your frontend gets data as props. No API layer, no tokens, no CORS.
How It Works in Practice
A typical page in my apps looks like this:
The React component receives typed props:
No useEffect to fetch data. No loading states for initial page load. No API client. The data is just there.
Inertia v2 Features I Use Constantly
Deferred Props
For heavy data that isn't needed immediately:
The page loads instantly with the core data, then the deferred props stream in. On the frontend, you show a skeleton loader while they load.
Prefetching
Inertia v2 can prefetch pages on hover:
When the user hovers over a link, Inertia starts loading the next page in the background. By the time they click, the page is already cached. It feels instant.
Polling
For real-time data without WebSockets:
I use this for the AI translation progress in Translations Pro. Every 3 seconds, it checks for updates without a full page reload.
Type Safety with Wayfinder
Laravel Wayfinder generates TypeScript functions for your routes:
If the route signature changes in Laravel, TypeScript catches it at compile time. No more broken links from typos in route names.

The Trade-offs
Inertia isn't perfect for everything:
- No offline support — Every navigation is a server request
- No shared state between tabs — Each tab is its own Inertia instance
- Server rendering required — Your Laravel app must be available for every page load
For public marketing sites where SEO is critical, I'd consider Next.js. But for authenticated applications — dashboards, admin panels, SaaS products — Inertia with React is the best developer experience I've found.
My Stack Summary
| Layer | Technology |
|---|---|
| Backend | Laravel 12 |
| Frontend | React 19 + TypeScript |
| Bridge | Inertia v2 |
| Styling | Tailwind CSS v4 |
| Components | shadcn/ui (Radix) |
| Routes | Laravel Wayfinder |
| Testing | Pest 4 |
| Formatting | Pint + Prettier |
This stack has been stable, productive, and enjoyable to work with across three different products. That's the strongest endorsement I can give.