Developing a React Native TV App

Authors
Anisha Malde
Developer Advocate
@
Amazon
Karol Latusek
Software Engineer
@
Callstack

If you are reading this article, you are likely familiar with the complexities and fragmentation of TV app development, and like us, you've turned to React Native as a solution. It's an exciting use case of React Native, with the community making significant progress in this space—most notably, Expo introducing TV support in Expo SDK 50 earlier this year.

Inspired by our own experiences (& struggles 😅), we decided to create a comprehensive guide to using React Native for TV.

React Native for TV ebook cover

Since using React Native frameworks, such as Expo, is now the recommended approach to creating new apps, our guide focused on this. However, during our post-launch discussions, we realized there were still developers who wanted to know how to set up a bare React Native (RN) project for TV. That’s why this article will explore how to set up your bare RN project and configure it to build for multiple platforms.

Expo or Bare React Native?

There are two different ways to get started with TV development: Expo and Bare React Native. Your choice between these approaches will depend on several factors such as project complexity, performance needs, and the specific TV platforms you are targeting. 

Building a TV App With Expo

Expo presents a quicker route to TV app development by reducing the complexity of setting up your development environment. It offers out-of-the-box support for multiple platforms (web, TV, and mobile) and pre-configured build processes. Expo is ideal for getting started quickly! 🚀

How to get started

You can find more information in this Expo documentation or the ‘Getting Started’ chapter in our guidebook. 

Building a TV App With Bare React Native

On the other hand, Bare React Native can offer developers more control, and as such is ideal for projects that require specific libraries or have unique performance requirements.

How to get started

If you are starting a Bare React Native project, the easiest way to ensure your project is configured for TV is to use the react-native-tvos template (React Native community CLI template):

npx @react-native-community/cli@latest init TVTest --template @react-native-tvos/template-tv

This creates a project with react-native-tvos and all the required configurations for Android and TvOS.

Adding TV Support to an Existing Project

If you have an existing React Native project and want to add TV support, you need to handle these configurations to extend it to build TV apps. Note that the above template takes care of this for you.

1. Update package.json dependencies 

"react-native": "npm:react-native-tvos@latest",

This enables your project to use a fork of React Native, react-native-tvos, with the changes needed to support Apple TV and Android TV.

💡 You cannot use this package and the core react-native package simultaneously in a project however using the fork doesn’t prevent you from creating your ‘regular’ mobile builds.

2. Update Android Manifest

  • For Android TV applications you need to ensure that your app is declaring a launcher activity by adding the leanback launcher to your Android manifest file:
<intent-filter>
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>

Without this, your application will not be discoverable on Google Play, and it will not be recognized as a TV app that appears on the system's home screen after installation (the app will only be visible in Settings > Apps > All Apps.)

  • Declare that the android.hardware.touchscreen feature is not required and that your app is built for Android TV:
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.faketouch" android:required="false" />
  • Declare that your app is built for Android TV:
<uses-feature android:name="android.software.leanback" android:required="false" />

For more information on these changes, read the Android documentation on adding TV support.

💡 We recommend adding these changes to the TV apps' Android manifest only. If your app is targeting different build platforms in addition to TV, you still want to make sure that the platform domain features, e.g., touchScreen is required on the mobile build. 

We explain how you can structure your app to have separate manifests below.

3. Update Project.pbxproj 

Update the iOS project file to define support of TVOS Gist.

4. Update Podfile

-platform :ios, min_ios_version_supported

+platform :tvos, min_ios_version_supported

This ensures your project is being configured for tvOS.

Structuring Your App to Handle the Additional TV Platform

One of the biggest advantages of React Native is the possibility to use one codebase for multiple platforms. This is also the case when you create builds for TV. However, mobile and TV projects may need separate package.json, podfiles, and Android manifests.

How can you structure your app to handle this? One option is to structure your project as a monorepo:

tree graph showing your project as a monorepo

Check Oskar’s article for details on a monorepo setup with Yarn workspaces. This allows flexibility as we can separate TV related code from the mobile and can also expand it to other TV platforms e.g. WebOS, Tizen.

Another approach for smaller projects use a structure similar to the template and differentiate Android TV and Android Mobile specific feature sets on the build flavour level and then by merging manifests. 

graph showing merging manifests

Whether you choose the Expo route or the Bare React Native approach, adding TV support to your app requires just a few steps. We hope this helps you get started on your TV development journey. Check out the guidebook for more tips and tricks on building for TV using React Native. 

