When starting a new Laravel project with Inertia.js and React, you immediately need to solve authentication. You have to choose between two official starter kits: Laravel Breeze and Laravel Jetstream.

Picking the wrong one early means either rewriting code or fighting a tool that is way too heavy for your needs. Let us break down both options so you can make the right call.

  • The core differences between Breeze and Jetstream
  • How Inertia and React work inside each package
  • When to choose a minimalist setup over a feature-rich one
  • Common pitfalls developers hit during setup

Laravel Breeze: The Minimalist Approach

Breeze is a lightweight starting point that gives you the absolute basics. It includes login, registration, password reset, email verification, and profile management.

It uses standard React components styled with Tailwind CSS. Because the code is published directly into your app, you own every single line of it.

Here is what a typical Breeze React page looks like for handling user login input:

import { useForm } from '@inertiajs/react';

export default function Login() {
    const { data, setData, post } = useForm({ email: '', password: '' });

    function submit(e) {
        e.preventDefault();
        post('/login');
    }

    return (
        <form onSubmit={submit}>
            <input type="email" value={data.email} onChange={e => setData('email', e.target.value)} />
            <button type="submit">Log in</button>
        </form>
    );
}

The key takeaway here is total control. You can open this file and change how the form behaves without fighting framework abstractions.

Laravel Jetstream: The Feature-Rich Powerhouse

Jetstream is built for applications that need advanced features on day one. It adds two-factor authentication, API tokens via Laravel Sanctum, team management, and profile photo uploads.

Unlike Breeze, Jetstream hides its core navigation and UI components inside a compiled vendor package. This makes deep customization much harder if you want to change how the dashboard layout works.

Here is how you conditionally render team features in a Jetstream React page:

export default function Dashboard({ auth }) {
    return (
        <div>
            {auth.user.current_team && (
                <div>Current Team: {auth.user.current_team.name}</div>
            )}
        </div>
    );
}

The key takeaway is speed for complex apps. You get advanced features out of the box, but you pay for it in flexibility.

Common mistakes to avoid

Many developers pick Jetstream just because they want two-factor authentication later. They end up wasting hours overriding vendor views they cannot easily edit.

Another common mistake is mixing Breeze with external UI libraries incorrectly. Always remember that Breeze expects standard Tailwind classes out of the box.

The final recommendation

Use Laravel Breeze for ninety percent of projects. It gives you a clean slate, lets you learn how Inertia and React wire up with Laravel, and stays out of your way.

Only choose Jetstream if your client explicitly requires team management or two-factor auth on launch day. Run composer require laravel/breeze --dev in your terminal right now and build your own custom features on top of a clean foundation.