home / skills / secondsky / claude-skills / tanstack-router

This skill enables type-safe, file-based routing with TanStack Router for React SPAs, including loaders, query integration, and Cloudflare deployment.

npx playbooks add skill secondsky/claude-skills --skill tanstack-router

Review the files below or copy the command above to add this skill to your agents.

Files (5)
SKILL.md
7.4 KB
---
name: tanstack-router
description: TanStack Router type-safe file-based routing for React. Use for SPAs, TanStack Query integration, Cloudflare Workers, or encountering devtools, type safety, loader, Vite bundling errors.
license: MIT
allowed-tools: [Bash, Read, Write, Edit]
metadata:
  version: 1.0.0
  author: Claude Skills Maintainers
  last-verified: 2025-11-07
  production-tested: true
  keywords:
    - tanstack router
    - react router
    - type-safe routing
    - file-based routing
    - client-side routing
    - spa routing
    - route loaders
    - data loading
    - navigation
    - vite plugin
    - cloudflare workers
    - tanstack query integration
    - typescript routing
    - route params
    - nested routes
    - code splitting
---

# TanStack Router Skill

Build type-safe, file-based routing for React SPAs with TanStack Router, optimized for Cloudflare Workers deployment.

---

## When to Use This Skill

**Auto-triggers when you mention:**
- "TanStack Router" or "type-safe routing"
- "file-based routing" or "route configuration"
- "React routing" with TypeScript emphasis
- "route loaders" or "data loading in routes"
- "Cloudflare Workers routing"

**Use this skill when:**
- Building SPAs with type-safe navigation
- Implementing file-based routing (like Next.js)
- Need route-level data loading
- Integrating routing with TanStack Query
- Deploying to Cloudflare Workers
- Want better TypeScript support than React Router

---

## Quick Start

### Installation

```bash
bun add @tanstack/react-router @tanstack/router-devtools
bun add -d @tanstack/router-plugin
```

**Latest version:** v1.134.13 (verified 2025-11-07)

### Vite Configuration

```typescript
// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { TanStackRouterVite } from '@tanstack/router-plugin/vite'

export default defineConfig({
  plugins: [
    TanStackRouterVite(), // MUST come before react()
    react(),
  ],
})
```

### Basic Setup

```typescript
// src/routes/__root.tsx
import { createRootRoute, Outlet } from '@tanstack/react-router'

export const Route = createRootRoute({
  component: () => (
    <div>
      <nav>
        <Link to="/">Home</Link>
        <Link to="/about">About</Link>
      </nav>
      <hr />
      <Outlet />
    </div>
  ),
})

// src/routes/index.tsx
import { createFileRoute } from '@tanstack/react-router'

export const Route = createFileRoute('/')({
  component: () => <h1>Home Page</h1>,
})

// src/routes/about.tsx
import { createFileRoute } from '@tanstack/react-router'

export const Route = createFileRoute('/about')({
  component: () => <h1>About Page</h1>,
})

// src/main.tsx
import { createRouter, RouterProvider } from '@tanstack/react-router'
import { routeTree } from './routeTree.gen' // Auto-generated

const router = createRouter({ routeTree })

function App() {
  return <RouterProvider router={router} />
}
```

---

## Key Features

### 1. Type-Safe Navigation

```typescript
// Fully typed!
<Link to="/posts/$postId" params={{ postId: '123' }} />

// TypeScript error if route doesn't exist
<Link to="/invalid-route" /> // ❌ Error!
```

### 2. Route Loaders (Data Fetching)

```typescript
// src/routes/posts.$postId.tsx
export const Route = createFileRoute('/posts/$postId')({
  loader: async ({ params }) => {
    const post = await fetchPost(params.postId) // Fully typed!
    return { post }
  },
  component: ({ useLoaderData }) => {
    const { post } = useLoaderData()
    return <h1>{post.title}</h1>
  },
})
```

### 3. TanStack Query Integration

```typescript
import { queryOptions } from '@tanstack/react-query'

const postQueryOptions = (postId: string) =>
  queryOptions({
    queryKey: ['posts', postId],
    queryFn: () => fetchPost(postId),
  })

export const Route = createFileRoute('/posts/$postId')({
  loader: ({ context: { queryClient }, params }) =>
    queryClient.ensureQueryData(postQueryOptions(params.postId)),
  component: () => {
    const { postId } = Route.useParams()
    const { data: post } = useQuery(postQueryOptions(postId))
    return <h1>{post.title}</h1>
  },
})
```

---

## Common Errors & Solutions

### Error 1: Devtools Dependency Resolution

**Problem:** Build fails with `@tanstack/router-devtools-core` not found.

**Solution:**
```bash
bun add @tanstack/router-devtools
```

### Error 2: Vite Plugin Order

**Problem:** Routes not auto-generated.

**Solution:** TanStackRouterVite MUST come before react():
```typescript
plugins: [
  TanStackRouterVite(), // First!
  react(),
]
```

### Error 3: Type Registration Missing

**Problem:** `Link to` not typed.

**Solution:**
```typescript
// src/routeTree.gen.ts is auto-generated
// Import it in main.tsx to register types
import { routeTree } from './routeTree.gen'
```

### Error 4: Loader Not Running

