Next.js 15 has landed

As a developer who’s worked with Next.js for years, I’m always excited when a new major release drops. Next.js 15, released recently, brings a lot to the table, focusing on developer experience, performance, and compatibility. After diving into it, I wanted to share my thoughts on the updates and how they might impact the way we build apps.

The Upgrade Process: Smoother Than Ever

One thing I’ve always appreciated about the Next.js team is their effort to make upgrades as painless as possible. With Next.js 15, they’ve introduced the @next/codemod CLI, which automates a lot of the heavy lifting during the transition. I gave it a go, and it felt like having a safety net—cleaning up outdated code, updating dependencies, and flagging areas needing attention. It’s a tool I’d recommend using even if you think you’ve got everything under control.

A Big Shift to Async APIs

Here’s a major change: APIs like headers, cookies, and params are now asynchronous. This might feel like a pain at first, especially if you’re used to synchronous access, but it’s actually a smart move. By making request-specific APIs async, they’re setting the stage for better rendering and caching.

In my projects, I’ve started adapting to this, and while the initial tweaks required some refactoring, it’s clear this change is aimed at long-term benefits like faster server responses. Pro tip: use their codemod to make the migration easier.

Caching: Default Behaviors Are Changing

Caching in Next.js 15 is more nuanced. Fetch requests and GET route handlers are no longer cached by default. This caught me off guard initially, but it makes sense—fresh data should always be the priority unless you explicitly opt into caching.

I’ve started experimenting with this in my projects, and while it requires a slight mindset shift, the control it gives you is worth it. You can now set the cache behavior that fits your app’s needs rather than relying on defaults that might not.

React 19 Is Here

This release aligns Next.js with React 19, bringing in some exciting features like the React Compiler and better hydration error handling. If you’re using the App Router, you’ll get these out of the box. For those of you still on the Pages Router (and I’ve got a few legacy projects in that camp), it’s nice that React 18 compatibility is still there. No pressure to switch, but it’s worth considering for newer projects.

Turbopack Is Fast (and Stable!)

Turbopack is officially stable in dev mode, and wow, is it fast. I’ve tested it on a few projects, and the local server startup and code updates with Fast Refresh are lightning quick. If you’re used to waiting on builds, this is a game-changer. It makes the whole development experience feel less like work and more like fun.

Other Cool Stuff

Here are a few smaller (but still awesome) features I’ve been exploring:

  • Static Route Indicator: A simple but effective addition that shows whether a route is static or dynamic. It’s like having a little helper keeping tabs on your rendering methods.

  • next/form: A great update for handling forms with client-side navigation. It’s a small detail, but these are the things that make a big difference to user experience.

  • TypeScript Support in next.config.ts: Finally! Writing configuration in TypeScript feels so much more natural.

Breaking Changes: Worth It in the Long Run

Yes, there are breaking changes—async APIs, caching defaults—but these aren’t arbitrary. They’re laying the groundwork for more efficient, scalable apps. My advice? Take the time to understand the "why" behind these changes. Once you do, you’ll appreciate the benefits they bring.

Final Thoughts

Next.js 15 is all about giving developers more control and setting us up for the future. Sure, some updates require a bit of a learning curve, but the payoff is faster apps, better workflows, and fewer headaches down the line. If you haven’t upgraded yet, I’d say dive in—it’s worth it.

All articles are my own thoughts. Gathered from reading articles and trying things out.