Dev Tools

TanStack Start Just Replaced Remix

All articles
🧬⚛️🛣️

Type-safe routing all the way down — and the migration story actually works

Plot twist: Remix didn't get killed by Next.js, it got killed by TanStack. Start 1.0 hit GA this week and it ships full-stack React on top of TanStack Router. Type-safe to the moon.

The Setup

If you've used TanStack Query you already know the vibes — small, composable, ruthlessly typed. Start is the missing server piece. File-based routing, Vite under the hood, and loaders that are actually inferred end-to-end.

bun create @tanstack/start@latest my-app
cd my-app
bun install
bun run dev

The Money Pattern

A route file with a typed loader plus a component, behold:

import { createFileRoute } from '@tanstack/start';

export const Route = createFileRoute('/deals/$dealId')({
  loader: async ({ params }) => {
    const deal = await fetch(`/api/pipedrive/deals/${params.dealId}`)
      .then((r) => r.json());
    return { deal };
  },
  component: DealPage,
});

function DealPage() {
  const { deal } = Route.useLoaderData();
  return <h1>{deal.title}</h1>;
}

That `deal` is fully typed at the consumer with zero generics ceremony. The loader return type flows down. Cursor and Claude Code go feral with this much type info.

The Catch

You're locking in to the TanStack ecosystem. Router, Query, Form, Table, Start — they're all designed to compose with each other and they assume you're using the whole stack. If TanStack ever stops shipping, you're holding the bag. Also: SSR streaming has rough edges on edge runtimes.

The Verdict

For a Supabase-backed dashboard with a hundred typed routes, TanStack Start is the new default. Remix had a great run, but the React Router merge muddied the story and Start is just cleaner. I'd ship a Rebuild Relief internal tool on this tomorrow. Try it.

Let us make some quick suggestions?
Please provide your full name.
Please provide your phone number.
Please provide a valid phone number.
Please provide your email address.
Please provide a valid email address.
Please provide your brand name or website.
Please provide your brand name or website.