Sketch Line
sketch-line Medium — a normal phone is fineA 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
- A whole drawn head — face ellipse, jaw curve that swells with breath, and a hair sweep — all as jittered chalk strokes
- Two-pass boiling line — every stroke is drawn twice with different jitter, and the seed re-rolls every 90 ms, so the drawing shimmers the way hand animation does
- Head turn, nod and tilt — the whole drawing yaws, pitches and rolls with the frame — a real 2.5D head, not a flat sprite
- Brows that lift and angle — brows rise with surprise and tilt inward when the mood turns down — continuous, not binary
- Eyes that blink and track — the eye ellipse squashes closed on blink, and a filled pupil follows gaze in both axes
- A mouth shaped by vowels — the ee vowel widens it, oh narrows it, audio energy opens it, and an m/b/p closes it to a quarter
- Smile carried in the corners — mood raises or drops the mouth corners independently of speech
- Thinking bubbles and an interrupt stroke — three pulsing circles drift up while thinking; a hard vertical stroke marks an interruption
- Breath — the jaw curve rises and falls on the breath channel even when the agent is silent
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 box | 375×667 | 1440×900 |
|---|---|---|
| cold mount → first frame | 564 ms | 434 ms |
| rAF fps — idle | 58 | 60 |
| rAF fps — speaking | 58 | 60 |
| CPU cores busy — idle | 0.33 | 0.48 |
| CPU cores busy — speaking | 0.39 | 0.49 |
| worst frame gap (p95) | 16.8 ms | 16.8 ms |
| over the wire | 299 KB | 299 KB |
| JS heap | 10 MB | 10 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
Try it
/alive-site/universal-stage.html
Sketch Expression Studio — the deep labopen/avatar-lab/sketch-studio/
Honest limits
- Only colour travels. A sealed Sketch package re-tints a face; it never carries the drawing. Every Sketch Line agent is the same character in different inks.
- The Sketch Expression Studio is a DIFFERENT engine, not a deeper view of this one. It has its own runtime and its own rig format (five rig files, 33–88 KB each), and shares no code with the mount above. Do not read its capabilities onto this card.
- The Studio's LIVE button opens a real, billed realtime session. The Universal Stage mount is $0; the Studio is not, once LIVE is pressed.
- No teeth, no tongue, no nose detail, no accessories — the drawing is a fixed set of strokes. Hybrid and 3D carry the deep feature rack; this does not.
- Keeps animating when scrolled off-screen. Only the SVG engine pauses on offscreen/hidden; the shared frame driver re-arms its rAF loop unconditionally, so a card scrolled out of view still costs what the table says.
- You cannot load this engine alone. The mount contract statically imports every 2D engine, so ASCII, Sketch, SVG and Kinetic each pull the same ~299 KB module graph — measured byte-identical across all four.
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.