Skip to main content

Oct 2026 · Guide · ~8 min read

How to Handle Global State in Next.js Without Redux

By Safdar Ali — frontend engineer, Bengaluru

A ticket that says "we need global state" usually needs one of four things. Redux is a valid answer for the fourth. It is a heavy answer for the first three. The companion article on not putting server data in a client store is the rule. This post is the order I walk through in review.

The order

  1. Server data. Fetch it in a Server Component. Mutate with a server action and revalidate. Do not copy the list into Redux so a button can read it.
  2. URL state. Filters, tabs, and the selected id belong in search params if a refresh or a shared link should restore them.
  3. Local state. A modal, a disclosure, and a draft input live next to the component that uses them.
  4. A small client store. Theme that many leaves read, or a cart drawer that is not the source of truth for prices. Zustand is enough. The comparison with Redux Toolkit is in that post.

Context is not a database

React context is a fine place for a theme or a current user object that rarely changes. It is a poor place for a value that updates on every keystroke, because every consumer re-renders. If the value is server data, context is the wrong layer entirely.

When I still accept Redux

When the client already has a lot of client-only workflows with time-travel debugging, middleware, and many writers, and the team already knows the store. I do not introduce it to hold a blog list. If you are choosing for a new app, finish the first three steps and see whether a store is still requested.

If this helped you

I publish free tutorials and write-ups like this in my spare time — no paywall on the guides. If it saved you an afternoon of trial and error, you can support the work:

More guides on safdarali.in — same author, production-focused.

"Talk is cheap. Show me the code."