article

Laravel 12 - The Smoothest Upgrade Ever (And Those New Starter Kits!)

21st September 2025

The 5-Minute Upgrade

I'll be honest - when I saw Laravel 12 was released in February, I was mentally preparing for a weekend of debugging and refactoring. Major version upgrades usually mean breaking changes, right?

Wrong. This time was different.

I upgraded three production apps from Laravel 11 to 12, and the longest one took maybe 15 minutes. Most of that was waiting for Composer. Taylor Otwell wasn't kidding when he called this a "maintenance release" - Laravel 12 is all about polish, not revolution.

What Makes Laravel 12 Different

Here's the thing that surprised me: Laravel 12 doesn't have a massive list of new features. And that's actually by design.

The Laravel team shifted their strategy. Instead of saving up features for a yearly major release, they're shipping continuously throughout the year in minor versions. Those cool new features you've been hearing about? They're already in Laravel 11.x releases:

  • The defer() helper shipped in 11.23
  • Laravel Reverb for WebSockets came in 11.x
  • Per-second rate limiting? Already here
  • Improved queue testing? Yep, shipped

So what IS in Laravel 12? The answer is: the stuff that needed breaking changes to ship properly.

The Starter Kits: This Changes Everything

Okay, this is where Laravel 12 gets really interesting. They completely reimagined application scaffolding.

Remember Breeze and Jetstream? Gone. Well, not gone exactly, but replaced with something way better: three modern starter kits that you actually own.

The React Starter Kit

php artisan install:react

This gives you:

  • React 19 with TypeScript by default
  • Inertia 2 for seamless Laravel-React integration
  • Tailwind CSS 4 pre-configured
  • shadcn/ui components - yes, those beautiful components everyone loves
  • Full authentication scaffolding that doesn't look like 2015

But here's the genius part: you get three layout options out of the box:

// Want a sidebar layout? One import.
import AppLayoutTemplate from '@/layouts/app/app-sidebar-layout';

// Prefer a header layout? Change one line.
import AppLayoutTemplate from '@/layouts/app/app-header-layout';

// Mixed layout? You got it.
import AppLayoutTemplate from '@/layouts/app/app-mixed-layout';

Dark mode, light mode, and system mode are all included. GitHub CI workflows too. It's like someone read my mind about what I wish every new project had from day one.

The Vue and Livewire Kits

Not a React developer? No problem.

The Vue kit gives you Vue 3 with Composition API, TypeScript, and shadcn-vue components. Same layout flexibility, same polish.

The Livewire kit? Livewire 3 with the Flux UI component library. For those of us who just want to stay in Blade-land and not touch JavaScript unless absolutely necessary.

The best part? You own all this code. It's in your repo. Modify it, customize it, make it yours. No vendor lock-in, no weird update headaches.

WorkOS AuthKit: Auth Without the Headache

I've spent way too many hours of my life implementing OAuth and dealing with social login edge cases. Laravel 12's WorkOS integration solves this completely.

php artisan install:auth workos

Now you get:

  • GitHub, Google, Microsoft, Apple ID authentication
  • Passkeys (yes, actual passwordless login)
  • Email-based magic links
  • Rate limiting and geo-blocking built-in
  • SSO for enterprise clients

And here's the kicker: it's free for up to 1 million monthly active users. For most projects, that means it's just... free.

The Breaking Changes (All Three of Them)

1. UUIDs Are Now Time-Ordered

use Illuminate\Database\Eloquent\Concerns\HasUuids;

class Product extends Model {
    use HasUuids; // Now generates UUIDv7 instead of v4
}

Why does this matter? UUIDv7 is time-ordered, which means better database performance. Your indexes won't fragment as much, and range queries are faster.

If you really need UUIDv4 behavior, you can override it. But honestly? The v7 default is better for almost everyone.

2. Container Defaults Actually Respected

This one bit me once:

class Example {
    public function __construct(public ?Carbon $date = null) {}
}

$example = resolve(Example::class);

// Laravel 11: $example->date instanceof Carbon (true - ignored default!)
// Laravel 12: $example->date === null (respects the default)

Makes sense when you think about it. Defaults should actually be defaults.

3. Image Validation Excludes SVGs

// This no longer allows SVGs by default
'photo' => 'required|image'

// Need SVGs? Be explicit:
'photo' => ['required', File::image(allowSvg: true)]

SVGs are technically XML files that can execute JavaScript. This is a security improvement that might break some file upload forms. Quick fix though.

And that's it. Three breaking changes. Compare that to some previous major versions...

Performance Improvements You'll Never Notice (But Should Appreciate)

Laravel 12 switched from MD5 to xxHash internally. This means cache operations, sessions, and various framework internals are up to 30× faster.

Will you notice this in a typical web app? Probably not. But at scale? It adds up.

The UUIDv7 change I mentioned? That's not just about better sorting. For high-volume tables, the reduced index fragmentation can make a real difference in query performance.

Upgrading: The Actual Steps

Here's what I did for each app:

# 1. Update composer.json
{
    "require": {
        "laravel/framework": "^12.0"
    }
}

# 2. Run these commands
composer update
php artisan migrate
php artisan cache:clear
php artisan config:cache

That's it. Seriously.

I had to update one line in a model where I was explicitly checking for UUIDv4 format. Everything else? Just worked.

When NOT to Upgrade

Real talk: if you're in the middle of a critical business period, or you haven't kept up with 11.x deprecations, maybe wait.

Also, if you're on Laravel 10 or older, you'll want to upgrade to 11.x first, fix all the deprecation warnings, then move to 12. Jumping multiple major versions is asking for trouble.

What I Actually Use This For

Since getting these new starter kits, I've spun up three new projects:

  • A client dashboard (React kit, sidebar layout)
  • An internal tool (Livewire kit, header layout)
  • A SaaS prototype (React kit, mixed layout)

Each one was production-ready with auth, dark mode, and a professional look in under an hour. The time savings compared to setting all this up manually? Easily 10-20 hours per project.

The Bottom Line

Laravel 12 isn't flashy. It won't make your existing apps magically faster (though those internal improvements are nice). But for new projects? The starter kits alone make it worth upgrading just to have them available.

And the fact that upgrading existing apps is this painless? That's a gift. I've done enough framework upgrades to appreciate when things just... work.

If you're starting a new Laravel project in 2025 or beyond, do yourself a favor: use Laravel 12 with one of the new starter kits. Your future self will thank you.

Quick Links

Now go build something cool. The tooling has never been better.

Ready to Transform Your Business?

Let us work together to bring your ideas to life with cutting-edge technology and innovative solutions.

Get Started Today

© Copyright 2025 EvolutIT