| 1 | No export const dynamic = 'force-dynamic' on Next.js 16+. Use 'use cache' for cacheable async work, <Suspense> for live data. (Import cacheLife/cacheTag from next/cache — alias from unstable_* if your version still ships them under that prefix.) | Cache Components let static/cached/dynamic coexist in one route. force-dynamic blocks every optimization. |
| 2 | Parallelize independent awaits with Promise.all — never serial await for unrelated work. | 2–10× latency reduction on multi-fetch routes. |
| 3 | Configure optimizePackageImports in next.config.ts for any icon/UI library you import (lucide-react, @mui/*, @radix-ui/*, date-fns, etc.). | Barrel imports load 1,500–10,000 modules; 200–800 ms cold start cost. |
| 4 | Use next/link for internal navigation, next/image for every image, next/font for every font. Never raw <a href="/...">, <img>, or <link rel="stylesheet"> font URLs. | Lose prefetching, layout shift, font swapping. |
| 5 | Serialize props that cross the Server→Client boundary. Dates become ISO strings, Maps/Sets become arrays/objects, no functions (except Server Actions). | Class methods are stripped, Dates silently coerce to strings, then crash on .getFullYear(). |
| 6 | No async Client Components. Fetch data in a Server parent and pass plain props down. | Async client components throw at runtime. |
| 7 | Wrap dynamic streaming work in <Suspense> with a real skeleton fallback. Add loading.tsx at the segment level for the route shell. | Streaming requires Suspense; the skeleton is the UX. |
| 8 | Prefer composition over boolean props. <Modal isHeader isFooter isDismissible> → <Modal.Frame><Modal.Header/>…, or distinct <ChannelComposer/> / <ThreadComposer/> variants. | Booleans multiply state combinatorially; compound components stay linear. |
| 9 | Don't try/catch redirect(), notFound(), forbidden(), or unauthorized(). They throw on purpose — let them through, or unstable_rethrow(error) in a catch. | Catching them silently breaks navigation. |
| 10 | Tailwind: pair every color with its dark: variant. Use semantic tokens via CSS variables for theming. Conditional classes via clsx/cn, not string templates. | Half-dark UIs leak white flashes. Strings with conditionals are unreadable. |