WebXR Development
WebXR is the browser API that lets a web page take over a VR headset or start an augmented reality session on a phone. A visitor opens a URL, presses a button, and they are in it — no app store, no install, no build submitted for review. In Three.js it is a handful of lines on top of a scene you already have.
The reason to lead with the caveats rather than the demo reel: the API is well supported on Meta Quest and on Android Chrome, partially supported on Vision Pro, and entirely absent from Safari on iPhone and from Firefox. So for most sites, the majority of visitors will never enter an immersive session. A WebXR project that is planned around that fact is a good project. One that treats the non-headset experience as a fallback bolted on at the end usually disappoints everyone.
Built by
Peter Csipkay
Creative frontend developer near Munich, and the person behind this site. I scope, build and ship the work myself.
What WebXR actually is
WebXR replaced WebVR and covers both ends of the spectrum through two session types:
immersive-vr: the page renders to a headset. The browser hands you head pose, controller poses, hand tracking where supported, and a stereo framebuffer.immersive-ar: the page renders over a camera or passthrough feed. On a phone the scene sits on top of the camera view; on a passthrough headset it sits in the room. Additional modules cover hit testing against real surfaces, anchors, plane detection and depth.
What WebXR is not: it is not a rendering engine, and it is not AR tracking. The rendering is Three.js or another WebGL/WebGPU library. The world understanding is whatever the device's platform provides, which varies enormously between devices.
The property that matters is distribution. A link works in a message, an email, a QR code on packaging. No install, no review process, no 200 MB download before anyone sees anything. For a trade-show demo, a product experience or a training module, that is often worth more than the extra polish a native app would buy.
Device and browser support, honestly
This is the section other pages leave out. Current state, plainly:
Works well
- Meta Quest Browser: the most complete WebXR implementation there is. Both session types, controllers, hand tracking, passthrough AR. Quest is realistically the primary target for browser VR.
- Android Chrome:
immersive-aron ARCore-capable phones, including hit testing for surface placement. This is the largest genuinely reachable AR audience on the web. - Wolvic and other Chromium-based XR browsers: broadly compatible.
Works with caveats
- Apple Vision Pro (Safari on visionOS): supports immersive sessions with hand input, and it is a real target. Treat the specifics as something to test rather than assume; behaviour has moved between OS versions.
- Desktop Chrome or Edge with a tethered PC headset: works, but the population is small and the setup path is fragile.
Does not work
- Safari on iPhone and iPad. No WebXR. This is the single most important fact on the page, because it means an "AR in the browser" feature does not reach iPhone users through WebXR at all. The routes that do reach them are AR Quick Look with a USDZ file, or camera-based web AR built on computer vision rather than the WebXR API.
- Firefox. WebXR support was removed and has not returned.
So planning a project means answering one question first: is this for headset owners, for Android phones, or for everyone? Those are three different builds. "Everyone" means the model viewer is the product and the immersive session is a bonus for the minority who can enter it.
AR on phones: three routes, not one
"Let customers see it in their room" is a common request and it has no single implementation.
Platform AR viewers. Android's Scene Viewer takes a glTF file; iOS Quick Look takes a USDZ. Both are launched by a link from a normal web page, both are essentially free to implement, and both are heavily optimised by the platform. The catch is two export formats maintained in step, and almost no control over what the experience looks like. You hand a file to the operating system.
WebXR immersive-ar. Full control, hit testing, your own interface, your own interactions. Android Chrome and passthrough headsets only. No iPhone.
Camera-based web AR. Computer vision over a plain camera feed: marker tracking, image tracking, face tracking. Works on iOS, because it uses the camera API rather than WebXR. This is what most branded AR filters and packaging campaigns use. It generally means a commercial SDK, it costs more, and tracking quality is below platform AR.
For most product work the pragmatic answer is the first: ship glTF and USDZ, launch the platform viewer, and spend the saved budget on the product configurator or visualization the AR view is launched from.
What building for a headset actually changes
The scene is not the hard part. These are.
You render twice. Two eyes, every frame. Fragment work roughly doubles and the frame budget is tighter than on a screen: 72 Hz is a common floor and 90 Hz a common target, so a frame has around 11 milliseconds. Foveated rendering and multiview help, but the honest planning assumption is that a scene which runs comfortably at 60 fps on a monitor needs real work before it holds 90 fps in stereo on standalone hardware.
Dropped frames make people ill. On a flat screen a stutter is annoying. In a headset it is nausea. Frame rate is not a polish item to be addressed at the end; it is a design constraint from the first day, and it is the main reason VR scenes are visually simpler than their flat-screen equivalents.
Comfort rules the interaction design. Camera movement the user did not initiate, acceleration, and artificial locomotion all cause sickness in a meaningful share of people. Teleport movement, fixed vantage points and short sessions are the conservative defaults, and there are good reasons they are so common.
The interface is in the world. No DOM, no CSS, no accessibility tree. Every button is geometry, every label is rendered text, and legibility at distance becomes a real design problem. Everything that HTML gives you for free has to be rebuilt.
Input varies by device. Controllers on Quest, hands on Vision Pro and on Quest with hand tracking, a touchscreen in phone AR. An interaction model that assumes a trigger button excludes hand-tracked users entirely.
Testing needs the hardware. Browser emulators are useful for wiring, and they tell you nothing about comfort, legibility or frame rate. Budget for device testing on every device you claim to support.
What it costs, and when it is worth it
A WebXR layer added to a 3D scene that already exists is a small piece of work: enable XR on the renderer, add an entry button, build controller and hand interaction, then spend the real time on comfort and performance testing.
A purpose-built immersive experience — an environment, spatial interface, spatial audio, guided flow — is a production, and it is priced like one.
The uncomfortable question is worth asking early: how many people will actually enter it? For a public marketing site, the number of visitors with a headset who will put it on for your page is small. That does not make the project pointless, and the honest justifications tend to be specific:
- Controlled contexts: a trade show, a showroom, a classroom, a training programme, where you supply the headsets and the audience is captive. WebXR is excellent here, and no-install distribution is exactly what you want.
- Android phone AR at scale: reaching a real audience, particularly from packaging or a QR code.
- The scene has a second life. If the same model already powers a configurator or a product page, an immersive mode is an increment rather than a project.
If a WebXR feature is being scoped mainly so a press release can mention it, I will say so. That is usually the cheapest advice I give.
The fallback is the main path
Design the non-XR experience first and completely. Almost everyone will see it.
That means the same scene running as an ordinary interactive 3D view with orbit controls, on a page whose content is server-rendered HTML that reads perfectly with no JavaScript at all. The "Enter VR" button appears only when navigator.xr reports a supported session, never as a button that fails when pressed. If AR is offered on Android and not on iPhone, the iPhone visitor should see the platform's own AR Quick Look route or nothing, rather than a disabled control and no explanation.
Feature-detect every capability rather than sniffing user agents, since support varies by device, OS version and browser build in combinations no lookup table survives. And keep an escape hatch: a way out of an immersive session that does not require finding a controller, because someone will start a session by accident.
The VR and WebXR section of this site collects working examples worth studying before commissioning anything.
What goes wrong
Promising iPhone AR through WebXR. It does not exist. This gets discovered late, and it invalidates whatever was demonstrated to stakeholders on an Android device.
A desktop scene shipped to a headset. Post-processing stacks, high-poly models and dynamic lights that are fine at 60 fps on a monitor produce a nauseating 45 fps in stereo. Rebuild the scene for the target, do not port it.
Interface designed for controllers only. Hand tracking is now common. A pointer-and-trigger interaction model leaves those users unable to press anything.
No testing on the actual device. Text that is legible in an emulator is unreadable at scale; a button placed comfortably in a simulator is behind the user's shoulder on hardware.
Motion the user did not ask for. Camera moves, forced locomotion and acceleration are the fastest way to make someone take the headset off and not put it back on.
Treating it as an install-free native app. WebXR trades some capability and performance for distribution. That trade is often correct, and pretending it is not a trade sets expectations the build cannot meet.
Budget
What it costs to work with me
Adding a WebXR mode to a scene that already exists and building a purpose-made immersive experience are different projects with roughly an order of magnitude between them. Which one you need depends on the device targets and the context, so that is where a quote starts.
Schedule
How long it takes
- 01
Target and feasibility
3–5 days
Decide the device targets (headsets, Android AR, or everyone) and confirm what each one can do. This is where iPhone WebXR expectations get corrected, cheaply.
- 02
Non-XR experience
1–3 weeks
Build the scene as an ordinary interactive 3D view on a server-rendered page, since that is what the majority of visitors will use.
- 03
Immersive session
2–4 weeks
XR entry, controller and hand input, spatial interface, comfort model, and an exit path that works when someone is disoriented.
- 04
Performance for stereo
1–2 weeks
Hold the target frame rate in stereo on the real device, under sustained thermal load rather than for the first thirty seconds.
- 05
Device testing
1 week
Every device claimed as supported, tested on hardware, with people who have not seen the build before.
Phases overlap in practice, and the ranges assume decisions arrive when they are needed. The one that slips most often is the first.
Proof
Work
Client projects I can show publicly are on the services page. Some work sits under NDA — ask on a call and I will say what I can.
F.A.Q
Frequently asked questions
Does WebXR work on iPhone?
No. Safari on iPhone and iPad does not implement the WebXR Device API, so neither immersive VR nor immersive AR sessions can be started from a web page on those devices. The routes that do reach iPhone users are AR Quick Look, which takes a USDZ file and is launched from an ordinary link, and camera-based web AR built on computer vision rather than WebXR, which is what most branded AR campaigns use. Any project promising in-browser AR to iPhone users needs one of those two paths, and both should be scoped at the start.
Which devices and browsers support WebXR?
The Meta Quest Browser has the most complete implementation, with both session types, controllers and hand tracking. Android Chrome supports immersive AR on ARCore-capable phones, including hit testing for surface placement, and is the largest reachable AR audience on the web. Safari on visionOS supports immersive sessions with hand input. Desktop Chrome and Edge work with a tethered PC headset. Safari on iPhone and iPad does not support it at all, and Firefox removed its support. Feature-detect rather than relying on a device list, because behaviour changes between OS versions.
Is WebXR good enough compared to a native VR app?
For the right project, yes. A native app has more headroom for performance and deeper platform integration, and it costs an install, a store submission and a review cycle. WebXR trades some of that headroom for a link that works instantly from a message, an email or a QR code. For trade shows, showrooms, training and product experiences, that distribution advantage usually outweighs the performance gap. For a long-session game with demanding graphics, it does not.
How many of my visitors will actually use a VR mode?
On a public marketing site, very few. Most visitors have no headset, and of those who do, few will fetch it for a web page. That is the number worth confronting before the budget is set. WebXR is strongest where the context is controlled and the headsets are supplied: trade shows, showrooms, classrooms, internal training. It is also worth doing when the 3D scene already exists for another purpose, because then an immersive mode is an increment rather than a project.
Can we let customers place a product in their room?
Yes, through one of three routes with quite different properties. Platform AR viewers (Android Scene Viewer with a glTF file, iOS Quick Look with a USDZ) are nearly free to add and work well, at the cost of maintaining two export formats and having almost no control over the interface. WebXR immersive AR gives full control and hit testing but reaches Android and passthrough headsets only. Camera-based web AR using computer vision works on iOS too, usually via a commercial SDK, with lower tracking quality and a higher cost. For most product work the platform viewers are the sensible default.
Why do VR experiences make some people feel sick?
Mostly two causes, and both are build decisions. The first is dropped frames: in a headset a stutter breaks the match between head movement and what the eyes see, which is a reliable route to nausea, so holding the target frame rate is a design constraint rather than a final polish task. The second is motion the user did not initiate: camera moves, artificial locomotion, acceleration. Teleport movement, fixed vantage points and short sessions are the conservative defaults for good reason.
Can you add WebXR to a 3D scene we already have?
Often yes, and it is the most cost-effective way in. Enabling XR on a Three.js renderer and adding an entry button is a small change. The real work is what follows: rebuilding the interface as world-space geometry, because there is no DOM in a headset; supporting both controllers and hand tracking; and getting the scene to hold its frame rate in stereo, which frequently means simplifying materials, lighting and post-processing that were fine on a monitor.
What do visitors without a headset see?
The main experience, because that is what almost all of them are there for. The scene should run as an ordinary interactive 3D view with orbit controls on a page whose content is fully server-rendered, so it reads with no JavaScript at all. The "Enter VR" button should appear only when the browser reports a supported session, never as a control that fails when pressed. Designing the non-XR path first, rather than treating it as a fallback added at the end, is what separates WebXR projects that work from ones that only demo.
Who is putting the headset on?
Tell me the context (trade show, showroom, training, or a public website) and which devices your audience has. That answer decides whether WebXR is the right tool, and I would rather establish it on a call than in month two.
Get In Touch
Let's talk about your project
Tell me what you're trying to build, big or small. I'll reply personally within 24 hours, usually same day.

Peter Csipkay
Creative Frontend Developer
Let's connect
Three.js developer and creator of threejsresources.com. I scope, build, and ship the work myself — no middlemen, no handoffs.
Based in
Munich, Germany
Testimonials
What Clients Say
Don't just take my word for it — here's what people I've worked with have to say.
“Peter is different from other front end developers. He understands design along with the tech stack. He successfully resolved bugs and optimized the webapp quickly. I appreciate his good work ethic. He is very logical and manages to capture ideas perfectly.”
“Amazing work with super fast turn around. I'm thrilled!”
“Peter is a great resource. I enjoyed working with him. I will definitely work with him again.”
“Was a pleasure to work with. Very reliable and motivated to deliver great work. I can highly recommend him.”
Keep reading
Related services
Interactive 3D Website Development
Sites where 3D carries the experience — built to stay fast on a mid-range phone and to still work when WebGL does not.
3D Product Configurator
Let customers change material, colour, size and components and see the result render live, with the price updating as they go.
All Three.js development services
The overview page: what I do, selected client work, and how a project usually starts.
Free tools