Reference

Support matrix

The maintained combinations for native stores, external adapters, middleware, and Yjs.

“Supported” means covered by tests and intended as a maintained contract. “Limited” means the integration has a narrower guarantee than its surrounding feature might suggest. Anything not listed should not be inferred to work.

Native stores

CombinationStatusNotes
Single store, localSupportedDefault synchronous authority
Native slices, localSupportedNamespaced native state
Single or slices, shared mainSupportedPatch stream is required
Single or slices, shared clientSupportedMethods become async proxies
Direct client setState()/apply()UnsupportedClient is a mirror
Shared mode with patches disabledUnsupportedSynchronization depends on patches

External adapters

All adapters bind a whole store. Slices mode is unsupported for every adapter.

AdapterLocalShared main/clientNotes
ZustandSupportedSupportedDirect client Zustand writes rejected
MobXSupportedSupportedClient external writes integration-defined
PiniaSupportedSupportedClient external writes integration-defined
JotaiSupportedSupportedDirect client atom writes rejected
Redux ToolkitSupportedUnsupportedLocal whole-store binding only
ValtioSupportedSupportedClient proxy writes restored to authority snapshot
XStateSupportedUnsupportedUpdate through actor events; setState() blocked

Shared adapter support covers remote Coaction method execution. It does not make arbitrary out-of-band external writes a uniform cross-adapter contract.

Middleware and collaboration

IntegrationLocalShared mainShared client
LoggerSupportedSupportedLimited visibility
PersistSupportedSupportedUnsupported
HistorySupportedSupportedUnsupported
YjsSupportedSupportedUnsupported

Put integrations that mutate, rehydrate, time-travel, or merge state on the authority.

Framework selector boundaries

Framework-generated selector maps are built from descriptors known during initialization. Known keys receive stable selectors; new dynamic paths do not extend the map. Put dynamic values inside a declared record and use an explicit selector.

For React, useStore.auto() returns selector functions. It does not directly read the field:

const selectors = useStore.auto();
const count = useStore(selectors.count);

Shared deployment boundary

Every authority and connected client must use the same Coaction major and compatible wire protocol. Mixed-major workers, shared workers, and custom transports are unsupported even if the TypeScript surface appears compatible.

On this page