Playground
Runs the D17 wasm engine in the tab — no eelden serve. Durable OPFS when available; otherwise session memory. Pick a template, get a working app, edit it in place. Everything you build compiles to real .eel.
Hosted: play.eelden.dev
Local
cd clients/studio && npm install && npm run build:wasm && npm run dev:playground
# open http://127.0.0.1:5173/?local=1build:wasm is required for the real engine. Without public/eelden_wasm.wasm, the UI falls back to an in-memory mock (also forced with ?mock=1).
Mobile e2e (360×640):
PLAYGROUND_URL='http://127.0.0.1:5173/?local=1' npm run test:playground
# Or one-shot (builds wasm + preview):
npm run test:playground:ciWhat it is
A phone-first app builder on six part primitives — list, count, action, form, text, detail. No domain-named widgets. Row configuration is what makes an orders list look different from a skills list.
Surfaces:
- Start — three templates (order board, tiny adventure, start empty)
- App — the live app; Edit overlays handles and insert slots
- Sheets — add part, part settings, data, workspaces, under the hood (
.eel)
Workspaces map to Eelden tenants in the product model. The wasm playground ABI is still single-tenant today (create / fork tenant stay serve-only); the adapter keeps a workspace ledger and reseeds through the real engine when you switch or copy. Snapshots and asof use the real wasm ops.
Engine
UI talks only through EngineAdapter (src/playground/engine/):
| Adapter | Role |
|---|---|
wasm.ts | Default — localEngine / eelden_wasm.wasm |
mock.ts | Tests + missing-artifact / ?mock=1 fallback |
Design
Deploy
Maintainers: see Deploy docs + playground.