All but React Native are in beta.
All but React Native are in beta.

This tool works with both Expo and React Native CLI projects. Just install and go.
Inspect named Jotai atoms, their current values, and recorded changes. Register the atoms you need with the same store your app uses, then follow a value through the event history and diff views.

every atom, in 67 secondsThis interactive demo uses example atoms and writes. Real coverage depends on the connected store, tracked atoms and capture setup.
npm install @buoy-gg/jotaiCall watchAtoms once at module scope — pass your Jotai store and a named map of your atoms. No wrappers, no middleware, no modifications to existing atoms.
import { getDefaultStore } from 'jotai';
import { watchAtoms } from '@buoy-gg/jotai';
import { countAtom } from './atoms/count';
import { authAtom } from './atoms/auth';
import { cartAtom } from './atoms/cart';
watchAtoms(getDefaultStore(), {
countAtom,
authAtom,
cartAtom,
});
import { getDefaultStore } from 'jotai';
import { watchAtoms } from '@buoy-gg/jotai';
import { countAtom } from './atoms/count';
import { authAtom } from './atoms/auth';
import { cartAtom } from './atoms/cart';
watchAtoms(getDefaultStore(), {
countAtom,
authAtom,
cartAtom,
});
That's it. Registered atoms automatically appear in the Jotai tool inside your FloatingDevTools menu.
Change a registered atom through your app, then confirm its new value and event appear. If it is absent, check that watchAtoms received the same store as your provider.
Browse all registered atoms and their live current value:
number, boolean, object, array · N, null, etc. at a glanceThe Free row cap is used after the filter.
Every atom change is captured with rich metadata:
prev → next at a glance (e.g. 0 → 5, null → {name, email}, [2 items] → [3 items])INIT (initial registration) or WRITE (subsequent update)Tap any event to see three detailed tabs:
Atom name, timestamp, category badge, and a diff summary showing which object keys changed.
The full atom value after this change — collapsible JSON tree for objects, raw value for primitives.
Side-by-side comparison of before and after — additions (green), removals (red), modifications (yellow). Choose between tree view or split view.
If your app uses a <Provider> with a custom store, pass it directly:
import { createStore, Provider } from 'jotai';
import { watchAtoms } from '@buoy-gg/jotai';
import { countAtom, authAtom } from './atoms';
const myStore = createStore();
watchAtoms(myStore, { countAtom, authAtom });
export function App() {
return (
<Provider store={myStore}>
<YourApp />
</Provider>
);
}
import { createStore, Provider } from 'jotai';
import { watchAtoms } from '@buoy-gg/jotai';
import { countAtom, authAtom } from './atoms';
const myStore = createStore();
watchAtoms(myStore, { countAtom, authAtom });
export function App() {
return (
<Provider store={myStore}>
<YourApp />
</Provider>
);
}
Each atom gets a consistent color across the Atoms tab, Events tab, and detail views. Colors are assigned automatically based on atom name and persist for the session.
Every event row shows prev → next so you immediately know what changed — no need to tap in for simple updates.
Tap "view history" on any atom in the Atoms tab to see all events scoped to just that atom — useful for tracking a specific piece of state through a flow.
Find events by atom name or value content. Add filter patterns to hide noisy atoms from both the Atoms and Events tabs simultaneously.
Export the full atoms snapshot or event history as JSON for bug reports, test fixtures, or sharing with teammates (Pro).
Pause atom capture when you need to focus, resume when ready.
Only registered atoms are visible. Jotai has stores, but Buoy does not automatically discover every atom your app may use.
Read-only atoms cannot be written. A derived atom can be writable if it defines a write function; derivation alone does not determine whether a write is allowed. Check the tool's reported capability before editing or restoring it.
Install @buoy-gg/jotai and register your atoms — they appear in the on-device browser with live values, write history, and diffs.
Register the app’s atoms and store with watchAtoms. The shared panel and snapshot provider use those registrations. Import it from the package's /web entry (7.0.41 or later). See Web installation for registration, dependencies, and browser boundaries.