How to Prototype a WebXR Demo: Step-by-Step Guide 2026

🥽DEVELOPER GUIDE — TECHNOLOGY EDITORIAL NOTICE

This guide is independent editorial technology content — not affiliated with or sponsored by Meta, Google, Apple, or any XR hardware or software vendor. All technical specifications are verified from official documentation: Android Developers (updated May 19, 2026), MDN Web Docs, and Meta Horizon OS Developers (May 2026). API availability and browser support change frequently — verify at immersiveweb.dev for the current browser support matrix. Information verified and updated as of July 13, 2026.

📅 Originally published: November 24, 2025 | Updated: July 13, 2026

How to Prototype a WebXR Demo: The Complete Step-by-Step Guide for 2026

🥽 WebXR Development ⚡ Developer Guide ✍️ By Samson Ese ⏱️ 35 min read 🔄 Updated July 13, 2026
📅 Verified and updated as of July 13, 2026 — covering A-Frame 1.8.0 (June 2026), Three.js r184, W3C WebXR Device API Candidate Recommendation (June 9, 2026), and Android XR launch (October 2025).
⏱️ Reading time: 35 minutes 👥 For: Web developers wanting to build their first WebXR demo — no prior 3D or VR experience required 🎯 Goal: A working, deployable WebXR prototype from zero to live URL

🪞 Where You Are Right Now

  • You know HTML, CSS, and JavaScript — but you have never built anything for VR or AR and you are not sure where to start
  • You have heard about WebXR but assumed it required a gaming engine, a native development environment, or an expensive headset to prototype anything
  • You want to understand which framework to choose (A-Frame? Three.js? Babylon.js?) and why the answer matters for your first demo
  • You need a complete guide that goes from "nothing installed" to "working demo I can share via a URL" without gaps

✅ What This Guide Delivers

Everything you need to prototype a WebXR demo in 2026: what WebXR is and how it works; the 2026 state of the ecosystem (40% adoption growth, new devices, W3C milestone); a complete framework comparison; step-by-step dev environment setup; your first VR scene with A-Frame (working code, copy-paste ready); a Three.js WebXR implementation for more control; how to add interaction (controllers and hand tracking); testing without a headset; AR session setup; deploying to a live URL; 15 FAQs covering every common question; and a 24-hour action plan that has you from nothing to a running demo by tomorrow.

You are reading Daily Reality NG — Nigeria's independent, research-backed digital publication. This WebXR guide was built from official documentation published by Google's Android Developers team (updated May 19, 2026), Meta Horizon OS Developers, MDN Web Docs, and the W3C Immersive Web Working Group. See how this publication applies the same technology principles it covers: AI tools transforming Nigerian business in 2026.

💡 The Statistic That Changes How You Think About WebXR

VR.org's April 2026 analysis reported that WebXR adoption grew 40% in 2026 — and documented that app download friction reduces engagement by 50 to 70 percent compared to browser-based experiences. The implication: a WebXR experience shared as a URL converts significantly better than the equivalent native app for most use cases. IKEA uses WebAR for product visualisation. Shopify merchants offer try-before-you-buy through the browser. Educational institutions run chemistry labs on school devices without IT approval. None of these required a $500 headset. WebXR is not a niche technology anymore. As of June 9, 2026, the WebXR Device API reached Candidate Recommendation status at the W3C — the final step before becoming a full ratified web standard. The timing to learn it is now. *(Source: VR.org April 2026)*

✅ PRECHECK — What You Need Before Starting

  • Basic HTML and JavaScript knowledge — you know what a <script> tag is and can write a function
  • A computer with Chrome or Edge installed — the primary browsers for WebXR development
  • Node.js installed (or willingness to install it) — needed for the local dev server
  • You do NOT need a VR headset — the Immersive Web Emulator Chrome extension lets you test in the browser
  • You do NOT need a game engine — pure HTML/JavaScript is sufficient for your first demo
  • A GitHub account is helpful for deploying your demo — free at github.com
Developer working on a laptop prototyping a WebXR virtual reality demo showing code and 3D scene on screen
WebXR adoption grew 40% in 2026. The gap between native VR apps and browser-based experiences is closing faster than most developers realise. If you know HTML and JavaScript, you already have most of what you need to start. | Photo: Pexels

🥽 What Is WebXR — Complete Explanation

WebXR is a JavaScript API — specifically, the WebXR Device API — that provides standardized access to VR and AR hardware through web browsers. "XR" is not an acronym. It is an algebraic variable: the X stands in for whatever form "_____ Reality" takes — Virtual Reality (VR), Augmented Reality (AR), Mixed Reality (MR), and whatever comes next. The API is designed to cover all of them through a single consistent interface.

The core insight is simple: if you can open a URL, you can enter an immersive experience. No app store. No download. No version compatibility issues. A user clicks a link, the browser requests the XR session, and they are inside. This is why WebXR is growing — the friction that killed native XR app adoption (find the app, install it, create an account, accept permissions, load the tutorial) is almost entirely eliminated.

🎯 Three Session Types You Must Understand

Session TypeWhat It DoesDevice RequiredCode to Request
inline Renders a 3D scene inside a normal web page canvas — responds to device orientation (Magic Window mode). No immersion, no permission prompt. Any device with a browser — phone, tablet, desktop navigator.xr.requestSession('inline')
immersive-vr Presents a fully virtual scene to a headset — real world replaced by virtual world. Browser prompts for permission before entering. VR headset (Meta Quest, Samsung Galaxy XR, HTC Vive, etc.) or emulator navigator.xr.requestSession('immersive-vr')
immersive-ar Overlays virtual objects on a camera view of the real world. Supports hit testing (place objects on real surfaces), plane detection, and depth sensing. AR-capable Android phone (Chrome), Meta Quest 3 (passthrough), Samsung Galaxy XR, Apple Vision Pro (visionOS 2) navigator.xr.requestSession('immersive-ar')
Source: W3C Immersive Web Working Group (immersiveweb.dev); MDN Web Docs

