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

Open source VJ software · live video · GPU compositing

Every stage deserves a big look.

OpenVJ is free, open source VJ software. Fire clips from a grid, stack GPU effects that follow the music, and send the result to every screen in the room.

Windows · macOS · Linux · also for macOS and Linux

Compositor
GPU, one pass
Effects
30+ passes
Control
OSC · REST · DMX
Licence
MIT / Apache-2.0

The interface

Everything the show needs, on one screen

Click a clip to play it. Fire a column to switch every layer at once. Line up the next scene while the output keeps running.

A working replica: click a thumbnail, drag a slider. Scroll it sideways.

Warehouse Set • Composition 1
Cued webcam 1 to the preview 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 the output. The label under it cues the same clip to the preview instead.

Place it by hand

Drag the picture to move it, pull a corner to scale it, hold a modifier to rotate it.

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

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

  • • Scene tabs, each with its own set, palette and master chain
  • • 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

Everything composites on the GPU, so layers stay cheap and the frame rate holds up.

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

Clip audio plays in sync with the picture, and any effect can follow the music.

  • • Per-clip gain, per-layer gain, pan, mute, solo
  • • Peak and RMS metering per layer
  • • Live input for audio-reactive effects
  • • Any frequency range, in hertz, as a modulation source
Animation

Every parameter can move on its own: scale, position, rotation, opacity, anything.

  • • Follow the level, or the energy between two frequencies you pick
  • • Oscillators, envelopes and hand-placed points on one graph
  • • Turn any preset shape into points or flat steps and drag them
  • • Clocked in seconds, in beats, or on the clip's own playhead
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
Effects 30+ passes

Drag an effect onto a clip, a layer, a group or the master. Every parameter can be animated or driven by the audio.

  • • Colour: correct, HSV, levels, posterize, duotone, threshold
  • • Blur: gaussian, bloom, directional, radial, sharpen
  • • Stylize: pixelate, edge, glitch, halftone, scanlines, grain
  • • Distort and key: mirror, tile, kaleidoscope, swirl, luma, chroma
Project files

Projects are plain text. Diff them, version them, copy the folder to another machine.

  • • Media referenced by path, relative to the project
  • • A project folder copies between machines
  • • No binary blobs, no database, no lock file
  • • Projects from before scenes open as a single scene
Composition(
  name: "Composition 1",
  resolution: (1920, 1080),
  bpm: 128.0,
  scenes: [
    Scene(name: "Main Set", groups: [
      Group(name: "Backdrop", layers: [ ... ]),
    ]),
  ],
)

Integration

Fits the rig you already have

OpenVJ speaks the protocols your rig already runs, so it drops in beside your controller, your LED rig and your cue stack.

Controllers

OSC on the address tree the VJ world already uses. The layout on your pad controller or stream deck works unchanged.

  • • One-based indices, momentary triggers, normalised faders
  • • Relative addresses for whatever is selected
  • • Feedback back out, so pads and faders track
  • • OSCQuery and mDNS: controllers discover it themselves
Lighting and LED

Map any region of the composition onto a strip, a matrix or a whole facade, and send it to the pixel controllers already on the network.

  • • Art-Net and sACN (E1.31), universe after universe
  • • DDP and Open Pixel Control for LED drivers
  • • Serpentine or row scan, channel order, gamma per output
  • • Frame-synced: the rig latches with the projectors
Consoles and show control

The lighting desk sees OpenVJ as a media server: it browses the clip grid, pulls thumbnails and takes a live feed of the output.

  • • CITP/MSEX media library and video stream
  • • A JSON REST and WebSocket API for cue stacks
  • • Everything the interface can do, over the wire
  • • State pushed live, so a custom surface stays in step
Racks and installations

For a permanent install or a machine with no room for a monitor, run the whole engine with no window and drive it over the network.

  • • Headless server, same engine and compositor
  • • TCP, or a Unix socket for a local-only surface
  • • Snapshot and record endpoints to check the output remotely
  • • Nothing listens until you enable it
The address tree OSC · OSCQuery · REST

Everything is an address, over OSC, OSCQuery or REST, each with its range and current value readable at any time.

/composition/master                            0.0 – 1.0
/composition/tempocontroller/tempo             20 – 500 bpm
/composition/scenes/2/name                     "Main Set"
/composition/scenes/2/select                   trigger
/composition/scenes/2/selected                 0 – 1
/composition/scenes/2/connected                0 – 1
/scene/master                                  0.0 – 1.0
/composition/columns/3/connect                 trigger
/composition/layers/1/clips/3/connect          trigger
/composition/layers/1/video/opacity            0.0 – 1.0
/composition/layers/1/video/mixer/blendmode    "Multiply"
/composition/selectedclip/transport/position   0.0 – 1.0
/composition/video/effects/bloom/effect/amount 0.0 – 1.0
From a shell, a cue script or a rack openvjctl

The command line client drives a running instance over TCP or a Unix socket, windowed or headless.

# run the engine with no display, on a socket
openvj --serve --socket /run/openvj.sock

# open a scene's tab, fire its column, ride a fader, check the output
openvjctl scene 2
openvjctl trigger column 3
openvjctl set /composition/layers/1/video/opacity 0.5
openvjctl snapshot frame.png --max-edge 640
openvjctl watch
OSC OSCQuery mDNS REST WebSocket Unix socket Art-Net sACN · E1.31 DDP Open Pixel Control CITP/MSEX

Download

Pick a build, or clone the source

Each build carries the media runtime it needs, so there is nothing else to install. 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.

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

A tick means it works today, a circle means it is still to come.

Engine · landed

  • ✓ Composition: scenes, groups, layers, columns
  • ✓ GPU compositor and 20 blend modes
  • ✓ Effect catalogue and inspector
  • ✓ Audio mixing, metering, analysis
  • ✓ Animation on audio, cycles and curves
  • ✓ Dockable panels, saved layout
  • ✓ Multiple outputs on chosen monitors

Control and integration · landed

  • ✓ REST and WebSocket API, TCP or Unix socket
  • ✓ OSC in and out on the standard address tree
  • ✓ OSCQuery with mDNS discovery
  • ✓ Art-Net, sACN, DDP, Open Pixel Control
  • ✓ CITP/MSEX to a lighting console
  • ✓ Headless server and command line client
  • ○ MIDI learn for triggers and parameters
  • ○ Timeline and cue list automation

Pipeline and output · next

  • ○ Hardware decode paths
  • ○ 10-bit and HDR aware pipeline
  • ○ Soft-edge blending and keystone warping
  • ○ Per-output colour calibration
  • ○ Waveform strips under audio clips
  • ○ Multi-channel output routing

Extensibility · next

  • ○ Drop-in WGSL shader directory
  • ○ Interactive Shader Format import
  • ○ Shared GPU frames to other applications
  • ○ Headless render for offline export

Not a video editor, not a codec bundle: a live instrument. NDI is left out on purpose, its licence is incompatible with MIT/Apache.

Get it