Runtime

Best Practices for 3D Web VR Games

Report summary

For an unspecified audience, scale, and budget, the most robust default strategy is progressive enhancement on a web-native core : ship a strong inline 3D experience first, add immersive VR through WebXR where available, keep WebGL 2 as the production baseline, and treat WebGPU as an optional accele

Status
Research archive item
Category
Runtime
Length
4,253 words
Reading time
20 minutes
Report type
strategy

Key topics

  • Runtime
  • Privacy
  • Physics
  • Research Archive
  • Strategy
  • Audit
  • Architecture
  • Governance

Research provenance

Archive status
Research archive item
Content identity
sha256:985e3f44b61df559f83b3a1527582473f9d53a3b897446e2bd9b0a08fc6d730f

For citation, use the report title and canonical URL. Archival presence does not establish authorship or promote report statements into portfolio evidence.

Source availability: 108 citation markers in the source export have no recoverable source links. Those markers are omitted from this reader; any supplied bibliography and ordinary links remain. Check the original sources before relying on the cited claims.

This page renders the archived Markdown as safe, formatted HTML. It is background research and does not become a portfolio claim without evidence review.

Full report

On this page

Executive summary

For an unspecified audience, scale, and budget, the most robust default strategy is progressive enhancement on a web-native core: ship a strong inline 3D experience first, add immersive VR through WebXR where available, keep WebGL 2 as the production baseline, and treat WebGPU as an optional acceleration path instead of a hard dependency. That recommendation follows the current standards and support landscape: WebGL remains the widely available rendering baseline, WebXR is standardized but still browser-fragmented, and WebGPU is advancing rapidly but MDN still marks it as “limited availability”; importantly, three.js can already fall back from its WebGPURenderer to WebGL 2 when needed.

For most teams building a serious 3D web VR game in 2026, the best overall architecture is: three.js or Babylon.js on the client, glTF/GLB assets with KTX2/Basis textures, authoritative multiplayer servers over WebSockets, optional WebRTC for voice or proximity channels, CDN-backed immutable asset delivery, and a security model built around HTTPS, secure contexts, CSP, and explicit XR permissions policy. This stack aligns with official engine capabilities, Khronos asset standards, the WebXR security model, and the reality that competitive or progression-sensitive multiplayer works best with server authority plus client prediction/reconciliation.

If you must pick one optimization target first, optimize for standalone VR headsets rather than desktop. Standalone devices impose the tightest GPU/CPU constraints, and official WebXR guidance repeatedly emphasizes sustained frame rate, low overdraw, restrained materials, and early profiling on target hardware. If a scene is comfortable on Quest-class hardware, desktop and tethered experiences usually inherit headroom; the reverse is not true.

From a UX perspective, comfort settings are not polish. The most defensible default is teleport locomotion plus snap turning, with optional smooth locomotion for experienced users, because recent research still finds a clear comfort–orientation tradeoff: teleportation minimizes cybersickness, while continuous joystick locomotion can be a reasonable compromise for navigation efficiency when offered as an option. Meta’s own immersive-app guidance similarly centers comfort, reduced overload, and distance-aware interaction design.

From a governance perspective, VR games should treat pose, controller, and spatial-tracking data as sensitive operational data even when not legally classified as special-category biometric data. The WebXR specification explicitly calls out privacy and security risks, GDPR requires data minimization and privacy by design, and COPPA becomes relevant quickly if the service is directed to children or knowingly collects covered data from users under 13. In practice, that means minimizing telemetry, avoiding raw pose-stream retention, and building age-appropriate defaults and disclosures into the product from the start.

flowchart LR
    A[Device and Browser] --> B[Capability Detection]
    B -->|WebXR available| C[Immersive Session Path]
    B -->|No WebXR| D[Inline 3D Fallback]
    C --> E[Renderer Abstraction]
    D --> E
    E -->|Preferred| F[WebGPU when available]
    E -->|Baseline| G[WebGL 2]
    E --> H[Input Mapping and Comfort Layer]
    H --> I[Game Logic and UI]
    I --> J[Authoritative Realtime Server]
    I --> K[Asset Streaming and CDN]
    I --> L[Telemetry and Privacy Controls]
    J --> M[WebSockets State Sync]
    J --> N[Optional WebRTC Voice or Proximity]

