Archive
2026
9 min read
Next.js Between the Lines · Part 20
Next.js Is Being Designed for Agents Too
A managed AGENTS.md block that opens with "This is NOT the Next.js you know", error pages written for agents, and a fix menu that encodes product decisions.
nextjsai
7 min read
Next.js Between the Lines · Part 19
Upgrading Next.js Without a Big Bang
The version 16 codemod does not run every migration, and a green build does not mean the migration is done. What the upgrade guide asks you to check by hand.
nextjsproduction
6 min read
Next.js Between the Lines · Part 18
Multi-Zones and the Cost of Splitting an App
Splitting one Next.js app into zones gives each team its own build and deploy. It also turns every navigation between zones into a full page load.
nextjsarchitecture
8 min read
Next.js Between the Lines · Part 17
Self-Hosting Next.js 16 Without Surprises
One container with a disk needs almost no configuration. The moment you run two, you need a shared cache, a stable build id, an encryption key and a deployment id.
nextjsproduction
7 min read
Next.js Between the Lines · Part 16
Knowing What Your Next.js App Is Doing
Next.js 16 removed the size column from build output on purpose. Here is what instrumentation.ts gives you instead, and what onRequestError tells you that error.js cannot.
nextjsproduction
7 min read
Next.js Between the Lines · Part 15
Auth Belongs Next to the Data, Not the Layout
Layouts do not re-render on client navigation, so an auth check there is not re-run. The Data Access Layer pattern puts the check where it cannot be skipped.
nextjssecurity
7 min read
Next.js Between the Lines · Part 14
From Middleware to Proxy, and Why
Next.js 16 renamed middleware.ts to proxy.ts. The rename is a recommendation: use it less, and never as your only authorization check.
nextjssecurity
6 min read
Next.js Between the Lines · Part 13
Every Server Action Is a Public Endpoint
The use server directive leaves a POST route behind. What Next.js protects for you, what it does not, and why schema validation is not an authorization check.
nextjssecurity
7 min read
Next.js Between the Lines · Part 12
Forms With Server Actions and Optimistic UI
useActionState, useFormStatus and useOptimistic each solve a different problem. Picking the wrong one gives you a pending flag that is always false.
nextjsforms
6 min read
Next.js Between the Lines · Part 11
Route Handler or Server Action?
Server Actions are dispatched one at a time per client, which makes them a poor fit for fetching. Route Handlers are public endpoints you should not call from your own Server Components.
nextjsapi
7 min read
Next.js Between the Lines · Part 10
Testing the App Router Without Guessing
The docs recommend end-to-end tests over unit tests for async Server Components. Here is where that line sits, and how to test that a navigation is actually instant.
nextjstesting
8 min read
Next.js Between the Lines · Part 9
Instant Navigation: Two Shells, Not One
A direct visit and a client navigation to the same route produce different initial UI. That is why a Suspense boundary can cover one and miss the other.
nextjsrendering
7 min read
Next.js Between the Lines · Part 8
Parallel Routes, default.js, and Modals
Slots do not appear in the URL, unmatched slots behave differently on refresh, and a conditional slot still runs on the server for every user.
nextjsrouting
7 min read
Next.js Between the Lines · Part 7
Partial Prerendering Is an Architecture Decision
Next.js moved the static boundary from the route to the component. That choice buys a faster first paint and moves real complexity into your hosting platform.
nextjsrendering
8 min read
Next.js Between the Lines · Part 6
The Mental Model Behind use cache in Next.js 16
Next.js 16 made caching explicit. What use cache actually stores, where it lives, how long it survives, and why revalidateTag and updateTag are not interchangeable.
nextjscaching
7 min read
Next.js Between the Lines · Part 5
Next.js Error Handling After 16.3: retry vs reset
Expected errors are data, unexpected errors are exceptions. How error.js, catchError, and the new retry function fit together in Next.js 16.3.
nextjsfundamentals
7 min read
Next.js Between the Lines · Part 4
Streaming in Next.js: Where to Put Suspense
Streaming is more than a loading skeleton. It shapes your status codes, your Web Vitals, and what your proxy and CDN must support.
nextjsfundamentals
7 min read
Next.js Between the Lines · Part 3
What Actually Makes a Next.js Route Dynamic
One cookies() call can change how a whole route renders. How Next.js decides between static and dynamic rendering, in both of its rendering models.
nextjsfundamentals
7 min read
Next.js Between the Lines · Part 2
Data Fetching in Next.js Without Hidden Waterfalls
Two awaits in a row can double the wait for your data. The patterns the Next.js docs give you to start requests early and share them safely.
nextjsfundamentals
8 min read
Next.js Between the Lines · Part 1
Why 'use client' Is a Boundary, Not a Label
What really crosses the line between Server and Client Components in Next.js, and why so many bundle and prop errors start with a single import.
nextjsfundamentals