Develop

Build an Expo app for VR

Updated: Sep 2, 2026
This page gets you to a React Native app running on Meta Horizon OS. Start from the sample project for the fastest path, or add Horizon OS support to a new Expo project.

Start from the sample project

React Native showcase app running in a panel on Meta Quest.
The easiest way to get started is to use the React Native Horizon OS sample as your template. It provides a working Expo project configured for Meta Quest.

Start from a new Expo project

If you do not use the sample project, create a standard Expo project:
npx create-expo-app@latest my-quest-app
cd my-quest-app
Add the Horizon OS integration and an Expo development client:
npm install expo-horizon-core
npx expo install expo-dev-client

Configure the project for Horizon OS

The sample project already includes Horizon OS configuration. If you started from a new Expo project, add the expo-horizon-core plugin to app.json:
{
  "expo": {
    "orientation": "default",
    "plugins": [
      [
        "expo-horizon-core",
        {
          "horizonAppId": "YOUR_HORIZON_APP_ID",
          "defaultWidth": "1024dp",
          "defaultHeight": "640dp",
          "supportedDevices": "quest2|questpro|quest3|quest3s",
          "disableVrHeadtracking": false,
          "allowBackup": false
        }
      ]
    ]
  }
}
Create an app in the Meta Horizon Developer Dashboard, then select Development > API to copy its App ID. See Creating an App ID for details.
Replace YOUR_HORIZON_APP_ID in the configuration above with this value.
The plugin adds the Horizon OS metadata and Quest build variants when Expo generates the native project.

Generate the Android project

If you started from a new Expo project, generate its native Android project:
npx expo prebuild --clean
expo-horizon-core creates separate quest and mobile build variants. Add scripts for each target to package.json:
{
  "scripts": {
    "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"
  }
}
Use the quest variants for Meta Quest and the mobile variants for other Android devices.
With a headset connected and in developer mode, build, install, and run the Quest development client:
npm run quest
This command also starts Metro. After the first build, JavaScript changes update through Fast Refresh. Rebuild when native dependencies or Expo configuration change.

Test your app

Choose the development loop that fits what you are testing:
  • Use Expo Go to preview JavaScript and UI changes.
  • Install a Quest APK on your headset or Meta Spatial Simulator to test expo-horizon-core, native modules, and Horizon OS features.
See Expo for React Native for both workflows.

Adapt unsupported features

Meta Horizon OS is based on AOSP and does not include Google Mobile Services. Some mobile hardware and Android permissions are also unavailable on Meta Quest.
If your app also targets mobile devices, use isHorizonDevice() from expo-horizon-core to select a Horizon OS integration or a mobile fallback.
Use Horizon-compatible integrations where available:
Mobile integrationUse on Meta Horizon OS
expo-location
expo-horizon-location
expo-notifications
expo-horizon-notifications
Google Play Billing
expo-iap with Horizon support enabled
Other Google Mobile Services
Use the recommended alternatives in Unsupported dependencies
Some location functionality, including GPS, heading, geocoding, and background location, is not available on Meta Quest. Provide a fallback when your app depends on these capabilities.
Remove prohibited permissions before building. See Unsupported permissions for the requirements and review process.

Enhance your app

After your new app runs on Meta Quest, explore these features for VR: