
Font Loading in 2026: Why next/font Isn't Always the Answer
next/font is great until it isn't. A practical breakdown of when to use it, when to ship raw @font-face, and how to stop fonts from wrecking your LCP and CLS scores.
Next.js, React, performance, design systems, and edge runtime patterns.

next/font is great until it isn't. A practical breakdown of when to use it, when to ship raw @font-face, and how to stop fonts from wrecking your LCP and CLS scores.

Cross-document view transitions finally landed in stable browsers and Next.js shipped a primitive for them. Here's what actually works in production, what still tears, and how to keep CLS honest.

Next.js middleware looks like the perfect place for auth. Then your bundle balloons, your Edge runtime chokes on a Node API, and your login redirects loop. Here's how we untangled it.

A war story about how `revalidateTag` and a disciplined tagging scheme replaced our nightly full-cache purge — and the four gotchas we hit getting there in production.

Streaming SSR is free performance — until it isn't. Where you place Suspense boundaries decides whether your page feels fast or stutters its way through a waterfall of spinners.

Server Components feel magical until you try to pass a Date, a class instance, or a function through the boundary. Here's how to design around the serialization wall instead of fighting it.

Partial Prerendering looked like free performance on the demo slide. Then we shipped it. Here's what actually breaks when you flip the flag on a real Next.js app — and how we'd roll it out now.

Server actions feel like free API endpoints. They aren't. Here's what we learned shipping them to production traffic, and the patterns that kept latency and bills in check.

React 19's `use` hook looks like a cleaner way to read promises and context. In production it has sharp edges. Here's where it earns its keep and where it quietly tanks your app.

A practical walkthrough of moving a React design system from styled-components themes to CSS custom properties and design tokens — without a big-bang rewrite or a Monday morning rollback.

next/font is supposed to make fonts a solved problem. It isn't. Here's why your Largest Contentful Paint still regresses, and how to actually fix it.

The View Transitions API graduated from Chrome-only experiment to a real cross-browser feature. Here's how to wire it into Next.js App Router without breaking streaming, hydration, or your sanity.

revalidateTag, revalidatePath, and the Data Cache look simple until you ship them. Here's how we reason about Next.js caching layers, what bites teams in production, and the mental model we wish we'd had on day one.

Suspense in the Next.js App Router is a TTFB lever, not a loading spinner. Here's how we decide where the boundaries go on real product pages — and where they backfire.

useOptimistic feels magical in demos and brittle in production. Here's how we wire it up so optimistic UI doesn't lie to users when the network goes sideways.

Partial Prerendering promises the speed of static with the freshness of dynamic. Here's what actually happens when you ship it past a marketing site, and where it quietly bites.

Server Actions look magical in demos. Six months into a real Next.js App Router build, here are the failure modes we keep hitting — and the patterns that actually hold up under traffic.