Next.js App Router notes from production: Suspense, MDX, next-intl, and CLS. The trap, then the reusable fix.
Checkout country dropdowns rebuilt after hydration and emptied a test fill. Precompute localized names on the server before the form paints.
Leave a Next.js tab open in local dev and the terminal floods with HEAD polls. I now enable offline Instant Navigations only on Vercel preview and production.
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.
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.
Product screens drifted from Figma because every sprint invented hex and timing. Shared tokens and typed headings stop one-off colors from surviving review.
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.
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.
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.