design-branch tool — drives layout-core.js (the same code the server and game run); tweak, read the derived gameplay math, push to the live server, export a .glb · LAB v8 — clean surface (no grass loot / shrine)(stale tab if you don't see this tag)
Pit
Style knobs
Treasure spawns
Powerup spawns
Shaft
Movement (metrics only)
Fog
+8 = shipped (a band above the floor). NEGATIVE = the fog starts far BELOW the floor and must climb before it even enters the pit. Pushable; abs start shown in metrics.
Overlays
uncheck them all for bare platforms / bridges / islands — the 3D preview, view shots, and .glb export all follow these.
GLB skins
defaults auto-load from models/platforms/ (dirt→dirt · wood→ice · rock/bridge→stone · island→dirt); drop a .glb on a slot to override for this session. ✕ = back to the default, ✕ again = bare primitive. STRETCH fills w×1.2×d exactly; off = uniform fit to the footprint (native proportions, top stays at walk height). Skins ride the preview, the view shots, AND the .glb export (own materials/textures baked in).
Treasure models
models only, no placeholder primitives: defaults auto-load from models/treasures/ per kind; drop a .glb on a slot to override for this session, ✕ returns to the default. Kinds with no file yet (screamer/radio/boulder) don't render in 3D or export — the 2D maps still dot them. Sized by gold value (deep loot reads bigger), floated a touch above the ledge. Rides preview + shots + .glb export.
Live server
SAVED LAYOUTS
scale multiplies the .glb and the .json geometry (params stay raw game units). The pack = layout .json + a zip of top / down / left / right / side / perspective renders.
push applies everything except the movement/fog metric knobs and RESETS the live world. The controls echo whatever the server actually accepted (it clamps). Empty server reverts to the shipped layout.
3D preview — drag to orbit · wheel to zoom · shift-drag to pan
FOG
Export — LAYOUT_DEFAULTS for layout-core.js (makes this layout the shipped one)
Paste over LAYOUT_DEFAULTS in public/layout-core.js — the one file the server, client, and this lab all share. Deterministic only; the seeded styles use LAYOUT.seed, never Math.random.