Note — WebXR vs WebGL: These are commonly confused. WebGL provides graphics and rendering (drawing 3D objects). WebXR provides device data — headset position, controller state, hand tracking — and manages the immersive session. WebXR uses WebGL (or the newer WebGPU) under the hood to render, but they are separate APIs. You can write WebGL without WebXR (normal 3D web graphics) but immersive sessions require WebXR. Most WebXR frameworks abstract both layers so you don't interact with either directly.


📊 The State of WebXR in 2026

DevelopmentDateWhat It Means for DevelopersSource
WebXR Device API — Candidate Recommendation June 9, 2026 The W3C has advanced WebXR to its final pre-ratification stage — the API is now stable enough that browser vendors are committed to implementing it consistently VR.org June 2026
WebXR Layers Level 1 — Working Draft June 12, 2026 Compositor-based layers allow dramatically higher-quality UI rendering in VR — text, images, and 2D content rendered at full resolution instead of through WebGL. A-Frame 1.8.0 fixed a bug blocking layer requests. VR.org June 2026
A-Frame 1.8.0 released June 2026 Dropped WebVR entirely, updated to modern Three.js, switched controllers from polling to standard inputsourceschange events, fixed WebXR Layers request bug VR.org June 2026
Samsung Galaxy XR launched October 2025 First Android XR device — built with Google and Qualcomm. Chrome on Galaxy XR has full WebXR support. Opens a new large-screen Android XR market for web developers. ThreeJS Resources Feb 2026
Safari enables WebXR by default on visionOS 2 2025 Apple Vision Pro now runs WebXR in Safari with gaze-and-pinch input. Currently supports immersive-vr; passthrough AR still limited. VR.org April 2026
WebGPU now widely supported 2026 WebGPU (successor to WebGL) brings near-native rendering performance. Three.js r184 is WebGPU-first. Closes the visual quality gap with native apps. MadXR Feb 2026
WebXR adoption grew 40% 2026 Browser-based XR experiences are no longer experimental. Real enterprises (IKEA, Shopify, educational institutions) are deploying production WebXR now. VR.org April 2026

🔧 Choosing Your Framework

Google's Android Developers documentation (updated May 2026) gives the clearest official guidance: "For rapid prototyping or using HTML-like syntax to define 3D scenes, we recommend A-Frame and model-viewer. For full control over 3D scenes and creation of custom or complex interactions, we recommend three.js and babylon.js."

A-Frame — Best for Rapid Prototyping and Beginners

🟢 BEGINNER FRIENDLY

A-Frame lets you define a complete VR scene using HTML-like custom elements — no JavaScript required for basic demos. A-Frame 1.8.0 (June 2026) is the current version. Built on Three.js. Full WebXR support. An entire scene can be written in under 15 lines of HTML. Start here for your first demo. Official site: aframe.io

Three.js — Best for Custom Complex Scenes

🔵 INTERMEDIATE

Three.js is the de facto standard for browser-based 3D with a built-in WebXRManager and VRButton/ARButton helper classes. Three.js r184 is the current release (WebGPU-first). More setup than A-Frame but gives you full rendering control. Best for production experiences or anything beyond basic scenes. threejs.org

Babylon.js — Best for Enterprise and Complex Interactions

🔵 INTERMEDIATE

Babylon.js has an integrated WebXR Experience Manager that handles session setup, camera configuration, and input automatically. Excellent tooling, a Babylon.js Editor, and strong enterprise developer support. babylonjs.com

React Three Fiber — Best for React Developers

🔵 INTERMEDIATE

Brings React's component model to Three.js and WebXR development. Use it if your team is already React-based. Use @react-three/xr for the WebXR layer. Requires familiarity with both React and Three.js concepts. r3f.docs.pmnd.rs

PlayCanvas — Best for Performance-Critical Games

🔴 ADVANCED

Web-first game engine with mature WebXR tooling and a visual editor. Best for experiences pushing the performance limits of the browser. Steeper learning curve. playcanvas.com

For this guide: We will prototype using A-Frame first (the fastest path to a working demo) and then show the equivalent in Three.js for developers who want more control. You only need to follow one path — both produce a deployable WebXR demo.


💻 Step 1 — Set Up Your Dev Environment

1

Install Node.js

Download and install Node.js from nodejs.org. Choose the LTS version. Node.js gives you the npm package manager needed to install dependencies and run a local dev server. Verify the install opened a terminal and typed:

node --version
npm --version
2

Install VS Code

Download VS Code from code.visualstudio.com. The recommended extensions for WebXR development: ESLint (code quality), Prettier (formatting), and Live Preview (quick browser reload). All are free and available in the VS Code extensions marketplace.

3

Create a Project and Set Up Vite

Vite is the fastest dev server for WebXR in 2026 — it starts instantly, supports ES modules natively, and its HTTPS mode is essential for immersive WebXR sessions. Create a new project:

mkdir my-webxr-demo
cd my-webxr-demo
npm init -y
npm install vite --save-dev

Add to your package.json scripts:

{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  }
}
4

Install the Immersive Web Emulator Chrome Extension

This is the most important tool for prototyping without a headset. Install the Immersive Web Emulator by Meta from the Chrome Web Store: search "Immersive Web Emulator" and install it. It adds a virtual Meta Quest device to your DevTools and lets you simulate headset movement, controller input, and full immersive-vr and immersive-ar sessions directly in Chrome on your desktop. *(Source: Meta Horizon OS Developers)*

