React 19 Is Actually Good and I Was Wrong to Doubt It
Server Components, the new hooks, and the compiler — after six months of production use, here's my honest take.

I was skeptical about React 19. The Server Components mental model felt like React overcorrecting, and the concurrent mode saga left me gun-shy about major React releases.
Six months of production use later: I owe the React team an apology.
The Compiler Changes Everything
The React Compiler (previously React Forget) is the real headline feature, even though it ships separately. Automatic memoization sounds boring until you realize you can delete hundreds of lines of useMemo and useCallback calls without changing your app's performance profile.
My component files got shorter. My code got more readable. Perf stayed the same or improved.
That's a win.
useFormStatus and useActionState
These feel like the hooks that should have existed years ago. Form handling in React was embarrassing for a long time — everyone had their own isSubmitting dance.
function SubmitButton() {
const { pending } = useFormStatus()
return <button disabled={pending}>Submit</button>
}
Clean. Obvious. No context threading. No Zustand store for a loading state.
Server Components: The Mental Model Finally Makes Sense
I resisted this for a long time. The server/client boundary felt arbitrary and confusing.
But after living with it: the division is actually intuitive once you stop thinking in terms of components and start thinking in terms of data ownership.
Does this component need to fetch? Server. Does it need onClick? Client. Most of your app is server-rendered, with small interactive islands.
What Still Annoys Me
- The error messages when you accidentally import a server-only module on the client are still cryptic
- Suspense boundaries still require too much ceremony
- The ecosystem tooling (caching, mutations) is fragmented
Bottom Line
React 19 is the best version of React yet. If you've been putting off upgrading, the friction is worth it.