Redux Remember saves (persists) and loads (rehydrates) your Redux state from any key-value storage
Documentation | Live Demo | GitHub
- Selective persistence - Save and load only the keys you specify
- Multi-platform - Works with React, React Native/Expo or any app that uses Redux
- Supports different storage drivers - localStorage, sessionStorage, AsyncStorage (React Native), or your own custom driver
- Battle-tested - Fully tested with Redux 5.0+ and Redux Toolkit 2.0+
- TypeScript ready - Fully type safe with TypeScript definitions included
npm install redux-remember
# or
pnpm/yarn/bun add redux-rememberimport { configureStore } from '@reduxjs/toolkit';
import { rememberReducer, rememberEnhancer } from 'redux-remember';
import { myStateIsRemembered, myStateIsForgotten } from './reducers';
const reducers = {
myStateIsRemembered: myStateIsRemembered.reducer,
myStateIsForgotten: myStateIsForgotten.reducer,
};
const rememberedKeys = ['myStateIsRemembered'] satisfies (keyof typeof reducers)[];
const reducer = rememberReducer(reducers);
const store = configureStore({
reducer,
enhancers: (getDefaultEnhancers) => getDefaultEnhancers().concat(
rememberEnhancer(window.localStorage, rememberedKeys)
)
});See the Quick Start guide for complete setup instructions.
Need to migrate persisted state when your schema changes?
Redux Remigrate is a companion library that provides TypeScript-first migrations for Redux Remember.
npm install redux-remigrateimport { configureStore } from '@reduxjs/toolkit';
import { rememberReducer, rememberEnhancer } from 'redux-remember';
import { myStateIsRemembered, myStateIsForgotten } from './reducers';
import { _remigrateVersion } from 'redux-remigrate';
import { migrate } from './remigrate';
const reducers = {
// 1. Add the _remigrateVersion reducer to track your state version:
_remigrateVersion,
myStateIsRemembered: myStateIsRemembered.reducer,
myStateIsForgotten: myStateIsForgotten.reducer,
};
const rememberedKeys = [
// 2. Make sure _remigrateVersion gets persisted with the state:
'_remigrateVersion'
'myStateIsRemembered',
] satisfies (keyof typeof reducers)[];
const reducer = rememberReducer(reducers);
const store = configureStore({
reducer,
enhancers: (getDefaultEnhancers) => getDefaultEnhancers().concat(
// 3. Pass the migrate function to the rememberEnhancer:
rememberEnhancer(window.localStorage, rememberedKeys, {
migrate
})
)
});
export type RootState = ReturnType<typeof store['getState']>;
// 4. Set your "stateTypeExpression" in config to the type name you specify here:
export type PersistedState = Pick<RootState, typeof rememberedKeys[number]>;Create remigrate.config.ts in your project root:
import { defineRemigrateConfig } from 'redux-remigrate';
export default defineRemigrateConfig({
storagePath: './src/remigrate',
stateFilePath: './src/store.ts',
stateTypeExpression: 'PersistedState'
});npx remigrate init # Initialize migrations directory
npx remigrate create # Create a migration when state schema changes
npx remigrate validate # Validate migration typesSee the Redux Remigrate documentation for setup and usage.
This is a monorepo managed with Turborepo:
| Package | Description |
|---|---|
packages/redux-remember |
The main library |
packages/redux-remigrate |
State migration library |
packages/remigrate |
CLI wrapper for redux-remigrate |
packages/docs-website |
Documentation site |
npm install
npm run build # Build all packages
npm run test # Run tests
npm run typecheck # Run type checking
npm run lint # Run linterMIT
