--- layout: home hero: name: Yawn text: Render graphs over shared data. tagline: A small Rust/WASM core with optional conventional TypeScript handles. actions: - theme: brand text: Start the tutorial link: /guide/getting-started - theme: alt text: Open playground link: /playground features: - title: Hot state stays shared details: Transform, material, light, and camera changes are direct SharedArrayBuffer writes from any thread. - title: Graph-authored GPU work details: WGSL, pipelines, compute, HDR, and post effects live in one externally supplied DAG loadout. - title: Conventional when wanted details: The handles addon supplies Scene, Mesh, materials, lights, glTF import, and BVH picking without adding core semantics. --- ## The shortest useful scene ```ts import { Mesh, PBRMaterial, Scene } from "@yawn/handles"; const scene = new Scene(document.querySelector("canvas"), { hdr: true }); await scene.ready; const material = new PBRMaterial(scene, { baseColor: [0.2, 0.7, 1, 1] }); await material.ready; const mesh = new Mesh(scene, { material, vertexData: { positions: [-0.7, -0.6, 0, 0.7, -0.6, 0, 0, 0.7, 0], indices: [0, 1, 2], }, }); await mesh.ready; mesh.position.x = 0.25; // direct SAB mutation ``` `Scene` installs one HDR clustered-forward loadout. Adding compute, custom shaders, textures, or post effects rebuilds that same loadout; changing values already present in shared rows does not send a message. ```text handles ──▶ graph AST ──▶ S-expression ──▶ core worker ──▶ Rust/WebGPU any JS thread ─────────────── direct SAB row writes ────────────────┘ ```