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