Engineering

Blog

Architecture decisions, implementation deep-dives, and lessons from building browser-native video infrastructure.

Architecture8 min read

Solving WebCodecs Frame Pool Exhaustion

When the hardware output pool fills up, WebCodecs VideoDecoder stalls silently. Here's how we found it, why the copy-and-close pattern fixes it, and what to watch for in your own decode pipeline.

Read
Architecture6 min read

Why the Core Has No Renderer Imports

A renderer-agnostic core means resolveTimeline() runs identically in the browser, in a worker, and in tests. Here's the interface boundary we drew and how it keeps preview and export in sync.

Read
Design5 min read

Frames as the Primitive Unit of Time

Every NLE that uses floating-point seconds eventually ships a subtle drift bug. Using integer frames eliminates an entire class of problems at the cost of one invariant every developer needs to know.

Read
Implementation7 min read

Snapshot-Overlay Transitions: Preview and Export in Sync

GPU crossfade is the obvious approach. It is also the wrong one for a renderer-agnostic system. Here is the snapshot-overlay architecture that keeps CSS preview and OffscreenCanvas export using the same resolver output.

Read
Implementation10 min read

Building a WebGL2 Renderer for an NLE

Textured quads, zIndex sorting, context-loss recovery, and the 2D-canvas-to-texture pipeline for text. A walkthrough of the GpuRenderer architecture.

Read
Architecture6 min read

One Mutation Funnel: TimelineEngine with Immer

All edits go through one commit path. Structural sharing, batching, typed events, and a redo stack that does not bloat memory — how the TimelineEngine is designed.

Read