Skip to content

Migration Guide

StateMesh can replace multiple libraries. This guide covers the conceptual mapping from common React state management patterns.

From Redux + RTK Query

ReduxStateMesh
createStorecreateMesh
useSelectoruseMeshSelector / useMeshState
useDispatchuseMeshAction / actions
createSlicemesh.action()
createAsyncThunkmesh.transaction()
RTK Query useQueryuseMeshResource
RTK Query useMutationuseMeshMutation
redux-persistmesh.persist()
redux-undomesh.undo() / mesh.redo()

Key differences:

  • No reducers, no action types, no switch statements
  • State mutations are direct (draft-based)
  • Async operations use transactions with automatic rollback
  • Resources handle caching, deduplication, and invalidation

From Zustand + React Query

Zustand/React QueryStateMesh
create()createMesh
useStore(selector)useMeshSelector / useMeshState
set()mesh.setState / mesh.setPath
useQueryuseMeshResource
useMutationuseMeshMutation
queryClient.invalidateQueriesmesh.invalidate(tags)
Persistence middlewaremesh.persist()

Key differences:

  • Single store for all state (client + server)
  • No separate query client
  • Built-in undo/redo, time travel, DevTools

From Jotai

JotaiStateMesh
atom()State paths
useAtomuseMeshState
atomFamilyResources with params
atomWithStoragemesh.persist()
atomWithObservablemesh.resource()

Key differences:

  • Single store instead of distributed atoms
  • Named actions and transactions
  • Built-in middleware, guards, plugins

General Tips

TIP

StateMesh's mesh.action() is the closest equivalent to any mutation pattern. It's a named, typed function that receives a draft.

TIP

StateMesh's mesh.transaction() replaces both thunks and mutation hooks. It handles optimistic updates, rollback, retry, and timeout.

TIP

StateMesh's mesh.resource() replaces query hooks. It handles caching, deduplication, staleness, and invalidation.

Next Steps

Released under the MIT License.