Internal modules
This page is an index of important runtime modules and their exported surfaces. For a mechanically-complete list of exports and declarations across the repo, including file-scope and nested declarations, see Code inventory.
Core runtime modules
app/main.mjsMain entrypoint. Wires UI/store, spawns the backend, installs clock lanes, and drives rendering. Also exposes
window.__PLAY_HOST__.Host contract helper:
app/play_host.mjs
backend/backend_core.mjsBackend on the main thread. Exports
createBackend(...)and wraps the Worker protocol with a friendlier API used by UI and plugins.worker/physics.worker.mjsWorker runtime: resolves forge dist, loads MuJoCo/WASM, validates required forge exports, runs stepping, and emits events/snapshots.
Internal helpers: -
worker/snapshot_pool.mjs
core/viewer_runtime.mjsShared runtime helpers used in both main and worker:
URL parameter parsing:
consumeViewerParams(...)and readersstrict/compat/verbose/perf helpers:
strictCatch/perfSample/etclogging helpers
ui/state.mjsViewer store/state/actions and snapshot merge. Exports:
createViewerStore(...): viewer storeapplySpecAction(...)/applyGesture(...): UI → backend commandsmergeBackendSnapshot(...): snapshot → store merge
ui/control_manager.mjsDOM wiring and control/panel rendering. Exports
createControlManager(...).File/model section helpers:
ui/file_section.mjs
renderer/pipeline.mjsThree.js renderer pipeline and renderer manager. Exports
createRendererManager(...)and a few shared camera helpers.Scene-SoA geometry/instancing/material helpers:
renderer/scene_soa_geoms.mjs
renderer/controllers.mjsInput controllers: camera and picking. Exports:
createCameraController(...)createPickingController(...)
environment/environment.mjsEnvironment/sky management. Exports:
createEnvironmentManager(...)pushSkyDebug(...): developer/debug helper
bridge/forge/WASM bridge helpers and a small simulator wrapper live under the
bridge/directory:heap view helpers:
heapViewF64/heapViewF32/etccollectRenderAssetsFromModule(...)MjSimLite: minimal helper wrapper
Split runtime modules
The repo splits large runtime modules into smaller submodules under their respective top-level directories. The main entrypoint imports these submodules directly.
- UI internals
ui/state.mjs: store/state/actions/snapshot mergeui/bindings.mjs: binding spec parsing + value normalisation helpersui/panel_sections.mjs: section collapse persistence + DOM helpersui/file_section.mjs: file/model loading + model picker UIui/control_manager.mjs: DOM wiring + UI panels
- Renderer internals
renderer/pipeline.mjs: Three.js renderer pipeline + renderer managerrenderer/controllers.mjs: camera + picking controllersrenderer/overlay3d.mjs: overlay3d manager: scopes and batchesrenderer/three_helpers.mjs: shared Three.js helpers: dispose, bounds, scenerenderer/depth_sort.mjs: depth/transparency sorting helpersrenderer/mujoco_shadows.mjs: MuJoCo shadow-map parity helpersrenderer/mujoco_constants.mjs: MuJoCo enums/constantsrenderer/mujoco_textures.mjs: MuJoCo textures + generated texcoords helpersrenderer/deformables.mjs: flex/skin mesh helpersrenderer/scene_soa_geoms.mjs: Scene-SoA geoms/instancing/material helpers, extracted from pipeline
- Backend internals
backend/backend_core.mjs: backend implementationbackend/snapshot_utils.mjs: backend snapshot helper functionsbackend/model_candidates.mjs: builtin model aliases + candidate resolution
- Bridge internals
bridge/heap_views.mjs: typed heap views and C-string helpersbridge/render_assets_collect.mjs: render-assets extraction from forge modulebridge/mj_sim_lite.mjs:MjSimLitewrapper
- Worker internals
worker/snapshot_pool.mjs: snapshot pool policy/state
Module dependency direction
Play’s runtime is intentionally layered. tools/check_module_boundaries.mjs
enforces a coarse dependency DAG. Run via node tools/run_checks.mjs:
base: shared runtime utilities.core/viewer_*.mjs,core/xml_refs.mjs,core/fallbacks.mjs,app/play_host.mjsbridge: low-level forge/WASM helpers.bridge/*.mjsprotocol: generated worker protocol glue.worker/protocol.gen.mjs,worker/dispatch.gen.mjsworker: physics worker.worker/physics.worker.mjs,worker/**backend: main-thread backend.backend/**environment: presets and sky helpers.environment/environment.mjsui: store and UI.ui/**renderer: Three.js renderer and controllers.renderer/**entry: application assembly.app/main.mjs
The intent is to keep worker/backend semantics isolated and prevent UI/renderer from becoming mutually dependent. Renderer no longer imports UI.
Protocol and generated helpers
tools/worker_protocol.jsonCommand/event IDL for main ↔ worker messages.
worker/protocol.gen.mjsGenerated protocol catalogs and snapshot transfer helpers.
worker/dispatch.gen.mjsGenerated encode/decode/dispatch helpers. Used to validate message shapes and reject unknown commands/events.
spec/ui_spec.jsonUI spec contract: control ids, fields, bindings.
core/viewer_state_types.tsTypeScript definition of the viewer store state. This is the complete field list.
core/viewer_structs.mjs/core/viewer_shared.mjs/core/viewer_defaults.mjsGenerated/utility helpers for struct layouts, defaults, and shared state operations.
Other utilities
core/xml_refs.mjsMJCF XML file reference parsing and bundle building. Used by
loadXmlBundle(...)style flows.tools/dev_server.pySmall Python dev server that serves static files and ensures correct MIME types for ESM and WASM.