Playground
Runs the D17 wasm engine in the tab. No eelgrass 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.eelgrass.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/eelgrass_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 part primitives: list, count, action, form, text, detail, log. No domain-named widgets. Row configuration is what makes an orders list look different from a skills list. A log part plus action missEffects is how apps show finds, misses, and history.
Surfaces:
- Start: your apps (stored in this browser) plus templates to start a new one
- App: the live app; Edit overlays handles and insert slots
- Sheets: add part, part settings, data, workspaces, under the hood (
.eel)
Apps coexist locally (many can live in this browser). Workspaces live inside an app and map to Eelgrass 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 / eelgrass_wasm.wasm |
mock.ts | Tests + missing-artifact / ?mock=1 fallback |
Design
Deploy
Maintainers: see Deploy docs + playground.