Zustand

A small, fast React state management library with a hook-based API and no boilerplate.

Library
npm
v5.0.15
58,802 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
78 /100 Good
Development Activity 72
Maintenance 76
Community 64
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
90 /100 Excellent
Architecture 90
Code Quality 85
Innovation 88
Learning Curve 95

Zustand is a minimal state-management library for React (and vanilla JS) built on simplified flux principles. It exposes a single create() function that returns a hook-shaped store — no context providers, no reducers, no action-type boilerplate — while still supporting selectors, middleware, and fully-typed TypeScript usage for larger applications.

Under the hood it is a closure-based store with a listener set, wrapped by a thin adapter over React’s useSyncExternalStore, which keeps the runtime tiny while remaining framework-agnostic at its core (the vanilla store can be used entirely outside React).

What You Get

  • A create() API that returns a ready-to-use React hook backed by a vanilla, framework-agnostic store
  • Selector-based subscriptions so components only re-render when the slice of state they read changes
  • Official middleware for persistence (persist), Redux DevTools integration (devtools), Immer-based immutable updates (immer), and combining reducers (redux, combine)
  • A separate vanilla entry point for using the store outside React (vanilla JS, other frameworks, or server-side logic)
  • Full TypeScript support with typed middleware composition via StateCreator generics

Common Use Cases

  • Replacing prop drilling or React Context for shared UI state (modals, theming, auth session) without a provider tree
  • Mid-sized to large React apps that want Redux-like predictability (single store, explicit updates) without Redux’s boilerplate
  • Persisting user preferences or session state to localStorage/AsyncStorage via the persist middleware
  • Sharing state between React and non-React code (e.g. a vanilla JS widget or a Node script) via the same store instance

Under The Hood

