Get the in-app menu running in under 2 minutes — then reach the same tools from your desktop or your AI agent.
npm install @buoy-gg/coreDrop FloatingDevTools at the root of your app:
import { FloatingDevTools } from "@buoy-gg/core";
export default function App() {
return (
<>
<YourApp />
<FloatingDevTools />
</>
);
}
import { FloatingDevTools } from "@buoy-gg/core";
export default function App() {
return (
<>
<YourApp />
<FloatingDevTools />
</>
);
}
A floating button appears in the corner of your app. Tap it to open the menu.
Every tool works with no key at all, capped at about five entries each — enough to see what they do. A free key raises that to 25 per tool and includes Pro free every weekend; Pro unlocks everything: production builds, the MCP server, Ask Buoy, and unlimited capture. See pricing.
Grab your key — free or paid, same command:
npx buoy login
npx buoy login
Run this from a project where
@buoy-gg/coreis installed —npxresolves the command from your ownnode_modules. If npx tries to download something instead (there is an unrelatedbuoypackage on npm), name the package explicitly:bashnpx --package=@buoy-gg/core buoy loginnpx --package=@buoy-gg/core buoy login
It signs you in, writes the key to .env.local, and gitignores it. Then:
Buoy.init({ licenseKey: process.env.EXPO_PUBLIC_BUOY_KEY });
Buoy.init({ licenseKey: process.env.EXPO_PUBLIC_BUOY_KEY });
See Installation for the details.
Install any tool package — it automatically appears in the menu. No wiring, no config.
npm install @buoy-gg/networkThat's it. Open the menu, tap Network, and you're watching every API call in real-time.
If you use Zustand, pass your stores directly via zustandStores:
import { FloatingDevTools } from "@buoy-gg/core";
import { useAuthStore } from "./stores/auth";
import { useCartStore } from "./stores/cart";
const stores = {
authStore: useAuthStore,
cartStore: useCartStore,
};
return (
<FloatingDevTools zustandStores={stores} />
);
import { FloatingDevTools } from "@buoy-gg/core";
import { useAuthStore } from "./stores/auth";
import { useCartStore } from "./stores/cart";
const stores = {
authStore: useAuthStore,
cartStore: useCartStore,
};
return (
<FloatingDevTools zustandStores={stores} />
);
If you use Jotai, call watchAtoms once at module scope with your store and a named map of atoms:
import { getDefaultStore } from "jotai";
import { watchAtoms } from "@buoy-gg/jotai";
import { authAtom } from "./atoms/auth";
import { cartAtom } from "./atoms/cart";
watchAtoms(getDefaultStore(), {
authAtom,
cartAtom,
});
import { getDefaultStore } from "jotai";
import { watchAtoms } from "@buoy-gg/jotai";
import { authAtom } from "./atoms/auth";
import { cartAtom } from "./atoms/cart";
watchAtoms(getDefaultStore(), {
authAtom,
cartAtom,
});
No wrappers, no middleware. Registered atoms automatically appear in the Jotai tool inside your FloatingDevTools menu.
| Package | What you get |
|---|---|
Buoy Desktop | Scan QR codes and IDs in the iOS Simulator — point it at your Mac screen, a webcam, an image or a video |
@buoy-gg/network | API request monitor with timing, headers, and errors |
@buoy-gg/sentry | Every envelope your app sends to Sentry, what it costs, and why an event never arrived |
@buoy-gg/storage | Browse and edit AsyncStorage, MMKV & SecureStore live |
@buoy-gg/env | Environment variable inspector with validation |
@buoy-gg/react-query | TanStack Query devtools with offline simulation |
@buoy-gg/route-events | Navigation tracking and route browser |
@buoy-gg/highlight-updates | See WHY components re-render with visual overlays |
@buoy-gg/perf-monitor | Track FPS, CPU & memory live and benchmark variants |
@buoy-gg/js-top | Live Task Manager for the JS thread — what's eating your JS FPS |
@buoy-gg/redux | Redux action monitor with state diffing and time-travel |
@buoy-gg/events | Unified timeline across all tools with LLM-ready export |
@buoy-gg/zustand | Zustand store monitor with state diffing and jump-to-state |
@buoy-gg/jotai | Jotai atom inspector with live values, diffs, and event history |
@buoy-gg/images | Every image load with cache verdicts, oversize audit, and failures |
@buoy-gg/assets | Bundled-asset inventory with sizes, duplicates, and never-loaded detection |
POLICE BOX @buoy-gg/time-machine | Snapshot & restore app state (storage, stores, query cache) as named restore points |
@buoy-gg/scenarios | Saved, parameterized one-tap app states for QA, support and demos |
@buoy-gg/ask-buoy | An in-app AI chat that drives every Buoy tool in plain English — your model, a visible changes bar, real undo |
@buoy-gg/tv-remote | Drive an Apple TV / Android TV D-pad from the desktop and replay navigation macros |
@buoy-gg/focus-inspector | Track D-pad focus on Apple TV / Android TV and flag focus that sticks, vanishes or is never reached |
@buoy-gg/image-overlay | Overlay design mockups on your app for pixel-perfect comparison |
Install what you need. Skip what you don't.
Only show devtools to specific users — admins, QA, internal team members, or whoever your business needs:
import { FloatingDevTools } from "@buoy-gg/core";
export default function App() {
const { user } = useAuth();
// Only render for internal users, admins, or QA
const showDevTools =
user?.role === "admin" ||
user?.role === "qa" ||
user?.email?.endsWith("@yourcompany.com");
return (
<>
<YourApp />
{showDevTools && (
<FloatingDevTools
licenseKey="YOUR_LICENSE_KEY"
userRole={user?.role}
/>
)}
</>
);
}
import { FloatingDevTools } from "@buoy-gg/core";
export default function App() {
const { user } = useAuth();
// Only render for internal users, admins, or QA
const showDevTools =
user?.role === "admin" ||
user?.role === "qa" ||
user?.email?.endsWith("@yourcompany.com");
return (
<>
<YourApp />
{showDevTools && (
<FloatingDevTools
licenseKey="YOUR_LICENSE_KEY"
userRole={user?.role}
/>
)}
</>
);
}
Or keep it available for everyone — your QA and support teams will thank you.
The tools you just installed aren't only in the floating menu — reach the same live app three more ways:
npx -y @buoy-gg/mcp@latest init
npx -y @buoy-gg/mcp@latest init
Buoy Desktop is free to use; the MCP server and Ask Buoy are Pro features. Desktop and MCP talk to your app through one extra package — npm install @buoy-gg/external-sync in the app and restart Metro with --clear — and from there the connection is automatic, with no URLs to configure (physical devices included). Ask Buoy needs no broker at all: it runs on the device and talks only to the endpoint you give it.
No — every tool works without one, capped at about five entries each. A free key raises that to 25 per tool and includes Pro free every weekend. Pro unlocks everything: production builds, the MCP server, Ask Buoy, and unlimited capture.
The fastest way to get either is npx buoy login. A free key needs no card and
takes about thirty seconds.
Once a day, in development only, it sends a random install id, the Buoy version,
your platform, and your license tier. Never your project, your app, or anything
from the tools — that data never leaves your machine. Turn it off with
Buoy.init({ telemetry: false }). Full details: Telemetry.
Install the package. Auto-discovery finds it and the tool appears in the floating menu with no wiring and no config — npm install @buoy-gg/network, open the menu, tap Network.
The menu only renders where you mount FloatingDevTools, and desktop sync is off whenever __DEV__ is false unless you opt in explicitly with a Pro license — so a shipped app never dials a broker on a customer's phone.