This diagram is a synthesis of the standards and engine guidance cited throughout the report. It reflects the safest architecture choice when audience, scale, and budget are not yet fixed.

Architecture and stack choices

The standards stack is easiest to reason about if you separate it into layers. WebGL is the cross-browser rendering baseline; WebXR is the session, tracking, and input layer for immersive devices; WebGPU is the newer rendering/compute API that should be used opportunistically rather than assumed universally. On today’s web, the safest production posture is “WebGL 2 + WebXR today, WebGPU where supported, always behind feature detection.”

LayerWhat it is forPractical recommendationSource basis
WebGL 2Widely deployed graphics baseline for browser 3DTreat as the minimum production rendering path
WebXRDevice/session/input layer for immersive VR and ARUse for immersive mode only after capability checks and user activation
WebGPUModern graphics and compute APIUse as an enhancement path, not a launch requirement

The practical framework choice depends less on raw render speed than on how much engine you want versus how much web control you want. Three.js remains the best fit for teams that want maximal control over render/data architecture; Babylon.js is the most complete “engine-like” web stack; A-Frame remains excellent for rapid XR prototyping and simpler experiences; PlayCanvas is strong when collaboration, editor workflow, and built-in batching/instancing matter; Unity Web is the best choice mainly when you already have a Unity-centered team, tooling, or content pipeline.

Stack optionBest fitProsConsSource basis
three.js + WebXRTeams that want direct control over render architecture and asset/runtime behaviorMature ecosystem; direct WebXR abstraction via WebXRManager; built-in support for instancing, LOD, Draco, KTX2, meshopt; WebGPURenderer can fall back to WebGL 2You must assemble more of the “engine” yourself: gameplay framework, editor workflow, networking architecture, and many pipeline conventions
Babylon.js + WebXRTeams wanting a higher-level engine with strong XR affordancesRich built-ins, WebXR defaults, inspector/instrumentation, engine/session capability surfaces, optional Layers supportHeavier framework assumptions than three.js; less “bare-metal web” flexibility
A-FrameFast prototyping, design validation, simpler social or educational XRDeclarative scene model, easy onboarding, stats component, pooling support, strong prototype velocityLess suitable for large performance-sensitive games with complex custom systems; abstraction overhead becomes more visible at scale
PlayCanvasTeams valuing browser-first collaboration and integrated editor workflowNative web engine; supports WebGL and WebGPU; explicit guidance on draw calls, batching, instancing, multi-draw, XR availability checksSmaller ecosystem than three.js or Unity; some teams may prefer fully code-centric pipelines
Unity WebExisting Unity studios reusing tools, art pipelines, and gameplay codeMature editor, AssetBundles/Addressables, Unity Profiler, current web support for desktop and mobile browsers in Unity 6.5Heavier payload and memory profile than most web-native stacks; default graphics path is WebGL 2; WebGPU is still experimental and not recommended for production

A rigorous architectural best practice is to keep renderer choice, transport choice, and gameplay simulation loosely coupled. That means the renderer should not decide game authority, and the multiplayer layer should not assume a particular scene graph. This is partly an engineering inference, but it is strongly supported by the way browser APIs, game transports, and engine capabilities are separated: WebXR governs device/session capability, WebRTC/WebSockets govern transport, and engines expose instrumentation and renderer features independently.

Concise architecture checklist

PracticeWhy it mattersSource basis
Keep WebGL 2 as the baseline rendererIt is the most broadly compatible production path
Add immersive mode via WebXR only after feature detection and user actionWebXR sessions are gated by support, permissions policy, trustworthiness, and user intent
Use WebGPU progressively, never as the only pathBrowser availability is still uneven
Prefer three.js or Babylon.js for production-grade web VRThey expose the standards stack while giving solid engine capabilities
Reserve A-Frame for prototypes or simpler products unless you have measured headroomIt is optimized for XR development, but large-scale tuning needs care
Use Unity Web mainly when organizational reuse outweighs web-native constraintsUnity web support is real, but payload/memory/graphics tradeoffs remain material

