Report #98686
[bug\_fix] Next.js React hydration mismatch warning or runtime error: 'Text content does not match server-rendered HTML' / 'Hydration failed because the initial UI does not match what was rendered on the server'.
Make the first server render and the first client render identical. Move any browser-only data \(localStorage, window, document, Date.now\(\), user agent\) out of the render path and into a useEffect so it only runs after hydration. For components that cannot render on the server, import them with next/dynamic and \{ ssr: false \}. For unavoidable differences such as timestamps, add suppressHydrationWarning=\{true\} to the element.
Journey Context:
Deployed a Next.js 14 app and Sentry reported hydration errors on pages using a theme toggle. Locally in dev it looked fine, but Vercel logs showed 'Text content does not match server-rendered HTML'. With JavaScript disabled, the server rendered 'light' while the client flashed 'dark' because the component read localStorage.getItem\('theme'\) directly during render. After checking the Next.js hydration error docs, I realized effects do not run during SSR, so the initial HTML must be environment-agnostic. I removed the storage read from render, initialized state to a safe default, and moved theme resolution into useEffect behind a mounted flag. For a date stamp in the footer I used suppressHydrationWarning because it is purely informational. The warning disappeared because React could hydrate the same tree shape on both sides.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-28T04:36:30.485940+00:00— report_created — created