---
name: tanstack-devtools
description: 'TanStack DevTools for debugging Query, Router, and Form state in React apps. Use when setting up devtools, debugging cache state, or inspecting route trees. Use for devtools, react-query-devtools, router-devtools, form-devtools, debug, inspect, cache-viewer.'
license: MIT
metadata:
author: oakoss
version: '1.1'
source: 'https://tanstack.com/devtools/latest/docs'
---
# TanStack DevTools
## Overview
TanStack DevTools provides debugging panels for inspecting Query cache state, Router route trees, and Form field state in React applications. There are two approaches: **standalone devtools** per library (`ReactQueryDevtools`, `TanStackRouterDevtools`) and the **unified TanStack Devtools** panel that combines all libraries into a single interface with plugin architecture.
**When to use:** Setting up devtools for TanStack libraries, debugging query cache behavior, inspecting route matching, monitoring form field state, or combining multiple TanStack devtools into one panel.
**When NOT to use:** Production debugging (devtools are tree-shaken in production by default), non-React frameworks without adapter support, or custom state management unrelated to TанStack libraries.
## Quick Reference
| Pattern | API | Key Points |
| -------------------------- | ----------------------------------------- | --------------------------------------------------- |
| Query devtools (floating) | `` | Auto-connects to nearest QueryClient |
| Query devtools (embedded) | `` | Embed in custom layout |
| Router devtools (floating) | `` | Place in root route component |
| Router devtools (embedded) | `` | Requires `router` prop outside provider |
| Form devtools | `` | Plugin for unified devtools |
| Unified devtools | `` | Single panel for all TanStack libraries |
| Vite plugin | `devtools()` in vite config | Source injection, enhanced logs, production removal |
| Production devtools | `ReactQueryDevtoolsInProd` | Opt-in for production environments |
| Lazy loading | `React.lazy(() => import(...))` | Reduce bundle size in development |
| Open hotkey | `config={{ openHotkey: ['Shift', 'D'] }}` | Keyboard shortcut for unified panel |
## Unified Devtools Config
| Option | Type | Purpose |
| ---------------- | ------------------------------------------------------------------------------------------------- | -------------------------------- |
| `position` | `'top-left' \| 'top-right' \| 'bottom-left' \| 'bottom-right' \| 'middle-left' \| 'middle-right'` | Trigger button location |
| `panelLocation` | `'top' \| 'bottom'` | Panel slide direction |
| `theme` | `'dark' \| 'light'` | Panel color scheme |
| `defaultOpen` | `boolean` | Open panel on load |
| `hideUntilHover` | `boolean` | Hide trigger until hover |
| `openHotkey` | `KeyboardKey[]` | Toggle panel shortcut |
| `inspectHotkey` | `KeyboardKey[]` | Source inspector shortcut |
| `requireUrlFlag` | `boolean` | Only activate with URL parameter |
## Common Mistakes
| Mistake | Correct Pattern |
| ------------------------------------------------------- | ---------------------------------------------------------------------------- |
| Importing devtools in production bundle | Standalone devtools auto-tree-shake; use `React.lazy` for code-splitting |
| Passing `router` prop when inside RouterProvider | Omit `router` prop; devtools auto-detect context |
| Using `ReactQueryDevtools` position for panel placement | `buttonPosition` controls logo position; `position` controls panel edge |
| Mixing standalone and unified devtools | Choose one approach; both rendering causes duplicate panels |
| Rendering devtools outside QueryClientProvider | Place `ReactQueryDevtools` inside provider or pass `client` prop |
| Using `TanStackRouterDevtools` outside route tree | Place in root route component or pass `router` prop explicitly |
| Forgetting Vite plugin for unified devtools | Add `devtools()` from `@tanstack/devtools-vite` to vite config |
| Using unified devtools without framework adapter | Install both `@tanstack/react-devtools` and library-specific plugin packages |
## Delegation
- **Devtools setup review**: Use `Task` agent to verify correct placement and configuration
- **Bundle size analysis**: Use `Explore` agent to check devtools are tree-shaken in production
- **Code review**: Delegate to `code-reviewer` agent
> If the `tanstack-query` skill is available, delegate query-specific debugging patterns to it.
> Otherwise, recommend: `npx skills add oakoss/agent-skills --skill tanstack-query`
>
> If the `tanstack-router` skill is available, delegate route debugging patterns to it.
> Otherwise, recommend: `npx skills add oakoss/agent-skills --skill tanstack-router`
>
> If the `tanstack-form` skill is available, delegate form state management and validation patterns to it.
## References
- [Query devtools setup, modes, and options](references/query-devtools.md)
- [Router devtools setup, route inspection, and options](references/router-devtools.md)
- [Form devtools and unified devtools patterns](references/form-devtools.md)