Performance engineering

VR performance is a comfort requirement, not only a graphics-quality concern. Official XR guidance stresses that developers should minimize overdraw, be selective with expensive materials, and profile on target hardware as an ongoing workflow rather than a late-stage debugging step. A-Frame’s own documentation makes the same point in plainer terms: VR comfort depends on maintaining frame rate, and developers should watch FPS, draw calls, geometry, materials, and entity counts continually.

The most durable optimization pattern for web VR is to move work out of runtime and into the pipeline. That means compressed textures by default, geometry compression when it creates net wins, precomputed LODs, instancing/batching for repeated meshes, stable material sets, and aggressive removal of per-frame allocations that trigger garbage collection or subtle heap growth. Official docs across three.js, PlayCanvas, A-Frame, Khronos, and Unity all converge on that same idea, even when they use different vocabulary.

Performance practiceWhat to doWhy it worksSource basis
Overdraw controlSort opaque objects front-to-back; reduce transparent fillHelps the GPU reject hidden fragments earlier
Material disciplineLimit expensive PBR/shadow combinations on standalone devicesComplex materials multiply fragment cost in stereo rendering
Instancing and batchingUse InstancedMesh, PlayCanvas batching, or hardware instancing for repeated assetsDirectly lowers draw-call overhead
LODProvide distance-based mesh or representation swapsCuts vertex, fragment, and sometimes memory cost at range
Texture compressionDefault to KTX2/Basis; avoid raw PNG/JPEG for large real-time scenesReduces download size and GPU memory footprint
Geometry compressionUse Draco or meshopt where it creates net winsShrinks transfer size; meshopt also targets fast decoding
Heap stabilityPool frequently spawned objects and watch memory growth over long sessionsReduces garbage-collection pauses and browser instability
Continuous profilingUse engine counters, browser profiling, frame capture, and device-native profilers togetherVR bottlenecks can be CPU, GPU, upload, or memory bound

A good sample performance budget for an unspecified project should be treated as a starting point, not a law. The table below is a conservative synthesis based on official low-end mobile guidance, web performance-budget practice, and standalone XR profiling guidance. In particular, PlayCanvas suggests roughly 100–200 draw calls for low-end mobile, Lighthouse documentation recommends keeping total page weight below about 1,600 KiB for general web performance, and MDN recommends budgets with warning and error levels.

Budget itemWarningErrorNotes
Headset frame time at 72 Hz12.5 ms13.9 ms13.9 ms is the full frame budget implied by refresh rate
Headset frame time at 90 Hz10.0 ms11.1 msUse only if the title actually ships a 90 Hz mode
Visible draw calls in standalone gameplay scene120180Conservative adaptation of official low-end mobile guidance
Initial app-shell transfer size1.2 MiB1.6 MiBFor HTML/CSS/JS/critical assets before first useful interaction
Runtime texture uploads during active playRare/controlledFrequent/user-visibleTreat repeated uploads as a bug unless doing managed streaming
Heap / memory trend over a 10–15 minute sessionStableMonotonic growthWatch for leaks, retained scenes, decoded assets, and GC churn
Shader/material variants loaded eagerlyLimited set“Load everything”Excess variant explosion harms load time and GPU state churn

The most effective profiling workflow is a funnel, not a single tool: first identify whether the bottleneck is CPU, GPU, or memory; then capture the relevant frame or timeline; then fix one class of problem at a time. The official tools line up well for this: Chrome DevTools gives CPU/runtime timelines, Spector.js captures WebGL frames, engine counters expose draw and memory statistics, Meta’s WebXR tooling exposes GPU-side details on Quest, and Unity’s Profiler covers CPU and memory on its web platform.