Architecture — Zustand’s core is a minimal vanilla store (src/vanilla.ts, ~100 lines) implementing createStore with a closure-based state container: a mutable state variable, a Set of listener callbacks, and setState/getState/getInitialState/subscribe methods — no reducers, no action types, no context. The React binding (src/react.ts) is a thin ~64-line wrapper around React’s built-in useSyncExternalStore hook, adding a selector argument for slice-based re-rendering and memoized snapshot getters. This two-layer split (framework-agnostic vanilla store + tiny React adapter) is the architectural core: create() composes createStore() from vanilla.ts and exposes it as a callable hook that also carries the raw store API as static properties via Object.assign. Middleware (src/middleware/*.ts: persist.ts, devtools.ts, immer.ts, redux.ts, combine.ts, subscribeWithSelector.ts) wraps StateCreator functions functionally, decorating setState/getState before they reach the store, which is how cross-cutting concerns like localStorage persistence or Redux DevTools integration are added without touching the core.

Tech Stack — Written in TypeScript (97.9% of the codebase per GitHub language stats), targeting Node >=12.20.0. Zero runtime dependencies; react, immer, and use-sync-external-store are all optional peerDependencies (peerDependenciesMeta marks them optional), which lets the vanilla store be imported without pulling in React at all. Build tooling uses Rollup (rollup.config.mjs) with esbuild for transpilation, producing separate CJS/ESM bundles per entry point (index, vanilla, react, middleware, shallow, traditional) as declared in the exports map in package.json. The repo uses pnpm workspaces (pnpm-workspace.yaml) and Vitest for testing.

Code Quality — 12 test files in tests/ (basic.test.tsx, ssr.test.tsx, devtools.test.tsx, immer.test.tsx, persistAsync.test.tsx, persistSync.test.tsx, shallow.test.tsx, subscribe.test.tsx, middlewareTypes.test.tsx, types.test.tsx) cover both runtime behavior and TypeScript type-level correctness, run via Vitest with a dedicated test:types script (tsc --noEmit) enforcing type soundness on every change. ESLint (flat config) plus Prettier enforce style; naming is short and consistent (create, useStore, setState) matching the library’s minimal-surface philosophy. Core state files carry inline comments explaining non-obvious TypeScript workarounds (e.g. a TODO on setState’s type assertion referencing a specific upstream TypeScript issue), showing deliberate handling of edge cases rather than silent suppression.

API Design — The public API is intentionally tiny: create((set, get) => ({...})) returns a hook usable directly in components with no provider wrapper, no action-type boilerplate, and immutable updates handled by a shallow-merging set function. Selector support (useStore(state => state.slice)) is opt-in and additive rather than required. Middleware composes via simple functional wrapping (persist(devtools(store))) rather than a plugin-registration system, so users add functionality by wrapping, not configuring. TypeScript generics are heavy (StateCreator, Mutate, StoreMutators) to support fully-typed middleware chains, which adds type-signature complexity for advanced users but keeps the runtime API surface small; the getting-started docs get a new user to a working store in under 10 lines of code.

Used by 119 apps in this directory

TypeScript
95%
AGPL 3.0

Rallly

Scheduling

5,297

Self-hostable group scheduling polls that eliminate back-and-forth emails and find the best meeting time for everyone.

View details
91
Repo Health
75
Technical
66
Dependency
Built with
TypeScript 95%
Updated yesterday
TypeScript
96%
Other

Refly

AI Development · Automation · No Code Platforms

7,530

Build deterministic, versioned agent skills from natural language—run them anywhere from Claude Code to Slack.

View details
61
Repo Health
76
Technical
63
Dependency
Built with
TypeScript 96%
Updated 2 months ago
Rust
72%
Apache 2.0

Rivet

AI Agents · Developer Tools

6,263

Stateful actors as a primitive for AI agents, real-time collaboration, and durable execution — with in-memory state, WebSockets, queues, and scheduling built in.

View details
87
Repo Health
81
Technical
64
Dependency
Built with
Rust 72%
TypeScript 25%
Updated today
TypeScript
97%
Other

Rocket.Chat

Team Chat

46,240

The secure, self-hosted team communications platform for organizations that cannot compromise on data sovereignty.

View details
96
Repo Health
79
Technical
66
Dependency
Built with
TypeScript 97%
Updated today
TypeScript
98%
AGPL 3.0

Rybbit

Analytics

13,104

Open-source, privacy-friendly web and product analytics with cookieless tracking, session replays, funnels, and real-time dashboards — a self-hostable alternative to Google Analytics.

View details
87
Repo Health
85
Technical
68
Dependency
Built with
TypeScript 98%
Updated yesterday
Python
76%
Apache 2.0

Second Me

AI Assistants · Productivity

15,692

Train a locally hosted AI twin on your own memories—then connect it to the world through a decentralized identity network.

View details
41
Repo Health
75
Technical
68
Dependency
Built with
Python 76%
TypeScript 19%
Updated 1 years ago
TypeScript
98%
MIT

sigle

Blogging

489

A decentralized, open-source writing platform that permanently stores your stories on the Stacks blockchain and Arweave — where Web3 content creators own their words forever.

View details
82
Repo Health
78
Technical
69
Dependency
Built with
TypeScript 98%
Updated 4 days ago
TypeScript
50%
Other

SigNoz

Analytics · Monitoring

32,323

Self-host your entire observability stack — logs, metrics, traces, and LLM monitoring — in one OpenTelemetry-native platform, without the Datadog bill.

View details
92
Repo Health
83
Technical
67
Dependency
Built with
TypeScript 50%
Go 38%
Updated yesterday
Python
78%
AGPL 3.0

Skyvern

AI Agents · Automation

23,168

Skyvern (YC S2023) automates browser-based workflows by pairing LLMs with computer vision, letting agents click, fill, and extract data on sites they've never seen, without brittle XPath selectors that break on every layout change.

View details
89
Repo Health
82
Technical
70
Dependency
Built with
Python 78%
TypeScript 20%
Updated today

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers