Skip to main content

Writing

Next.js

Next.js App Router notes from production: Suspense, MDX, next-intl, and CLS. The trap, then the reusable fix.

All posts

Empty CMS hours must not clear Google Maps

Sander Korf4 min read

Retail CMS hours sync to Google Maps on publish. Empty regularHours in a PATCH body cleared live weekday hours because updateMask treats blanks as deletes.

googlesyncnextjs+2

Read more

An empty page is not the end of the list

Sander Korf4 min read

Logged-in shoppers saw an empty My orders screen while older rows still existed. hasMore followed filtered rows, not the raw API page.

paginationtanstack-querynextjs+2

Read more

Docs allowlist broke card decline redirect

Sander Korf3 min read

Card declines sent shoppers to /undefined after HTML sanitization stripped data-failed-return-url. Contract-test live payment snippets, not doc examples.

nextjssecuritypayments+1

Read more

When srcset maxes at 1000w on retina PDP

Sander Korf4 min read

PDP packshots looked soft on phones while cards stayed sharp. sizes asked for retina pixels but srcset stopped at 1000w. I matched candidates and one builder.

nextjssanityplaywright+1

Read more

Instant Nav needs an SSR shell, not ssr false

Sander Korf3 min read

Fashion liveshow soft nav painted an empty shell. Instant Nav locks static HTML; next/dynamic with ssr false and cookie awaits blocked landmarks e2e needed.

nextjsbambuserperformance

Read more

Keep nav backdrop open until close completes

Sander Korf4 min read

On a fashion storefront mega menu, the dim layer snapped off when Base UI cleared the menu value at the start of the exit animation, not the end.

nextjsreacta11y

Read more

Nested remote cache breaks Next.js prerender

Sander Korf4 min read

Homepage prerender on a Centra Next.js build failed with 'Filling a cache during prerender timed out'. Nested use cache remote boundaries caused the hang.

nextjscentraperformance

Read more

Minified React error #441 in Next.js: the fix

Sander Korf4 min read

Minified React error #441 broke soft navigation in a Next.js app with Cache Components. Here is what caused it in production and the fix that stopped it.

nextjsreactconvex

Read more

Server-side country labels fix E2E fills

Sander Korf3 min read

Checkout country dropdowns rebuilt after hydration and emptied a test fill. Precompute localized names on the server before the form paints.

intlnextjsplaywright

Read more

Next.js useOffline: env-shape shared config

Sander Korf4 min read

Shared Next config had offline detection always on, so local dev inherited HEAD polls meant for deploy. I now derive the flag from Vercel env at config time.

nextjsvercel

Read more

CSS view() timelines vs IntersectionObserver

Sander Korf4 min read

Below-the-fold blocks on my Next.js site faded in with a client observer. Scroll timelines do the fade now, and older browsers just show the content.

cssnextjstailwind+1

Read more

Next.js MDX in HTML, not behind Suspense

Sander Korf4 min read

Crawlers never ran my blog JavaScript, so they got a shell with no article. I flattened the static pages and now test the HTML with scripts turned off.

nextjsmdxplaywright+1

Read more

Homepage skip links jumped the fold late

Sander Korf3 min read

I awaited a cached translation for a skip link and the Shopify homepage jumped. That one string now renders inside the section that already waits.

next-intlnextjssanity+1

Read more

Next.js Suspense fallbacks wreck CLS P95

Sander Korf3 min read

Empty loading slots made my CMS blocks jump in late and wrecked layout stability. I now reserve height per section type and watch P95, not P75.

nextjssanityshopify+2

Read more

Dutch Klaviyo receipts arrived in English

Sander Korf3 min read

Dutch shoppers got English order emails from Klaviyo. I now pick the storefront language on the server before the event leaves, not in a default template.

next-intlklaviyocentra+1

Read more