flowchart TD
    A[Reproduce on physical target device] --> B[Check frame stability and refresh target]
    B --> C{CPU, GPU, or memory bound?}
    C -->|CPU| D[Chrome DevTools or Unity Profiler timeline]
    C -->|GPU| E[Spector.js frame capture and Meta GPU tools]
    C -->|Memory| F[Engine stats and memory profiler]
    D --> G[Reduce JS work, physics, draw submission, allocations]
    E --> H[Reduce overdraw, materials, shadows, draw calls, uploads]
    F --> I[Pool objects, unload assets, stabilize heap growth]
    G --> J[Re-test on device]
    H --> J
    I --> J
    J --> K[Compare against warning and error budgets in CI and release tests]

Concise performance checklist

PracticeMinimum standardSource basis
Profile on real headset hardware early and oftenNever rely on desktop-only profiling for shipping decisions
Keep draw calls low using instancing/batchingRepeated meshes should almost never render as separate full draw paths
Default to compressed texturesKTX2/Basis should be normal, not exceptional
Use LOD and culling systematicallyDo not render full-detail distant objects
Watch heap growth over long sessionsBrowser VR failures are often memory failures before FPS failures
Keep budgets in CIPrevent regressions instead of rediscovering them late

Compatibility and multiplayer

Cross-platform support is still the awkward center of web VR strategy. As of July 2026, WebXR support remains partial and uneven: Chromium-family browsers provide the main production path, while Safari and iOS Safari are still not shipping standard WebXR support in normal consumer configurations, and Firefox support remains disabled by default in Can I Use’s current tables. That reality strongly argues for feature detection plus graceful fallback rather than product plans that assume “the browser web” is a single target.

The right compatibility pattern is: detect capability, then choose the experience tier. At minimum, detect navigator.xr, then check isSessionSupported("immersive-vr"), and only expose the “Enter VR” affordance when the check passes and the user can trigger session entry. This matches both MDN guidance and the WebXR security model, which require trustworthy context, permissions policy, and user intent for immersive sessions.

A useful business implication follows from the support matrix: if Apple mobile users matter, USDZ / AR Quick Look is a fallback format for object preview and lightweight productized 3D experiences, not a primary runtime for immersive VR gameplay. Apple officially positions USDZ around Quick Look / AR preview, while iOS Safari still lacks standard WebXR support. For VR games, that means iOS should usually get inline 3D or a separate native path, not “the same immersive experience.”

On the networking side, the highest-confidence architecture for a real game is still authoritative server simulation for game-critical state. Unity’s multiplayer documentation is explicit here: server-authoritative models reduce state conflicts and enable prediction and rollback-oriented techniques. Client prediction exists to hide input latency locally while the server remains authoritative; that principle transfers cleanly to browser games even if you are not using Unity.

Transport choice should be boring whenever possible. WebSockets are the baseline for replicated game state because they are simple, browser-wide, and fit server-authoritative topologies well. WebRTC data channels are best used when you need peer-style low-latency data paths or to co-locate arbitrary data with voice/video channels; they also require signaling infrastructure that the specification does not provide for you. Recent official docs and standards make the separation clear: WebSocket is browser–server duplex messaging; WebRTC is peer communication plus signaling/STUN/TURN complexity; DataChannels support reliable and unreliable modes.

TransportUse it forStrengthsCaveatsSource basis
WebSocketAuthoritative game-state replication, lobbies, chat, match eventsSimple browser–server duplex model; straightforward operationallyNo built-in peer media or NAT traversal
WebRTC DataChannelLow-latency peer data, proximity data, companion channels, optional voice-adjacent systemsSecure by default with DTLS; can carry arbitrary data; reliable and unreliable modes existNeeds signaling; more complex connectivity and ops
WebRTC mediaVoice chat, spatial comms, party voiceDesigned for real-time mediaSame signaling/STUN/TURN complexity; not a substitute for authoritative game logic

