This episode traces the evolution of React state management from prop drilling, the Context API, and Flux, to the birth of Redux by Dan Abramov and its refinement into Redux Toolkit. You'll also understand the concrete problems Redux solves: a global store, unidirectional data flow, and debuggability.

Before learning how Redux works, it's important to understand why Redux exists. No library is born without a reason. Redux was born from real frustration: modern web applications keep growing more complex, and state scattered everywhere makes bugs hard to track and application behavior impossible to predict.
Episode 1 traces the journey of state management: from prop drilling, the Context API, the Flux architecture used by Facebook, the birth of Redux by Dan Abramov in 2015, to Redux Toolkit in 2019 as the official standard. You'll also see the concrete problems Redux solves and an initial comparison with other approaches.
The end goal is simple: after this episode, you'll know exactly when and why an application needs Redux, not just follow the trend.
The earliest problem in React was prop drilling: passing state from a parent component to a child, then to a grandchild, and so on through layers of props. As the depth grows, the code becomes noisy and hard to maintain.
function App() {
const [user] = useState(null)
return <Dashboard user={user} />
}
function Dashboard(props) {
return <Sidebar user={props.user} />
}
function Sidebar(props) {
return <Profile user={props.user} />
}The Profile component needs user, even though Dashboard and Sidebar don't care about it at all. The Context API arrived to pierce through this prop chain, but Context has limitations: any change to a Context value re-renders all its consumers, and Context provides neither debugging tools nor a structured mechanism for state changes.
In 2014, the Facebook team introduced Flux: an architectural pattern with unidirectional data flow. Its core idea is action → dispatcher → store → view. A year later, Dan Abramov simplified Flux into Redux: a single store, pure reducer functions, and no separate dispatcher — dispatch(action) goes straight to the reducer.
action -> reducer -> store -> UI
^ |
+------------------------+Redux kept the Flux pattern but reduced its complexity. The store becomes the single source of truth, and every state change always flows through the same path.
Redux core was powerful, but it demanded a lot of boilerplate: action constants, action creators, reducer switch-cases, and manual middleware setup. In 2019, the Redux team released Redux Toolkit as the recommended way to write Redux. RTK wraps Redux core, Immer, Reselect, and Redux Thunk into one package with a much more concise API.
Since 2023, Redux core has been at version 5 and RTK at version 2.x — fully ESM, TypeScript-first, and almost boilerplate-free. Redux Toolkit isn't a replacement for Redux; it's Redux, tidied up.
Info
Don't worry if terms like reducer, middleware, or store still feel unfamiliar. Episode 2 will break down each one with concrete code examples, and later episodes deepen them one by one. What matters now: understand why Redux is needed.
Redux consolidates all application state into one global store. Because the flow is unidirectional, every component can only change state in the same way: dispatch(action), then the reducer produces new state, then the UI re-renders. No shortcuts, no hidden mutations.
const action = { type: "counter/increment" }
store.dispatch(action)store.dispatch(action) is the only way to change state. This consistency is what makes application behavior easy to understand for any team member.
Because all state changes are recorded as a series of actions, every change can be traced. You can see which action occurred, how the state changed, and even do time-travel debugging — stepping backward and forward to specific state conditions. This is Redux's main selling point for applications with complex business rules.
Redux enforces a consistent structure: centralized reducers, explicit actions, and middleware for side effects. On a team with dozens of engineers, this enforced structure prevents everyone from having their own state mutation style. RTK adds built-in helpers — createSlice, createAsyncThunk, RTK Query — that make team patterns even more uniform.
This combination is what keeps Redux relevant: it's not just about storing data, but providing the same patterns and tools for the entire team.
Redux isn't the only state management solution. An initial comparison with other approaches:
We'll compare all four in depth in episode 22. For now, just understand where each one stands.
Episode 1 answers the big question: Redux was born from the real need for centralized state, traceable changes, and consistent structure for large teams. The journey from prop drilling to RTK shows that every layer of evolution answered the weaknesses of the previous layer.
Key takeaways:
In the next episode, episode 2, we'll break down Redux's core concepts and main architecture — its three principles, how it works behind the scenes from dispatch to re-render, the role of middleware and Immer, and a complete map of the main Redux Toolkit components that will accompany the rest of this series.