๐Ÿฅฝ Quest 3 Playground โ€” Build Report

WebXR demos & mini-games built with Three.js r184 + TypeScript + Vite, deployed to Cloudflare Pages with free HTTPS (required for WebXR). Built 2026-06-10.

โ–ถ quest3-playground.pages.dev
Contents 1. How to open on your Quest 3 (start here) 2. What was built โ€” 5 live demos 3. Idea catalog โ€” what to build next 4. Stack research โ€” what's modern in 2026 5. Curated WebXR experiences to try 6. Asset sources & credits 7. Local dev workflow

1.How to open the demos on your Meta Quest 3

The 10-second version: put on the headset โ†’ open Meta Horizon Browser โ†’ type quest3-playground.pages.dev in the address bar โ†’ tap a demo card โ†’ press Enter VR (or Start AR for passthrough demos) โ†’ grant permissions when asked.
1
Open the browser in the headset.

Press โŠ• on the right controller to open the universal menu, then launch Browser (Meta Horizon Browser). It's a Chromium browser with full WebXR support โ€” nothing to install.

2
Go to quest3-playground.pages.dev.

Type it in the address bar (or log into the same Meta account on your phone's Horizon app and send the tab to the headset). Bookmark it: tap the โญ in the address bar so it's one tap next time.

3
Pick a demo and press the big button.

Each demo shows an Enter VR / Start AR button at the bottom of the page. AR demos (Room Invaders, Hand Garden) will show your real room via passthrough. The first time, the browser asks permission for the immersive session โ€” accept.

4
For Hand Garden: put the controllers down.

Hand tracking activates automatically a moment after you set the controllers down (make sure Settings โ†’ Movement tracking โ†’ Hand tracking is enabled). Pinch thumb+index to grab.

Why pages.dev and not just the LAN?

WebXR immersive sessions require a secure context (HTTPS) โ€” the Quest browser will simply not show the Enter VR button on plain http:// origins (only localhost is exempt, and "localhost" on the Quest is the headset itself). That rules out http://kubic.home.arpa:30xxx as-is. Your options, ranked:

MethodEffortVerdict
Cloudflare Pages (what we did)One wrangler pages deployโœ… Free HTTPS, fast CDN, zero config. Re-deploy in ~10 s.
USB cable + adb reverseadb reverse tcp:5173 tcp:5173 then open http://localhost:5173 in the headsetโœ… Best for rapid dev iteration โ€” headset sees your Mac's Vite dev server as its own localhost (secure-context exempt). Needs developer mode + USB-C cable.
kubic LAN + HTTPSmkcert CA, install cert on Quest, or a Cloudflare Tunnelโš ๏ธ Works but fiddly: Quest makes installing custom CAs painful. A cloudflared tunnel from kubic is the saner LAN-ish route.
Plain HTTP on LANโ€”โŒ Enter VR button never appears. Dead end.

2.What was built โ€” five live demos

All demos share a small TypeScript boilerplate (src/lib/xr.ts) that sets up the renderer (foveation 0.5, framebuffer scale 1.2 for Quest 3 sharpness, local-floor reference space), controllers with models + haptics, optional articulated hands, an in-VR canvas-texture score panel, and procedural WebAudio sound effects โ€” no audio files needed.

๐ŸงŠ Spinning Cube

LIVEVR

The hello-world: floating cube in a starfield. Point + trigger recolors it with a haptic kick. ~80 lines of demo code over the boilerplate โ€” the template for everything else.

open โ–ถ

๐ŸŽˆ Balloon Blitz

LIVEVR

60-second arcade round. Balloons spawn around you with wobble physics; laser-pop them for points. Score panel, pop particles, haptic pulses, procedural sfx, wave pacing.

open โ–ถ

๐Ÿ‘พ Room Invaders

LIVEMR passthrough

Drones materialize in your actual room and home in on your head. 3 lives, escalating waves, explosion shards. Shows why Quest 3 passthrough is the killer feature.

open โ–ถ

๐Ÿ–๏ธ Hand Garden

LIVEMRhands

Controller-free: pinch floating crystals with bare hands (25-joint tracking), throw them with real hand velocity, watch them drift back home. Runs in passthrough.

open โ–ถ

๐Ÿ›๏ธ Micro Museum

LIVEVR

Six classic glTF models (Damaged Helmet, Avocado, Duck, animated Fox/Horse/Flamingo) on pedestals under real HDRI image-based lighting. Trigger a pedestal to spin its exhibit.

open โ–ถ

๐Ÿ—‚๏ธ VR Launcher Index

LIVE

The landing page is designed to be browsed inside the headset: big cards, big tap targets, plus 14 hand-picked external WebXR experiences one tap away.

open โ–ถ

3.Idea catalog โ€” what to build next

Ranked roughly by wow-per-effort on Quest 3. Effort: weekend 1โ€“2 weeks ambitious

๐Ÿ•ณ๏ธ Portal Wall

MRweekend

Use mesh detection (mesh-detection feature) to find a real wall, then render a stencil-buffer "hole" in it revealing a sci-fi vista behind. The single most jaw-dropping MR trick per line of code.

๐Ÿ“ Paddle Pong MR

MRweekend

A ball bounces off your real walls and floor (plane detection + rapier physics). Controller = paddle. Quest 3's room mesh makes the ball feel genuinely physical.

๐Ÿน Desk Pet

MRhands1โ€“2 wks

An animated critter (the Fox model works!) lives on your real desk: walks on detected surfaces, follows your hand, eats pinch-fed virtual snacks, sleeps when ignored. Tamagotchi energy.

๐Ÿน Castle Siege

VR1โ€“2 wks

Two-handed bow archery (one hand holds, one draws โ€” great controller interaction) defending a castle wall from waves. Kenney's CC0 Castle Kit has all the models.

๐ŸŽต Rhythm Wall

VRhands1โ€“2 wks

Punch incoming note-blocks to the beat (Moon Rider-lite). WebAudio analyser can auto-generate patterns from any MP3 the user drops in โ€” infinite content.

๐Ÿงฑ Voxel Sculptor

VRhands1โ€“2 wks

Minecraft-creative-lite: place/remove voxels with pinch gestures, palette on your wrist, export to GLB. Highly shareable output.

๐ŸŒŠ Flooded Room

MRambitious

Water level rises in your real room (screen-space water shader clipped by room mesh). Fish swim around your furniture. Pure ambience showcase โ€” demo-reel material.

๐Ÿค LAN Party Arena

VRambitious

Two headsets (or headset + phone spectator) in one arena via WebRTC/WebSocket on kubic โ€” the one place your k8s cluster genuinely shines for XR. Laser tag in a shared virtual room.

๐Ÿ”ญ Solar System Walk

VRweekend

To-scale planets you teleport between, with real NASA textures. Classic but always lands with first-time VR users. Good "show the family" demo.

๐Ÿƒ Tabletop Anything

MRhandsambitious

Chess/checkers/card game on your real table (plane detection anchors the board). Hand-tracked piece grabbing. Add Claude API for an opponent that talks trash.

4.Stack research โ€” what's modern (June 2026)

ChoiceVerdict
Three.js r184 + WebGLRenderer โ† used hereThe safe, stable core. Gotcha: the newer WebGPURenderer does not support XR on its WebGPU backend yet โ€” stick to WebGLRenderer for XR.
@pmndrs/xr / @react-three/xr v6The modern wrapper (full 2024 rewrite): one-liner sessions, default hand/controller models, pointer events on meshes. Worth adopting if demos grow; vanilla core needs no React.
Babylon.js 9Most batteries-included for deep MR โ€” plane/mesh detection, anchors, depth sensing are each one enableFeature() call. Pick it for the Portal Wall / Tabletop ideas if three.js plumbing gets annoying.
Meta IWSDK (npm create @iwsdk@latest)Meta's new (Sept 2025) opinionated three.js+ECS framework with physics, grab, locomotion, scene understanding built in. Young but the strongest scaffold for Quest-first projects.
IWER + @iwer/devui + @iwer/semMeta's WebXR emulator runtime: develop/test on the Mac in desktop Chrome, including synthetic Quest 3 rooms for passthrough/plane testing. Add when iteration speed matters.
Physics: @dimforge/rapier3d-compatRust/WASM, fast, TS-native, no COOP/COEP header hassles (WASM inlined). cannon-es is unmaintained; Havok belongs with Babylon.
UI: pmndrs/uikitthree-mesh-ui is dead โ€” uikit is the maintained spatial-UI lib (works vanilla or R3F).
A-Frame 1.7Alive (volunteer-paced), fine for HTML-first prototypes, but not the best fit for TS game loops.
Quest 3 tuning applied in this repo: framebufferScaleFactor 1.2 (default undersamples the panel), foveation 0.5, local-floor reference space, transparent clear color in AR so passthrough shows through, haptics via XRInputSource.gamepad.hapticActuators.

5.Curated WebXR experiences (verified live 2026-06-10)

All open directly in the Quest browser, no install, no login. These are also tap-able cards on the launcher index.

ExperienceWhat it isMode
Moon RiderFree Beat Saber-style rhythm game, community songsVR ยท controllers/hands
Above Par-adowskiWebXR Game of the Year mini-golfVR ยท controllers
Flap FrenzyFlap your arms to fly (Meta showcase)VR ยท body input
Chairs EtcFurniture placement in your real roomMR ยท hands+controllers
Sneaker BuilderCustomize sneakers in passthroughMR ยท hands
RealMeasureMeasure real furniture from inside the headsetMR ยท controllers
three.js Ball ShooterPhysics ball shooting in a grid roomVR ยท controllers
three.js XR PaintTilt-Brush-style 3D paintingVR ยท controllers
three.js AR Hit TestPlace objects on real surfaces (depth API)MR ยท controllers
three.js Hand CubesGrab cubes with articulated handsVR ยท hands
W3C WebXR SamplesReference demos for every WebXR API featureVR+MR
A-PainterA-Frame's VR painting flagshipVR ยท controllers
A-BlastCute wave shooterVR ยท controllers
PlockleSpatial block-puzzle, 40+ levelsVR ยท controllers
Castle BuilderMultiplayer castle building, AR-capableVR+MR
heyVR ArcadePortal with dozens of no-install WebXR gamesVR
PlayCanvas VR LabVR interaction patterns sandboxVR ยท controllers+hands
VARTISTEFull VR texture-painting art suiteVR ยท controllers

Dropped during verification: Mozilla Hubs (shut down 2024 โ€” use FRAME), Silk Brush (domain dead), Project Flowerbed (WAF-blocked for bots; likely still fine in the headset).

6.Asset sources & credits

AssetSourceLicense
Damaged Helmet (3.8 MB)Khronos glTF-Sample-AssetsCC-BY (theblueturtle_)
Avocado (7.9 MB), Fox (159 KB, animated)Khronos glTF-Sample-AssetsCC0 (Fox rig CC-BY)
Duck (118 KB)Khronos glTF-Sample-AssetsSCEA Shared Source (attribution)
Horse, Flamingo (animated, <200 KB)three.js examples (mirada, "3 Dreams of Black")CC-BY
studio_small_03, venice_sunset HDRIs (1k)Poly HavenCC0

For future games: Kenney packs (kenney.nl โ€” Blaster Kit, Food Kit, Castle Kit, Space Kit, Nature Kit) are all CC0 with direct zip downloads and per-model GLBs of 10โ€“100 KB, perfect for Quest. Poly Haven 1K PBR textures follow the pattern dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/<slug>/<slug>_diff_1k.jpg (use _nor_gl_ normals for three.js). Quaternius models are CC0 but Google-Drive-only โ€” grab once via browser.

7.Local dev workflow

# dev server (desktop preview at http://localhost:5173)
npm run dev

# fastest headset iteration: USB-C cable + developer mode, then
adb reverse tcp:5173 tcp:5173
# โ†’ open http://localhost:5173 in the Quest browser (secure-context exempt)

# typecheck + production build
npx tsc --noEmit && npx vite build

# ship it (~10 s)
npx wrangler pages deploy dist --project-name=quest3-playground --branch=main --commit-dirty=true

Each demo is an independent Vite page under demos/<name>/ โ€” copy any folder, add one line to vite.config.ts, and you have a new playground slot. The shared boilerplate lives in src/lib/xr.ts.