This tool works with both Expo and React Native CLI projects. Just install and go.
Full Redux Toolkit inspection for React Native. Monitor actions, explore state changes, time-travel debug, and inspect your Redux store in real-time — directly on your device.

Redux DevTools slides up from the bottom, showing captured actions in real-time alongside your app.
npm install @buoy-gg/reduxThat's it. The Redux DevTools auto-detects your store and appears in your FloatingDevTools menu.
Zero config required — Just install the package. Your existing Redux store works as-is with no middleware or wrapper needed.
BUOY brings the power of Redux DevTools to mobile — with features designed for React Native workflows.
| Feature | BUOY | Chrome Extension |
|---|---|---|
| On-device debugging | ✅ | ❌ |
| Works in production | ✅ | ❌ |
| QA/support can use it | ✅ | ❌ |
| No desktop app required | ✅ | ❌ |
| Zero configuration | ✅ | ❌ |
| Action logging | ✅ | ✅ |
| State inspection | ✅ | ✅ |
| State diff view | ✅ | ✅ |
| Time-travel (Jump to state) | ✅ | ✅ |
| Action replay | ✅ | ✅ |
| Action filtering & search | ✅ | ✅ |
| Performance timing | ✅ | ✅ |
| Async thunk linking | ✅ | ✅ |
| Export history | ✅ | ✅ |
| RTK Query support | ✅ | ✅ |
| Skip/toggle actions | 🔜 | ✅ |
| Dispatch custom actions | 🔜 | ✅ |
| Import state | 🔜 | ✅ |
| Persist across reloads | 🔜 | ✅ |
| Stack traces | 🔜 | ✅ |
Why on-device matters: Debug Redux on real devices, in TestFlight, or in production. No USB cable, no desktop app, no "it works on the simulator" moments.
Every dispatched action is captured with rich metadata:
Tap any action to see three detailed tabs:
View the complete action payload, meta information, and error details for failed actions. Interactive JSON tree for exploring nested data.
Explore the full state tree after this action with a collapsible data viewer. Navigate deeply nested state with ease.
Side-by-side comparison showing exactly what changed — additions (green), removals (red), and modifications (yellow) clearly highlighted. Choose between tree view or split view.
Jump to any point in your app's history:
Note: For full time-travel support (jumping to past states), add the optional reducer wrapper. See Advanced Configuration below.
Full support for Redux Toolkit async thunks with intelligent linking:
Catch performance issues before they impact users:
Find actions instantly by type, or filter to show only actions that changed state.
Export action data or payloads for debugging, bug reports, or test fixtures.
Pause action capture when you need to focus, resume when ready.
Download your complete action history as JSON for sharing with teammates or creating test data.
For most apps, zero-config is all you need. But if you want more control:
To enable jumping to past states (not just viewing them), wrap your reducer:
import { configureStore } from '@reduxjs/toolkit';
import { withBuoyDevTools } from '@buoy-gg/redux';
const store = configureStore({
reducer: withBuoyDevTools(rootReducer),
});
import { configureStore } from '@reduxjs/toolkit';
import { withBuoyDevTools } from '@buoy-gg/redux';
const store = configureStore({
reducer: withBuoyDevTools(rootReducer),
});
For fine-grained control over what gets captured:
import { createBuoyReduxMiddleware, withBuoyDevTools } from '@buoy-gg/redux';
const customMiddleware = createBuoyReduxMiddleware({
maxActions: 500, // History size (default: 200)
ignoreActions: [ // Actions to skip
'persist/PERSIST',
'persist/REHYDRATE',
],
});
const store = configureStore({
reducer: withBuoyDevTools(rootReducer),
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware().concat(customMiddleware),
});
import { createBuoyReduxMiddleware, withBuoyDevTools } from '@buoy-gg/redux';
const customMiddleware = createBuoyReduxMiddleware({
maxActions: 500, // History size (default: 200)
ignoreActions: [ // Actions to skip
'persist/PERSIST',
'persist/REHYDRATE',
],
});
const store = configureStore({
reducer: withBuoyDevTools(rootReducer),
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware().concat(customMiddleware),
});
When to use manual middleware: Only if you need to ignore specific actions or increase history size. The auto-instrumentation handles everything else.
No conflicts: If you configure middleware manually, the auto-instrumentation automatically detects this and defers to your configuration. You'll never get duplicate action entries.
import {
// Auto-instrumentation (used internally, rarely needed)
instrumentStore,
isStoreInstrumented,
// Manual middleware (optional, for advanced config)
buoyReduxMiddleware,
createBuoyReduxMiddleware,
// Time-travel (optional)
withBuoyDevTools,
jumpToState,
replayAction,
// Hooks
useReduxActions,
useAutoInstrumentRedux,
// History adapter (for custom integrations)
reduxHistoryAdapter,
createReduxHistoryAdapter,
} from '@buoy-gg/redux';
import {
// Auto-instrumentation (used internally, rarely needed)
instrumentStore,
isStoreInstrumented,
// Manual middleware (optional, for advanced config)
buoyReduxMiddleware,
createBuoyReduxMiddleware,
// Time-travel (optional)
withBuoyDevTools,
jumpToState,
replayAction,
// Hooks
useReduxActions,
useAutoInstrumentRedux,
// History adapter (for custom integrations)
reduxHistoryAdapter,
createReduxHistoryAdapter,
} from '@buoy-gg/redux';