Immer

Create your next immutable state by mutating the current one.

Library
npm
v11.2.9
28,992 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
89 /100 Excellent
Development Activity 96
Maintenance 96
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 88
Innovation 92
Learning Curve 90

Immer is a small, zero-dependency JavaScript library that lets you write the next immutable state by mutating a temporary “draft” instead of hand-rolling spreads, Object.assign, or deep clones. It wraps your base state in an ES6 Proxy, records exactly which branches of the tree you touched inside a recipe function, and produces a new state object that shares every untouched branch with the original — giving you both natural mutation syntax and full structural-sharing immutability guarantees.

Because the API surface is a single produce(base, recipe) call (plus a curried form for reducers), Immer drops into Redux reducers, React useState/useReducer updates, and any other place immutable updates are required without changing how the surrounding code reads. Optional plugins add Map/Set support, JSON patch generation, and array-method interception, keeping the core bundle minimal for consumers who don’t need them.

What You Get

  • A single produce(base, recipe) function that returns a new immutable state from mutation-style code, plus a curried form for use directly as a Redux reducer
  • produceWithPatches, applyPatches, and patch listeners for recording and replaying granular JSON-patch-style changes (undo/redo, time travel, network sync)
  • createDraft/finishDraft for manual draft lifecycles outside the callback-based produce flow
  • Opt-in plugins — enableMapSet for native Map/Set drafting, enablePatches for patch generation, enableArrayMethods for optimized array method interception — kept out of the core bundle until enabled
  • First-class TypeScript types (Draft, WritableDraft, Immutable) that infer the mutable draft shape from your immutable state type and back again
  • current() and original() helpers to inspect in-progress drafts or the untouched base value from inside a recipe

Common Use Cases

  • Writing Redux or useReducer reducers as if directly mutating state, while Immer guarantees the returned value is a new immutable object
  • Updating deeply nested React component state (nested objects/arrays) in a single setState call without manual spreading at every level
  • Building undo/redo or collaborative-editing features on top of the patches Immer generates for every producer call
  • Simplifying form-state or normalized-store libraries that need copy-on-write semantics without hand-writing structural sharing

Under The Hood

Architecture — src/immer.ts exports the public API bound to a singleton Immer instance whose produce/produceWithPatches/createDraft/finishDraft/applyPatches methods live in src/core/immerClass.ts. Calling produce() checks isDraftable(base), opens a scope via enterScope (src/core/scope.ts), and creates a root proxy through the createProxy dispatcher, which delegates to proxyMap_/proxySet_ (src/plugins/mapset.ts) for Map/Set or to createProxyProxy (src/core/proxy.ts) for plain objects and arrays. The object/array traps in proxy.ts implement copy-on-write: get lazily creates child proxies only for properties actually read, set/deleteProperty call prepareCopy() to shallow-copy a branch the first time it’s touched and markChanged() to bubble a modified_ flag up to every ancestor. After the recipe returns, finalization walks the scope’s drafts and swaps in copy_ only where modified_ is true, leaving everything else pointing at the original base_ references (structural sharing), then optionally freezes the result and emits patches through the patches plugin if a listener was supplied.

Tech Stack — The library is authored entirely in TypeScript (src/) with zero runtime dependencies, built by tsup (tsup.config.ts) into CJS, ESM, and a legacy ESM bundle plus .d.ts declarations, as declared in package.json’s exports map. Tests run on Vitest (vitest.config.ts for source, vitest.config.build.ts to re-run the suite against the built artifacts), with a separate Flow type-check pass (yarn test:flow) for consumers still on Flow, and semantic-release drives versioned publishing from the main branch.

Code Quality — __tests__/produce.ts alone runs 844 lines of scenario coverage (curried producers, Map/Set drafting, patches, class instances, frozen input, array mutation edge cases), complemented by redux.ts for reducer-integration tests, spec_ts.ts/type-external.ts for compile-time type assertions, a dedicated flow/ suite, and both dev- and prod-mode snapshot fixters (__snapshots__, __prod_snapshots__) that pin the numeric die() error codes used in production builds. Coveralls integration tracks coverage over time, reflecting the rigor expected of a dependency this widely embedded in other libraries’ reducers.

API Design — The public surface is deliberately tiny: produce(base, recipe) is the only call most consumers ever need, with a curried variant that drops straight into useReducer/Redux without a wrapper. Escape hatches (original(), current(), no-op castDraft/castImmutable for type coercion) cover the cases where you need to read outside the draft. Plugins are opt-in via explicit enableMapSet()/enablePatches()/enableArrayMethods() calls rather than bundled by default, and the TypeScript types automatically flip an Immutable<T> state type into a mutable Draft<T> inside the recipe and back — removing a whole class of manual type-casting that other immutable-update approaches require.

Used by 52 apps in this directory

TypeScript
93%
MIT

OpenReel Video

Video Editors

5,442

A browser-based, GPU-accelerated video editor with multi-track timelines, color grading, and 4K export — no uploads, no installs, no watermarks.

View details
72
Repo Health
80
Technical
71
Dependency
Built with
TypeScript 93%
Updated 1 weeks ago
TypeScript
90%
MIT

Plasmic

CMS · Design Tools · Low Code Platforms

7,125

The open-source visual builder that lets teams design React apps and websites with drag-and-drop while integrating seamlessly with your codebase.

View details
81
Repo Health
78
Technical
64
Dependency
Built with
TypeScript 90%
Updated 6 days ago
TypeScript
96%
Other

Refly

AI Development · Automation · No Code Platforms

7,537

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

View details
68
Repo Health
76
Technical
63
Dependency
Built with
TypeScript 96%
Updated 1 weeks ago
TypeScript
98%
Apache 2.0

rowboat

AI Assistants · AI Development

18,060

Build, test, and deploy multi-agent AI workflows with a visual editor, RAG data sources, MCP tool integration, and a production-ready REST API.

View details
88
Repo Health
72
Technical
65
Dependency
Built with
TypeScript 98%
Updated 6 days ago
TypeScript
50%
Other

SigNoz

Analytics · Monitoring

32,429

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
64
Dependency
Built with
TypeScript 50%
Go 38%
Updated 6 days ago
TypeScript
89%
Other

strapi

CMS

73,368

Open-source headless CMS that auto-generates REST and GraphQL APIs from your content models, with a fully customizable admin panel you control.

View details
93
Repo Health
84
Technical
63
Dependency
Built with
TypeScript 89%
JavaScript 11%
Updated 6 days ago
TypeScript
99%
Other

Teable

Databases · No Code Platforms

21,920

A no-code PostgreSQL database with spreadsheet UX, real-time collaboration, and native AI agents — built for teams that outgrow Airtable.

View details
78
Repo Health
76
Technical
62
Dependency
Built with
TypeScript 99%
Updated 6 days ago
Go
75%
AGPL 3.0

Teleport

Authentication · Security

21,016

Zero-trust infrastructure access platform that replaces credentials and VPNs with short-lived certificates, SSO, and identity-aware proxies for SSH, Kubernetes, databases, RDP, and AI agents.

View details
94
Repo Health
81
Technical
68
Dependency
Built with
Go 75%
TypeScript 16%
Updated 1 weeks ago
HTML
68%
AGPL 3.0

ToolJet

AI Agents · Low Code Platforms · No Code Platforms

41,123

Open-source AI-native platform to build and deploy internal tools, workflows, and AI agents with a visual drag-and-drop builder and 80+ data source integrations.

View details
94
Repo Health
81
Technical
63
Dependency
Built with
HTML 68%
JavaScript 20%
Updated 5 days ago

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