⚠️ HTTPS Requirement: All immersive WebXR sessions (immersive-vr and immersive-ar) require a secure context — either https:// or localhost. During development, localhost is fine. When deploying, you must use HTTPS. The Immersive Web Emulator only works on localhost or https:// — it will not activate on http:// non-localhost URLs.

Developer team reviewing WebXR prototype on multiple screens showing the development workflow for building immersive web experiences
The full WebXR development loop — write HTML/JS, run on localhost, test in the Immersive Web Emulator, iterate, test on device, deploy to HTTPS. You can complete the first four steps entirely on a standard laptop. | Photo: Pexels

🌐 Step 2 — Your First WebXR Scene With A-Frame

A-Frame uses HTML custom elements to define a 3D scene. You do not need to understand WebGL or Three.js internals to write your first scene. Create a file called index.html in your project directory:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>My First WebXR Demo</title>
  <script src="https://aframe.io/releases/1.8.0/aframe.min.js"></script>
</head>
<body>

  <a-scene>

    <!-- Sky background -->
    <a-sky color="#1a1a2e"></a-sky>

    <!-- Floor -->
    <a-plane
      position="0 0 0"
      rotation="-90 0 0"
      width="10" height="10"
      color="#16213e">
    </a-plane>

    <!-- A red box -->
    <a-box
      position="-1 0.5 -3"
      rotation="0 45 0"
      color="#ef476f"
      shadow>
    </a-box>

    <!-- A teal sphere -->
    <a-sphere
      position="0 1.25 -5"
      radius="1"
      color="#06d6a0"
      shadow>
    </a-sphere>

    <!-- An amber cylinder -->
    <a-cylinder
      position="1 0.75 -3"
      radius="0.5" height="1.5"
      color="#ffd166"
      shadow>
    </a-cylinder>

    <!-- Lighting -->
    <a-light type="ambient" color="#ffffff" intensity="0.5"></a-light>
    <a-light
      type="directional"
      color="#ffffff"
      intensity="1"
      position="-1 2 1">
    </a-light>

    <!-- Camera with look controls -->
    <a-entity camera look-controls wasd-controls></a-entity>

  </a-scene>

</body>
</html>
index.html — Save this file and run: npm run dev — then open http://localhost:5173 in Chrome.

Run npm run dev in your terminal. Open http://localhost:5173 in Chrome. You will see a 3D scene with three objects on a dark floor. Press WASD to move, drag to look around, and click the "Enter VR" button in the bottom right to activate the immersive session (using the Immersive Web Emulator if no headset is connected).

📘 What Each A-Frame Element Does

ElementWhat It CreatesKey Attributes
<a-scene>The root element — creates the 3D scene, WebXR canvas, and VR button automaticallyNo required attributes for a basic scene
<a-sky>A large sphere around the scene that acts as a background/skycolor, src (for 360° images)
<a-box>A 3D cube/rectangular prismposition, rotation, color, width, height, depth
<a-sphere>A 3D sphereposition, radius, color
<a-cylinder>A 3D cylinder or coneposition, radius, height, color
<a-plane>A flat 2D plane (use rotation="-90 0 0" for a horizontal floor)position, rotation, width, height, color
<a-light>A light sourcetype (ambient/directional/point/spot), color, intensity
<a-entity>A generic entity for attaching components (camera, controllers, custom behaviour)Components added as HTML attributes
<a-gltf-model>A 3D model loaded from a GLTF/GLB filesrc="#model-id", position, scale
Position format: "x y z" where x=left/right, y=up/down, z=forward/back (negative z is forward). Rotation format: "x y z" in degrees. Source: A-Frame documentation aframe.io

Adding Interaction — Click Events in A-Frame

A-Frame handles click/gaze interaction through the cursor and raycaster components. Add this to your scene to make objects clickable:

<!-- Add cursor component to camera for click/gaze interaction -->
<a-entity camera look-controls wasd-controls>
  <a-entity
    cursor="fuse:false; rayOrigin:mouse"
    raycaster="objects:.clickable">
  </a-entity>
</a-entity>

<!-- Make the box clickable -->
<a-box
  class="clickable"
  position="-1 0.5 -3"
  rotation="0 45 0"
  color="#ef476f"
  shadow
  event-set__click="color: #ffd166">
</a-box>
Click the red box and it changes to amber — simple interaction with no JavaScript required.

💡 A-Frame 1.8.0 Just Fixed Something Important

VR.org's June 2026 analysis of A-Frame 1.8.0 identified a critical fix most developers missed: "The release includes a fix for a typo in the requiredFeatures list that was affecting layer requests. If you were trying to prototype against WebXR Layers Level 1 in A-Frame in the last few weeks and getting nothing, that one-character fix is why." The same release: switched controller detection from a polling loop to the standard inputsourceschange event (important for frame budget on mobile Quest), dropped WebVR support entirely, retired all Oculus branding, and implemented memory-saving optimizations on the component update path. If you are using an older A-Frame version, update to 1.8.0 — specifically change your CDN script src from the old version to https://aframe.io/releases/1.8.0/aframe.min.js.


Step 3 — WebXR With Three.js

Three.js gives you full control over the rendering pipeline. Install it first:

npm install three

Create main.js:

import * as THREE from 'three';
import { VRButton } from 'three/addons/webxr/VRButton.js';
import { XRControllerModelFactory } from 'three/addons/webxr/XRControllerModelFactory.js';

// 1. Scene, Camera, Renderer
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x1a1a2e);

const camera = new THREE.PerspectiveCamera(
  70,
  window.innerWidth / window.innerHeight,
  0.01, 100
);
camera.position.set(0, 1.6, 3);

const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(window.devicePixelRatio);
renderer.xr.enabled = true; // Enable WebXR
document.body.appendChild(renderer.domElement);

