One codebase for AR on phones
and VR on Quest.

One ViroReact API. On iOS it talks to ARKit, on Android to ARCore, on Quest to OpenXR. You do not wait for Unity or Unreal to add the platform, and you do not maintain a separate VR project. visionOS is in preview. Android XR is next.

$npm install @reactvision/react-viro

We map onto native APIs, not onto an engine

Every platform ReactVision supports is reached the same way: the ViroReact API is mapped onto that platform's own runtime. That is why the same scene renders as native AR on a phone and native VR on a headset, with no re-authoring and no second workflow, and why a new platform does not mean waiting for a game engine's roadmap.

PlatformNative runtimeStatus
iOSARKitSupported
AndroidARCoreSupported
Meta Horizon OSOpenXR, Quest 3 / 3SSupported
visionOSApple Vision ProInternal Preview
Android XRSamsung, GoogleComing Soon

One scene, routed per device

ViroXRSceneNavigator takes a single scene and renders it as AR on phones and VR on Meta Quest, choosing the runtime at launch. The scene itself is ordinary ViroReact: components, typed props, and the same event model everywhere.

Scenes built visually in ReactVision Studio run on both too: Studio outputs one scene format, and ViroReact renders it natively wherever the app lands.

App.tsx
import { ViroXRSceneNavigator } from '@reactvision/react-viro';
import { MyScene } from './MyScene';

// One scene, routed to the right runtime per device:
// AR through ARKit or ARCore on phones, VR through
// OpenXR on Meta Quest. No separate VR project.
export default function App() {
  return (
    <ViroXRSceneNavigator initialScene={{ scene: MyScene }} />
  );
}

What one codebase actually buys you

One team, one skillset

The React Native team that ships your phone app ships your Quest app. No separate VR engineers, no engine specialists, no second toolchain or CI pipeline.

Devices come and go, the app stays

When a device reaches end of life or a new headset launches, the same app moves to the next runtime. The API stays; the mapping underneath is our job.

Content ships everywhere at once

A scene edited in Studio or updated through Platform asset hosting goes live on phones and headsets together, without an app release per platform.

The usual caveats apply per device: ViroReact needs a development build (not Expo Go), AR testing needs a physical phone, LiDAR features are iOS-only, and passthrough mixed reality needs a Quest 3 or 3S.

What each part of ReactVision does

ViroReact is MIT licensed and free forever. Studio and Platform are managed products: Cloud Anchors, Geospatial Anchors, asset hosting, Environment Testing, and the MCP server. iOS (ARKit), Android (ARCore), and Meta Quest (OpenXR) are supported today. visionOS is in internal preview. Android XR is coming.

Proof it ships

~10,000

npm installs of ViroReact per month

140,000+

npm installs in 2025

3 platforms

iOS, Android, and Meta Quest supported today

Shipped on ViroReact: Looking Glass (geospatial AR heritage storytelling), Pikd (brand AR for Red Bull and Burger King), InkStory (AR image recognition, built solo). The ViroReact MCP server is listed in the Claude Connectors Directory.

Common questions

Can one codebase ship AR on phones and VR on Quest?
Yes. ViroReact maps one TypeScript API onto each platform's native runtime: ARKit on iOS, ARCore on Android, and OpenXR on Meta Quest. The ViroXRSceneNavigator component routes a single scene to the right runtime per device, so AR and VR are not separate projects. visionOS is in internal preview and Android XR is next.
How is this different from Unity or Unreal cross-platform support?
Unity and Unreal support many platforms, but AR and VR are typically separate build targets and workflows inside the engine, and new platforms wait on engine support. ReactVision maps directly onto each platform's native APIs, so one React surface covers phones and Quest, and new platforms are added by mapping the same API onto the new runtime.
What is ViroXRSceneNavigator?
The ViroReact component that makes one scene run across the XR spectrum. On a phone it renders the scene as AR through ARKit or ARCore; on Meta Quest it renders VR (or mixed reality passthrough on Quest 3 and 3S) through OpenXR. You write the scene once and the navigator handles the routing.
Do Studio scenes run on both phones and headsets?
Yes. Scenes built visually in ReactVision Studio output one scene format, and ViroReact renders it natively on iOS, Android, and Meta Quest. Load a hosted scene with the StudioSceneNavigator component and the same content runs on every supported platform.
Is this React Native only?
The best path today is React Native or Expo, in TypeScript. The company goal is one XR API mapped onto native platform APIs (ARKit, ARCore, OpenXR) that developers, Studio users, and coding agents can all build against; React Native is where that API lives right now.
What are the practical limitations?
ViroReact needs a development build, so it cannot run in Expo Go. AR requires a physical device; simulators are not supported. And platform-specific hardware still matters: LiDAR features are iOS-only, and passthrough mixed reality needs a Quest 3 or 3S.

Related comparisons and guides

Write it once, ship it everywhere

Install ViroReact and target phones and Quest from one TypeScript codebase, or build the scene visually in Studio and let the same content run on both.

$npm install @reactvision/react-viro