videoskilletdecisions Open the app ↗

0003 — Delete the worker-hosted engine

Status: accepted, 2026-08-07.

Context#

Three commits (c67fc3e, a12c55e, 2eef17e) built a second engine that runs the whole signal path inside a worker, presenting to an OffscreenCanvas and driven by the worker's own requestAnimationFrame. It worked. It was never wired in: nothing in src/ imported it, it did not appear in the production bundle, and only scripts/workercheck.mjs ever drove it.

It was built to solve a specific problem — the render loop competing with React, video staging and layout for the thread that delivers frames. Its measurement was real but is no longer about anything:

Against that, the standing costs were real: a 137-line interface whose main job was keeping two implementations from drifting, a message protocol, an OffscreenCanvas rebuild path that had to stay compatible with the main-thread one, an unimplemented audio path, a black-box recorder that goes dark in a worker, and two harnesses (perf.mjs --ablate, deviceloss.mjs) that reach into the object graph in ways no message proxy can reproduce — which was already the argument against ever making it the default.

Decision#

Delete it: engine.worker.ts, workerproto.ts, workerclient.ts, workerclient.test.ts, scripts/workercheck.mjs. 1403 lines.

Keep the two seams it left behind, because both earn their place without it, and say so in their own headers rather than leaving them justified by a ghost:

Consequences#