// 2. Add the VR button — handles session start/end
document.body.appendChild(VRButton.createButton(renderer));

// 3. Lighting
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);
const dirLight = new THREE.DirectionalLight(0xffffff, 1);
dirLight.position.set(-1, 2, 1);
scene.add(dirLight);

// 4. Floor
const floor = new THREE.Mesh(
  new THREE.PlaneGeometry(10, 10),
  new THREE.MeshStandardMaterial({ color: 0x16213e })
);
floor.rotation.x = -Math.PI / 2;
scene.add(floor);

// 5. Objects
const box = new THREE.Mesh(
  new THREE.BoxGeometry(0.5, 0.5, 0.5),
  new THREE.MeshStandardMaterial({ color: 0xef476f })
);
box.position.set(-1, 0.5, -3);
box.rotation.y = Math.PI / 4;
scene.add(box);

const sphere = new THREE.Mesh(
  new THREE.SphereGeometry(0.5, 32, 32),
  new THREE.MeshStandardMaterial({ color: 0x06d6a0 })
);
sphere.position.set(0, 1, -5);
scene.add(sphere);

const cylinder = new THREE.Mesh(
  new THREE.CylinderGeometry(0.3, 0.3, 1, 32),
  new THREE.MeshStandardMaterial({ color: 0xffd166 })
);
cylinder.position.set(1, 0.5, -3);
scene.add(cylinder);

// 6. Animation loop — use renderer.setAnimationLoop for WebXR
renderer.setAnimationLoop(() => {
  box.rotation.y += 0.005;
  sphere.rotation.y += 0.003;
  renderer.render(scene, camera);
});

// 7. Handle window resize
window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
});
main.js — The key WebXR-specific lines: renderer.xr.enabled = true and VRButton.createButton(renderer). The renderer.setAnimationLoop replaces requestAnimationFrame for WebXR compatibility.

Update your index.html to include this script:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Three.js WebXR Demo</title>
  <style>
    body { margin: 0; overflow: hidden; }
    canvas { display: block; }
  </style>
</head>
<body>
  <script type="module" src="main.js"></script>
</body>
</html>

Critical Three.js WebXR difference: Replace requestAnimationFrame with renderer.setAnimationLoop. In VR mode, the WebXR API controls the frame loop — setAnimationLoop is the correct hook that works both inside and outside a WebXR session. Using requestAnimationFrame directly will break VR rendering. *(Source: MDN Web Docs)*


🧪 Step 4 — Testing Without a Headset

You have two options for headset-free testing, both documented in Meta's official WebXR Workflow documentation:

ToolWhat It DoesHow to UseBest For
Immersive Web Emulator (Chrome Extension) Adds a virtual Quest headset and controllers to Chrome DevTools. Lets you rotate headset view, move controllers, simulate button presses, and enter both immersive-vr and immersive-ar sessions. Install from Chrome Web Store → Open DevTools (F12) → "WebXR" tab → Select device → Click "Enter VR" in your page Primary testing tool — best for testing all WebXR sessions without a headset
IWER (Immersive Web Emulation Runtime) A JavaScript library (npm @iwer/devui) embedded directly in your project. Auto-activates when no native WebXR is detected. Provides a UI overlay for controlling headset and controllers. Install: npm install @iwer/core @iwer/devui → Import and initialize in your JS entry point Sharing demo links with others who don't have headsets — the emulator is built into the page
Source: Meta Horizon OS Developers — WebXR First Steps

For debugging, use Spector.js (available as a browser extension) to examine your WebXR scene's draw calls and diagnose graphical errors. Note: Spector.js only works on desktop browsers with the Immersive Web Emulator — it cannot be used directly on a Quest headset. *(Source: Meta Horizon OS Developers)*

For testing on a real headset, connect your Meta Quest to your development machine via USB, enable Developer Mode in the Oculus companion app, then open your http://localhost:5173 URL in the Quest Browser. The Quest and your computer must be on the same network, or you can use adb reverse tcp:5173 tcp:5173 to forward the localhost port over USB.


🎮 Step 5 — Adding Controller and Hand Interaction

Controllers in A-Frame

Add VR controllers to your A-Frame scene with two lines:

<!-- Left and right controller entities -->
<a-entity
  id="leftHand"
  laser-controls="hand: left"
  raycaster="objects: .clickable; lineColor: #06d6a0">
</a-entity>

<a-entity
  id="rightHand"
  laser-controls="hand: right"
  raycaster="objects: .clickable; lineColor: #ff6b35">
</a-entity>
A-Frame laser-controls draws a laser pointer from each controller. Add class="clickable" to any element you want the controllers to interact with.

Controllers in Three.js

// Get controllers 0 (right) and 1 (left) const controller0 = renderer.xr.getController(0); const controller1 = renderer.xr.getController(1); scene.add(controller0); scene.add(controller1); // Listen for trigger press (select) controller0.addEventListener('selectstart', function() { console.log('Right trigger pressed'); // Change sphere color sphere.material.color.setHex(0xff6b35); }); controller0.addEventListener('selectend', function() { console.log('Right trigger released'); sphere.material.color.setHex(0x06d6a0); }); // Add visible controller models using XRControllerModelFactory const controllerModelFactory = new XRControllerModelFactory(); const controllerGrip0 = renderer.xr.getControllerGrip(0); controllerGrip0.add( controllerModelFactory.createControllerModel(controllerGrip0) ); scene.add(controllerGrip0); const controllerGrip1 = renderer.xr.getControllerGrip(1); controllerGrip1.add( controllerModelFactory.createControllerModel(controllerGrip1) ); scene.add(controllerGrip1);
The selectstart/selectend events fire on trigger press — the primary interaction event in WebXR. XRControllerModelFactory renders the actual controller 3D model.

