Grit vs Express
They sit at opposite ends of the same spectrum. Express is a minimal, unopinionated Node router — just routing and middleware — that you assemble a stack around. Grit is the assembled stack: a Go backend, a generated React admin, and typed clients from one command. Express is the glue; Grit is the thing already glued together.
The short version
Reach for Express when you want minimalism and full control — a small or simple API, an unusual architecture, a stack you want to assemble yourself piece by piece. Reach for Grit when you don't want to spend the first weeks wiring auth, RBAC, an admin, jobs, and storage together — because it ships with all of them already connected.
Glue vs assembled
Express gives you routing and middleware, then you choose and wire up everything else — ORM, auth, validation, jobs, structure. Grit makes those choices for you and generates them: grit generate resource emits a model, service, handler, Zod schema, TS types, React Query hooks, and an admin page in one command.
Side by side
| Grit | Express | |
|---|---|---|
| Backend language | Go (Gin + GORM) | JavaScript / TypeScript |
| What it is | Assembled full stack | Routing + middleware only |
| ORM / database layer | Built in (GORM) | Bring your own (Prisma, etc.) |
| Typed API → client | Generated Go → TS + Zod | Wire it up yourself |
| Admin panel | Generated, Filament-like | Build it yourself |
| Auth + RBAC | Built in (roles + permissions) | Add Passport / custom |
| Background jobs / cron | Built in (asynq) | Add a queue yourself |
| File storage, email, cache | Built in (S3/R2, Resend, Redis) | Wire up each yourself |
| Mobile + desktop clients | Generated (Expo, Wails) | Not in scope |
| Flexibility to swap parts | Opinionated (Gin + GORM) | Total — you choose everything |
| Ecosystem + community | Younger | Enormous, the Node default |
Choose Grit when
- You don't want to hand-assemble auth, RBAC, admin, and jobs first.
- You want the batteries included: storage, email, cache, cron, backups.
- More than one client will consume the API (web + mobile + admin).
- You'd rather generate CRUD and typed clients than write them each time.
Choose Express when
- You want minimalism and full control over every layer of the stack.
- The API is small or simple and doesn't need the batteries.
- You want to assemble exactly your own stack with no baked-in opinions.
- One language (JS/TS), a huge ecosystem, and no lock-in matter most.
The honest trade-off
Express's minimalism is its strength: it makes no choices for you, runs everywhere in Node, and has an ecosystem and community nothing here can match. That's also the trade-off — you assemble and maintain the stack yourself. Grit makes the opposite bet: it picks Gin and GORM, adds a second language (Go), and hands you the batteries and admin pre-wired, at the cost of that flexibility and a younger ecosystem. If you want to build your stack exactly, use Express. If you want the stack already built, use Grit.
