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
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.
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.”
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.







