A "stack" is just a memorable name for one set of answers. T3, MERN, MEAN, LAMP: acronyms for filled-in grids. Once you see the grid, the names stop being intimidating and start being boring, which is the goal.
T3 is filled in. Press another stack and watch the same six slots take different answers.
Theo Browne's create-t3-app is a Next.js starter with a specific set of answers pre-filled. The pitch is "typesafe from database to browser": Prisma types the rows, tRPC carries those types across the network, TypeScript checks the whole chain. Change a column and the error shows up in the React component that uses it.
The "3 Ts": TypeScript, tRPC, Tailwind. Everything else is optional in the installer. In 2026 the DB layer is often Drizzle instead of Prisma; the shape is the same.
| piece | answers | runs |
|---|---|---|
| TypeScript | language | build time only |
| Next.js (with React) | UI, server, routing | server + browser |
| tRPC | client ↔ server, typed | both ends |
| Prisma / Drizzle + Postgres | data access + database | server |
| NextAuth (Auth.js) | auth | server |
| Tailwind | styling (question 7, if you like) | build time only |
With server components and server actions, many T3 apps now use tRPC less: a server component can just call Prisma. tRPC still earns its place when a client component needs typed data.
MongoDB, Express, React, Node. Express is a small routing library for Node; you write the server by hand. React is plain client-side React (CSR only). Mongo stores JSON documents instead of tables. There's no built-in answer for auth or type safety; you bolt on JWTs and hope.
Nothing about MERN is wrong. It's just more assembly required, and the pieces don't know about each other. Next.js's whole value is collapsing "Express + React + routing + SSR" into one thing that agrees with itself.
| question | MERN | T3 |
|---|---|---|
| language | JavaScript | TypeScript |
| UI | React (browser only) | React (server + browser) |
| server + routing | Express, hand-written | Next.js, from the filesystem |
| client ↔ server | REST + fetch, untyped | tRPC / server actions, typed |
| data | Mongoose + MongoDB | Prisma + Postgres |
| auth | roll your own | NextAuth |
Two rooms and a workshop: the browser tab, Node, and build time. Pick a piece, then click the room it runs in. Some need two rooms. If you can do this without thinking, you have the whole picture.
Postgres is its own process, usually on its own machine. It goes in the Node room here because only the server talks to it.
Pick what your app actually has and the diagram assembles itself from everything you've walked through. Then open your repo and find each piece in it.