The recommended state-sync pattern for browser VR games is therefore:

  • Authoritative server for position, combat, economy, progression, and anti-cheat-sensitive interactions.
  • Client prediction + reconciliation for the local player’s high-frequency movement and inputs.
  • Interpolation / smoothing for remote entities rather than immediate hard snaps. This is a standard inference from authoritative + prediction architectures and is one of the usual complements to them.
  • Reliable channels for chat, inventory, economy, and session control; unreliable / unordered modes only for ephemeral data that is immediately superseded by newer state. The existence of both reliable and unreliable DataChannel modes is standardized.

Recent academic work on multiplayer VR latency continues to reinforce the importance of latency mitigation rather than pretending it can be ignored. Studies from 2024–2025 examine the perceptual effects of added latency and acceptable latency envelopes in multiplayer or cloud-style VR scenarios, which supports conservative engineering choices such as client prediction, local input responsiveness, and minimizing avoidable transport complexity in core gameplay loops.

Concise compatibility and multiplayer checklist

PracticeMinimum standardSource basis
Gate immersive mode behind feature detectionOnly show “Enter VR” when support is confirmed
Always ship a non-immersive fallbackBrowser support is too fragmented to assume universal WebXR
Make authoritative servers the default for real gameplayBest fit for integrity, conflict resolution, and anti-cheat posture
Use prediction for local motionHides latency while preserving server truth
Prefer WebSockets for core game stateLower complexity, better operational predictability
Use WebRTC mainly for voice or specialized low-latency channelsPowerful, but operationally heavier and signaling-dependent

UX interaction and accessibility

The primary UX rule in VR games is simple: comfort first, mastery second. Meta’s official immersive-app guidance is unusually direct on this point, emphasizing safe and comfortable design, avoiding overload, and keeping main controls consolidated rather than scattering multiple floating windows through the scene. The research literature remains consistent with that operational guidance: cybersickness is still one of the largest barriers to wider VR adoption.

For locomotion, the best default is teleport movement plus snap turning, then expose smooth locomotion, smooth turning, or hybrid variants as user-selectable options. Recent empirical work found that teleportation minimizes cybersickness but can hurt spatial orientation, while joystick locomotion may offer a useful balance among navigation efficiency, usability, and comfort. The correct product response is not to choose one ideology, but to expose a comfort settings surface that matches user tolerance and game style.

For input, the right abstraction is profiles, not devices. The WebXR Gamepads Module and the WebXR Input Profiles ecosystem exist precisely so developers can map interactions to conceptual controls rather than hard-coding per-controller assumptions. In practice, this means your game should normalize grab, primary action, locomotion axes, menu, and handedness across devices, then provide user remapping where gameplay depth makes that worthwhile.

For UI, 3D spatiality should be used selectively rather than theatrically. Meta’s comfort guidance warns against overwhelming users with too many objects or windows at once. In most VR games, the most effective pattern is one primary panel or diegetic surface for task-critical UI, plus context-sensitive hints near the relevant object or controller. Purely “web-like floating desktop windows in a sphere” tends to increase clutter faster than it increases usability.

Accessibility should not be treated as an afterthought just because XR standards are still evolving. W3C’s XR Accessibility User Requirements make clear that XR needs multimodal alternatives, customization, synchronized outputs, and interaction models that support users with visual, auditory, cognitive, and motor differences. For a game, that translates into concrete features: seated and standing modes, left/right-handed support, subtitles and captions, high-contrast UI variants, calibrated reach zones, optional gaze or ray interaction, remappable controls, and onboarding that does not assume prior VR experience.

Recent experimental work also suggests that body/embodiment design matters: one 2024 study found that the presence of an avatar can reduce cybersickness in immersive VR. That does not mean “always show a full body,” but it does support the broader principle that coherent embodiment and sensory consistency are part of comfort design, not only aesthetics.

Concise UX and accessibility checklist