React Native for TV guidebook banner

Insights

Learn more about TV

cover

Jun 11Article

AI-Assisted React Native Migration for TV: Lessons From Zattoo

A practical look at React Native TV migration, based on Zattoo’s experience with shared code, platform differences, and team change.

cover

Apr 27Webinar

From Native to React Native for TV: The Zattoo Case

Learn why and how Zattoo moved from native TV apps to React Native, what changed for their team, and what it takes to scale across multiple platforms efficiently.

cover

Nov 25Podcast

Amazon's Vega OS: A New OS With React Native Built-In

Giovanni Laquidara (Amazon) introduces Vega OS, a new lightweight operating system with React Native built-in, designed for high-performance on low-end media devices.

cover

Oct 3Article

Cross-Platform TV Apps With React Native for tvOS, Android TV, and Tizen

Learn why React Native is a powerful choice for TV app development. Discover how it unifies development for tvOS, Android TV, Tizen, and more with a single codebase.

cover

Oct 2Live Stream

Building React Native App for Vega OS

React 19.2 brings <Activity> and useEffectEvent, new ideas for React state management arrive, and Vega OS debuts as a React Native-powered Linux OS.

cover

May 29Talk

The Bigger Picture

React Native lessons from TV that scale: performance, architecture & cross-platform code strategies, beyond mobile, across devices.

cover

Mar 5Podcast

Multiple TV Platforms, One Codebase: React Native TV App Development

Is TV app development is the same as mobile, but bigger? It's not. In this episode, Michael Khirallah (DIRECTV) and Chris Trag (Amazon) will explain why.

cover

Dec 13Podcast

React Native for TV App Development

Learn about the current state of the TV development space and the benefits and considerations of applying React Native to it.

cover

Oct 6Article

Receiving a Live Stream With Amazon IVS in React Native

Discover how to integrate Amazon IVS (Interactive Video Service) into your app, powered by AWS. Learn to set up a streaming player with minimal code.

cover

Feb 2Article

Amazon Fire TV Stick App in React Native

Use React Native to build an AF app. Explore more in our article! Contact us for React Native project assistance.

cover

Mar 19Tutorial

The Hard Way vs. The React Native AI SDK Way: Stop Writing Custom Modules for Every Model

Learn how React Native AI uses a unified provider model to switch between cloud and on-device LLMs without rewriting application logic, enabling reliable AI experiences online and offline.

cover

Mar 12Tutorial

Build Smarter Apps: Tool Calling & AI Orchestration Explained

Learn how on-device models in React Native can call tools, interact with external APIs, and return structured outputs you can use directly in application logic.

cover

Mar 5Tutorial

MLC LLM + React Native: On-Device AI Without the Pain

Learn how to run third-party on-device LLMs in React Native using MLC LLM. Choose your models, run them efficiently across platforms, and keep a unified JavaScript API with React Native AI.

cover

Feb 24Tutorial

Intelligent Fallbacks with Apple Intelligence in React Native

Learn how to use Apple’s built-in Foundation Models in React Native apps, reduce memory usage, and enable fast, fully on-device AI with React Native AI Apple.

cover

Feb 10Tutorial

What Is the React Native AI SDK? A Complete Intro & Quickstart

Learn why on-device AI matters for React Native apps, how local LLMs behave offline, and what problems React Native AI is designed to solve from day one.

cover

Jan 29Tutorial

Implementing an Android TurboModule with Kotlin

Learn how to implement a React Native TurboModule on Android, from the TypeScript spec and Codegen to the Kotlin implementation and package registration.

cover

Jan 19Tutorial

Working with Different Threads in Swift TurboModules

Learn how JavaScript, native module, background, and main threads interact in React Native TurboModules, and how to use GCD queues to run async work safely in Swift.

cover

Jan 9Tutorial

How to Add Type-Safe Constants to Swift TurboModules

Learn how to expose typed, immutable constants from a Swift TurboModule using Codegen, and get full end-to-end type safety between native and JavaScript.

cover

Dec 30Tutorial

Adding Event Emitters to Your TurboModule in Swift

Learn how to emit native events from a Swift TurboModule and subscribe to them in JavaScript, including proper memory management and Codegen integration.

cover

Dec 22Tutorial

Writing Your First TurboModule in Swift

Learn how to build a fully working TurboModule in Swift, integrate it with Codegen, and bridge it through Objective‑C inside an Expo app.