Short answer to “are we using Needle / PlayCanvas / plain Three.js / Icosa / a blend?”:
We’re shipping parallel MIT-licensed adapters, one per major runtime. No blend. No single-runtime lock. Users pick the one that fits their stack. All adapters pass the same conformance suite (runtimes/_conformance/) so XRAI docs are portable across them.
Locking discipline: a runtime is only “locked” as canonical-for-scenario-X after the 7-gate verification in
RUNTIMES_EVALUATION.mdpasses. Today, only Unity is locked (for iOS — CVPR-paper evidence). Three.js adapter is locked only for v1.0 public-spec parse/render. Everything else is NOT LOCKED. Per user directive 2026-04-22: “these are important decisions to triple verify & lock in once we see all is working & scalable & meets objectives.”
| Runtime | Role | Status | When you pick it |
|---|---|---|---|
| Plain Three.js | Reference runtime — smallest, MIT-only, no vendor deps | ✅ shipping — adapter at runtimes/threejs/, 4/4 v1.0 fixtures green |
Default for web demos, docs, LLM dogfood. Embedded in any Vite/Next site. Zero install beyond three. |
| Unity + UnityGLTF + Paint | Canonical engineering runtime — Portals reference impl, shipping on iOS + targeting visionOS via UAAL | ✅ shipping (unity/Assets/Scripts/Bridge/SceneComposer.cs) — this is what CVPR paper’s 60 FPS numbers come from |
Real AR/VR deployment on mobile + visionOS. Full VFX Graph + Gaussian splat + audio-reactive. |
| PlayCanvas | Heavier web runtime — PBR, ECS, editor-first workflow | ⚠ stub README at runtimes/playcanvas/ |
Teams already on PlayCanvas + needing a published editor tool + server-backed scenes. |
| Needle Engine | Unity-authored → web export, good WebXR path (browser XR once Apple unlocks Safari) | ⚠ stub at runtimes/webxr/ + see specs/015-visionos-needle-avp/ |
Web viewers for visionOS Safari WebXR + iOS Go App Clip. NOT for UAAL-embedded runtimes (Needle can’t run embedded). |
| Unreal | AAA rendering + XR | ⚠ stub at runtimes/unreal/ |
High-fidelity desktop/console/VR; teams already on Unreal. |
| visionOS RealityKit | Apple-native, full swiftlang | ⚠ stub at runtimes/visionos/ |
Native visionOS apps beyond Safari WebXR. HEDGE-VISIONOS-01 activation trigger. |
Icosa is NOT an XRAI runtime. It’s:
com.icosa.icosa-api-client-unity, vendored at .xrai/MetavidoVFX-main/Packages/ — wraps import + .tilt ↔ glTF conversion)AllBrushes.asset with 72 Open Brush descriptors — the source we curate Paint-AR brushes from, per specs/009-paint-ar-openbrush/MIGRATION_PLAN_V2_2026-04-22.md)Portals publishes TO Icosa Gallery and imports FROM Icosa API via XRAI references (object.glb / future object.tilt entity types). Icosa’s own viewer stays on their site — we don’t embed it, they don’t embed our adapter.
Integration path lives in specs/009-paint-ar-openbrush/MIGRATION_PLAN_V2_2026-04-22.md § 3 "the 4-layer Icosa divide."
These are different surfaces, both using Three.js under the hood:
| Surface | Path | Purpose | Branding |
|---|---|---|---|
viewer.portals.app |
viewer/ in Portals monorepo |
Login-gated Portals Viewer + Editor per spec 014 | Portals-branded |
| RGBD hologram web viewer | web/rgbd-viewer/ |
LiveKit + Three.js point-cloud for live hologram streaming | Portals-branded |
xrai-website runtimes/threejs/ |
this directory | Public MIT-licensed reference adapter, open for external adoption | XRAI-neutral |
The Portals-branded viewers can import the xrai-website adapter verbatim — it’s a superset-compatible MIT loader. Spec 014 has the full positioning.
scripts/xrai_conformance_run.sh runs all v1.0 fixtures through every adapter’s CLI. A divergence in one runtime is caught mechanically. This is how glTF stays portable across 50+ renderers.runtimes/<name>/ with a package.json (if JS/TS) + src/cli.js implementing the contract: read XRAI JSON on stdin or file arg, exit 0 on parse success.runtimes/<name>/README.md with mapping from XRAI entities/relations to your engine’s primitives.scripts/xrai_conformance_run.sh --runtime <name> — it auto-discovers and drops a .ok or .fail marker in _conformance/results/.Linked from: README.md Implementation surface, FAQ.md, scripts/governance-readiness.sh.