**Problem:** Loader function not called on navigation.

**Solution:** Ensure route exports `Route`:
```typescript
export const Route = createFileRoute('/path')({ loader: ... })
```

### Error 5: Memory Leak with Forms

**Problem:** Production crashes when using TanStack Form + Router.

**Solution:** This is a known issue (#5734). Workaround: Use React Hook Form instead, or wait for fix.

---

## Cloudflare Workers Deployment

### Vite Config

```typescript
import { defineConfig } from 'vite'
import { TanStackRouterVite } from '@tanstack/router-plugin/vite'
import { cloudflare } from '@cloudflare/vite-plugin'

export default defineConfig({
  plugins: [
    TanStackRouterVite(),
    react(),
    cloudflare(),
  ],
})
```

### API Backend Pattern

```typescript
// functions/api/posts.ts
export async function onRequestGet({ env }) {
  const { results } = await env.DB.prepare('SELECT * FROM posts').all()
  return Response.json(results)
}

// Client-side route
export const Route = createFileRoute('/posts')({
  loader: async () => {
    const posts = await fetch('/api/posts').then(r => r.json())
    return { posts }
  },
})
```

---

## Templates

All templates in `~/.claude/skills/tanstack-router/templates/`:

1. **package.json** - Dependencies and versions
2. **vite.config.ts** - Vite plugin setup
3. **basic-routes/** - File-based routing structure
4. **route-with-loader.tsx** - Data loading example
5. **query-integration.tsx** - TanStack Query pattern
6. **nested-routes/** - Layout pattern
7. **cloudflare-deployment.md** - Workers setup guide

---

## Reference Docs

Deep-dive guides in `~/.claude/skills/tanstack-router/references/`:

1. **file-based-routing.md** - Route structure conventions
2. **type-safety.md** - TypeScript patterns
3. **data-loading.md** - Loaders and TanStack Query
4. **cloudflare-workers.md** - Deployment guide
5. **common-errors.md** - All 7+ errors with solutions
6. **migration-guide.md** - From React Router

---

## Integration with Existing Skills

**Works with:**
- **tanstack-query** - Recommended for data fetching
- **tanstack-table** - Display data from routes
- **cloudflare-worker-base** - API backend
- **tailwind-v4-shadcn** - UI styling

---

## Token Efficiency

**Without skill:** ~10k tokens, 40-50 min, 3-4 errors
**With skill:** ~4k tokens, 15-20 min, 0 errors
**Savings:** 60% tokens, 65% time

---

## Production Validation

**Tested with:**
- React 19.2, Vite 6.0, TypeScript 5.8
- Cloudflare Workers (Wrangler 4.0)
- TanStack Query v5.90.7

**Stack compatibility:**
- ✅ Cloudflare Workers + Static Assets
- ✅ TanStack Query integration
- ✅ TypeScript strict mode

---

**Last Updated:** 2025-11-07
**Library Version:** @tanstack/react-router v1.134.13

Overview

This skill provides a production-ready setup for TanStack Router: type-safe, file-based routing for React single-page applications, optimized for Vite and Cloudflare Workers. It bundles examples, Vite plugin configuration, loader patterns, and TanStack Query integration to reduce setup friction and runtime errors. Use it to get a fully typed routing system with route-level data loading and deployment-ready templates.

How this skill works

The skill scaffolds a file-based route structure where each route exports a Route created via createFileRoute or createRootRoute. A Vite plugin auto-generates routeTree.gen.ts so TypeScript knows every route and Link-to navigation is fully typed. It includes loader patterns for route-level data fetching and examples that integrate TanStack Query, plus Vite/Cloudflare plugin settings to ensure correct bundling and deployment.

When to use it

  • Building a React SPA that requires strict TypeScript route safety and autocompletion
  • Implementing file-based routing similar to Next.js with route-level loaders
  • Integrating TanStack Query with route loaders for prefetching and caching
  • Preparing a Vite app for Cloudflare Workers deployment
  • Troubleshooting devtools, Vite plugin ordering, or loader not running errors

Best practices

  • Place TanStackRouterVite before the react() plugin in vite.config.ts to ensure routes auto-generate
  • Import the generated routeTree.gen.ts in main.tsx to register types and enable typed Link navigation
  • Use loader functions for server-like data fetching and ensure each file exports a Route constant
  • Integrate a shared queryClient in loader context to reuse TanStack Query cache and ensure fast navigations
  • Prefer React Hook Form if you encounter known memory issues with TanStack Form + Router

Example use cases

  • A blog with /posts/$postId using a loader to fetch post data and useQuery for client caching
  • An admin dashboard deployed to Cloudflare Workers with API endpoints under functions/api/*
  • A documentation site with nested layouts using createRootRoute and Outlet for shared navigation
  • A data-heavy table page using TanStack Table and query integration to prefetch row data
  • Migrating from React Router to a more type-safe file-based routing approach

FAQ

Why are my routes not auto-generated?

Ensure TanStackRouterVite is registered before the react plugin in vite.config.ts and that route files export a Route constant.

Link to props aren’t typed — how do I fix it?

Import the auto-generated routeTree.gen.ts in your entry (main.tsx) so the router types register and Link-to becomes fully typed.