AreaRecommended defaultWhySource basis
LocomotionTeleport + snap turnMost comfort-preserving baseline
Advanced movementOptional smooth locomotion / turningBetter for experienced users and some genres
Input mappingNormalize by profile and handedness, not controller SKUImproves portability across hardware
UI in 3DOne primary panel, task-local affordancesReduces clutter and overload
AccessibilitySeated/standing, captions, contrast, reach calibration, remappingAligns with W3C XR accessibility requirements
OnboardingSafe tutorial room with comfort settings surfaced immediatelyNew users need explicit acclimation and discoverability

Asset pipeline and release engineering

For web-delivered 3D assets, glTF/GLB should be the primary interchange and runtime format. Khronos positions glTF explicitly as an efficient transmission format that minimizes asset size and runtime processing cost, which is exactly what browser VR needs. For production use, the sweet spot is usually GLB + KTX2/Basis textures + either meshopt or Draco where measured results justify them.

Compression choices should be guided by end-to-end performance, not by file size alone. Draco can shrink geometry significantly, but three.js documentation explicitly notes the tradeoff: smaller geometry comes at the cost of client decode time. Meshopt exists to compress a broader class of binary glTF data with fast decoding characteristics. Texture compression is less negotiable: KTX2/Basis has official support paths in glTF and in major engines precisely because it reduces both transfer size and GPU memory use.

When Apple mobile devices matter, USDZ belongs in the pipeline as a fallback deliverable, mainly for Quick Look or AR product-style preview, not as the canonical runtime format for VR gameplay. If your roadmap includes both immersive VR and iPhone/iPad marketing/distribution surfaces, it is reasonable to generate both GLB and USDZ from the same source assets.

The release pipeline should split content into small boot shells and streamed content bundles. This is the main idea behind general web performance budgets and also behind Unity’s web-specific guidance to move assets into AssetBundles or Addressables instead of forcing everything into the first load. For Unity specifically, current docs note that Web AssetBundle caching uses IndexedDB, remote catalogs support mutable content mappings, and web deployment supports Brotli/gzip compression.

The safest CI/CD pattern looks like this:

  • validate assets with glTF Validator;
  • transcode textures and generate compressed variants during CI;
  • run synthetic audits with Lighthouse CI and enforce warning/error budgets;
  • deploy immutable hashed bundles through a CDN over HTTPS;
  • use a service worker to cache the shell and stable assets, not volatile multiplayer state;
  • keep release rollback simple by versioning catalogs/manifests and bundle URLs.

Concise asset-pipeline and release checklist

PracticeMinimum standardSource basis
Primary runtime format = glTF/GLBBest-aligned web 3D delivery format
Textures = KTX2/Basis by defaultReduces transfer and GPU memory
Geometry compression = measured choiceUse Draco or meshopt only when net wins are proven
Validate every asset in CICatch broken or suboptimal content before release
Split shell from bulk contentImproves first interactive load and patchability
Serve compressed immutable assets via CDN over HTTPSCore to web performance and secure-feature access

Security, privacy, testing, analytics, and compliance

Web VR games have a larger-than-normal attack and privacy surface because they combine powerful browser features, tracking-capable hardware, real-time networking, and long-lived sessions. The WebXR specification itself calls out security, privacy, and comfort considerations; MDN’s security guidance adds the deployment-level requirements: immersive sessions need secure contexts, user intent, and—where spatial tracking is involved—the xr-spatial-tracking Permissions-Policy gate. A hardened 3D web VR game should therefore assume that XR is a privileged feature and build its headers, embedding rules, and session UX accordingly.

A strong security and privacy checklist is below.

ControlRecommended policySource basis
HTTPS / secure contextMandatory in all production environments; use localhost only for development convenience
Permissions-PolicyExplicitly set xr-spatial-tracking and do not allow untrusted embeds to inherit XR capability
User activationEnter XR only from clear user actions
CSPUse strict Content-Security-Policy; include worker-src for workers/service workers and keep origins tight
Sensor and pose dataDo not store raw head/hand/controller traces unless they are truly necessary; aggregate or discard quickly
Transport securityUse WSS/HTTPS; rely on DTLS for WebRTC channels; rotate auth tokens aggressively
Worker and service-worker originsPin them with CSP and keep cache scopes narrow
Third-party scripts / SDKsMinimize them; every extra script expands attack surface and can upset budgets

