Redux is a JavaScript library for managing application state in a predictable way, created in 2015 by Dan Abramov and Andrew Clark. Its documentation describes it as “a predictable state container for JavaScript apps,” designed so that applications behave consistently across client, server, and native environments and remain easy to test. Although most closely associated with React, Redux is not tied to any particular view library.
The library rests on three core ideas. The entire state of an application is held in a single object tree inside one store, making that store the single source of truth. Changes are described by actions, which are plain objects that say what happened in the application. And the way state changes in response to those actions is specified by reducers, which are pure functions that take the previous state and an action and return the next state.
The data flow that ties these together is deliberately one-directional. To change anything, code dispatches an action to the store; the store runs the relevant reducer to compute a new state from the old state and the action; and any interested parts of the user interface read the updated state and re-render. Because reducers are pure and never mutate state in place, the sequence of states an application moves through becomes reproducible and inspectable.
Redux drew its central concepts from earlier ideas. From Facebook’s Flux architecture it took the notion of unidirectional data flow and actions describing changes, and from the Elm language it took the pattern of a single state value updated by a pure function. The predictability this produced enabled tooling such as a time-traveling debugger, which can step backward and forward through an application’s recorded states.
The Redux source code is maintained at github.com/reduxjs/redux, and the project later introduced Redux Toolkit as its officially recommended way to write Redux logic with less boilerplate. As a focused approach to state management, Redux became one of the most influential patterns in the front-end ecosystem, shaping how developers reason about shared state in component-based applications.