TanStack Start

TanStack Start

Full-stack React framework powered by TanStack Router

Features

  • Full-stack React with type-safe routing
  • Server functions with RPC-style client-server communication
  • Built on TanStack Router's type-safe navigation
  • First-class integration with TanStack Query
  • SSR, streaming, and server-side data loading

Pros

  • End-to-end type safety from routes to data fetching
  • Leverages proven TanStack ecosystem (Router, Query)
  • Flexible deployment targets via Nitro/Vinxi

Cons

  • Newer framework — still stabilizing APIs
  • Smaller ecosystem compared to Next.js or Remix
  • Requires buy-in to TanStack Router paradigm

Overview

TanStack Start is a full-stack React framework built on top of TanStack Router, bringing type-safe routing, server functions, and SSR into a cohesive development experience. Created by Tanner Linsley, it extends the TanStack ecosystem’s philosophy of type safety and developer experience into full-stack territory.

The framework uses server functions for RPC-style communication between client and server, eliminating the need for manual API route definitions. Combined with TanStack Router’s fully type-safe route definitions and TanStack Query’s data management, it provides end-to-end type safety from database queries to UI rendering. Deployment is flexible through Nitro/Vinxi, supporting Node.js, serverless, and edge runtimes.

When to Use

TanStack Start is the right choice when you want maximum type safety across your full-stack React application, when you’re already invested in the TanStack ecosystem (Query, Router, Table), or when you want a modern alternative to Next.js with a stronger focus on type-safe data flow.

Getting Started

npx create-start@latest my-app
cd my-app && npm install && npm run dev
// app/routes/index.tsx
import { createFileRoute } from "@tanstack/react-router";

export const Route = createFileRoute("/")({
  loader: async () => ({ message: "Hello, TanStack Start!" }),
  component: Index,
});

function Index() {
  const data = Route.useLoaderData();
  return <h1>{data.message}</h1>;
}