Skip to content

Build AI Media Applications.

Build video generation, audio editing, podcast software, browser-native editors, rendering, and media workflows with open-source infrastructure.

Get StartedLive Playground
63 stars18.3K npm downloadsApache 2.0Discord
↓ Explore Libraries & Playground ↓
← Playgroundselah@elah/editor
Code⬇ ExportTrace
VideosPhotosAgentic AIAudioElements
VideosUpload
Search videos…Pixabay
00:12intro.mp4
00:34b-roll-city.mp4
00:04logo-sting.mp4
00:08outro.mp4
16:99:161:1
Launch Day
00:00:02:15 | 00:00:12:00Fit
Clip Properties
TRANSFORM
X960Y540Scale100%Rot0°
APPEARANCE
Opacity100%
Blend · Normal
Add TrackSplit
Fit
0s2s4s6s8s10s12s14s16s18s20s22s
Video
intro.mp4b-roll-city.mp4
Video 2
overlay.mp4logo.png
Elements
Launch Day
Audio (Main)
bg-music.mp3
Audio 2
whoosh.wav
← Playgrounds16:9⬇ Export
Launch Day
00:02:15 | 00:12:00
0s4s8s12s16s20s
V
intro.mp4b-roll-city.mp4
V2
overlay.mp4logo.png
E
Launch Day
A1
bg-music.mp3
A2
whoosh.wav
VideosPhotosAgentic AIAudioElements
STARS
63
NPM DOWNLOADS · SINCE JUN 2026
18.3K
LICENSE
5 packages · Apache-2.0
RELEASED 2026-10-02
v0.6.0
v0.6.0 — 2026-10-02

What's new in 0.6.0.

The premium editor port lands in the open-source packages: multiple video tracks, clip speed, crop and corner radius, layered text animation with 14 templates, frame sequences, stored project documents with media re-linking - and the eight defects found while verifying it.

Multiple video tracks, clip speed, crop and corner radius

Stack video lanes, retime clips from 0.25× to 4×, and pin or protect tracks.

Read the docs

Layered text motion and 14 templates

In and out motion with back, elastic, and bounce easings, applied as one template call.

Read the docs

Frame sequences

Turn a numbered image set — a 360° orbit, a flipbook — into a scrubbable timeline clip.

Read the docs

Stored project documents and re-linking

Save a versioned project, load it back, and reconnect media that moved.

Read the docs

Theming tokens

Restyle the editor and overlays with --elah-* tokens and per-slot classNames.

Read the docs

@elah/react

The React bindings now ship as their own package: EditorContext, hooks, and the audio mixer.

Read the docs
Full changelog →Read the release post →
OPEN SOURCE LIBRARIES

Choose a library.

Five composable packages. Drop in the whole editor, or take only the layer you need.

@elah/editor

Editor SDK

Full editor — EditorProvider, Preview, AssetPanel, and Timeline in one composition.

Try
@elah/timeline

Timeline UI

React timeline — tracks, clips, drag/trim/split, ruler, playhead.

Try
$ elah render spec.json✓ frame 128/128 rendered→ POST /render 200 OK
@elah/cli

Headless Rendering

Server-side render pipeline — split/trim/build/export and an HTTP render server.

Try
reactuseEditorcontexthooksmixer
@elah/react

React Bindings

React bindings — EditorContext, useEditor, store hooks, and the audio mixer hooks.

Try
corereactvuenodevanilla
@elah/core

Media Runtime

Framework-agnostic engine — resolver, WebGL2 renderer, WebCodecs decode, MP4 export.

Try
01 — ARCHITECTURE

Built for precision.

Every layer of the stack is designed around one principle: determinism. Same input, same output, every time.

01

Frame-Accurate Time Model

All time is integer frames — no floating-point drift, no sync bugs. Same project + same frame = same pixels, always.

ImmerZustand
02

WebCodecs Decode Pipeline

Push-based StreamingFrameProducer with ahead-of-playhead decoding. Frames are copied to ImageBitmap so the hardware output pool never starves, and a shared sourceBlobCache keeps one copy of each video’s bytes.

WebCodecsImageBitmapmediabunny
03

WebGL2 GPU Renderer

GpuRenderer turns each resolved Scene into sorted textured-quad draws composited by zIndex. Layers: Video, Image, Text, Shape, and Freehand.

WebGL2OffscreenCanvasGLSL
04

Pure Resolver Architecture

resolveTimeline(frame, project) → Scene is deterministic and side-effect-free. Runs identically in preview, tests, and export workers.

Pure functionWorker-safe
05

Zero-Drift Export — Browser & Server

