Create a new app
Updated: Sep 15, 2026
Use this guide to create a new Android app for Meta VR devices. Start from the template, configure the required manifest settings, then adapt and test your app before adding platform features.
We recommend starting with the Horizon OS template. It gives you a project that already declares the Horizon OS requirements, and it has two routes to the same starter — a single-activity Jetpack Compose app:
If you don’t use the template, make sure your AndroidManifest.xml declares the following Horizon OS tags and metadata so your app launches and displays correctly on Meta VR devices:
| Area | Manifest declaration | Why it matters |
|---|
Supported devices | <meta-data android:name="com.oculus.supportedDevices" android:value="quest2|questpro|quest3|quest3s" />
| Declares supported Quest devices |
Default window size | android:defaultWidth="1024dp" android:defaultHeight="640dp" inside <layout>
| Initial size of your resizable app window |
Minimum window size | android:minWidth="360dp" android:minHeight="225dp" inside <layout>
| Optional. Set a floor only if your layout breaks below a certain size. |
Orientation and display | android:screenOrientation and window metadata
| Handles window resizing and immersive display |
Example manifest snippet:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<meta-data
android:name="com.oculus.supportedDevices"
android:value="quest2|questpro|quest3|quest3s" />
<activity
android:name=".MainActivity"
android:exported="true">
<layout
android:defaultWidth="1024dp"
android:defaultHeight="640dp" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Eye tracking permissions and Look and Pinch
When using Look and Pinch, don’t request eye tracking permissions—the system handles gaze and sends standard touch events. Remove these if present:
<!-- Do NOT include -->
<uses-permission android:name="com.oculus.permission.EYE_TRACKING" />
<uses-permission android:name="horizonos.permission.EYE_TRACKING" />
An app that requests them fails the Look and Pinch review. Hybrid apps that need eye tracking in immersive mode must declare the permission but only request it at runtime when the immersive activity launches. See
Look and Pinch for 2D apps.
Style your app with our UI set
After configuring the manifest, style your app with components designed to look good on Meta VR devices. Our UI set is built for resizable app windows, controller and hands input, and accessibility:
- Buttons, Cards, Controls, Dialogs, Dropdowns, Inputs, Sliders, Tooltips, Navigation items — all handle focus, hover, and resizing for you
- Single import from the component library, no custom panel logic needed
Quick start: add the library and use
Button,
Card,
Dialog in your Compose layout. See
Component library overview for install and full component list.
Test in Meta Spatial Simulator
You don’t need a physical device for the first iteration.
To test with the plugin, open your app, select the Meta Spatial Simulator device, and click Run.
To test from the command line, download and start the simulator, then install and launch your APK:
metavr ssim download
metavr ssim start
metavr app install path/to/app.apk
metavr app launch your.package.name
Meta VR CLI does not build your app. Build the APK with Android Studio or Gradle before you install it. Both workflows launch the same APK you would install on a physical device and let you verify resizing, input, and window configuration. For complete setup and debugging guidance, see
Test on simulator.
Follow the design guidelines
Our design guidelines ensure your app is usable on device and passes review. Short version:
- Respect default and minimum panel sizes—don’t assume a static layout. Users can resize your windows at will, so design the content to reflow.
- Support both controllers and hands, keep touch targets at least 48dp, and provide visual indications for hover effects.
- Keep text readable at distance, use high contrast, avoid small fonts
After your new app runs on Meta VR devices, explore these features for VR:
Gradle uses the wrong JDK
Android Studio uses its own Gradle JDK setting for project sync. If the Horizon OS Template cannot sync, open Settings > Build, Execution, Deployment > Build Tools > Gradle and set Gradle JDK to JDK 17. Sync the project again.
If a command-line build that uses Gradle 8.7 fails on JDK 25, set JAVA_HOME to your JDK 17 installation directory before running the Gradle wrapper again.