TL;DR
TanStack Start is the full-stack framework built by Tanner Linsley on top of TanStack Router. Released in 2025, it's still maturing but already competitive for SaaS projects that want type-safe routing, fine-grained SSR, and no vendor lock-in. The starter ecosystem is small compared to Next.js, but growing fast. If you love TanStack Query and TanStack Router, TanStack Start is the natural completion of that stack.
Key Takeaways
- TanStack Start = TanStack Router + SSR + Server Functions — the first framework to treat routing as a first-class type-safe concern
-
File-based routing with full type safety —
href="/users/$userId"is typed, params are typed, no string guessing - Vinxi + Vite underneath — faster builds than webpack, standard Vite ecosystem
- Works with any database — no Prisma, no ORM included, bring your own stack
- Still v1.x — smaller ecosystem than Next.js, but production-ready for teams that adopt early
- Best for: Teams already using TanStack Router + TanStack Query who want to go full-stack
What Makes TanStack Start Different
Most React meta-frameworks (Next.js, Remix) were designed around a different set of routing primitives. TanStack Start is built from scratch on TanStack Router — which means:
-
Routes are typed end-to-end — no
useParams<{ id: string }>()type assertions - Search params are first-class — validated, typed, serializable
-
Loaders are type-safe —
useLoaderData()returns the correct type without inference hacks -
Server functions are colocated —
createServerFn()next to the component that calls it
// routes/users/$userId.tsx
// Server function — runs on the server, fully typed
const getUser = createServerFn({ method: "GET" })
.validator((data: string) => data)
.handler(async ({ data: userId }) => {
return db.user.findUnique({ where: { id: userId } });
});
loader: ({ params }) => getUser({ data: params.userId }),
component: UserPage,
});
function UserPage() {
const user = Route.useLoaderData(); // typed — no cast needed
const { userId } = Route.useParams(); // typed — no cast needed
return <div>{user.name}</div>;
}
Current Starters Ecosystem
TanStack Start's ecosystem is still young. Here are the most notable starters:
Official Starters
# Basic TanStack Start project
npx create-tsrouter-app@latest my-app --framework=react --bundler=vite --add-ons=tsr
# With Clerk auth
npx create-tsrouter-app@latest my-app --add-ons=clerk
Official templates on GitHub:
-
tanstack/router/examples/react/start-basic— minimal starter -
tanstack/router/examples/react/start-convex— Convex + TanStack Start -
tanstack/router/examples/react/start-clerk-basic— Clerk auth -
tanstack/router/examples/react/start-trpc-react-query— tRPC integration
Community SaaS Starters
create-tsrouter-app — Official CLI tool that scaffolds TanStack Start projects with optional add-ons (Clerk, Convex, Tailwind, shadcn).
tanstack-start-clerk-convex (community) — Full SaaS stack with Clerk auth + Convex backend + Stripe.
start-saas (community) — TanStack Start + Better Auth + Drizzle + Stripe. More traditional server stack.
Vinxi starter templates — Lower-level starters using the underlying Vinxi build tool.
Complete SaaS Stack with TanStack Start
A production TanStack Start SaaS stack in 2026:
Framework: TanStack Start (TanStack Router + Server Functions)
Database: PostgreSQL via Neon or Supabase
ORM: Drizzle (most popular TanStack pairing)
Auth: Clerk or Better Auth
Billing: Stripe
Email: Resend
UI: shadcn/ui + Tailwind CSS
State: TanStack Query (built-in async state)
Deployment: Vercel, Netlify, or Cloudflare Workers
Key Patterns
Server functions replace API routes:
// app/routes/api/stripe.ts
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
.validator((data: { priceId: string; userId: string }) => data)
.handler(async ({ data }) => {
const session = await stripe.checkout.sessions.create({
payment_method_types: ["card"],
line_items: [{ price: data.priceId, quantity: 1 }],
mode: "subscription",
success_url: `${process.env.APP_URL}/dashboard?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${process.env.APP_URL}/pricing`,
metadata: { userId: data.userId },
});
return { url: session.url };
});
// React component
function PricingButton({ priceId }) {
const { userId } = useUser(); // Clerk hook
const handleClick = async () => {
const { url } = await createCheckoutSession({ data: { priceId, userId } });
window.location.href = url!;
};
return <button onClick={handleClick}>Subscribe</button>;
}
Drizzle schema + TanStack Query:
// db/schema.ts — Drizzle schema
id: text("id").primaryKey(),
email: text("email").notNull().unique(),
createdAt: timestamp("created_at").defaultNow(),
subscriptionStatus: text("subscription_status").default("free"),
});
// routes/dashboard.tsx
loader: async () => {
const user = await getUserFromDb({ data: getCurrentUserId() });
return { user };
},
component: Dashboard,
});
TanStack Start vs Next.js for SaaS
| Feature | TanStack Start | Next.js |
|---|---|---|
| Routing type safety | ✅ Full — params, search, loaders typed | ⚠️ Limited — manual type assertions |
| Server components | ⚠️ Server functions (different model) | ✅ Full RSC support |
| Ecosystem | 🟡 Growing but small | ✅ Largest in the industry |
| Boilerplates | 🟡 10-20 community starters | ✅ 100+ premium starters |
| Vercel integration | ✅ Works | ✅ Native |
| Edge deployment | ✅ Cloudflare Workers | ✅ Edge Runtime |
| Stability | 🟡 v1.x, still evolving | ✅ v14+, battle-tested |
| Learning curve | Medium (if new to TanStack Router) | Low–Medium |
| Performance | ✅ Vite-based, fast DX | ✅ Fast (turbopack) |
When TanStack Start Wins
TanStack Start outperforms Next.js in developer experience when:
- Your app has complex search param state — filters, pagination, sort — TanStack Router handles this with zero boilerplate
- You value type safety everywhere — the typed routing system eliminates a whole class of bugs
- You want to avoid React Server Components complexity — server functions are simpler to reason about
- You're already on TanStack Router — Start is the natural next step for SPA-to-SSR migration
When Next.js Still Wins
- You need the most boilerplate options — ShipFast, Makerkit, Supastarter, etc. are Next.js only
- You need React Server Components — TanStack Start has a different server model
- Team familiarity — most React developers know Next.js conventions
- Production maturity — Next.js has years of edge cases solved
The "Start" in TanStack Start
The name refers to "Start" as in server start, but it also represents where the framework is in its lifecycle. Unlike Next.js (14+ stable versions) or Remix (now React Router v7), TanStack Start is v1.x — actively being developed with APIs still evolving.
What this means for your SaaS:
- API stability is improving but breaking changes are possible between minor versions
- Documentation gaps exist, especially for advanced patterns
- Community resources (blog posts, Stack Overflow, YouTube) are still growing
- Production adoption is increasing but not yet mainstream
For a boilerplate choice, this means TanStack Start is an early adopter bet — excellent for teams that want the type-safety benefits and don't mind being on the frontier.
Recommended TanStack Start Starter
For a new SaaS project in 2026, the most production-ready free starting point is:
npx create-tsrouter-app@latest my-saas \
--framework=react \
--bundler=vite \
--add-ons=clerk \
--add-ons=shadcn
Then add manually:
- Drizzle ORM + Neon PostgreSQL
- Stripe billing via server functions
- Resend for email
Total cost at launch: $0/month (Neon free tier + Clerk free tier + Vercel free tier).
Methodology
- Reviewed TanStack Start docs, changelog, and GitHub discussions as of March 2026
- Tested
create-tsrouter-appscaffolding across Next.js, React, and Vinxi modes - Analyzed community starters on GitHub (stars, commit activity, issue tracker)
- Compared server function patterns vs Next.js Route Handlers and Remix actions
- Reviewed TanStack Router v1 stability notes and upgrade guides
Find all TanStack Start and React full-stack boilerplates on StarterPick.
Top comments (0)