Start routing data
Skill fusengine/agents/plugins/tanstack-start-expert/skills/start-routing-data
Use when: loading data in TanStack Start routes with isomorphic loaders, wiring TanStack Query into a Start loader (ensureQueryData), running mutations via server functions, or tuning per-route SSR (ssr flag). Do NOT use for: generic TanStack Router/Query API — route trees, search params, useQuery/useMutation basics (use react-expert's react-tanstack-router).From its SKILL.md
npx -y skills add fusengine/agents --skill start-routing-dataAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 22 stars22 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.9 KB, ~1.0k tokens by cl100k_base, as published. Nobody here has run it
TanStack Start — Routing Data
Agent Workflow (MANDATORY)
Before ANY implementation, spawn in parallel:
- fuse-ai-pilot:explore-codebase — map
src/routes/, existing loaders,router.tsx, queryClient wiring - fuse-ai-pilot:research-expert — verify Start API via Context7
/websites/tanstack_start_framework_react - mcp__context7__query-docs — confirm loader / ssr / ensureQueryData signatures
After implementation, run fuse-ai-pilot:sniper.
Scope Boundary (READ FIRST)
Generic TanStack Router and TanStack Query — route trees, file-based routing, search-param validation, useQuery/useMutation mechanics, cache config — are covered by react-expert's react-tanstack-router. This skill covers ONLY what is specific to Start:
- Loaders are isomorphic (server on first request, client on navigation)
context.queryClient.ensureQueryData()inside a loader (SSR prefetch + hydration)- Per-route
ssr: true | false | 'data-only' - Mutations through server functions +
router.invalidate()
Overview
| Start-specific feature | Description |
|---|---|
| Isomorphic loader | Route.loader runs on server (initial) AND client (navigation) — no window at top level |
| Query in loader | ensureQueryData(queryOptions) prefetches on server, useQuery reads cache in component |
| Selective SSR | ssr flag per route: full SSR, data-only, or client-only |
| Server-fn mutation | Call createServerFn handler, then router.invalidate() to refetch loaders |
Critical Rules
- Loaders are isomorphic — never touch
window/localStorageat loader top level; gate withssr: false/'data-only'oruseEffect. - Share
queryOptions— define once, pass to BOTHensureQueryData(loader) anduseQuery(component) so the cache key matches. - Prefetch via
context.queryClient— the loader receivesqueryClientfrom router context; do not create a new client. - Mutations invalidate — after a server-fn write, call
router.invalidate()(loader data) orqueryClient.invalidateQueries(Query cache). ssrinherits down and only tightens — a child cannot loosen a parent'sssr: falseback totrue.
Architecture
src/
├── router.tsx # createRouter({ context: { queryClient } })
├── routes/
│ └── posts.$postId.tsx # loader: ensureQueryData + component: useQuery
└── queries/
└── posts.ts # queryOptions factory (shared loader + component)
→ See query-loader-route.md for the complete route
Reference Guide
Concepts
| Topic | Reference | Load when |
|---|---|---|
| Isomorphic loaders | isomorphic-loaders.md | Loader touches browser API or you see hydration mismatch |
| Query in loader | query-in-loader.md | Integrating TanStack Query prefetch with a Start loader |
| Selective SSR | selective-ssr.md | Disabling/tuning SSR per route |
| Mutations | mutations.md | Writing data via server functions and refreshing the UI |
Templates
| Template | When to Use |
|---|---|
| query-loader-route.md | Route that prefetches with Query and reads in the component |
| selective-ssr-route.md | Route needing client-only render or data-only SSR |
Best Practices
DO
- Keep
queryOptionsfactories insrc/queries/and reuse them loader + component - Return the
ensureQueryDatapromise directly from the loader (Start awaits it) - Use
ssr: 'data-only'when the component needswindowbut the data should still SSR
DON'T
- Duplicate query keys between loader and component (breaks hydration dedupe)
- Read
localStorage/windowat loader top level (loader also runs on the server) - Re-fetch in
useEffectwhen the loader already primed the cache
What ships with it: 6 files
20.7 KB alongside SKILL.md
references/
- isomorphic-loaders.md3.0 KB
- mutations.md2.9 KB
- query-in-loader.md3.3 KB
- selective-ssr.md3.3 KB
- templates/query-loader-route.md4.3 KB
- templates/selective-ssr-route.md3.9 KB