Every new TypeScript backend starts with the same fork in the road. Reach for NestJS and its structure, or start plain with Express or Fastify and add what you need. I have shipped both. The answer is not “Nest is better,” it is “Nest is better past a certain point, and worse before it.”
The honest tradeoff
Nest gives you dependency injection, modules, decorators, and a strong opinion about where everything goes. That is real value on a team. It is also a real tax on day one. A new hire who has never seen Nest has to learn providers, modules, and the DI container before they can add an endpoint.
Plain Node has almost no learning curve. You wire a route, you write a handler, you are done. The cost shows up later, when three developers have invented three different ways to structure the same thing.
Where Nest pays off
Nest earns its weight when the codebase and the team both grow. A few signals I watch for:
- More than two or three engineers touching the same service.
- Cross-cutting concerns you keep re-solving: auth guards, request validation, logging, error filters.
- A domain complex enough that testable, injected services save you real time.
Once you are writing the same boilerplate by hand in five places, the DI container and module system stop feeling like ceremony and start saving hours.
Where plain Node wins
For a solo build, a prototype, or a service with a handful of routes, plain Fastify ships faster and stays easier to reason about. There is no framework between you and the request. When I need something live this week and it will stay small, I do not reach for Nest.
Small internal tools live their whole lives happily on 150 lines of Fastify.
The cost of guessing wrong
Guessing wrong in either direction is expensive. Start plain on something that becomes a large team codebase, and you spend months retrofitting structure onto organic mess. Start with Nest on a tiny throwaway, and you carry framework overhead that never pays back.
Migrating a mature plain-Node service into Nest is a genuine rewrite of every entry point. It is not a weekend.
How I decide
I ask one question: how many people will touch this in a year, and how long will it live? Two developers and a long life, I reach for Nest up front. One developer or a short life, I stay plain and revisit only when the pain is real.
Match the framework to the team size, not to what is trending. The framework is there to coordinate people. If there are no people to coordinate yet, you are paying for coordination you do not need.