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:

PHP

The React component receives typed props:

TSX

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:

PHP

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:

TSX

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:

TSX

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:

TSX

If the route signature changes in Laravel, TypeScript catches it at compile time. No more broken links from typos in route names.

Wayfinder Type Safety

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

LayerTechnology
BackendLaravel 12
FrontendReact 19 + TypeScript
BridgeInertia v2
StylingTailwind CSS v4
Componentsshadcn/ui (Radix)
RoutesLaravel Wayfinder
TestingPest 4
FormattingPint + Prettier

This stack has been stable, productive, and enjoyable to work with across three different products. That's the strongest endorsement I can give.

Related articles