Loading...
Loading...
Software Mansion's guide for migrating Expo SDK apps to Meta Quest using expo-horizon packages. Use when adding Meta Quest or Meta Horizon OS support to an existing Expo or React Native project. Trigger on: Meta Quest, Horizon OS, Quest 2, Quest 3, Quest 3S, VR app, expo-horizon-core, expo-horizon-location, expo-horizon-notifications, build flavors for Quest, panel sizing, VR headtracking, Horizon App ID, quest build variant, isHorizonDevice, isHorizonBuild, migrate expo-location to Quest, migrate expo-notifications to Quest, Meta Horizon Store publishing, or any task involving running an Expo app on Meta Quest hardware.
npx skill4agent add software-mansion-labs/skills expo-horizonWhat do you need to do?
│
├── Starting from scratch or adding Quest support to an existing Expo app?
│ └── Follow the "Setup Workflow" below (do NOT auto-install location or
│ notifications packages) and webfetch: expo-horizon-core README
│ ├── Install expo-horizon-core
│ ├── Configure the config plugin (horizonAppId, panel size, supportedDevices)
│ ├── Add quest/mobile build scripts
│ ├── Add runtime device detection (isHorizonDevice, isHorizonBuild)
│ └── Detect expo-location / expo-notifications, then ASK before migrating
│
├── Need location services on Quest?
│ └── Webfetch: expo-horizon-location README
│ ├── Replace expo-location with expo-horizon-location
│ ├── Review the feature support matrix
│ └── Guard unsupported calls (heading, geocoding, geofencing, background)
│
├── Need push notifications on Quest?
│ └── Webfetch: expo-horizon-notifications README
│ ├── Replace expo-notifications with expo-horizon-notifications
│ ├── Configure horizonAppId in expo-horizon-core
│ ├── Use getDevicePushTokenAsync (Expo Push Service is not supported)
│ └── Skip badge counts (not supported on Quest)
│
└── Need to build, run, or publish for Quest?
└── Webfetch: expo-horizon-core README (build variants) + Meta docs below
├── Build variants: questDebug, questRelease, mobileDebug, mobileRelease
├── Meta Quest Developer Hub (device management, sideloading)
└── Meta Horizon Store manifest requirementsexpo-horizon-corenpx expo install expo-horizon-coreI'll add theconfig plugin toexpo-horizon-core. Please confirm or override each value (press Enter / reply "default" to accept the bracketed default):app.json
[supportedDevices] — pipe-separated Quest devices your app supports (required for Meta Horizon Store submission).quest2|quest3|quest3s [empty] — Meta Horizon application ID. Leave empty unless you plan to use push notifications; required byhorizonAppIdto issue device push tokens.expo-horizon-notifications [defaultWidth] — Default panel width. Leave blank to omit.1024dp [defaultHeight] — Default panel height. Leave blank to omit. If you set width/height, make sure your Expo640dpmatches (useorientationfor wide panels)."landscape" [disableVrHeadtracking] — Setfalseto omit thetruemanifest entry.android.hardware.vr.headtracking [allowBackup] — Meta recommendsfalsefor sensitive data; setfalseonly if you need Android backup in the Quest build.true
horizonAppIddefaultWidthdefaultHeightquestmobilepackage.jsonnpx expo prebuild --cleanpackage.jsondependenciesdevDependenciesexpo-locationexpo-notificationsexpo-location"I foundin your project. Do you want me to replace it withexpo-locationso location works on Meta Quest? (Quest has no GPS, heading, geocoding, or geofencing — unsupported calls will need to be guarded withexpo-horizon-location.)"ExpoHorizon.isHorizonDevice
expo-notifications"I foundin your project. Do you want me to replace it withexpo-notificationsso push notifications work on Meta Quest? This requires aexpo-horizon-notificationsin the core config plugin, uses Meta's push service (not the Expo Push Service), and does not support badge counts orhorizonAppId."getExpoPushTokenAsync
npx expo install expo-horizon-locationexpo-horizon-notificationsnpm uninstall expo-locationexpo-notificationsimporthorizonAppIdexpo-horizon-coreexpo-horizon-notificationsnpx expo prebuild --cleanExpoHorizon.isHorizonDevicequestexpo-horizon-corequestmobileexpo-horizon-locationexpo-horizon-notificationsexpo-locationexpo-notificationspackage.jsonquestquestDebugquestReleasesupportedDevices"quest2|quest3|quest3s"npx expo prebuild --cleanexpo-locationexpo-notificationsexpo-horizon-locationexpo-horizon-notificationsExpoHorizon.isHorizonDeviceExpoHorizon.isHorizonBuildhorizonAppIdgetDevicePushTokenAsyncgetDevicePushTokenAsyncgetExpoPushTokenAsync{ type: 'horizon', data }isHorizonDeviceisHorizonBuildisHorizonDeviceisHorizonBuildnpx expo prebuildraw.githubusercontent.com/...| Topic | Official source |
|---|---|
| Repo overview and package list | expo-horizon README |
| Install, config plugin options, runtime API, native module access | expo-horizon-core README |
| Location migration, limitations, feature support matrix | expo-horizon-location README |
| Push notifications migration, token types, feature support matrix | expo-horizon-notifications README |
| Example app wiring for all three packages | expo-horizon example README |
| Panel sizing guidelines (dp values, orientation, letterboxing) | Meta Panel Sizing |
| Meta Horizon Store manifest checklist for publishing | Publish Mobile Manifest |
| Device management, casting, sideloading, ADB | Meta Quest Developer Hub |
| Server-side push delivery via Meta's push service | Horizon OS push notifications |