plugins/nextjs-expert/skills/nextjs-zustand/SKILL.md
Zustand v5 state management for Next.js 16 App Router. Use when implementing global state, stores, persist, hydration, or client-side state in Client Components.
npx skillsauth add fusengine/agents nextjs-zustandInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Minimal, scalable state management with React 18+ useSyncExternalStore.
Before ANY implementation, use TeamCreate to spawn 3 agents:
After implementation, run fuse-ai-pilot:sniper for validation.
| Feature | Benefit | |---------|---------| | Minimal API | Simple create() function, no boilerplate | | React 18 native | useSyncExternalStore, no shims needed | | TypeScript first | Full inference with currying pattern | | Middleware stack | devtools, persist, immer composable | | Bundle size | ~2KB gzipped, smallest state library | | No providers | Direct store access, no Context wrapper |
create<State>()((set) => ({...}))modules/[feature]/src/stores/Stores organized by feature module:
modules/cores/stores/ - Shared stores (theme, ui)modules/auth/src/stores/ - Auth statemodules/cart/src/stores/ - Cart statemodules/[feature]/src/interfaces/ - Store types| File | Purpose | Max Lines |
|------|---------|-----------|
| store.ts | Store creation with create() | 50 |
| store.interface.ts | TypeScript interfaces | 30 |
| store-provider.tsx | Context provider (App Router) | 40 |
| use-store.ts | Custom hook with selector | 20 |
Double parentheses required for TypeScript inference. Currying pattern ensures full type safety.
For Next.js App Router, wrap stores in Context to prevent request-sharing. Use createStore from zustand/vanilla with useRef for initialization.
Stack middlewares: devtools → persist → immer. Order matters for TypeScript types.
Use skipHydration: true with persist middleware. Manually rehydrate in useEffect to avoid SSR mismatches.
| Need | Reference | |------|-----------| | Initial setup | installation.md | | Store patterns | store-patterns.md | | SSR/Hydration | hydration.md | | Middleware | middleware.md | | Next.js App Router | nextjs-integration.md | | TypeScript | typescript.md | | Slices pattern | slices.md | | Auto selectors | auto-selectors.md | | Reset state | reset-state.md | | Subscribe API | subscribe-api.md | | Testing | testing.md | | Migration v4→v5 | migration-v5.md |
useStore((s) => s.field) for performance| Pattern | Reason | Alternative |
|---------|--------|-------------|
| Global stores in App Router | Request sharing between users | Context-based stores |
| Zustand in Server Components | No React hooks in RSC | Fetch data directly |
| Persisting auth tokens | Security vulnerability | httpOnly cookies |
| Without useShallow on objects | Excessive re-renders | useShallow(selector) |
| v4 syntax | TypeScript inference broken | v5 currying create<T>()() |
testing
Copy self-audit and ban-lists — filler verbs/hype adjectives, slop placeholder names, fake-precise numbers, Title Case headlines, humor in error copy ('Oops!'), em-dash crutch, one copy register per page.
development
Logged-in web apps — dashboards, auth flows, settings, onboarding, data tables, command palettes, modals, toasts. Register `product`: density and glance-speed over marketing polish, no hero/CTA-tricks, every data surface covers empty/loading/error explicitly, tables and dataviz follow preattentive-processing rules.
development
Marketing sites, landing pages, campaign pages — register `brand` (design IS the product). Structure comes from the register's POV + a macrostructure pick, never from copying an inspiration site's section flow. Hero discipline, deviated section order, asymmetric grids, and a silhouette lookalike-test gate before ship.
development
Token-strategy core — OKLCH color rules, neutral tinting, accent-commitment levels, type scale, 8pt spacing grid, touch targets, and the canonical output format of design-system.md (the file the harness gates on). This is routing step 1 of design-method/SKILL.md — read it before design-web/design-webapp/design-ios/design-android, before picking or auditing a single color/type/spacing value.