At install
Something refuses to install
The install just stops with an error. You, or your AI agent, see it immediately. This is the easiest kind to catch, because it cannot be missed.
At install
The install just stops with an error. You, or your AI agent, see it immediately. This is the easiest kind to catch, because it cannot be missed.
At build
Building the app fails because it uses a piece of ReactDOM.render, findDOMNode, or another feature that got removed. Still visible, still an error you can see.
At runtime
The build succeeds. The page looks the same. But something quietly changed in how the app behaves, and you will not notice unless you actually try the things that used to work.
We're using a real React update as the example, but this happens with any library.
Direct answer
An install that finishes and a build that succeeds do not answer this question. The only real way to know is to make a copy, apply the update there, and try the same things you already know work, like logging in, checking out, or saving something. If any of those break, the update is not safe yet. If you never tried them again, you simply do not know yet.
Every real library update can break your app in one of three ways. Apps built by AI tools break the same way. Under the hood you are usually running React plus a handful of other libraries your AI agent picked for you, and updating any of them counts as shipping a new version, whether you meant to or not.
One library you did not even know you were using refuses to work with the new version of another. Your AI agent might "fix" this by forcing the install through anyway. That does not mean the two libraries actually work together. It means the tool that would have warned you got told to be quiet.
The technical detailReact 19 plus an old @types/react, or a UI kit that still peers react@^18, is the usual form. The agent may "fix" this with --legacy-peer-deps, which silences the installer rather than resolving the conflict.
React 19 removed a handful of older features that a lot of AI-generated code still relies on. If your app, or a library it depends on, still uses one of those, the build fails outright. That is actually good news: you find out immediately instead of shipping something broken.
The technical detailReactDOM.render is gone, migrate to createRoot. findDOMNode is gone, migrate to refs. defaultProps on function components is gone, migrate to default parameters. unmountComponentAtNode is gone, call root.unmount().
This is the one that actually ships to real users. The build finishes with no errors, and the homepage looks exactly the same. But something about how the app behaves has quietly changed, maybe a value that used to fill in automatically now doesn't, or an error that used to get logged now goes silent. Nothing in your install log will warn you about this.
Worked example
Cited from the React 19 Upgrade Guide (25 April 2024). This is not a complete changelog. It is the set that shows up in generated React apps.
NoteThe rest of this section gets specific about the exact code that changed. If you are not writing code yourself, the sections above already told you what matters: try the things that used to work.
ReactDOM.renderThis was deprecated in React 18 and fully removed in 19. If your AI tool generated code from an older tutorial, or pulled in a library that still uses the old way, your build fails right here. The fix is createRoot, shown below.
// Before
import { render } from 'react-dom';
render(<App />, document.getElementById('root'));
// After
import { createRoot } from 'react-dom/client';
const root = createRoot(document.getElementById('root'));
root.render(<App />);
findDOMNodeThis has been on its way out since 2018 and is now gone for good, replaced by something called a ref. If your generated code used the old approach, it will not run.
defaultProps on function componentsMost AI-generated components are function components, and this one is sneaky: your code might still run, but a default value that used to fill in automatically can silently disappear instead, becoming blank. That is the dangerous kind of break, the one your build will not catch for you.
// Before
function Heading({ text }) { return <h1>{text}</h1>; }
Heading.defaultProps = { text: 'Hello, world!' };
// After
function Heading({ text = 'Hello, world!' }) {
return <h1>{text}</h1>;
}
If something feels like it is running twice while you are developing, but not for real users, that is very likely expected behavior React has had since version 18, not a new bug from this upgrade. Before you assume the upgrade broke something, rule out that expected double-run, a missing cleanup step, or a default value that quietly disappeared.
The technical detailOn the double render, useMemo and useCallback reuse the first render's memo; ref callbacks are double-invoked on initial mount to simulate replacement by a Suspense fallback. This is Strict Mode's documented development behaviour, not a new break.
In React 19, an error while rendering no longer necessarily surfaces the way it used to. If you rely on an error-tracking tool to catch problems in production, check that it is still catching things after this upgrade, because it may have gone quiet without you noticing while the build still passed.
The technical detailReact 19 reports uncaught render errors to window.reportError and caught ones to console.error, without the old re-throw.
That is the whole method. Trying the things that used to work is the only real answer to "did it break." Everything else is a guess.
Where PeerRun is today
PeerRun can help you plan a library update today. What we cannot yet claim is a fully automatic version of the process above: trying the update on a copy and re-running everything for you. Until we can prove that works end to end, we will not claim it. The honest line is: an update you do not re-check is one you do not actually know is safe. Here is how to check it yourself.
What PeerRun can already do is open your project in a real browser and try the journeys that matter, and tell you honestly if one fails. So after you apply an update yourself, bringing us the folder again and having us try those same journeys answers the same question a fully automatic version would.
Nothing gets updated just by being on this page. Clicking through only tells us you came here to bring a project.
render, findDOMNode, function-component defaultProps, unmountComponentAtNode. Strict Mode notes. Error reporting change.ReactDOM.render.