Hand Tracking (Meta Quest 3 and Android XR)

Android Developers documentation (May 2026) confirms: "Hand input is the primary interaction mechanism in Android XR. Chrome for Android XR supports the Hand Input API as the default input." In Three.js:

// Get hand objects const hand0 = renderer.xr.getHand(0); // Right hand const hand1 = renderer.xr.getHand(1); // Left hand scene.add(hand0); scene.add(hand1); // Hand tracking provides individual joint positions // All 25 joints per hand: XRHand.WRIST, THUMB_METACARPAL, etc. // Listen for pinch gestures via 'pinchstart' and 'pinchend' hand0.addEventListener('pinchstart', function() { console.log('Right hand pinched'); }); hand0.addEventListener('pinchend', function() { console.log('Right hand pinch released'); });
Hand tracking requires requesting the hand-tracking feature: navigator.xr.requestSession('immersive-vr', { optionalFeatures: ['hand-tracking'] }). Source: Android Developers official May 2026.

📱 Step 6 — AR Session Setup

AR sessions are supported on Meta Quest 3 (passthrough), Samsung Galaxy XR, AR-capable Android phones via Chrome, and Apple Vision Pro (visionOS 2). The key difference from VR: the scene background is transparent (the real world shows through), and you typically use hit-testing to place objects on real-world surfaces.

<!-- Replace the a-scene tag to request AR instead of VR -->
<a-scene
  webxr="requiredFeatures: hit-test,local-floor; optionalFeatures: dom-overlay"
  ar-hit-test="target:#target-marker">

  <!-- Target marker — shows where objects will be placed -->
  <a-entity id="target-marker">
    <a-ring color="#06d6a0" radius-inner="0.05" radius-outer="0.1"
      rotation="-90 0 0">
    </a-ring>
  </a-entity>

  <!-- Place box on tap/select -->
  <a-box
    id="ar-box"
    visible="false"
    color="#ef476f"
    position="0 0 0">
  </a-box>

</a-scene>
A-Frame's ar-hit-test component handles surface detection automatically. The target marker follows detected real surfaces. A tap places a virtual object.

For Three.js AR with hit testing — the full implementation involves requesting an AR session with the hit-test feature, creating an XRHitTestSource each frame, and moving a reticle to the detected surface position. The Three.js WebXR Samples repository at immersive-web.github.io/webxr-samples includes a complete, runnable AR hit-test example.

⚠️ Safari iOS limitation: Safari on iOS (not visionOS) does not support the WebXR Device API natively. If your demo needs to run on iPhones, consider using model-viewer (from Google) for basic AR product visualisation — it uses iOS's ARKit via a Web component and does not require WebXR. For full WebXR support, iOS users need Apple Vision Pro (visionOS 2 with Safari) or the Mozilla WebXR Viewer app. *(Source: WPDean October 2025; ThreeJS Resources February 2026)*


🚀 Step 7 — Deploying Your Demo

WebXR requires HTTPS for all immersive sessions. The fastest deployment options:

PlatformCostDeploy MethodHTTPSBest For
GitHub Pages Free Git push → GitHub Actions workflow auto-deploys. Meta's WebXR First Steps tutorial includes a ready-made workflow at .github/workflows/deploy.yml ✅ Automatic Open-source demos and tutorials
Netlify Free tier Drag-and-drop build folder or connect GitHub repo — auto-deploys on every push ✅ Automatic Quick sharing with a custom URL
Vercel Free tier Connect GitHub repo → runs Vite build automatically ✅ Automatic Vite/Next.js projects
Cloudflare Pages Free tier Connect GitHub → auto-builds on push → global CDN included ✅ Automatic Global delivery performance
Source: Meta Horizon OS Developers. Once deployed, the URL works immediately on any device with a compatible browser — no app store submission, no approval process.

For GitHub Pages, the deploy workflow from Meta's WebXR First Steps tutorial:

name: Deploy to GitHub Pages

on:
  push:
    branches: [main]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pages: write
      id-token: write
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm install
      - run: npm run build
      - uses: actions/upload-pages-artifact@v3
        with:
          path: dist
      - uses: actions/deploy-pages@v4
Fork the meta-quest/webxr-first-steps repo on GitHub, go to Settings → Pages → Build and Deployment → GitHub Actions. Every push to main auto-deploys. Source: Meta Horizon OS Developers.

🔧 Common Errors and How to Fix Them

ErrorCauseFix
"WebXR not supported" or VR button doesn't appear Browser doesn't support WebXR, or the Immersive Web Emulator extension is not installed/enabled Install Chrome or Edge; install the Immersive Web Emulator extension; or check immersiveweb.dev for your browser's current support status
WebXR session fails on non-localhost HTTP WebXR immersive sessions require a secure context (HTTPS or localhost) During development: always use localhost. In production: always use HTTPS. Use Netlify, Vercel, or GitHub Pages for automatic HTTPS.
Scene renders in browser but not in VR mode (black screen) Using requestAnimationFrame instead of renderer.setAnimationLoop (Three.js) or missing renderer.xr.enabled = true Replace requestAnimationFrame with renderer.setAnimationLoop; ensure renderer.xr.enabled = true is set before starting the loop
Models not loading (404 or CORS error) GLTF files need to be served from the same origin or with proper CORS headers Place GLTF/GLB files in your project's public folder so Vite serves them. Use a CORS-enabled CDN for external models.
A-Frame controllers not showing in emulator Conflicting emulator extensions or wrong emulator configuration Disable any other WebXR emulator extensions and use only the Immersive Web Emulator. If using IWER, disable the extension to avoid conflicts. (Source: Meta Horizon OS Developers)
WebXR Layers not working in A-Frame Older A-Frame version with the requiredFeatures typo bug Upgrade to A-Frame 1.8.0 (June 2026). The fix was specifically for this bug. Change CDN URL to https://aframe.io/releases/1.8.0/aframe.min.js. (Source: VR.org June 2026)
AR session permission denied on Android Multiple WebXR permissions required (3D mapping, camera) — Chrome must prompt for each Chrome prompts for each required permission one at a time. Handle the permission denied case in your code — check the Android Developers documentation for the proper permission handling pattern. (Source: Android Developers May 2026)
Poor frame rate in VR (motion sickness risk) Scene is too complex, too many draw calls, or unoptimized geometry Use Spector.js to profile draw calls; merge static geometries with BufferGeometryUtils.mergeGeometries; reduce polygon count on models; enable frustum culling; use compressed textures (KTX2 format). Target 90fps minimum for VR. (Source: Meta Horizon OS Developers — Performance Optimization section)