Testing strategy should combine automation, emulation, remote debugging, and physical device labs. No single approach is sufficient. WPT exists for cross-browser platform conformance, Playwright provides broad browser automation, the Immersive Web Emulator speeds up desktop iteration for Quest-class behaviors, Chrome supports remote debugging on Android, and Meta documents remote debugging for Browser content on Quest. That combination is much more defensible than “we tested on one headset and one desktop.”

A recommended testing matrix for an unspecified commercial project is below.

Device classRepresentative browsers / runtimeWhat must workWhy it belongs in the matrixSource basis
Desktop without headsetChrome, Edge, Firefox, SafariInline 3D fallback, login, menus, asset streaming, keyboard/mouse controlsWebXR is not universally available; fallback quality determines reach
Desktop with tethered VRChromium-based browser with WebXR-capable headset pathSession entry, controller mapping, stereo render stability, reconnect flowsUseful for enthusiast and dev workflows
Android phone/tabletChrome / Samsung InternetInline 3D, touch UI, performance, network recoveryMobile browsers are common discovery surfaces and partial-support environments
iPhone / iPadSafariInline 3D and non-WebXR fallback; installability where relevantiOS Safari still lacks standard WebXR support
Standalone VR headsetQuest Browser and equivalent WebXR-capable headset browserEnter/exit XR, thermal stability, controller/hand fallback, comfort settings, long-session memory behaviorHardest real-world target; should anchor budgets
Emulated desktop XRImmersive Web EmulatorSession smoke tests, CI-adjacent regression checksFast iteration, not a substitute for physical device QA

The operational testing rule should be: automate what is deterministic, lab-test what is experiential. Browser automation, asset validation, Lighthouse budgets, login/session flows, and non-immersive routing belong in CI. Comfort, thermal throttling, controller ergonomics, onboarding clarity, and long-session headset behavior still require human QA on real devices.

On analytics, collect only what you need to answer product and reliability questions. The best telemetry set for a VR web game is usually: session start/end, device/browser bucket, Enter VR success rate, feature-detection outcomes, frame-time percentiles, dropped-frame counts, asset-load timings, network RTT/loss buckets, disconnect reasons, comfort-setting usage, tutorial completion, checkpoint completion, crashes, and recoverable errors. Use sampling, aggregation, and privacy scrubbing; send small unload-safe event bursts with the Beacon API or route richer traces through OpenTelemetry with collectors that scrub personal information.

What you should not collect by default is just as important: raw pose streams, room-boundary geometry, precise location, persistent identifiers beyond necessity, or children’s data flows that you have not explicitly designed legal controls around. Under GDPR, the anchor principles are lawfulness, transparency, minimization, and privacy by design; under COPPA, persistent identifiers, geolocation, and media containing a child’s image or voice can all be regulated data; and if children are likely to access the service, the ICO Children’s Code pushes you toward high-privacy defaults and age-appropriate design.

Concise legal/compliance checklist

ScenarioWhat to doSource basis
Users in the EU / EEA / UKApply GDPR principles: minimization, transparency, storage limitation, privacy by design
Service likely accessed by childrenApply age-appropriate defaults and child-centered risk review
Under-13 U.S. users or child-directed serviceAssess COPPA obligations before collecting persistent IDs, geolocation, photos, video, or voice
Telemetry designPseudonymize where possible; separate identifiers from behavior data
Consent / disclosuresExplain XR permissions and telemetry clearly before immersive entry

The overall release recommendation is therefore straightforward: ship a progressive, standards-aligned web core; optimize for standalone VR first; compress and stream everything; use authoritative networking; treat comfort as a first-class setting surface; and keep privacy/security controls explicit instead of implicit. When constraints are unspecified, that is the architecture with the highest chance of surviving technical, operational, and compliance reality.