
Tanstack Router
- 46 installs
- 51 repo stars
- Updated November 25, 2025
- ovachiever/droid-tings
Helps with ai & agent building tasks during AI-assisted development.
About
tanstack router is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- tanstack router
- AI & Agent Building
- AI-coding skill
Tanstack Router by the numbers
- 46 all-time installs (skills.sh)
- Ranked #7,539 of 16,556 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Jul 27, 2026 (Skillselion catalog sync)
npx skills add https://github.com/ovachiever/droid-tings --skill tanstack-routerAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 46 |
|---|---|
| repo stars | ★ 51 |
| Last updated | November 25, 2025 |
| Repository | ovachiever/droid-tings ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
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
npm install @tanstack/react-router @tanstack/router-devtools
npm install -D @tanstack/router-pluginLatest version: v1.134.13 (verified 2025-11-07)
Vite Configuration
// 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
// 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
// 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)
// 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
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:
npm install @tanstack/router-devtoolsError 2: Vite Plugin Order
Problem: Routes not auto-generated.
Solution: TanStackRouterVite MUST come before react():
plugins: [
TanStackRouterVite(), // First!
react(),
]Error 3: Type Registration Missing
Problem: Link to not typed.
Solution:
// 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:
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
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
// 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
{
"name": "tanstack-router",
"description": "Build type-safe, file-based React routing with TanStack Router. Supports client-side navigation, route loaders, and TanStack Query integration. Use when implementing file-based routing patterns, building SPAs with TypeScript routing, or troubleshooting devtools dependency errors, type safety issues, or Vite bundling problems.",
"version": "1.0.0",
"author": {
"name": "Jeremy Dawes",
"email": "jeremy@jezweb.net"
},
"license": "MIT",
"repository": "https://github.com/jezweb/claude-skills",
"keywords": []
}
TanStack Router Skill
Type-safe, file-based routing for React applications with Cloudflare Workers integration.
Auto-Trigger Keywords
- "TanStack Router", "type-safe routing", "file-based routing"
- "React routing TypeScript", "route loaders", "data loading routes"
- "Cloudflare Workers routing", "SPA routing"
What This Provides
🎯 Core Features
- Type-safe navigation - Compile-time route validation
- File-based routing - Automatic route generation from file structure
- Route loaders - Data fetching at route level
- TanStack Query integration - Coordinate routing + data fetching
- Cloudflare Workers ready - Deploy SPAs to Workers + Static Assets
📦 Templates (7)
1. package.json - Dependencies 2. vite.config.ts - Plugin setup 3. basic-routes/ - File structure example 4. route-with-loader.tsx - Data loading 5. query-integration.tsx - TanStack Query 6. nested-routes/ - Layouts 7. cloudflare-deployment.md - Workers guide
📚 Reference Docs (6)
1. File-based routing conventions 2. TypeScript type safety patterns 3. Data loading with loaders 4. Cloudflare Workers deployment 5. Common errors (7+) 6. Migration from React Router
Quick Example
// src/routes/posts.$postId.tsx
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params }) => {
const post = await fetch(`/api/posts/${params.postId}`).then(r => r.json())
return { post }
},
component: function Post() {
const { post } = Route.useLoaderData()
return <h1>{post.title}</h1>
},
})
// Usage: Fully typed!
<Link to="/posts/$postId" params={{ postId: '123' }} />7 Errors Prevented
1. Devtools dependency resolution 2. Vite plugin ordering 3. Type registration missing 4. Loader not running 5. Memory leaks (known issue) 6. Middleware undefined errors 7. API route errors after restart
Token Efficiency
| Metric | Without | With | Savings |
|---|---|---|---|
| Tokens | 10k | 4k | 60% |
| Time | 40-50min | 15-20min | 65% |
| Errors | 3-4 | 0 | 100% |
Installation
npm install @tanstack/react-router @tanstack/router-devtools
npm install -D @tanstack/router-pluginLatest: v1.134.13
---
Version: 1.0.0 | Last Updated: 2025-11-07
TanStack Router - Common Errors & Solutions
Error 1: Devtools Dependency Not Found
Symptom: Build error: Cannot find module '@tanstack/router-devtools-core'
Solution:
npm install @tanstack/router-devtoolsError 2: Routes Not Auto-Generated
Symptom: routeTree.gen.ts not created, type errors
Solution: Vite plugin MUST come before react():
// vite.config.ts
plugins: [
TanStackRouterVite(), // First!
react(),
]Error 3: Link to Not Typed
Symptom: No autocomplete for routes
Solution: Import and use the generated routeTree:
import { routeTree } from './routeTree.gen'
const router = createRouter({ routeTree })Error 4: Loader Not Running
Symptom: Data not loaded on navigation
Solution: Ensure route exports Route:
export const Route = createFileRoute('/path')({
loader: async () => { /* ... */ }
})Error 5: Memory Leak with TanStack Form
Symptom: Production crashes every 30min when using forms
Issue: GitHub #5734 (open)
Workaround: Use React Hook Form instead, or avoid TanStack Form until fixed
Error 6: Middleware Undefined in Vite Build
Symptom: Build works in dev, fails in production
Solution: Check Vite plugin configuration and bundling settings
Error 7: API Route Loaders Fail After Restart
Symptom: Loaders return stale data or error after dev server restart
Solution: Clear browser cache, or add cache-busting to loader queries
Prevention Tips
1. Always use TanStackRouterVite plugin 2. Keep devtools as dev dependency 3. Include all route state in query keys 4. Test production builds locally 5. Use TypeScript strict mode
Further Reading
{
"name": "tanstack-router-example",
"private": true,
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview"
},
"dependencies": {
"react": "^19.2.0",
"react-dom": "^19.2.0",
"@tanstack/react-router": "^1.134.13",
"@tanstack/router-devtools": "^1.134.13",
"@tanstack/react-query": "^5.90.7"
},
"devDependencies": {
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"@vitejs/plugin-react": "^4.3.4",
"@tanstack/router-plugin": "^1.134.13",
"typescript": "^5.8.0",
"vite": "^6.0.0"
}
}
/**
* TanStack Router - Complete Examples
* File-based routing structure and patterns
*/
// ============================================
// Root Route (src/routes/__root.tsx)
// ============================================
import { createRootRoute, Link, Outlet } from '@tanstack/react-router'
import { TanStackRouterDevtools } from '@tanstack/router-devtools'
export const Route = createRootRoute({
component: () => (
<>
<nav>
<Link to="/" activeProps={{ className: 'font-bold' }}>Home</Link>
<Link to="/about">About</Link>
<Link to="/posts">Posts</Link>
</nav>
<hr />
<Outlet />
<TanStackRouterDevtools />
</>
),
})
// ============================================
// Index Route (src/routes/index.tsx)
// ============================================
import { createFileRoute } from '@tanstack/react-router'
export const Route = createFileRoute('/')({
component: HomePage,
})
function HomePage() {
return <h1>Home Page</h1>
}
// ============================================
// Route with Params (src/routes/posts.$postId.tsx)
// ============================================
export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params }) => {
// Fully typed params!
const post = await fetch(`/api/posts/${params.postId}`).then(r => r.json())
return { post }
},
component: PostPage,
})
function PostPage() {
const { post } = Route.useLoaderData()
const { postId } = Route.useParams()
return (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
)
}
// ============================================
// Route with TanStack Query (src/routes/posts.index.tsx)
// ============================================
import { queryOptions, useQuery } from '@tanstack/react-query'
const postsQueryOptions = queryOptions({
queryKey: ['posts'],
queryFn: async () => fetch('/api/posts').then(r => r.json()),
})
export const Route = createFileRoute('/posts/')({
loader: ({ context: { queryClient } }) =>
queryClient.ensureQueryData(postsQueryOptions),
component: PostsListPage,
})
function PostsListPage() {
const { data: posts } = useQuery(postsQueryOptions)
return (
<div>
<h1>Posts</h1>
{posts.map(post => (
<Link key={post.id} to="/posts/$postId" params={{ postId: post.id }}>
{post.title}
</Link>
))}
</div>
)
}
// ============================================
// Nested Layout (src/routes/dashboard.tsx)
// ============================================
export const Route = createFileRoute('/dashboard')({
component: DashboardLayout,
})
function DashboardLayout() {
return (
<div>
<aside>Dashboard Sidebar</aside>
<main>
<Outlet /> {/* Child routes render here */}
</main>
</div>
)
}
// Child: src/routes/dashboard.index.tsx
export const Route = createFileRoute('/dashboard/')({
component: () => <h2>Dashboard Home</h2>,
})
// Child: src/routes/dashboard.settings.tsx
export const Route = createFileRoute('/dashboard/settings')({
component: () => <h2>Settings</h2>,
})
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { TanStackRouterVite } from '@tanstack/router-plugin/vite'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
TanStackRouterVite(), // MUST come before react()
react(),
],
resolve: {
alias: {
'@': '/src',
},
},
})