💡 The "One URL" Advantage WebXR Has Over Every Native App

VR.org's April 2026 analysis documented something developers frequently underestimate: "app download friction reduces engagement by 50 to 70 percent compared to browser-based experiences. That is not a small gap. That is the difference between someone actually trying your XR content and closing the tab on the store listing." A WebXR demo you can share as a URL — in a WhatsApp message, an email, a tweet, a QR code at an event — will be tried by a dramatically higher percentage of the people you share it with than the equivalent native app. For prototypes, proofs of concept, client demonstrations, and educational experiences, this advantage compounds. The museum that wants to show an AR exhibit the night before opening can update the web page. The client who wants to approve a product visualisation before a production run can scan a QR code. None of these need app store approval. This is why WebXR adoption grew 40% in 2026 — not because the technology became perfect, but because the distribution model became compelling.

What This Means for Nigerian Developers in 2026

🎯 The Opportunity

Nigerian developers who know HTML and JavaScript already have the foundation for WebXR development. A-Frame specifically requires no additional learning beyond basic HTML — a developer who can build a website can build a WebXR demo in an afternoon. The market applications are immediate: product visualisation for Nigerian e-commerce, virtual tours for real estate and hospitality, interactive training simulations for manufacturing and healthcare, educational experiences for schools that cannot afford app installation approval. The deployment advantage — a URL that works immediately without app store submission — is particularly valuable in Nigerian market contexts where device storage constraints and app discovery challenges reduce native app conversion rates. See also: how AI and web tools are already transforming Nigerian business in 2026.

✅ The Starting Point

The W3C WebXR Device API reached Candidate Recommendation on June 9, 2026. The Interop 2026 initiative has WebXR as a focus area. A-Frame 1.8.0 shipped in June 2026 with the full modern standard. Browser support covers over 5 billion people. The ecosystem is mature enough for production use. The question is not whether to learn WebXR — it is whether to be early or late to a market that has already started growing at 40% per year.

📢 Editorial Disclosure: This guide was independently researched and written by Samson Ese of Daily Reality NG using official documentation from Android Developers, Meta Horizon OS Developers, MDN Web Docs, the W3C Immersive Web Working Group, and named technology publications. No XR hardware vendor, framework creator, or cloud hosting provider has paid for or influenced this content.

⚠️ Content Disclaimer: WebXR is an actively evolving web standard. Browser support, API methods, and framework features change frequently. Verify current browser support at immersiveweb.dev and check the official documentation for any framework before building on it in production. Information verified as of July 13, 2026.

✅ Key Takeaways — How to Prototype a WebXR Demo

  • WebXR is a W3C JavaScript API that delivers VR and AR experiences through web browsers without app installation — anyone with a compatible browser URL can enter the experience immediately
  • Three session types: inline (3D in a web page, no headset required), immersive-vr (full VR headset), and immersive-ar (AR overlay on real world via phone or passthrough headset)
  • WebXR adoption grew 40% in 2026 and the W3C WebXR Device API reached Candidate Recommendation on June 9, 2026 — the standard is now stable and production-ready (VR.org April 2026)
  • For prototyping: A-Frame 1.8.0 (released June 2026) is the fastest path — a working VR scene in under 15 lines of HTML, no JavaScript required
  • For production and complex scenes: Three.js r184 (WebGPU-first) with VRButton and renderer.xr.enabled = true — remember to use renderer.setAnimationLoop instead of requestAnimationFrame
  • You do NOT need a VR headset to prototype — the Immersive Web Emulator Chrome extension (from Meta) simulates a Quest headset and controllers directly in Chrome DevTools on your desktop
  • Browser support in 2026: Chrome/Edge (full, desktop and Android), Meta Quest Browser (full including passthrough AR), Safari on visionOS 2 (immersive-vr), Samsung Internet (full), Opera (full) — over 5 billion people have compatible browsers
  • Hardware in 2026: Meta Quest 3 (de facto developer standard), Samsung Galaxy XR (Android XR, launched October 2025), Apple Vision Pro (visionOS 2), HTC Vive XR Elite, Pico 4
  • All immersive WebXR sessions require HTTPS — use localhost for development, GitHub Pages/Netlify/Vercel/Cloudflare Pages for free HTTPS deployment
  • App download friction reduces engagement by 50-70% vs browser-based experiences — a WebXR demo shared as a URL will be tried by dramatically more people than the equivalent native app (VR.org April 2026)

📰 Related Articles

Developer writing WebXR code with notes and documentation around them showing the learning and building process for immersive web experiences
If you can open a URL, you can enter a WebXR experience. If you can write HTML, you can build one. The technical barriers that kept immersive web development locked behind game engines and native SDKs have largely dissolved in 2026. | Photo: Pexels

Frequently Asked Questions

What is WebXR and how is it different from WebVR?

