Every time I start a new backend project, I face the same question:
Should I use NestJS, or keep things simple with Express + TypeScript?
NestJS is powerful and popular. But in many real-world projects, I found myself dealing with too much abstraction, decorators, and framework rules when all I wanted was a clean, scalable Express API.
That’s why I built express-ts-api-starter — a production-ready and scalable Express + TypeScript starter focused on clarity over magic.
In this post, I’ll:
- Compare it honestly with NestJS
- Show real code examples
- Help you decide which approach fits your project
What Problem Does This Starter Solve?
If you’ve built multiple APIs, you’ve probably repeated:
- Project structure
- Error handling
- Environment configuration
- Module separation
- TypeScript setup
This starter extracts those production patterns into a reusable foundation — without turning Express into a framework.
Project Structure Comparison
NestJS
src/
├─ app.module.ts
├─ app.controller.ts
├─ app.service.ts
├─ users/
│ ├─ users.module.ts
│ ├─ users.controller.ts
│ ├─ users.service.ts
NestJS enforces architecture using modules, decorators, and dependency injection.
express-ts-api-starter
src/
├─ app.ts
├─ server.ts
├─ modules/
│ └─ users/
│ ├─ routes.ts
│ ├─ controller.ts
│ ├─ service.ts
│ └─ types.ts
This structure scales because:
- Features are isolated
- Responsibilities are clear
- Everything is plain TypeScript
👉 No decorators. No reflection. No hidden lifecycle.
Route Handling: Side-by-Side
NestJS
@Controller("users")
export class UsersController {
constructor(private service: UsersService) {}
@Get()
getUsers() {
return this.service.getAll();
}
}
express-ts-api-starter
router.get("/", controller.getUsers);
export const getUsers = async (req, res) => {
const users = await userService.getAll();
return res.json(users);
};
Key difference:
- NestJS relies on decorators and DI
- This starter relies on explicit, readable code
Debugging is easier because nothing is abstracted away.
Dependency Injection: Magic vs Explicit
| Aspect | NestJS | express-ts-api-starter |
|---|---|---|
| DI system | Built-in | Plain imports |
| Abstraction | High | Minimal |
| Debugging | Harder | Very easy |
| Learning curve | Steep | Very low |
In this starter:
JavaScript itself is the DI system.
Scalability (The Big Myth)
A common misconception:
NestJS is scalable, Express is not.
Reality:
- Both scale well when architecture is done right.
express-ts-api-starter scales because:
- Feature-based modules
- Thin controllers
- Isolated services
- No framework lock-in
- Easy refactoring as the codebase grows
👉 Scalability comes from architecture, not decorators.
Performance & Control
| Area | NestJS | express-ts-api-starter |
|---|---|---|
| Startup time | Slower | Faster |
| Runtime overhead | Medium | Minimal |
| Express control | Partial | Full |
| Middleware | Nest-specific | Native Express |
If you want raw Express control, this starter wins.
Production Readiness
Both approaches support:
- Centralized error handling
- Environment configuration
- Middleware and logging
- Testing support
This starter provides production-safe defaults without forcing a framework.
Honest Rating (Out of 10)
| Category | NestJS | express-ts-api-starter |
|---|---|---|
| Production readiness | 9/10 | 9/10 |
| Scalability | 9/10 | 9/10 |
| Learning curve | 6/10 | 9/10 |
| Debuggability | 7/10 | 9/10 |
| Flexibility | 8/10 | 9/10 |
Final score
- NestJS: 8.1 / 10
- express-ts-api-starter: 9.0 / 10
When Should You Choose Which?
Choose NestJS if:
- You have a large enterprise team
- You want strict framework rules
- You prefer Angular-style architecture
Choose express-ts-api-starter if:
- You want production-ready Express without magic
- You value simplicity and control
- You want faster onboarding
- You want zero framework lock-in
Try It Yourself
npx express-ts-api-starter my-api
cd my-api
npm install
npm run dev
📦 npm package:
https://www.npmjs.com/package/express-ts-api-starter
Final Thoughts
NestJS is a framework.
express-ts-api-starter is a foundation.
If you prefer clarity over abstraction and want something that scales naturally in production, this starter might be exactly what you’re looking for.
Feedback, issues, and PRs are welcome
Top comments (0)