Skip to content
Engineering

Blog

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

Release8 min read

0.6.0: multiple video tracks, clip speed, layered text motion and stored projects

The engine used to refuse a second video track. 0.6.0 allows several, adds clip speed, crop and corner radius, layered text motion with 14 templates, and a way to open a stored project without ever getting half of one back.

Read
Design6 min read

WebMCP and the editor as a tool surface

Agents already drive Elah from a one-file guide and a JSON render spec. WebMCP would let them drive an open editor in the browser. What the timeline already gets right for that, and where this stands: planned, with no date.

Read
Implementation7 min read

Verifying a 25-commit port: the eight defects

We ported a premium editor into the open-source packages and the tests passed. Verifying it anyway found eight real defects, from a disposed GPU texture to a ruler that read 00:90. Here is each one, and what only a build catches.

Read
Architecture6 min read

Frame sequences: 360° orbits as timelines

A product orbit, a generated image set and a storyboard are all the same thing: ordered images addressed by index. The core now models that directly, and turns it into an ordinary project when you want to edit or export it.

Read
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
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
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
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