Skip to content

Runtime & ECS Architecture

How HoloScript scenes get instantiated, updated, and rendered.

Overview

The runtime system takes parsed AST and executes it as a live scene with entities, components, and systems. It supports both visual rendering (R3F, WebGPU) and headless execution (testing, servers, CI).

Architecture

text
┌──────────────────────────────────┐
│  AST (from Parser)               │
└──────────────┬───────────────────┘

┌──────────────────────────────────┐
│  SceneRunner                     │
│  ├── run() — walk AST            │
│  ├── spawnedEntities — tracking  │
│  └── entity spawning per node    │
│  File: src/runtime/SceneRunner   │
└──────────────┬───────────────────┘

┌──────────────────────────────────┐
│  RuntimeBridge                   │
│  ├── sceneRunner reference       │
│  └── connects to renderers       │
│  File: src/runtime/RuntimeBridge │
└──────────┬───────────────────────┘

     ┌─────┴──────┐
     ▼            ▼
┌─────────┐  ┌──────────────┐
│ Renderer│  │HeadlessRuntime│
│ (R3F,   │  │ No GUI       │
│  WebGPU)│  │ CI/Testing   │
└─────────┘  └──────────────┘

Key Classes

ClassFilePurpose
SceneRunnersrc/runtime/SceneRunner.ts:41Core scene executor — walks AST tree, spawns entities
HeadlessRuntimesrc/runtime/profiles/HeadlessRuntime.ts:95GUI-less execution for tests and servers
RuntimeBridgesrc/runtime/RuntimeBridge.ts:47Bridges scene runner to platform renderers
RuntimeRenderersrc/runtime/RuntimeRenderer.ts:237Base renderer — particle systems, materials
HeadlessRuntimeImplsrc/runtime/HeadlessRuntime.ts:91Headless runtime implementation

Entity-Component-System (ECS)

Located in src/ecs/:

  • Entities: General-purpose objects identified by unique IDs
  • Components: Data containers attached to entities (position, velocity, health)
  • Systems: Logic that processes entities with matching component sets
typescript
// SceneRunner spawns entities from AST nodes
const runner = new SceneRunner(composition);
await runner.run();

// Access all spawned entities
for (const entity of runner.spawnedEntities) {
  console.log(entity.id, entity.components);
}

Runtime Profiles

ProfileClassUse Case
FullRuntimeRendererVisual rendering with R3F/WebGPU
HeadlessHeadlessRuntimeNo-GUI — testing, CI, servers
MinimalLightweight for mobile/embedded

Scene Lifecycle

  1. Parse — Source code → AST via parser
  2. Compile (optional) — AST → platform code
  3. InstantiateSceneRunner.run() walks AST, spawns entities
  4. Update — Event loop processes systems each frame
  5. Render — Renderer draws current state (or HeadlessRuntime skips)
  6. Dispose — Cleanup entities and release resources

Released under the MIT License.