The Best create-t3-app Alternative in 2026 (TanStack Start + Drizzle + Better-Auth)
The T3 stack was great in 2022. In 2026, it's technical debt waiting to happen.
I ran create-t3-app on a new project last year out of muscle memory. Three hours later I was debugging tRPC procedure types, fighting Prisma's migration tooling, and realizing I still hadn't written a single feature. That's when I decided the T3 stack and I were done.
Here's what I switched to — and why it's the best create-t3-app alternative for anyone building SaaS in 2026.
What create-t3-app Gets Wrong in 2026
The T3 stack is Next.js + tRPC + Prisma + Tailwind. It was revolutionary when type-safe full-stack was still rare. But in 2026, those same choices come with serious baggage:
- Prisma is slow at runtime. Its Rust query engine adds cold-start overhead and still can't match Drizzle ORM's performance in a real benchmark. Read the full Drizzle ORM vs Prisma performance breakdown.
- tRPC is clever, but it's a complexity tax you pay every day. Every new endpoint means defining a router, a procedure, and wiring up the client. TanStack Start server functions are just... functions.
- Next.js means Vercel. And Vercel means you'll hit a $400–600/month bill before you're profitable. I've seen it happen to founders who thought they were building lean.
- No auth, no payments, no email. create-t3-app is a skeleton. You still have to wire everything yourself — and that's 2–3 weekends of your life.
T3 taught a generation of developers to care about type safety. Good. But it's not a production SaaS starter — it's a scaffold you outgrow before you hit 100 users.
The Modern Stack: TanStack Start + Drizzle + Better-Auth
I built BetterStarter because I kept solving the same auth/payments/email problems on every project. Here's the stack I landed on after shipping multiple SaaS products:
| Layer | T3 Stack (create-t3-app) | BetterStarter |
|---|---|---|
| Framework | Next.js | TanStack Start |
| Runtime | Node.js | Bun |
| ORM | Prisma | Drizzle ORM |
| Auth | NextAuth / Auth.js | Better-Auth |
| API Layer | tRPC | Server functions (native) |
| DIY | Plunk (open-source) | |
| Payments | DIY | Stripe (pre-wired) |
| Deployment | Vercel (lock-in) | Any Bun/Node host |
Every swap is deliberate. Let me break down the three that matter most.
Why TanStack Start Replaces Next.js + tRPC
TanStack Start gives you file-based routing and server-side rendering without the App Router confusion. More importantly, it ships server functions — async functions that run on the server and are called from the client with full TypeScript types, without any extra abstraction layer like tRPC.
// server/actions/subscription.ts
import { createServerFn } from '@tanstack/start'
export const getSubscription = createServerFn()
.validator((userId: string) => userId)
.handler(async ({ data: userId }) => {
return db.select().from(subscriptions)
.where(eq(subscriptions.userId, userId))
})
No router. No procedure. No client setup. Just a fully typed function called like any other. The result is a codebase that's dramatically simpler than a tRPC setup — fewer files, fewer abstractions, less to debug.
On top of that, TanStack Start for full-stack TypeScript runs on Bun. Your dev server starts in under a second. Your tests run faster. Cold starts in serverless are noticeably snappier.
Here's the full architecture at a glance:
flowchart LR
A[Your SaaS Idea] --> B[TanStack Start on Bun]
B --> C[Server Functions]
B --> D[Better-Auth]
B --> E[Drizzle ORM]
B --> F[Stripe + Plunk Email]
C & D & E & F --> G[Ship to Production]
G --> H[Any Host — No Lock-in]
Why Drizzle ORM Is Better Than Prisma Here
Prisma isn't bad. I used it for three years. But for a Bun-first stack, Drizzle wins clearly:
- No Rust binary — Drizzle is pure TypeScript. Smaller bundle, no native compilation, no cold-start overhead.
- SQL-first — Drizzle queries read like SQL. You always know exactly what's hitting the database. No magic
.include()chains. - Bun-native — Prisma's Rust engine has friction points with Bun's runtime. Drizzle just works.
- Migration tooling that makes sense —
drizzle-kit pushin development,drizzle-kit migratein production. Simple.
// Drizzle: explicit, fast, readable
const activeProUsers = await db
.select({ id: users.id, email: users.email })
.from(users)
.where(and(
eq(users.plan, 'pro'),
gt(users.createdAt, subDays(new Date(), 30))
))
.limit(50)
You can read the full Drizzle vs Prisma performance comparison — the gap is real, especially at scale.
Why Better-Auth Over NextAuth
NextAuth (Auth.js) works fine for a weekend project. For production SaaS it falls short in two ways: its database adapters lag behind the core library, and it doesn't ship organization support, multi-session, or 2FA out of the box.
Better-Auth ships all of this from day one:
- OAuth (Google, GitHub, etc.) — built in
- Magic links, passkeys, 2FA — built in
- Multi-session management — built in
- Organization/team support — built in
- 100% self-hosted — no third-party API calls, no data leaving your server
The setup is clean and explicit:
// lib/auth.ts
import { betterAuth } from 'better-auth'
import { drizzleAdapter } from 'better-auth/adapters/drizzle'
import { organization } from 'better-auth/plugins'
export const auth = betterAuth({
database: drizzleAdapter(db, { provider: 'sqlite' }),
emailAndPassword: { enabled: true },
plugins: [organization()],
socialProviders: {
google: {
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
},
},
})
No adapter packages to keep in sync. No sessions that mysteriously expire. Just auth that works in production.
What create-t3-app Doesn't Ship (And BetterStarter Does)
The honest critique of create-t3-app is that it's a technical starter, not a product starter. It gets you type-safe API calls and a database connection. To ship an actual SaaS you still need:
- Auth with social login, magic links, and organization support
- Stripe with webhook handling, subscription tiers, and a billing portal
- Transactional email for welcome emails, password resets, and payment receipts
- Deployment config that doesn't trap you on Vercel
With create-t3-app, you spend 2–3 weekends wiring all of that. With BetterStarter, it's pre-wired — auth, Stripe, email, DB, and deployment config included — $99 one-time payment.
If you want to see the full SaaS tech stack for indie hackers that I recommend in 2026, I broke it down in detail there.
FAQ
Is create-t3-app still worth using in 2026? It's good for learning type-safe TypeScript patterns. For production SaaS, you'll outgrow it fast — no auth, no payments, no email, and it tightly couples you to Next.js and Vercel.
What's the key difference between T3 and TanStack Start? T3 uses tRPC for the API layer — a separate abstraction on top of your framework. TanStack Start has server functions built in, so you get the same end-to-end TypeScript without any extra routing layer or client setup.
Can I use Drizzle ORM with create-t3-app? Yes, create-t3-app lets you choose Drizzle or Prisma. But you're still using Next.js and wiring up auth/payments yourself. BetterStarter goes further: Drizzle, Better-Auth, and Stripe are all pre-configured on TanStack Start.
Is BetterStarter a full create-t3-app replacement? Yes — and more. It covers everything T3 does (type-safe TypeScript, Tailwind, Drizzle) plus adds auth, payments, transactional email, and deployment config ready to ship. It's a complete SaaS starter, not a scaffold.
Does this stack require Vercel? No. TanStack Start with Bun deploys to any server or container — Railway, Fly.io, your own VPS. No platform lock-in. This is one of the biggest reasons I moved away from Next.js.