
TV is React Native — the same packages, the same install. What changes is the surface. A TV has no touch, so Buoy mounts headless and renders nothing on the screen, and Buoy Desktop becomes the whole interface.
TV support is in beta. The documented target set includes Apple TV simulators and Android TV emulators. Check Known limits and test your app on its actual target hardware; these pages are not a test record for every device and build.
Two ways to reach your running TV app:
There is no third way on TV: the in-app floating menu is deliberately absent.
Let your coding agent install Buoy in your app:
To install by hand, follow the Quick Start.
TV uses D-pad navigation. A focusable debug overlay can enter that focus order and affect the behavior under test. Mount Buoy headless to keep its controls on Desktop and leave the app screen available for inspection.
These exist because of TV. Both are desktop surfaces — the packages you install only capture.
| Tool | Package | What it does |
|---|---|---|
| TV Remote | @buoy-gg/tv-remote | Press the D-pad, Select, Menu, holds, media keys and typed text from Buoy Desktop; record a macro and replay it with per-step confirmation. |
| Focus Inspector | @buoy-gg/focus-inspector | Every focus move with its direction, the full focusable inventory, and flags for focus that gets stuck, vanishes, or is never reached. |
Use the remote event history and focus transitions together to record the sequence leading to a focus problem.
Buoy Desktop injects with adb shell input keyevent on Android TV and idb ui key on the Apple TV
simulator. Both travel the platform's real input pipeline, so focus moves through the same engine a
physical remote drives. The installed package only observes — it reports which events your app
actually received, which is what tells "the app handled that press" apart from "something swallowed
it."
The app package observes input events; host tools inject supported presses. A JavaScript handler call alone does not reproduce the platform focus-navigation path.
| Target | Capture | Replay presses | How |
|---|---|---|---|
| Android TV emulator | ✅ | ✅ everything | adb -s <serial> shell input keyevent |
| Android TV device | ✅ | ✅ everything | the same, over adb connect <ip>:5555 |
| Apple TV simulator | ✅ | ✅ except media keys | idb ui key / ui button / ui text |
| Apple TV device | ✅ | ❌ record only | no supported host-side injection exists |
Capture is pure JavaScript, so recording works everywhere, including retail hardware. That is the record-on-retail workflow: a tester presses the physical remote on a rack device, the macro is built from the app's own event stream, and replay runs against emulators and simulators.
None of these needed TV-specific code — they are the same tools the phone examples use, available for inspection through the corresponding installed packages:
Network · Storage · Console · Env · Routes · Events · React Query · Redux · Zustand · Jotai
idb ui key speaks the HID keyboard page,
which has no usages for play/pause, rewind, fast-forward, next or previous. Those steps report
skipped-unsupported, never silently pass. They work on Android.Next: Quick Start.