Getting started with React Native apps on Meta Horizon OS
Updated: Dec 9, 2025
React Native developers can use familiar tooling and frameworks to build apps for Meta Quest.
Just like for mobile apps, Meta recommends using Expo. Also, we recommend using the expo-horizon-core plugin, which will help you remove and skip unsupported dependencies and permissions, configure Android product flavors, specify Meta Horizon App ID, and provide Meta Quest-specific JS utilities.
Demo of basic expo-horizon-core functions.
Getting started with Meta Quest in Expo
To add Meta Quest support to your Expo app, there are two main steps:
Set up the platform integration using the expo-horizon-core library and config plugin.
Migrate or adjust your libraries to versions that support Meta Horizon OS (only a few, like expo-location and expo-notifications, require special handling — see the unsupported dependencies list).
Step 1. Set up the platform integration with expo-horizon-core
To prepare your app for Meta Horizon OS:
Install the core library.
npm install expo-horizon-core
# or
yarn add expo-horizon-core
Add the following configuration to either your app.json or app.config.js/app.config.ts file to enable the expo-horizon-core config plugin.
For more granular control over the screen orientation, use Expo’s ScreenOrientation package.
Run this command to clean up your existing directories based on your app configuration file and then create a new prebuild.
expo prebuild --clean
Use Android product flavors to build for Quest or mobile. To select a target platform you need to use the correct build variant. For example, in package.json you can use:
Alternatively, you can select and run the variants in the Android Studio using the Build Variants menu.
Step 2. Add custom libraries with Meta Quest support
After setting up your development build for Meta Quest devices, you can start using the forked Expo libraries that include native support for Quest. If you want to write cross-platform code for Meta Quest and other devices, you might need to use the isHorizonDevice() method from expo-horizon-core to guard against executing platform-specific logic on platforms that do not support it.
Other libraries, like expo-sms or expo-sensors, provide feature-specific checks that should be used to avoid executing unsupported logic.
Adding expo-horizon-location
Since Meta Quest devices lack GPS sensors, their location accuracy and update frequency are limited. Additionally, certain features like geocoding, device heading, and background location are not supported.
Keep in mind that some unsupported features may throw errors when used on Quest devices. To handle this gracefully, check for isHorizonDevice() (from expo-horizon-core) before using those features and provide a suitable fallback when running on Meta Quest.
To get started with expo-horizon-location, substitute the original library with our forked version and update the necessary imports.
Install the package.
npx expo install expo-horizon-location
Remove the old expo-location package.
Update your app configuration by replacing the expo-location config plugin with expo-horizon-location.
Run the app using the selected flavor: yarn mobile / yarn quest.
Update your imports.
// import * as Location from 'expo-location';
import * as Location from 'expo-horizon-location';
Using a forked expo-location library to access location services on Meta Quest devices.
Adding expo-horizon-notifications
After setting up your Meta Quest development build, you can add notification support using the expo-horizon-notifications package. For more information about notifications support on Meta Quest, see User Notifications Overview.
Install the package.
npx expo install expo-horizon-notifications
# and remove the old package:
npm uninstall expo-notifications
# or
yarn remove expo-notifications
Update your app.json/app.config.js to replace expo-notifications with expo-horizon-notifications.
Use the questDebug or questRelease build variant to run the app on Meta Quest devices. See expo-horizon-core for more details.
Update your imports:
// import notifications package
import * as Notifications from 'expo-horizon-notifications';
On the device, notifications appear just above your app. Since the screenshots didn’t capture the notifications due to privacy protection, we’re displaying exemplary ones in the notification center instead.
Adding expo-iap
Unlike standard Android, which uses Google Play Billing, Meta Quest has its own billing infrastructure: the Meta Horizon Billing SDK. This platform difference means you need a library that supports the Meta-provided SDK.
The expo-iap library supports Meta Horizon OS, providing a single, cross-platform API for handling in-app purchases.
Add the expo-iap plugin to the plugins array of either your app.json or app.config.js/app.config.ts file.
[
'expo-iap',
{
modules: {
horizon: true, // Enable Horizon OS support
},
android: {
horizonAppId: 'YOUR_HORIZON_APP_ID', // Required: Your Horizon App ID
},
},
],
Your full configuration file should look like this.
export default {
expo: {
plugins: [
[
"expo-horizon-core",
{
horizonAppId: "DEMO_APP_ID", // Replace with your actual Horizon App ID if needed
defaultHeight: "640dp",
defaultWidth: "1024dp",
supportedDevices: "quest2|quest3|quest3s",
disableVrHeadtracking: false,
},
],
[
"expo-iap",
{
modules: {
horizon: true, // Enable Horizon OS support
},
android: {
horizonAppId: "YOUR_HORIZON_APP_ID", // Required: Your Horizon App ID
},
},
],
],
},
};