WebXR is the W3C JavaScript API for VR and AR in web browsers — it replaced the deprecated WebVR in 2018. WebVR was never ratified as a standard, supported few browsers, and was VR-only. WebXR supports all modes (VR, AR, mixed reality), is hardware-agnostic, and reached W3C Candidate Recommendation status on June 9, 2026. *(Source: MDN Web Docs)*

Do I need a VR headset to prototype a WebXR demo?

No. The Immersive Web Emulator Chrome extension from Meta simulates a Quest headset and controllers in Chrome DevTools on your desktop — you can test full immersive-vr and immersive-ar sessions without any hardware. IWER (@iwer/devui) provides a built-in project alternative. You only need a physical headset when testing spatial audio, haptic feedback, and the full physical interaction experience. *(Source: Meta Horizon OS Developers)*

What WebXR framework should I use for a first demo?

A-Frame (v1.8.0, released June 2026) for rapid prototyping — defines 3D scenes in HTML-like syntax, requires minimal JavaScript for basic demos. Google's Android Developers documentation (May 2026) specifically recommends A-Frame for rapid prototyping. For full rendering control: Three.js (r184, WebGPU-first) or Babylon.js. *(Source: Android Developers official May 2026)*

What are the three modes of a WebXR session?

Inline (3D in a web page, no headset, no permission required), immersive-vr (full VR headset, real world replaced by virtual), and immersive-ar (virtual objects overlaid on real-world camera view). Each is requested via navigator.xr.requestSession('session-type'). *(Source: immersiveweb.dev)*

Which browsers support WebXR in 2026?

Chrome and Edge (full WebXR on desktop and Android including Samsung Galaxy XR), Meta Quest Browser (full — passthrough AR, hand tracking, plane detection, depth API), Safari on visionOS 2 (immersive-vr via Apple Vision Pro, gaze-and-pinch input), Samsung Internet and Opera (full on compatible devices). Over 5 billion people have compatible browsers. The Interop 2026 initiative coordinates browser vendors to close remaining gaps. *(Source: VR.org April 2026)*

What hardware can run WebXR experiences in 2026?

Meta Quest 3 (de facto developer standard — best Quest Browser with full WebXR support), Samsung Galaxy XR (Android XR, launched October 2025 — native Chrome WebXR), Apple Vision Pro (visionOS 2, Safari), HTC Vive XR Elite (VIVE Browser/Wolvic), Pico 4, AR-capable Android phones (Chrome), desktop browsers (inline + emulated immersive). *(Source: ThreeJS Resources February 2026)*

What is A-Frame and how do I write a scene with it?

A-Frame is an open-source HTML framework for WebXR built on Three.js. Declare a scene with <a-scene>, add primitives like <a-box>, <a-sphere>, <a-sky>, <a-plane> with position/color/rotation attributes. Load the CDN from https://aframe.io/releases/1.8.0/aframe.min.js. The scene automatically adds a VR button and handles session management. *(Source: aframe.io; MDN Web Docs)*

How do I set up a WebXR development environment from scratch?

Five things: (1) Node.js from nodejs.org; (2) VS Code from code.visualstudio.com; (3) Vite dev server (npm install vite); (4) Immersive Web Emulator Chrome extension; (5) Chrome or Edge browser. For Three.js: npm install three. For A-Frame: CDN script tag. Run npm run dev and open localhost in Chrome. *(Source: Meta Horizon OS Developers)*

How do I add controller input to a WebXR demo?

In A-Frame: add laser-controls="hand:right" and laser-controls="hand:left" to entity elements. In Three.js: use renderer.xr.getController(0/1) and add selectstart/selectend event listeners. In Android XR (2026): the Hand Input API is the default — use renderer.xr.getHand(0/1) for hand tracking with pinchstart/pinchend events. *(Source: Android Developers May 2026; MDN Web Docs)*

What is GLTF and how do I use 3D models in WebXR?

GLTF 2.0 is the standard 3D format for WebXR. Use .glb (single binary file) for web delivery. In A-Frame: <a-gltf-model src="#model-id">. In Three.js: use GLTFLoader from three/addons/loaders/GLTFLoader.js. Compress with Draco compression. Find free models at Sketchfab (sketchfab.com). *(Source: MDN Web Docs; Meta Horizon OS Developers)*

What is the difference between immersive-vr and immersive-ar sessions?

immersive-vr replaces the real world with a virtual scene — requires a VR headset. immersive-ar overlays virtual content on a camera view of the real world — requires AR-capable hardware. AR additionally supports hit-test (ray casting against real surfaces), plane-detection (detecting floors/walls), and anchors (pinning objects to real-world points). Meta Quest 3 in 2026 supports the fullest WebXR AR feature set. *(Source: immersiveweb.dev; Android Developers May 2026)*

How do I deploy a WebXR demo so others can access it?

WebXR requires HTTPS. Deploy to: GitHub Pages (free, Meta provides a ready GitHub Actions workflow), Netlify (free tier, drag-and-drop), Vercel (free tier, Vite-optimised), or Cloudflare Pages (free, global CDN). Once deployed, share the URL — no app store submission required. *(Source: Meta Horizon OS Developers)*

What is WebGPU and why does it matter for WebXR in 2026?

WebGPU is the successor to WebGL — a modern GPU API with compute shaders, multi-threading, and near-native performance in the browser. Widely supported in 2026. Three.js r184 is WebGPU-first. Babylon.js has full WebGPU support. WebGPU closes the visual quality gap between WebXR and native VR apps, enabling 90fps at higher fidelity. *(Source: MadXR February 2026)*

What are the main limitations of WebXR compared to native VR apps?

Performance ceiling for highly complex simulations; limited access to some advanced hardware features; offline capability limitations; iOS Safari lacks native WebXR Device API; app store visibility advantages. For most use cases — prototyping, enterprise deployments, education, product visualisation — the zero-friction URL distribution advantage outweighs these limitations. *(Source: Creote Studio April 2026)*

