Generated banner for React Native Tv Best Practices
Generated logo for React Native Tv Best Practices

React Native Tv Best Practices

CallstackOfficialPublished by Callstack

  • Skill
  • Guidelines
  • Software development
  • MIT
  • No issues found

From the author

Reviews React Native TV apps for focus/D-pad navigation, 10-foot UI layout, TV playback/DRM integration, low-memory TV performance, and TV accessibility. Use when building, debugging, or reviewing react-native-tvos, Expo TV, Amazon Vega/Kepler, or React Native web TV targets where the issue depends on remote input, TV focus, TV packaging, TV hardware, or TV playback constraints.
— the description by Callstack

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a comprehensive set of best practices for building, testing, and debugging React Native applications on TV platforms, including Apple TV, Android TV, Fire TV, and web-based targets. It focuses on the unique challenges of the 10-foot UI, such as remote-based D-pad navigation, focus management, TV-specific performance constraints, and accessibility requirements. The guidance helps developers navigate the differences between various TV stacks like react-native-tvos and Amazon Vega/Kepler.

What it does

  • Provides heuristics for 10-foot UI design, typography, and layout.
  • Offers strategies for managing focus engines and D-pad navigation.
  • Details performance optimization for low-memory TV hardware.
  • Outlines requirements for TV-specific accessibility and screen reader support.
  • Explains how to handle video playback, DRM, and player controls.
  • Guides developers on identifying and setting up the correct TV platform stack.

When to use it

  • When building or debugging navigation issues related to remote inputs.
  • When optimizing app performance for low-memory TV devices.
  • When implementing accessibility features for TV screen readers.
  • When troubleshooting video playback or DRM integration errors.
  • When designing layouts for 10-foot viewing distances.

Advantages

  • Reduces platform-specific bugs by providing clear stack-detection rules.
  • Improves user experience through consistent focus and navigation patterns.
  • Helps meet accessibility standards required for TV app store approval.
  • Provides actionable debugging paths for common TV-specific failures.

Usage examples

“How do I fix focus jumping to the wrong element in my React Native TV app?”
The agent will guide you to use focus-management.md, recommending the use of TVFocusGuideView for shared focus paths and advising against imperative focus overrides.
“My app crashes on Fire TV when scrolling through a long list of posters. What should I check?”
The agent will point you to perf-lists.md and perf-memory.md to implement proper virtualization and optimize image memory usage for low-memory hardware.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/callstackincubator/react-native-tv-best-practices/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip react-native-tv-best-practices.zip -d .agents/skills

Documentation by Callstack

React Native TV Best Practices

Overview

TV-specific review guidance for React Native-backed apps on Apple TV, Android TV, Fire TV, Amazon Vega/Kepler, and web-based TV targets such as Tizen or webOS.

Use this skill only for TV deltas: remote input, focus engines, 10-foot layout, platform packaging, playback/DRM, low-memory TV hardware, and TV accessibility. For ordinary React Native performance or architecture issues, use react-native-best-practices.

Skill Format

Reference files are grouped by topic prefix:

  • focus-*: focus engines, focus guides, focus event performance

  • nav-*: D-pad navigation, Back/Menu behavior, keyboard/search input

  • design-*: 10-foot typography, layout, color, focus visibility

  • perf-*: startup, memory, lists, animation, and network constraints on TV hardware

  • video-*: playback architecture, DRM/protocol selection, debugging

  • a11y-*: TV accessibility implementation and audit checks

  • setup-*: stack detection, setup, architecture, cross-platform behavior

  • test-* and release-*: test coverage, E2E, and CI/release workflows

When to Apply

Apply this skill when the app targets a TV platform and the work involves:

  • Focus movement, visible focus, focus restoration, or remote/D-pad input

  • TV layout readability, overscan/safe areas, or 10-foot UI density

  • TV player controls, manifests, DRM, decoder support, or playback errors

  • Performance on low-memory TV hardware, especially with video or large carousels

  • TV accessibility with screen readers, captions, focus order, or remote-only interaction

  • Platform setup for react-native-tvos, Expo TV, Amazon Vega/Kepler, Tizen, or webOS

Before You Start — Identify the TV Stack

This skill covers several TV stacks. Detect which one the app targets before flagging setup issues — demanding react-native-tvos, a tvOS Podfile, or an Android TV manifest on a Vega/Kepler or web-based TV app produces false positives.

