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.
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.
| Platform | Native runtime | Status |
|---|---|---|
| iOS | ARKit | Supported |
| Android | ARCore | Supported |
| Meta Horizon OS | OpenXR, Quest 3 / 3S | Supported |
| visionOS | Apple Vision Pro | Internal Preview |
| Android XR | Samsung, Google | Coming 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.
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.
What each part of ReactVision does
ViroReact
The open-source native XR renderer. One TypeScript API mapped onto ARKit, ARCore, and OpenXR. MIT licensed, free forever.
Studio
The browser-based visual editor and CMS for XR scenes. Free to sign up.
Platform
Managed Cloud Anchors, Geospatial Anchors, asset hosting, and Environment Testing, accessed with an rvApiKey and rvProjectId.
MCP server
How coding agents use the stack: live ViroReact knowledge plus tools to validate, run, and test scenes.
Proof it ships
npm installs of ViroReact per month
npm installs in 2025
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?
How is this different from Unity or Unreal cross-platform support?
What is ViroXRSceneNavigator?
Do Studio scenes run on both phones and headsets?
Is this React Native only?
What are the practical limitations?
Related comparisons and guides
- Unity alternative for AR and VR →
- Unreal Engine alternative for AR and VR apps →
- Niantic Lightship alternative →
- 8th Wall alternative →
- Open-source Unity and Unreal alternative →
- Best AR/VR/XR tool for React Native →
- Can AI agents build AR and VR apps? →
- Geospatial AR without Niantic →
- XR CMS: update content without an app release →
- React Native AR guide →
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.