Skip to content

ADR-042 — ISS Explorer low-end fallback (?view=list + heuristics)

Status · Accepted
Date · 2026-05-05
Closes · RFC-013 (with ADR-040, ADR-041)
TA anchor · §components
Related · ADR-025 (accessibility), PRD-010

Context

RFC-013 OQ-3 requires a non-WebGL path and automatic degradation on weak devices.

Decision

URL override

?view=list forces list mode: alphabetical module list, same src/lib/components/IssModulePanel.svelte content. No WebGL initialisation — no THREE.WebGLRenderer, no GLB fetch.

Auto-fallback

After 3D mode starts, measure FPS for ~2 s via requestAnimationFrame deltas. If sustained < 20 fps, switch to list mode and dispose renderer, scene, and loader geometry.

If navigator.deviceMemory is defined and &lt; 4, skip 3D and open in list mode immediately (Chrome/Android hint).

If WebGL context creation fails, list mode.

UX

Single reactive viewMode: '3d' | 'list' — avoid mounting canvas then unmounting in a way that flashes white; prefer deciding mode before first paint when URL/device hints demand list.

Toggle

HUD control syncs URL (view search param) so shareable links reproduce mode.

Consequences

Positive: Accessibility + low-end coverage without maintaining two full feature sets.

Negative: deviceMemory is non-standard — treated as optional signal only.

Implementation notes

FPS sampler runs only when viewMode === '3d' after GLB load completes.

Orrery — architecture documentation · MIT · No tracking