| Query | Client-side async cache: dedupe, background refetch, mutations with cache invalidation, polling. | Data must update without navigation, e.g. polling an order status, or many independent widgets sharing server data. Until then, use loaders plus router.invalidate() after a mutation. |
| Form | Type-safe form state, field-level and async validation, field arrays. | An admin form gets complex: dependent fields, per-license price rows, cross-field validation. Simple forms can use plain <form> + a server function. |
| Table | Headless sorting, filtering, pagination, column visibility. | An admin list needs sorting or filtering. Static lists can be plain shadcn <Table>. |
| Store | Small framework-agnostic reactive store with selectors. | Client state is shared across distant components and outlives a route: cart, "view as customer", theme. A cookie plus loader may still be simpler. |
| DB | Reactive client collections with live queries and optimistic mutations. | We want admin edits to show instantly in the public side without server round-trips, or an offline-capable mock backend in the browser. Overkill while the mock backend lives in server memory. |
| Virtual | Renders only visible rows/cells of long lists. | Search shows thousands of results in one scroll. Not needed for a few hundred fixtures with pagination. |
| Pacer | Debounce, throttle, rate limit, queue. | Search-as-you-type or live price recalculation fires too often. |
| Hotkeys | Keyboard shortcut handling. | Facilitator shortcuts during user tests (switch variant, reset state, toggle theme). |