Compared honestly.Sources you can check.
Everyone evaluating MoroJS asks the same thing: why not just use Express, Fastify, NestJS, or Hono? Fair question. So here's the same endpoint written in each one, a feature-by-feature checklist, and benchmarks where every framework runs head-to-head in one suite - same machine, same session. Run it yourself and check.
Every Node frameworkmakes you choose.
Speed or features. Simplicity or power. Type-safety or flexibility. You wire middleware in the right order and pray nothing breaks at 3am.
Designed in 2010. No types, no validation, no async-aware errors. Every project rebuilds the same wheels.
Fast, but you assemble the framework yourself — schemas, plugins, decorators, lifecycle hooks.
Powerful, but heavy. Decorators, modules, providers, DI container — Java in TypeScript clothing.
Minimal and fast — but minimal. You still need auth, validation, websockets, gRPC. Plug and pray.
Less code.More guarantees.
The same validated POST endpoint in four frameworks. Identical behavior, wildly different effort.
import { createApp, z } from '@morojs/moro'
const app = await createApp()
app.post('/users')
.body(z.object({
name: z.string().min(1),
email: z.string().email(),
age: z.number().int().min(18),
}))
.handler((req) => {
return { id: crypto.randomUUID(), ...req.body }
})
app.listen(3000)- Schema, validation, types — one chain
- req.body fully typed, already validated
- Errors handled by intelligent defaults
- No plugins. No boilerplate.
Everything in the box.Nothing to install.
Auth, validation, websockets, GraphQL, gRPC, HTTP/2, every one first-class and ready to use. No plugins to vet, no glue code to write.
| Feature | Express | Fastify | NestJS | Hono | MoroJS |
|---|---|---|---|---|---|
| Core | |||||
| TypeScript native | |||||
| Zero-config | |||||
| Intelligent middleware ordering | |||||
| Multi-runtime (Node/Edge/Lambda/Workers) | |||||
| Validation | |||||
| Zod / Joi / Yup support | |||||
| Type inference from schema | |||||
| Auth | |||||
| Built-in OAuth providers | |||||
| RBAC + sessions, zero deps | |||||
| Real-time | |||||
| WebSockets | |||||
| Server-Sent Events | |||||
| GraphQL | |||||
| gRPC | |||||
| HTTP/2 native | |||||
| Background work | |||||
| Built-in job scheduler | |||||
| Worker threads facade | |||||
| Mail (SES, SendGrid, Resend) | |||||
| Performance | |||||
| Own native C++ engine (default) | |||||
| Built-in clustering | |||||
| req/sec (peak, same-session suite) | 70k | 117k | n/a | 100k | 584k |
Up to 584,016 req/sec.Reproduce it yourself.
No cross-sourcing — every framework measured in the same suite, same machine, same session, same tool. This is the pipelined ×10 capability profile; real-world numbers + full methodology are one click away.
Pipelined ×10 (wrk -c100 -d40, best-of-3) — every framework run in the same suite on a Mac Studio M2 Ultra, Node 24.11. Real-world (no-pipelining) numbers and the full comparison table are on the benchmarks page.
Full methodologyBuild it inthe next 60 seconds.
One command. A typed, validated, production-ready API. No framework decisions left to make.
MIT licensed · No telemetry · Open governance