Redux has been the default state management library for serious React apps for a decade. It's excellent. It also carries a tax — boilerplate, action types, reducers, selectors, middleware configuration. On a 200k-line codebase we inherited from a client, that tax was eating 41% of the front-end code budget. We migrated to Zustand in 6 weeks and the results were striking.
This article isn't a Redux hit-piece. Redux has its place — large teams with strong conventions, time-travel debugging, hot-reload. But for most product code, Zustand gives you 90% of the value with 30% of the code. Here's the migration playbook we used.
Why we moved off Redux
Three numbers pushed us over the edge:
- 41% of front-end LoC was Redux boilerplate (actions, types, reducers, selectors)
- 23% of render time was selector re-computation — even with Reselect memoisation
- Onboarding new engineers took 2 weeks longer because of the Redux mental model
The migration in three phases
We didn't rewrite. We migrated, file by file, behind feature flags. The playbook:
- Phase 1 (week 1–2): Add Zustand alongside Redux. New feature code uses Zustand. Existing Redux stays untouched.
- Phase 2 (week 3–4): Migrate one store at a time, starting with the leaf stores (least depended-on). Each migration ships behind a flag.
- Phase 3 (week 5–6): Remove the last Redux store. Delete the Redux dependencies. Run the final test pass.
“The killer feature of Zustand isn't the API — it's that you can migrate to it gradually. Try that with Redux Toolkit.”
The results
After 6 weeks and 87 stores migrated:
Front-end LoC dropped 41%. Render time dropped 23%. Onboarding time for new engineers dropped from 2 weeks to 4 days. And the migration shipped zero regressions — every change was behind a flag and tested in production before the flag flipped.
Author
Sofia Renaud
VP, Engineering, Globantis Labs
Sofia writes about engineering at Globantis Labs. Reach out if you'd like to discuss this article or your own project.