What is the WebXR hit-test API and how do I use it for AR?

The hit-test API casts rays into the real world and detects intersection with real surfaces — the foundation for placing virtual objects grounded on actual floors, walls, and tables. Request with requiredFeatures: ['hit-test'] in your AR session. Each frame, call hitTestSource.getHitTestResults(frame) to get hit positions. A-Frame's ar-hit-test component handles this automatically. *(Source: Android Developers May 2026; MDN Web Docs)*

The 24-Hour Action Plan — From Nothing to Working Demo

🕐 Before Tomorrow — Complete These Steps

  • Hour 1 — Environment setup: Install Node.js (nodejs.org), VS Code (code.visualstudio.com), and the Immersive Web Emulator Chrome extension. Run node --version to confirm Node is installed.
  • Hour 2 — A-Frame hello world: Create a folder, create index.html, paste the A-Frame scene code from Step 2 of this guide. Run npm init -y && npm install vite --save-dev && npx vite. Open localhost:5173. You now have a running 3D scene.
  • Enter VR — right now: Click the "Enter VR" button in the bottom right of your scene. The Immersive Web Emulator will activate. Use the DevTools WebXR panel to rotate the virtual headset. You are in an immersive VR session.
  • Hour 3 — Customise your scene: Change the sky colour, move the objects, change the colours, add an <a-gltf-model> from a free GLTF file from Sketchfab. Make it something specific to your use case — a product, a room, an educational object.
  • Hour 4 — Deploy: Create a GitHub repo, push your code, enable GitHub Pages with GitHub Actions. Your WebXR demo now has a public URL. Share it with someone who doesn't have a headset — they will see the 3D inline scene. On a Meta Quest, they will get the full VR experience.
  • Next step — Three.js or interaction: Once the A-Frame demo is live, decide: do you need more rendering control (step to Three.js) or do you want to add controller interaction (add laser-controls to A-Frame)? The guide above covers both paths.
  • Official resources to bookmark: aframe.io, WebXR Samples, immersiveweb.dev, and the Meta WebXR First Steps tutorial (2-hour deep dive into Three.js WebXR). See also: how to use AI tools to accelerate the writing of your WebXR content scripts and scene descriptions.
Samson Ese — Founder of Daily Reality NG, Warri, Delta State

Samson Ese

Founder & Editor-in-Chief, Daily Reality NG — Warri, Delta State, Nigeria

This guide was built entirely from primary and authoritative secondary sources published in 2025–2026: Google's Android Developers official documentation (updated May 19, 2026), Meta Horizon OS Developers official documentation, MDN Web Docs, the W3C Immersive Web Working Group, VR.org's April 2026 and June 2026 analyses, and MadXR's February 2026 enterprise WebXR analysis. Every code example is based on documented, verified patterns — not invented or hallucinated syntax. For corrections: dailyrealityng@gmail.com

📧 Get Weekly Technology and Development Intelligence

Verified weekly writing on technology, tools, and practical development guides — free, written personally by Samson Ese from Warri, Delta State, Nigeria.

Subscribe Free →

💬 Questions Worth Thinking About

  1. WebXR reached 40% adoption growth in 2026. What is the most compelling use case for WebXR in your specific industry or project context — and what would a URL-shareable XR experience mean for your engagement with that audience?
  2. A-Frame allows a working VR scene in under 15 lines of HTML. If you spent 4 hours today following this guide, what would your prototype demonstrate — a product, a space, an educational concept, a game mechanic?
  3. VR.org's analysis showed that app download friction reduces engagement by 50-70% versus URL-based XR experiences. What experiences have you seen abandoned at the "download the app" step that could have been delivered via WebXR instead?
  4. The W3C WebXR Candidate Recommendation was reached on June 9, 2026. What does it mean for your project planning that the standard is now at its final pre-ratification stage — stable enough for production use?
  5. For Nigerian developers specifically: WebXR removes the need for app store approval, installation approval from IT departments, and device storage availability. What local deployment challenges does WebXR's URL-based delivery model resolve that a native app would not?

The argument against learning WebXR in 2025 was legitimate: inconsistent browser support, fragmented device ecosystem, performance ceiling, and an API that felt experimental rather than production-ready. None of those arguments hold the same weight in July 2026.

The W3C Candidate Recommendation is done. The browsers are aligned on Interop 2026. A-Frame 1.8.0 shipped in June. WebGPU is widely available. The Meta Quest Browser supports passthrough AR. Samsung shipped Android XR. Apple Vision Pro runs WebXR in Safari. Adoption is up 40% and the performance gap with native apps is closing faster than anyone expected two years ago.

An HTML file and a browser are still enough to build your first WebXR demo. That was true when A-Frame launched. It remains true today. The tools are better, the standards are stabler, and the audience is larger. The right moment to start was two years ago. The second best moment is today.

— Samson Ese | Founder, Daily Reality NG, Warri, Delta State, Nigeria, July 13, 2026

📢 Share This With Every Web Developer You Know

The developer who thinks WebXR requires a game engine and a $500 headset. The Nigerian tech team building experiences for clients who can't afford app installation friction. The student learning JavaScript who doesn't know VR is already within reach. Share this guide with them today.

© 2025–2026 Daily Reality NG — Empowering Everyday Nigerians | All content independently researched and written by Samson Ese, Warri, Delta State, Nigeria.

© 2025–2026 Daily Reality NG — Empowering Everyday Nigerians | Samson Ese, Warri, Delta State, Nigeria.

Comments

Popular posts from this blog

Is Your Opay or Palmpay Money Insured? The NDIC Truth

Carbon vs FairMoney vs Renmoney: Which Charges Less?