For years, Redux was almost the mandatory standard for managing global state in React applications.
But as projects grew — and especially after I started using Next.js and React Server Components — Redux began to feel more like an obstacle than a solution.
That’s when I found Zustand, and my approach to global state changed completely.
Redux always felt too verbose for too little benefit.
Creating a store required reducers, actions, types, middleware, and a provider — and even then, every small change felt bureaucratic.
Also:
isOpen: true.All that moved me away from the kind of flow I expect in a modern front-end stack.
Zustand came as the exact opposite: simple, direct, and without magic.
A store can literally be created in a few lines:
import { create } from 'zustand'
type CounterState = {
count: number
increment: () => void
}
export const useCounter = create<CounterState>((set) => ({
count: 0,
increment: () => set((s) => ({ count: s.count + 1 })),
}))
And that’s it — no reducers, no dispatch, no actions.
On top of that, the code became much more readable, which directly improves team productivity.
Redux still has its place in very large applications, with big teams and complex middleware needs (logging, persistence, monitoring).
But for 95% of modern front-end projects, Zustand is faster, lighter, and more natural.
Switching to Zustand made me realize that less is more.
State management doesn’t need to be complex — it just needs to be clear, predictable, and easy to test.
And in that, Zustand delivers everything Redux once promised.