Web Development

Next.js 15 App Router: What Actually Changed (And What We Stopped Doing)

Caching got more predictable, params became async, and Turbopack is now the default for dev. Here's what those changes actually mean for a production app — and the patterns we retired the moment we upgraded.

KAKabir AnandLead Developer
10 min read
Close-up of colorful syntax-highlighted code on a monitor

Next.js 15 reads like a quiet release from the changelog, but it fixes the two things that generated the most confused Slack threads on every App Router project we've shipped: caching defaults that surprised people, and a dev server that felt slower than it should.

Caching stopped being opt-out by default

In the App Router's early versions, fetch requests were cached by default — a reasonable instinct for static content, a constant source of stale-data bugs for anything dynamic. Next.js 15 flips that: fetches are uncached by default, and you opt into caching explicitly.

Fetch caching, before vs after 15

Next.js 14fetch() cached by default
Surprise stale dataHad to remember cache: 'no-store'
Next.js 15fetch() uncached by default
Explicit opt-incache: 'force-cache' when you want it
app/dashboard/page.tsx
1// 15: explicit, and the explicit version is now the exception, not the rule
2const stats = await fetch("https://api.acme.com/stats", {
3  cache: "force-cache",
4  next: { revalidate: 60 },
5});

params and searchParams are now async

Route params and search params are Promises now, not plain objects. This unlocks Next.js to start rendering a route's shell before those values resolve — but it means every page and layout reading them needs an await, and TypeScript will catch the ones you miss.

app/blog/[slug]/page.tsx
1export default async function Page({
2  params,
3}: {
4  params: Promise<{ slug: string }>;
5}) {
6  const { slug } = await params;
7  return <Article slug={slug} />;
8}
The migration shortcut

Next.js ships a codemod for this exact change — `npx @next/codemod@latest next-async-request-api .` rewrites the vast majority of call sites automatically. Run it before touching anything by hand.

Turbopack for dev is fast enough to just leave on

Turbopack graduated from opt-in flag to the stable default for `next dev`. On our larger monorepo apps, cold start and hot-reload times dropped enough that the flag stopped being something anyone remembered to add — it's just how the dev server behaves now.

  • Cold start on a 400+ route app dropped from ~14s to ~3s in our benchmarks.
  • Hot module reload on a deeply nested component tree stayed near-instant even as the app grew, where Webpack-based dev noticeably slowed down.
  • Production builds still default to Webpack for now — don't assume dev speed automatically carries over to your CI build time.

4.6x

faster cold start with Turbopack dev on our largest app

1

codemod command that handled 95% of the async-params migration

0

stale-data incidents since switching to explicit fetch caching

The best caching bug is the one that never ships because the default no longer hides it.

Kabir Anand, Lead Developer

Key Takeaways

  • fetch() is uncached by default now — opt in explicitly with cache: 'force-cache' where you actually want it.
  • params and searchParams are Promises; run the official codemod before hand-editing every call site.
  • Turbopack is the stable default for next dev — expect noticeably faster cold starts and HMR on larger apps.
  • Production builds still use Webpack by default, so dev-speed gains don't automatically show up in your CI build times.

What we stopped doing

We retired our custom "no-store fetch wrapper" utility that every project used to reimplement to avoid the old caching surprises — Next.js 15's default now does exactly what that wrapper existed to work around.

Keep Reading

More from the blog

The Engineering Partner You Can Build On

Reliable software takes an experienced team that owns delivery end to end. Here’s the track record behind ours.

11+

Years Building Custom Software

320+

Projects Delivered Across Web, Mobile & AI

85%

Repeat Client Rate

12+

Countries Served Worldwide

Trusted by startups and enterprises worldwide

Work With Us

Let’s create
with purpose

Share your goals, timeline, and challenges — we’ll respond with clarity and next steps.

Ambitious ideas deserve thoughtful execution. Start the conversation and let’s define what success looks like.

Team

Acetrum

Est. 2015

4.9/5

Trusted by
top brands

Services interested in:

By submitting, I confirm I’ve read and agree with Privacy and Cookie Policies.

Newsletter

Signals worth
paying attention

No recycled headlines — just the patterns we’re seeing across real client work, distilled into one read a month.

A curated digest of practical thinking and real-world brand perspectives monthly.

No spam. Unsubscribe anytime.