Develop
Develop
Select your platform

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
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:
  1. Set up the platform integration using the expo-horizon-core library and config plugin.
  2. 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:
  1. Install the core library.
    npm install expo-horizon-core
    # or
    yarn add expo-horizon-core
    
  2. 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.
    {
      "expo": {
        "plugins": [
          [
            "expo-horizon-core",
            {
              "horizonAppId": "DEMO_APP_ID",
              "defaultHeight": "640dp",
              "defaultWidth": "1024dp",
              "supportedDevices": "quest2|quest3|quest3s",
              "disableVrHeadtracking": false,
              "orientation": "default"
            }
          ]
        ]
      }
    }
    
    For a complete list of options and configuration details, see the expo-horizon-core documentation.
    For more granular control over the screen orientation, use Expo’s ScreenOrientation package.
  3. Run this command to clean up your existing directories based on your app configuration file and then create a new prebuild.
    expo prebuild --clean
    
  4. 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:
    {
      "scripts": {
        "prebuild": "expo prebuild",
        "android": "expo run:android --variant mobileDebug",
        "quest": "expo run:android --variant questDebug",
        "android:release": "expo run:android --variant mobileRelease",
        "quest:release": "expo run:android --variant questRelease"
      }
    }
    
    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.
  1. Install the package.
     npx expo install expo-horizon-location
    
  2. Remove the old expo-location package.
  3. Update your app configuration by replacing the expo-location config plugin with expo-horizon-location.
  4. Run the app using the selected flavor: yarn mobile / yarn quest.
  5. Update your imports.
     // import * as Location from 'expo-location';
     import * as Location from 'expo-horizon-location';
    
Forked expo-location library interface for accessing location services on Meta Quest devices
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.
  1. Install the package.
     npx expo install expo-horizon-notifications
     # and remove the old package:
     npm uninstall expo-notifications
     # or
     yarn remove expo-notifications
    
  2. Update your app.json/app.config.js to replace expo-notifications with expo-horizon-notifications.
  3. Use the questDebug or questRelease build variant to run the app on Meta Quest devices. See expo-horizon-core for more details.
  4. Update your imports:
     // import notifications package
     import * as Notifications from 'expo-horizon-notifications';
    
Notifications displayed above app on Meta Quest device
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.
  1. 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
            },
            },
        ],
        ],
    },
    };
    

Getting more help

For comprehensive documentation, API references, and additional guides on building React Native apps for Meta Horizon OS, see the React Native for Meta Horizon OS documentation.

Next steps

Did you find this page helpful?