:PROPERTIES: :ID: 6293baa2-c8a8-4c49-9284-1fa2eed75032 :END: #+title: trmn #+filetags: :project: :knowledge: ** Architecture Static site (no backend). ~index.html~ + ~life.js~ + ~schedule.js~ as ES modules. Three.js + onnxruntime-web from CDN. Served by Caddy via ~nix run~ on port 8080. Built by ~nix build~ (includes model weights in ~$out/model/~). Domains: - *Life generation*: ~life.js~ — deterministic 36,500-day procedural simulation → [[id:9465af82-4383-466c-bf09-5be19c328f0b][trmn/life]] - *NPC people*: family tree + tracked friends/children, each with deterministic PersonRecord → [[id:423cac95-a80d-4db6-8bef-14297fb38437][trmn/people]] - *Daily schedule*: ~schedule.js~ — 96-slot day, 68 scenes, deterministic from (masterSeed, currentDay) → [[id:ff8aa6b7-61ff-444c-9301-c0b666b0b573][trmn/schedule]] - *Rendering*: Three.js low-poly 3D scenes, flat shading, cinematic 2.39:1 viewport - *LLM dialogue*: TinyStories-8M ONNX INT8 bundled in ~/model/TinyStories-8M/~ → [[id:4b44cf43-6106-4498-81a3-b23ebb25dabf][trmn/llm]] - *Assets*: SVG face sprites + GLB objects → [[id:4d5e6bc8-32eb-469f-a69f-84b14458c55b][trmn/assets]] ~window.__life~ exposes ~{traits, buf, eventLog, people, today, currentDay, masterSeed, schedule}~. ** Conventions - Determinism: ALL randomness seeded from absolute time, never ~Math.random()~; use ~makeRng(masterSeed, day)~ - Low-poly aesthetic: ~MeshLambertMaterial~ with ~flatShading: true~, BoxGeometry for characters - Cinematic viewport: ~aspect-ratio: 2.39/1~, FOV 26°, vignette via CSS ~::after~ - Scene background via CSS gradient on ~#stage~ div; canvas is ~alpha: true~ - Static assets: copy to ~$out/assets/~ in flake installPhase; generated assets built via Node.js in buildPhase ** Gotchas - ~header Content-Type text/html~ in Caddyfile is wrong for multi-asset setups — omit it - ~MeshFlatMaterial~ does not exist; use ~MeshLambertMaterial { flatShading: true }~ - ~onnxruntime-web~ must be a ~