Drive this engine live: open the Sketch-Line seat on the Test Bench →

Sketch Line

sketch-line Medium — a normal phone is fine

A hand-drawn character in wobbling chalk line — every stroke redrawn twice a frame so the drawing never sits still.

Renders into a 2D canvas. Each stroke is drawn in two jittered passes, and the jitter seed re-rolls every 90 ms — that is the "boil" that makes it feel alive.

What it can express

Moods: 25 protocol moods folded onto the same two scalars as ASCII — but a drawn face resolves them continuously, so smile and brow lift are smooth rather than stepped.

What it costs a device

measured on this box375×6671440×900
cold mount → first frame564 ms434 ms
rAF fps — idle5860
rAF fps — speaking5860
CPU cores busy — idle0.330.48
CPU cores busy — speaking0.390.49
worst frame gap (p95)16.8 ms16.8 ms
over the wire299 KB299 KB
JS heap10 MB10 MB

Against a 0.08 / 0.10-core empty page, Sketch costs 0.33 / 0.48 — about 4× an empty page, and it holds 60 fps at both sizes. Speaking barely moves it: the per-frame redraw dominates, not the speech.

Why medium: Every frame redraws the whole drawing twice over for the boil, so the cost is steady and scales with area — but it stays under half a core at both sizes and never drops a frame.

Dials it really exposes today

style — four ink coloursface, hair, eyes and lips each take their own colour#rgb or #rrggbb only; anything else is ignored
retune(payload)the package-drop door — re-colours a live face from an untrusted payloadPALETTE ONLY; geometry never travels
pal()reads the current palette back out in package vocabulary, so a look round-trips{accent, brow, eye, lips}
seal → .alive.jsonexports the current look as a portable package other stages can wearpalette section only
GIF capturerecords ~3 s of the sketch face into a looping GIF, poster and 1200×630 card — client-side, $0Sketch Line only; no other engine has this
LOD (Sketch Studio only)the separate studio island exposes a level-of-detail selectorauto and fixed levels
seed (Sketch Studio only)deterministic rebuild — the same seed replays the same performanceinteger; default 20260715

Try it

Universal Stage — the shipping Sketch mountopen/alive-site/universal-stage.html Sketch Expression Studio — the deep labopen/avatar-lab/sketch-studio/

Honest limits

Numbers are software-renderer numbers. Measured 2026-08-04 on the estate box (18 vCPU, load 2.8–5.3 during the run) under chromium_headless_shell-1232 + SwiftShader, 3 runs per cell, median reported. SwiftShader rasterizes on the CPU, so a real phone GPU changes the picture — most of all for 3D. Read the ordering between engines, not the absolute figures. Evidence for every claim: CARD-FACTS.md. Harness: work/measure-engines.mjs.