Installation

Buoy on TV is the ordinary React Native install with one prop changed. This page is the complete version of Quick Start.

Requirements

React Nativereact-native-tvos (the TV fork)
ArchitectureNew Architecture / Fabric
App typeExpo TV (@react-native-tvos/config-tv) or bare RN TV — both verified
Native deps added by BuoyNone — no podspecs, no gradle changes, no prebuild
Host toolingadb for Android TV; idb for the Apple TV simulator (remote injection only)

Expo Go cannot run a TV app at all — TV is always a prebuild + expo run:* app. That is a property of TV, not of Buoy.

Packages

Install the core, then any tools you want. Installed tools register themselves; there is no list to maintain.

npm install @buoy-gg/core

The two TV-specific tools:

npm install @buoy-gg/tv-remote @buoy-gg/focus-inspector

Everything else installs exactly as it does on a phone — Network, Storage, Console, Env, Routes, Events, React Query, Redux, Zustand, Jotai are all device-verified on both TV platforms.

Mounting

tsx
import { FloatingDevTools } from "@buoy-gg/core";

export default function App() {
  return (
    <>
      {/* your app */}
      <FloatingDevTools
        headless
        licenseKey={process.env.EXPO_PUBLIC_BUOY_KEY}
        externalSync={{ deviceId: DEVICE_ID, deviceName: "Living Room Apple TV" }}
      />
    </>
  );
}
import { FloatingDevTools } from "@buoy-gg/core";

export default function App() {
  return (
    <>
      {/* your app */}
      <FloatingDevTools
        headless
        licenseKey={process.env.EXPO_PUBLIC_BUOY_KEY}
        externalSync={{ deviceId: DEVICE_ID, deviceName: "Living Room Apple TV" }}
      />
    </>
  );
}

headless is required on TV in practice: without it the floating bubble renders, and on Android TV its focusable views join your app's D-pad focus order. See Overview.

deviceName is what shows in Buoy Desktop's switcher. Give each TV a distinct one — an Apple TV simulator and an Android TV emulator running the same app are otherwise hard to tell apart.

Connecting to the desktop

DeviceWhat it needs
Apple TV simulatorNothing — it connects on its own.
Android TV emulatoradb -s <serial> reverse tcp:42831 tcp:42831, once per boot.
Physical TV deviceA socketUrl pointing at your machine's LAN address.

Pass -s <serial> to adb explicitly. A physical phone is often attached alongside the emulator, and an unqualified adb reverse forwards the wrong device.

Host tooling for the TV Remote

Replay is injected from your machine, so the binaries have to be findable:

  • Androidadb, part of the Android SDK platform-tools.

  • Apple TV simulatoridb, which does not ship with Xcode:

    sh
    brew tap facebook/fb && brew install idb-companion
    pipx install fb-idb
    
    brew tap facebook/fb && brew install idb-companion
    pipx install fb-idb
    

Buoy looks for both on your PATH and in the usual install locations, so the packaged desktop app finds them even though a GUI app inherits a minimal PATH. If idb is missing, the Apple TV lane is disabled and the panel says so rather than failing silently.

Recording needs none of this — capture is pure JavaScript and works on retail hardware.

License keys

KeyWhat you get
No keynoneEvery tool works, with a minimal event history.
Freefree key, from an accountStandard access — event history across every tool.
Propaid keyEverything: production builds, the MCP server, and unlimited events.

Headless has no license entry UI — there is no on-device screen to type into. On TV a key can only arrive as the licenseKey prop, typically from an env var. The desktop dashboard works at the free tier; the MCP server requires Pro and will refuse an anonymous-tier TV device.

Don't have a key yet? Grab one at buoy.gg/pricing.