Years ago, I remember calling a former classmate back in Kazakhstan. I asked him what he was working on. He said it was some large corporate project built on Java Spring Boot.
I laughed.
I literally said something like: “Bro, that’s ancient. That’s boring. Why would you build anything new on that? Why not Next.js?”
At the time, it felt obvious. Spring Boot sounded slow, verbose, old-fashioned. Next.js felt modern, fast, elegant. Everyone online was building with it. The ecosystem was exploding. The DX was addictive.
But over the years, after building, breaking, migrating, and maintaining real systems, that memory started to bother me.
Not because Spring Boot suddenly became cool. But because I slowly understood why those companies chose it.
After enough back-and-forth, enough upgrades, enough rewrites that weren’t supposed to be rewrites, something clicked:
They weren’t optimizing for excitement. They were optimizing for survival.
That’s when I realized something uncomfortable: I wasn’t laughing because Spring Boot was bad. I was laughing because I didn’t yet understand what “long term” actually means in software.
This article isn’t written by someone who hates Next.js. It’s written by someone who used it, trusted it, and then zoomed out far enough to see the trade-offs clearly.
And once you see them, you can’t unsee them.
I'm on TanStack now, very happy with the decision after more than a year.