All posts
Jun 2, 2026·8 min
Upgrading a real app to Next 16 + React 19
Next.jsReact
Upgrading to Next 16 and React 19 is mostly painless if your app is already on the App Router — but a few sharp edges drew blood.
React 19 tightened `cloneElement` ref typing and form `action` return types. Both were one-line fixes once the compiler pointed at them.
Next 16 removed `next lint` in favour of the ESLint CLI with flat config, and next-themes moved its types to the package root. The new react-compiler lint rules are noisy but worth reading.
The lesson, as always: upgrade often in small steps, keep the type-checker green, and read the migration guide before the stack trace reads it to you.