Web Engineering

Next 15 made upgrades feel like product work

1 min read

Next.js 15 made a framework upgrade look like product work.

Async request APIs, changed caching defaults, and route behavior affect freshness, loading, metadata, and access control. The dependency diff is not the user-facing diff.

The first checks should be route-level:

  • dynamic params resolve the right page
  • query strings reach the intended component
  • metadata matches the page
  • protected routes still block correctly
  • cached pages are cached deliberately
  • live pages remain live deliberately

The async request change exposes assumptions quickly:

type Params = Promise<{ slug: string }>

export default async function Page({ params }: { params: Params }) {
  const { slug } = await params
  return <Article slug={slug} />
}

The caching change asks the same product question in another form. A dashboard should not behave like a blog post. A pricing page should not behave like a private workspace. The upgrade forces those choices into code.

Framework upgrades do not need ceremony for its own sake. They need smoke tests, a preview rollout, and a rollback path that does not require guessing which behavior changed. The test is whether the product still tells the truth after the framework moves underneath it.

Jeremy London

About Jeremy London

Engineering leader and builder in Denver. I write about AI platforms, agents, security, reliability, homelab infrastructure, and the parts of engineering work that have to survive production.