Minified React error 418, 423, 425 and the other codes on this page are React's hydration errors as a production build prints them: a number and a link instead of the message. #418 is a mismatch, #425 is a text mismatch in React 18, and #423 says React re-rendered the whole page. Decode yours below.
The error
A React 19 production build prints:
Minified React error #418; visit https://react.dev/errors/418?args[]=HTML&args[]= for the full message or use the non-minified dev environment for full errors and additional helpful warnings.React 18 links to the old decoder instead:
Minified React error #423; visit https://reactjs.org/docs/error-decoder.html?invariant=423 for the full message or use the non-minified dev environment for full errors and additional helpful warnings.The number identifies the message. The args[] values fill in its
placeholders; for #418 in newer React 19 releases that is only the word
HTML or text, never the element.
Minified React error 418, 423, 425 and the rest, decoded
| Code | React 18 message | React 19 message | Reported by hydration-proof as |
|---|---|---|---|
| #407 | Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering. | Same | HP2003, HP2004 |
| #418 | Hydration failed because the initial UI does not match what was rendered on the server. | Hydration failed because the server rendered HTML (or text) didn't match the client. | The exact difference, such as HP1001 or HP1007 |
| #419 | The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering. | Same | HP2006 |
| #421 | This Suspense boundary received an update before it finished hydrating. This caused the boundary to switch to client rendering. The usual way to fix this is to wrap the original update in startTransition. | No longer reported | HP2005 |
| #422 | There was an error while hydrating this Suspense boundary. Switched to client rendering. | There was an error while hydrating but React was able to recover by instead client rendering from the nearest Suspense boundary. | HP2003 |
| #423 | There was an error while hydrating. Because the error happened outside of a Suspense boundary, the entire root will switch to client rendering. | There was an error while hydrating but React was able to recover by instead client rendering the entire root. | HP2004 |
| #424 | This root received an early update, before anything was able hydrate. Switched the entire root to client rendering. | Same | HP2005 |
| #425 | Text content does not match server-rendered HTML. | Not used: text mismatches are #418 | HP1001 |
The mismatch codes: #418 and #425
These are the bug. Minified React error #418 is an element or text that differs between the server HTML and the first client render. In React 18, a text difference has its own code, #425.
The recovery codes: #422 and #423
These say what React did about an earlier error. Minified React error #422 means it rendered one Suspense boundary again in the browser, and #423 means it rendered the whole root again. In React 18 they follow every mismatch. In React 19 they follow a component that threw during hydration. See there was an error while hydrating.
The server code: #419
Minified React error #419 means the server threw while rendering a Suspense boundary, sent its fallback, and left the browser to render it. The real error is in your server logs, not in the browser.
The early update codes: #421 and #424
Minified React error #421 means a Suspense boundary received an update before it finished hydrating, and minified React error #424 means the same for the root. See Suspense boundary received an update before hydrating.
The API code: #407
useSyncExternalStore was called without its third argument during server
rendering or hydration. See
Missing getServerSnapshot.
Why React minifies its errors
Production builds of React replace every error message with its number, so
the long strings are not shipped to every user. The development build keeps
the full text, the diff, the component stack and the warnings, such as
Warning: Text content did not match, that production does not print at all.
That is why a React 18 production console often shows #418 followed by #423 and nothing else: the warnings that named the element exist only in development.
How to get the full message
-
Open the link in the error. react.dev/errors decodes the number and fills in the arguments. It will not tell you which element, because production does not record it.
-
Reproduce it in development. Run the same page with a development build (
next dev,vite dev) and read the full message and diff. -
If it only happens in production, test the production build and the development build side by side:
npx hydration-proof test --mode bothhydration-proof finds the difference in the production build itself, by comparing the DOM, and marks findings that appear in only one mode. With browser source maps (
productionBrowserSourceMaps: truein Next.js) it also names the component. See hydration errors only in production.
Find every instance
Minified codes arrive one at a time from users' browsers. To find all of them before users do, run hydration-proof on every route in CI; see detect hydration errors in CI. Each code is mapped to a stable issue code with the element, both values and the likely cause.