StackHow to detectSetup expectations
react-native-tvos (Apple TV, Android TV, Fire TV)"react-native": "npm:react-native-tvos@…" in package.jsontvOS Podfile (platform :tvos); Android TV leanback/LEANBACK_LAUNCHER manifest entries; TV emulator/simulator
Expo + react-native-tvosabove plus @react-native-tvos/config-tv in app.jsonEXPO_TV=1 prebuild; react-native-tvos version must match the Expo SDK; not all Expo features/libraries are available on TV
Amazon Vega / KeplerVega/Kepler SDK & tooling (@amazon-devices/* deps, Kepler manifest); no react-native-tvosAmazon's Vega/Kepler toolchain — react-native-tvos, tvOS Podfile, and Android TV manifest do not apply
Web-based TV (Tizen, webOS)web bundler (Rsbuild/webpack) + platform packaging; spatial-nav libraryPlatform SDK packaging; @noriginmedia/norigin-spatial-navigation for focus

The focus, 10-foot design, performance, accessibility, and player guidance applies across all of these — only the setup/build expectations are stack-specific.

Review Rules

  • Resolve the target stack before setup advice.

  • Prefer natural focus order and focus guides before imperative focus calls or broad nextFocus* maps.

  • Treat focus loss, invisible focus, and broken Back/Menu behavior as navigation bugs.

  • Check readability, safe areas, and focus states at TV distance before tuning visual details.

  • Profile on the weakest supported TV device before reporting performance fixes as complete.

  • Separate playback failures by layer: manifest request, DRM license exchange, decoder capability, player state, and React UI controls.

Priority-Ordered Guidelines

PriorityCategoryImpactPrefix
1Focus and D-pad navigationCRITICALfocus-*, nav-*
2List, animation, and input performanceCRITICALperf-*
3Playback and DRM failuresHIGHvideo-*
410-foot readability and layoutHIGHdesign-*
5TV accessibilityHIGHa11y-*
6Stack setup, testing, and releaseMEDIUMsetup-*, test-*, release-*

Quick Reference

  1. Detect the TV stack from package files, manifests, native folders, and platform tooling.

  2. Reproduce navigation with the remote or D-pad path, not mouse/touch assumptions.

  3. Confirm the focused element is always visible, reachable, and restored after modals/routes.

  4. Check playback failures from the network/DRM layer upward before changing React controls.

  5. Measure list, animation, memory, and startup work on the weakest supported TV target.

References

Focus and Navigation
FileImpactDescription
focus-management.mdCRITICALFocus engines, focus guides, nextFocus*, and focus restoration
focus-performance.mdCRITICALAvoiding frame drops from focus event handling
nav-directional.mdCRITICALDirectional navigation rules across TV platforms
nav-patterns.mdCRITICALGlobal/local navigation, modals, tabs, and Back behavior
nav-keyboard.mdMEDIUMSearch and text input with remotes
Design
FileImpactDescription
design-10foot.mdHIGH10-foot review heuristics
design-typography.mdHIGHTV type sizing and readability
design-layout.mdHIGHSafe areas, spacing, carousels, and focus room
design-color.mdMEDIUMContrast and TV display color constraints
Performance
FileImpactDescription
perf-overview.mdHIGHTV performance targets and profiling order
perf-lists.mdCRITICALVirtualized rows and poster-heavy lists
perf-animations.mdCRITICALFocus and transition animation performance
perf-memory.mdHIGHLow-memory TV crashes and image/video pressure
perf-network.mdHIGHRemote input, request stalls, and network resilience
Video, Accessibility, Setup, Testing
FileImpactDescription
video-streaming.mdHIGHTV platform protocol/DRM selection
video-players.mdHIGHPlayer choices and custom controls
video-debugging.mdHIGHManifest, DRM, codec, and playback debugging
a11y-overview.mdMEDIUMTV-specific accessibility differences
a11y-implementation.mdHIGHAccessible labels, roles, live regions, and focus
a11y-checklist.mdMEDIUMLaunch accessibility audit checklist
setup-getting-started.mdMEDIUMreact-native-tvos and Expo TV setup
setup-cross-platform.mdMEDIUMPlatform detection and cross-platform caveats
setup-architecture.mdMEDIUMCode sharing and project structure
test-strategy.mdMEDIUMTV testing scope and coverage split
test-javascript.mdMEDIUMJS-level remote/focus test helpers
test-e2e.mdMEDIUMAppium and TV E2E coverage
release-cicd.mdMEDIUMCI, build fingerprinting, and release checks

Problem → Skill Mapping

SymptomStart Here
"Focus jumps to wrong element"focus-management.md → Debugging section
"App freezes when scrolling lists"perf-lists.md → Virtualization
"Animations stutter on Fire TV"perf-animations.md → Native driver
"Text too small on TV"design-typography.md → Minimum sizes
"Video won't play / DRM errors"video-streaming.md → DRM section
"Screen reader skips elements"a11y-implementation.md → Roles & labels
"Back button doesn't work right"nav-patterns.md → Back navigation
"Keyboard covers content"nav-keyboard.md → Built-in vs custom
"App takes forever to start"perf-overview.md → Startup time
"Images causing memory crashes"perf-memory.md → Image optimization
"CI pipeline takes hours"release-cicd.md → Fingerprinting
"How to share code across platforms"setup-architecture.md → Code sharing

Security (TV-Specific)

General dependency/input hygiene applies as in any RN app; the TV-specific deltas worth calling out:

  • Never embed FairPlay/Widevine/PlayReady keys in client code — treat the license server as the trust boundary and keep DRM tokens server-issued.

Files

references/focus-performance.md


title: Focus Performance impact: CRITICAL tags: focus, performance, re-renders, react-memo, transforms, tv

Focus Performance

On TV, every D-pad press sends focus change events. Careless handling triggers dozens of component updates per press, tanking your frame rate.

Quick Reference

  • Keep focus effects local — don't update global state for visual changes

  • Prefer a single top-level focus frame over per-card overlays

  • Use transforms (scale, translate) not layout properties (width, height) for focus animations

  • Batch focus updates in one render frame

Why It's Worse on TV

  • Focus cascades: Changing focus in one row can cause style updates in multiple rows

  • Platform quirks: Tizen/webOS trigger both onBlur and onFocus for multiple elements in quick succession

  • Remote latency: Bluetooth/IR remotes already have inherent latency — any JS thread delay makes it worse

  • Users hold directions or rapidly press buttons — your app must process multiple focus events per second

Problem: Cascading Renders

Bad — Every card stores its own focus state in React state:

const [isFocused, setIsFocused] = useState(false);
useEffect(() => {
  if (focusedId === id) setIsFocused(true);
  else setIsFocused(false);
}, [focusedId]);

Every change to focusedId re-renders every card in the row.

Better — Memoize the card:

const Card = React.memo(({ isFocused, poster }) => (
  <Image
    style={isFocused ? styles.focused : styles.normal}
    source={poster}
  />
));

Only the focused card re-renders, not the whole row.

Problem: Overlay Flicker

Bad — Unmounting/remounting overlays on focus:

{isFocused && <FocusOverlay />}

Better — Toggle opacity:

<View style={{ opacity: isFocused ? 1 : 0 }}>
  <FocusOverlay />
</View>

Avoids flicker but mounts dozens of hidden overlays consuming memory.

Best — Single top-level focus frame:

const [frame, setFrame] = useState(null);
const onCardFocus = (ref) => {
  ref.current?.measure((x, y, w, h, pageX, pageY) => {
    setFrame({ x: pageX, y: pageY, w, h });
  });
};

return (
  <View style={{ flex: 1 }}>
    <FlatList data={movies} renderItem={({ item }) => {
      const ref = useRef(null);
      return (
        <Card ref={ref} item={item} onFocus={() => onCardFocus(ref)} />
      );
    }} />
    {frame && (
      <Animated.View style={[styles.absolute, {
        left: frame.x, top: frame.y,
        width: frame.w, height: frame.h
      }]} />
    )}
  </View>
);

One focus frame moves around — no duplication, minimal re-renders.

TV-Specific Checks

  1. Keep focus effects local — Don't update Redux/Zustand for visual focus changes.

  2. Preload focus styles — Shadows, glows, gradients are GPU-expensive to generate on the fly. Pre-render them and toggle visibility.

  3. Batch focus updates — A single D-pad press can fire blur and focus events across multiple elements.

  4. Avoid layout shifts — Changing focus geometry can make the next directional search unstable.

  5. Use platform-specific focus helpers:

    • On Android TV/Fire TV: focusable prop reduces extra focus jumps

    • On Apple TV/Android TV/Fire TV: TVFocusGuideView to control focus without excessive JS

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
Callstack
Publisher
Callstack (Official)
Source
callstackincubator/agent-skills · skills/react-native-tv-best-practices · commit 59e9d17
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Callstack.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download react-native-tv-best-practices.zip