home / skills / deckardger / tanstack-agent-skills / tanstack-integration
This skill helps you implement best practices for integrating TanStack Query, Router, and Start across SSR, caching, and data flow.
npx playbooks add skill deckardger/tanstack-agent-skills --skill tanstack-integrationReview the files below or copy the command above to add this skill to your agents.
---
name: tanstack-integration-best-practices
description: Best practices for integrating TanStack Query with TanStack Router and TanStack Start. Patterns for full-stack data flow, SSR, and caching coordination.
---
# TanStack Integration Best Practices
Guidelines for integrating TanStack Query, Router, and Start together effectively. These patterns ensure optimal data flow, caching coordination, and type safety across the stack.
## When to Apply
- Setting up a new TanStack Start project
- Integrating TanStack Query with TanStack Router
- Configuring SSR with query hydration
- Coordinating caching between router and query
- Setting up type-safe data fetching patterns
## Rule Categories by Priority
| Priority | Category | Rules | Impact |
|----------|----------|-------|--------|
| CRITICAL | Setup | 3 rules | Foundational configuration |
| CRITICAL | SSR Integration | 1 rule | Router + Query SSR setup |
| HIGH | Data Flow | 4 rules | Correct data fetching patterns |
| MEDIUM | Caching | 3 rules | Performance optimization |
| MEDIUM | SSR | 2 rules | Additional SSR patterns |
## Quick Reference
### Setup (Prefix: `setup-`)
- `setup-query-client-context` — Pass QueryClient through router context
- `setup-provider-wrapping` — Correctly wrap with QueryClientProvider
- `setup-stale-time-coordination` — Coordinate staleTime between router and query
### Data Flow (Prefix: `flow-`)
- `flow-loader-query-pattern` — Use loaders with ensureQueryData
- `flow-suspense-query-component` — Use useSuspenseQuery in components
- `flow-mutations-invalidation` — Coordinate mutations with query invalidation
- `flow-server-functions-queries` — Use server functions for query functions
### Caching (Prefix: `cache-`)
- `cache-single-source` — Let TanStack Query manage caching
- `cache-preload-coordination` — Coordinate preloading between router and query
- `cache-invalidation-patterns` — Unified invalidation patterns
### SSR Integration (Prefix: `ssr-`)
- `ssr-dehydrate-hydrate` — Use setupRouterSsrQueryIntegration for automatic SSR
### Additional SSR (Prefix: `ssr-`)
- `ssr-per-request-client` — Create QueryClient per request
- `ssr-streaming-queries` — Handle streaming with queries
## How to Use
Each rule file in the `rules/` directory contains:
1. **Explanation** — Why this pattern matters
2. **Bad Example** — Anti-pattern to avoid
3. **Good Example** — Recommended implementation
4. **Context** — When to apply or skip this rule
## Full Reference
See individual rule files in `rules/` directory for detailed guidance and code examples.
This skill describes practical best practices for integrating TanStack Query with TanStack Router and TanStack Start. It focuses on full-stack data flow, SSR coordination, and unified caching for predictable client and server behavior. The guidance targets setup, loader/component patterns, and per-request SSR concerns to reduce bugs and improve performance.
The skill inspects integration patterns and provides rules that map to concrete implementation steps like provider wrapping, router-context wiring, and query hydration on SSR. It highlights loader-based fetching, useSuspenseQuery usage, mutation invalidation coordination, and a single source of caching governed by TanStack Query. Each rule bundles rationale, anti-patterns, and recommended code patterns for quick application.
Do I need a separate cache for the router and Query?
No. Let TanStack Query manage caching; coordinate the router to populate or preload the query cache rather than duplicating state.
How do I avoid duplicate fetches between loaders and components?
Use loaders to call ensureQueryData and have components useSuspenseQuery or standard query hooks so they read from the populated cache instead of refetching.