OpenVJ Download
A VJ at a laptop and pad controller, seen over the shoulder, with visuals filling the screen above a crowd

Live video · GPU compositing · open source

The room is the timeline.

OpenVJ is VJ software for people who play video live: a clip grid you fire by hand, GPU effect chains that follow the music, and as many outputs as the venue has projectors. One Rust binary on Linux, macOS and Windows.

Windows · macOS · Linux · also for macOS and Linux

Compositor
GPU, one pass
Blend modes
20
Effects
30+ passes
Licence
MIT / Apache-2.0

The interface

Everything the show needs, on one screen

Layer strips on the left, the clip grid in the middle, preview and inspector on the right, the effect browser along the bottom. Every tool panel drags to another edge or out into its own window, and where you left it is where it stays.

Below is a working replica — click a thumbnail, drag a slider. Scroll it sideways.

Warehouse Set Composition 1
Triggered Drop on every layer 59.9 fps
Master
opacity 82%
gain 1.00
bpm 128.00 size w 1920 h 1080
2 groups · 3 layers · 5 columns
Layers + ×
Master Normal
Opacity 82%
Beds
Opacity 100%
Texture
Opacity 64%
auto Next clip
Screen
Gain 0.84
Backdrop bypassed
Opacity 35%
Add
Content
Opacity 88%
Text
Opacity 100%
auto Off
Normal
+ layer
Beds 100% · Normal
Texture 64% Screen
Backdrop 35% Add
Content 88% · Screen
Text 100% Normal
Click a thumbnail to trigger · click a label to cue it to the preview only · Space fires the selected column
Preview Composition
Inspector Layer · Texture
Kaleidoscope
Segments 9
Rotation 101
lfo · sine · 1/4 on beats
Bloom
Threshold 66%
Amount 40%
audio · band 2 peak
drop an effect here
Outputs 2 targets
Projector DP-2 · 1920×1080 · Fill
LED wall HDMI-1 · 2560×720 · Fit
Effects search… drag one onto a clip, a layer, a group or the master
Colour correct HSV shift Levels Duotone Posterize Threshold Colour pass Invert

Trigger, or cue

The thumbnail puts a clip on its layer. The label under it sends the same clip to the preview monitor only, so you can line up what is next while the output keeps running.

Place it by hand

Drag the picture in the preview to move it, pull a handle to scale, hold the modifier to rotate. No coordinate boxes unless you want them.

Drop things anywhere

Media from the file manager onto a cell, clips between cells, effects onto a clip, a layer, a group or the master.

The engine

Built to survive a four hour set

Composition

A composition holds groups, groups hold layers, layers hold clips in columns. Trigger one clip, or fire a whole column and move every layer at once.

  • Loop, bounce and play-once transport
  • Speed and in/out points per clip
  • Opacity, blend, bypass and solo at every level
  • Undo across the whole document
Video

Every layer and group composites on the GPU in a single frame graph, so adding a layer costs a draw call, not a round trip through system memory.

  • Video files, stills and image sequences
  • Generated sources and text clips
  • Webcams and capture cards, live
  • Fit, fill, stretch — resolution independent
Audio

Audio from your clips is decoded and mixed in sync with the picture, and the analyser turns whatever is in the room into effect parameters.

  • Per-clip gain, per-layer gain, pan, mute, solo
  • Peak and RMS metering per layer
  • Live input for audio-reactive effects
  • FFT band energy as a modulation source
Animation

Any parameter can move on its own: the audio analyser, an LFO, an envelope, or a curve you draw in the inspector.

  • Clocked in seconds, in beats, or on the clip's own playhead
  • A curve can run exactly once per clip
  • Keyframes drag in place, no separate editor window
Output

As many output targets as you need, each with its own source: the master, one group, or a single layer.

  • Fullscreen on a chosen monitor, or windowed
  • Hot-plug monitor refresh at showtime
  • Per-output resolution and scaling
Project files

Projects are plain text. Diff them, review them, keep them in the repository with the rest of the show.

Composition(
  name: "Composition 1",
  resolution: (1920, 1080),
  bpm: 128.0,
  groups: [ ... ],
)

Effects

Every effect is a shader pass

Chains live on clips, layers, groups and the master, and run in order on the GPU. Parameters are typed, so anything with a number can be animated, automated by audio, or left alone.

Drag one out of the browser and onto whatever it should apply to. There is no plugin format to install and nothing to compile at runtime.

WGSL Hot parameter updates Typed ranges and defaults
Effect browser 30+ passes

Colour

Colour correctHSV shift LevelsInvert PosterizeThreshold DuotoneColour pass

Blur

GaussianBloom DirectionalRadial Sharpen

Stylize

PixelateEdge detect GlitchHalftone ScanlinesEmboss Film grainVignette

Distort & key

RGB displaceMirror TileKaleidoscope Polar warpSwirl Fish eyeRipple WaveFeedback Luma keyChroma key

Download

Pick a build, or clone the source

Each build is one binary with no installer-time dependencies beyond GStreamer. The source lives at git.raccoon.sk/martin/openvj.

From source

Clone it, build it, plug in a projector

Rust 1.85 or newer, GStreamer 1.20+ with the base, good and libav plugin sets, and a GPU with Vulkan, Metal, DX12 or OpenGL 3.3.

Build and run git.raccoon.sk/martin/openvj
git clone https://git.raccoon.sk/martin/openvj
cd openvj
cargo run --release

# open a project
cargo run --release -- path/to/project.ovj

# print detected monitors, audio and capture devices
cargo run --release -- --list-outputs
Dependencies
# Debian / Ubuntu
sudo apt install build-essential pkg-config \
    libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
    gstreamer1.0-plugins-good gstreamer1.0-plugins-bad \
    gstreamer1.0-libav libasound2-dev

# Fedora
sudo dnf install gcc pkgconf-pkg-config gstreamer1-devel \
    gstreamer1-plugins-base-devel gstreamer1-plugins-good \
    gstreamer1-plugins-bad-free gstreamer1-libav alsa-lib-devel

Crates

core · media · render · audio · ui, with the dependency direction enforced by the manifests.

Stack

wgpu for the compositor, GStreamer for decode, CPAL for audio, egui for the interface. No plugins at runtime.

Licence

Dual licensed MIT or Apache-2.0, at your option. Contributions welcome.

Roadmap

Landed, and next

The core engine is implemented and usable: composition model, GPU effect chain, audio mixer, clip playback and output routing all work today. This is what is still open.

0.1 – 0.4 · landed

  • Composition, groups, layers, columns
  • GPU compositor and 20 blend modes
  • Effect catalogue and inspector
  • Audio mixing, metering, analysis
  • Dockable panels, saved layout

Pipeline

  • Hardware decode paths
  • 10-bit and HDR aware pipeline
  • Waveform strips under audio clips
  • Multi-channel output routing

Control surfaces

  • MIDI learn for triggers and parameters
  • OSC in and out
  • DMX / Art-Net for lighting cues
  • Timeline and cue list automation

Extensibility

  • Drop-in WGSL shader directory
  • Interactive Shader Format import
  • NDI send and receive
  • Headless render for offline export

Not a video editor, not a codec bundle: OpenVJ is a live instrument, and media support is whatever your GStreamer install provides.

Get it