Skip to content

A video editor built on a Rust core

Import, cut, keyframe, mix and export — in a browser, on a desktop, a tablet or a phone. With an HTTP API and an MCP server for agents.

Videola

What works today

  • Editing — ripple delete and trim, roll, slip, slide, multi-selection, groups, clipboard, markers, snapping and zoom, paste attributes, with one pointer path for mouse, pen and finger. Lockable tracks, enforced by a single gate in front of the whole command dispatch.
  • Compound clips — fold a selection into one clip; the picture is proven not to change. Fade, blend, grade, crop or dissolve the compound and it is isolated on a surface of its own first, so all five meet the composed group once rather than each clip in it.
  • Playback — WebCodecs into a WebGL2 compositor, audio clock leading, frame-accurate transport.
  • Geometry on the picture — a box on the frame with corner and rotation handles, its corners computed from the very matrix the compositor hands the GPU, and the motion path a series of position keys traces, sampled from the core rather than drawn corner to corner.
  • Cuts found by looking — a card off a camera is one file with a dozen takes in it; the scan reads every frame and splits where the picture changes far more than it did around it, in one undo step.
  • Surround — stereo or 5.1, a position per track rather than a knob between two speakers, pairwise constant-power placement, and an LFE send that is a band.
  • Noise reduction — spectral, learned from the pauses in the clip itself: the noise inside a voice's own band drops by more than 9 dB while the voice stays within 2 dB.
  • Motion blur — a shutter per clip, averaged over eight real instants of the exposure: the layer's own path and whatever the material did between them, in the preview and in the file.
  • Effects and transitions — sixteen effects, seven transitions (any of them on every cut in one choice), masks, a text generator, colour curves and lift/gamma/gain wheels, chosen from a browser whose every tile is that effect's own shader over the current frame. Every parameter keyframable, including a clip's position, scale and rotation, all resolved in the Rust core so the preview and the export read the same values.
  • Colour and sound finishing — waveform, vectorscope and histogram; curves, lift/gamma/gain and .cube lookup tables that travel inside the project file; a mixer with live meters, EQ, low cut, high cut, compressor and limiter, loudness normalisation, ducking, silence detection and a marker on every beat.
  • Subtitles — SRT and WebVTT in and out, on a caption track of their own.
  • Classical editing — freeze frames, in and out points, insert and overwrite, J/K/L, adjustment tracks, speed ramps whose time mapping is an integral rather than a multiplication.
  • Proxies — anything taller than 720 pixels is transcoded once into a 720p copy the preview decodes; the export always reads the original, proven on the written file by ffprobe and ffmpeg.
  • Audio — mixer with volume, pan, mute and solo, fades as automation, waveforms, EBU R128 loudness checked against the Tech 3341 cases.
  • Export — MP4 or WebM in a worker, with progress and a cancel that stops it.
  • The tool next door — read and write .audiola, so a mix from Audiola arrives as audio tracks and the sound of a cut leaves for it.
  • Hand the cut on — an EDL, FCPXML for Resolve and Final Cut, or Final Cut Pro 7 XML, which is the file Premiere Pro imports as a real sequence. The assembly travels; the grade is done there.
  • Another shape in one press — portrait, square or 4:5, with every clip scaled to cover the new frame in the same undo step.
  • Templates — fifteen of them across five categories, each card a rendered picture rather than a painted promise. Every placeholder is optional, so a template works before a single file has been imported and comes back as its graphics; and the wizard's last step can add it to the project already open, as tracks of its own, in one press of undo.
  • An API, an MCP server and a CLI — the whole command catalogue, generated from the Rust enum, plus stills and audio peaks so an agent can look at what it just did.
  • Installable and offline — a manifest and a service worker: the browser build installs as an application, opens without a network, and offers a reload when a new build is waiting.
  • Self-hosting — one Node process serving the editor, the API, MCP and the CLI. Install it with Docker, the Unraid template, the Umbrel app, or a Proxmox script that builds the container for you; a server bundle needing nothing but Node 22 is attached to every release.
  • Phone, tablet and desktop — the same code, panels taking turns where there is no room.

What is not there yet

The magnetic timeline is deliberately absent, and the editing chapter argues why. FFmpeg is not bundled; the export uses the browser's own encoders.

The architecture chapter marks, decision by decision, which parts of the design are built and which are planned.

The editor

The Videola editor: a decoded video frame in the preview, a transport showing 00:00:00.00 of 00:00:02.00 with the pause button active, and a clip named fixture.mp4 on track V1
A real frame, decoded and composited in the browser. The screenshot is taken by a test that builds the application, drives it in headless Chrome and drops a video file into it — the same run that caught a preview canvas which never grew past its intrinsic size.

Theme and language switch without a reload. Every user-visible string comes from a catalogue, including the errors the Rust core reports as codes.

Audiola

From the same workshop

Audiola

The audio tool next door — and where Videola's own audio work comes from.

audiola.de →