NestJS Got to Seventy-Five Thousand Stars Because Large Node Backends Finally Needed a Framework That Treated Structure Like a Feature, Not a Lecture
NestJS sits at about 75,587 GitHub stars and remains a major choice for serious Node backends. This guide covers what it does, how modules and controllers work, and how to deploy NestJS cleanly with PM2, Docker, or managed platforms.
The punchline is simple: NestJS got big because a lot of Node teams eventually discovered that “just structure it ourselves” often means “we will invent six different patterns and regret all of them.”
GitHub shows NestJS at roughly 75,587 stars, and that is what happens when a framework gives Node developers a strong architecture story without forcing them to abandon the ecosystem they already use.
What NestJS is actually for
NestJS is excellent for:
- large APIs
- modular backend systems
- enterprise-ish codebases
- teams that need conventions
- apps using DI, guards, pipes, and layered architecture
It is popular because it makes growth survivable. Small apps can stay readable, and large apps do not have to collapse into router spaghetti.
Start a Nest project
npm i -g @nestjs/cli
nest new my-nest-app
cd my-nest-app
npm run start:devBasic controller:
import { Controller, Get } from "@nestjs/common";
@Controller("health")
export class HealthController {
@Get()
check() {
return { ok: true, framework: "nestjs" };
}
}That controller then gets wired into a module, which is where Nest starts paying off for larger systems.
Why it stayed popular
NestJS solved a painful middle stage:
- Express is flexible but too loose at scale
- hand-rolled architecture drifts
- TypeScript projects need repeatable patterns
- teams need onboarding consistency
NestJS made backend structure feel like product leverage rather than ceremony.
How to deploy it
Standard production build
npm run build
npm run start:prodPM2
npm install -g pm2
pm2 start dist/main.js --name my-nest-appDocker
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["node", "dist/main.js"]Build and run:
docker build -t my-nest-app .
docker run -p 3000:3000 my-nest-appWhat it disrupted
NestJS did not destroy Express. It did something more realistic: it exposed how many Express backends were being held together by memory, habit, and hope. For teams with more than one backend developer, that mattered. A lot.