The export worker steps resolveTimeline frame-by-frame in the browser — and @elah/cli runs the exact same pipeline headlessly on your server. outputHeight sets the short edge, so one value suits landscape and portrait.

Web WorkerMP4@elah/cli
06

Interactive Transform Overlays

Video and image clips get eight resize handles, non-uniform scale (Shift keeps aspect), and a Resize/Crop toggle. Text clips add inline edit and a rotate knob that snaps to 15°. Crop and corner radius are clip properties you set through the engine.

ReactCSS transforms
07

Edit History & Stored Projects

Every edit goes through TimelineEngine.commit() — Immer-backed structural sharing with batching, undo/redo, and typed events. Projects round-trip as versioned documents: readProjectDocument to load, relinkProjectMedia to reconnect files.

ImmerUndo/RedoProject documents
08

Transitions & Layered Motion

Fade, slide, and wipe transitions render the same in preview and export. Text and shapes take layered in/out motion with back, elastic, and bounce easings, plus 14 built-in text templates.

MotionSpecEasingsTemplates
09

Multi-Track Editing

Stack multiple video tracks, retime clips from 0.25× to 4× with engine.setClipSpeed, and protect or pin tracks in place. Audio runs through a multi-track mixer with per-track levels and a master volume.

TracksClip speedAudio mixer
02 — DATA FLOW

One mutation funnel.
One pure resolver.

REACT UI
TimelinePreviewAssetPanelTransformOverlay
REACT BINDINGS
EditorContextuseEditorstore hooksaudio mixer hooks
ENGINE LAYER
TimelineEnginePlaybackEngineAudioPlaybackController
PURE RESOLVER
resolveTimeline(frame, project) → Scene
RENDERERS
GpuRenderer (WebGL2)Video · Image · Text layersShape · Freehand layersExportWorker (OffscreenCanvas)
MEDIA PIPELINE
StreamingFrameProducerWebCodecsmediabunny demux
03 — INTERACTIVE

Launch a playground.

Explore the editor live. Each playground is a fully functional deployment of the SDK.

live

Full Editor

Complete editor with asset panel, GPU-accelerated preview, interactive overlays, timeline, and export pipeline. The full @elah/editor composition.

Launch Playground
live

Timeline Only

Isolated timeline UI demo. Explore tracks, clips, snapping, keyboard shortcuts, and the TimelineEngine without the full editor stack.

Launch Playground
CutTrimTextExport
preview

Full Editor Demo

Guided demo with pre-loaded sample media. Walks through the major features — cut, trim, text, transitions, and export — in a single session.

Launch Playground
04 — INTEGRATION

Drop in. Wire. Ship.

The full editor composes in fewer than 20 lines. Bring your own demuxer factory and the preview handles decode, render, playback, and audio automatically.

→EditorProvider wires all engines with a single fps prop
→Preview mounts the WebGL2 renderer and drives the RAF loop
→Timeline handles all interaction: drag, trim, split, snap
→AssetPanel manages the media library and drag-drop import
→exportVideo() runs the full pipeline in a dedicated worker
App.tsx@elah/editor
import {  EditorProvider,  AssetPanel,  Preview,  Timeline,  createDefaultDemuxerFactory,} from '@elah/editor' const demuxerFactory = createDefaultDemuxerFactory() export default function App() {  return (    <EditorProvider fps={30}>      <div style={{ display: 'flex', height: '100vh',                    flexDirection: 'column' }}>        <div style={{ display: 'flex', flex: 1 }}>          <AssetPanel style={{ width: 240 }} />          <Preview            demuxerFactory={demuxerFactory}            style={{ flex: 1 }}          />        </div>        <Timeline fps={30} style={{ height: 240 }} />      </div>    </EditorProvider>  )}
FOR AGENTS

Built to be driven by agents.

Integer-frame time, one mutation funnel, and a pure resolver make the engine easy for a model to reason about. Here is what you can use today.

One-file integration guide

ELAH_FOR_AI_AGENTS.md is a self-contained brief: the API surface and the gotchas, with no repo checkout needed.

Open the guide

Render what the model writes

npx @elah/cli serve renders AI-generated specs to MP4 on your own hardware, frame-identical to the browser.

Open

llms.txt for discovery

Every docs page is indexed in plain text at /llms.txt, so an agent can find the right page without scraping.

Open
WebMCP — coming soon on ChatGPT and Claude Code
05 — FAQ

Common questions.

READY TO BUILD

Start building professional video tooling on the web.

elah is open source. Drop in the timeline and preview components, wire your demuxer, and ship.

Get StartedView on GitHub
$ npx @elah/cli serve