Agent skill
tanstack-start
Install this agent skill to your Project
npx add-skill https://github.com/secondsky/claude-skills/tree/main/plugins/tanstack-start/skills/tanstack-start
SKILL.md
TanStack Start (React) — RC-Ready Playbook
Full-stack React on TanStack Router with per-route SSR/CSR, file-based routing, server functions, and first-class Cloudflare Workers support.
Use this skill when
- Building a greenfield React app that needs route-level SSR/CSR/SSG switches.
- Migrating from Next.js/React Router while keeping file-based routing + API routes.
- Shipping to edge runtimes (Workers) with typed server functions and bindings.
- You want predictable routing with type-safe params/search + built-in preloading.
What’s inside
- References: quickstart/layout, rendering modes, server functions, Cloudflare hosting, execution/auth, plus new routing/data/navigation/devtools guides.
- Script:
scripts/bootstrap-cloudflare-start.sh <app>scaffolds Start + Workers + binding types. - Troubleshooting: hydration, API routing, bindings, navigation/preloading failures.
Quick Start (React)
npm create @tanstack/start@latest my-app
cd my-app
npm run dev
Manual installs (all bundle targets are supported): add @tanstack/react-router + @tanstack/react-start with your bundler plugin (vite, webpack, or esbuild) per the official install guides.
Core layout reminder
app/routes/**file-based routes → router tree, automatic code-splitting + data preloading.app/entry.client.tsxhydrates<StartClient />;app/entry.server.tsxwrapscreateServerEntry.app/config.tsorapp/start.tssetsdefaultSsr,spaMode, middleware, and context.
Routing + Data Best Practices
- Type-safe params & search:
createFileRoute()infers path params; addvalidateSearch(zod) to parse and coerce search params. - Route matching order is deterministic (index → static → dynamic → splat); rely on this when adding catch-alls.
- Loaders run once per location change; return plain data, throw
redirect()/notFound()for control flow. - Data mutations: colocate
action/server functions; keep loaders read-only and invalidate viarouter.invalidate()after mutation. - TanStack Query bridge: create a
QueryClientin router context andensureQueryDatainside loaders to dedupe fetches. - Deferred/external data: stream partial data or read from external loaders; prefer suspense-friendly responses.
- Head management: set
headper route for<title>/meta; derive from loader data to keep SEO consistent. - Not-found/auth: throw
notFound()orredirect()in loaders/middleware; use error boundaries for UX.
Example route (typed search + data-only SSR):
// app/routes/posts.$postId.tsx
import { createFileRoute, redirect } from '@tanstack/react-router'
import { z } from 'zod'
export const Route = createFileRoute('/posts/$postId')({
validateSearch: z.object({ preview: z.boolean().optional() }),
ssr: 'data-only',
loader: async ({ params, search, context }) => {
const post = await context.queryClient.ensureQueryData(['post', params.postId], () =>
fetch(`/api/posts/${params.postId}?preview=${!!search.preview}`).then(r => r.json())
)
if (!post.published && !search.preview) throw redirect({ to: '/drafts' })
return { post }
},
})
Navigation, Preloading, and UX
- Link prefetch defaults:
<Link preload="intent">(hover/focus) preloads route data/code; usepreload="render"for above-the-fold routes. - Programmatic preloading:
router.preloadRoute({ to, search })to warm caches before navigation (e.g., on visibility). - Route masking: keep canonical URLs while showing user-friendly masks (e.g.,
/products?slug=abcmasked as/p/abc). - Navigation blocking: protect unsaved forms with
router.navigate({ to, replace, from })blockers oruseBlocker. - Scroll restoration: enable
scrollRestorationto restore positions on back/forward; customize per route when using long lists. - Search param serialization: customize parse/stringify to keep numbers/dates stable and avoid stringified booleans.
Rendering & Performance
- Per-route SSR: set
ssr: true | false | 'data-only'on routes;defaultSsrconfig sets the baseline. - Code-splitting: file-based routes auto-split; add
lazy/loadfor manual chunks on code-based routes. - Preloading strategy: pair
preload="intent"links withdefaultPreloadStaleTimeto avoid over-fetching. - Render optimizations: keep loaders pure, memoize heavy components, and use
pendingComponentfor CSR routes to avoid layout shift.
Devtools, Linting, and LLM Support
- Add
<RouterDevtools />during development to inspect matches, loader states, and preloading. - Enable the ESLint plugin
@tanstack/eslint-plugin-routerwith the recommended config to enforce inference-sensitive property order (e.g.,beforeLoadbeforeloader). - LLM-aware routing: the Router exposes structured route metadata to LLM agents; keep descriptions concise in
Routemeta for better AI navigation.
Deployment Notes (Cloudflare-friendly)
- Keep
cloudflare({ viteEnvironment: { name: 'ssr' } })first in Vite plugins so bindings reach server entry. - Regenerate bindings after changes:
npm run cf-typegen. - For static-heavy sites, enable prerender to ship HTML to Workers Assets/Pages; exclude param routes or add explicit
pages.
Ship Checklist
- Routes load without hydration warnings (prefer
ssr: 'data-only'for non-deterministic UI). - Search params validated with
validateSearchand custom serializer where needed. - Link preloading configured for high-traffic routes; blockers added for unsaved forms.
- ESLint plugin enabled (
create-route-property-orderrule) andnpm run checkpasses. - Devtools verified locally;
router.matchesstate looks correct. - Cloudflare bindings typed (
cf-typegen) and streaming tested viacurl -N.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
skill-name
[TODO: Write comprehensive description in third-person. Start with "This skill provides..." or "This skill should be used when..."] [TODO: Add "Use when" scenarios - specific situations where Claude should use this skill] [TODO: Add keywords - technologies, use cases, error messages that should trigger this skill]
websocket-implementation
Implements real-time WebSocket communication with connection management, room-based messaging, and horizontal scaling. Use when building chat systems, live notifications, collaborative tools, or real-time dashboards.
ai-sdk-ui
bun-nextjs
This skill should be used when the user asks about "Next.js with Bun", "Bun and Next", "running Next.js on Bun", "Next.js development with Bun", "create-next-app with Bun", or building Next.js applications using Bun as the runtime.
bun-sqlite
Use for bun:sqlite, SQLite operations, prepared statements, transactions, and queries.
bun-sveltekit
Use when building or running SvelteKit apps on Bun, including SSR, adapters, and Bun-specific APIs
Didn't find tool you were looking for?