Report #91154
[bug\_fix] Hydration failed because the initial UI does not match what was rendered on the server. Text content does not match: Server: "X" Client: "XY"
Add \`suppressHydrationWarning\` prop to the specific element if caused by browser extensions, or move client-only data \(timestamps, random values\) into a \`useEffect\` so it only renders on the client after hydration. Root cause: Server renders clean HTML but client HTML is modified by browser extensions \(Grammarly, LastPass, Dark Reader\) or hydration occurs with different initial props \(timezone differences, Math.random\), causing a mismatch between the server-rendered DOM and the initial client render.
Journey Context:
Site works perfectly in local dev and most production users, but Sentry reports hydration errors for specific users. Realize these users have Grammarly or LastPass extensions that inject \`\` tags or attributes into contenteditable divs during client-side hydration. Check DevTools Network tab: the raw HTML from the server is clean, but the Elements panel shows extra attributes injected by extensions. Initially tried asking users to disable extensions \(impossible at scale\). Finally added \`suppressHydrationWarning\` to the specific contenteditable divs, or wrapped client-only timestamps in a \`useEffect\` with an \`isClient\` state guard, ensuring server/client HTML matches exactly for the initial render.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T11:35:50.827889+00:00— report_created — created