Skip to content

Repository files navigation

Varda VJ

An open source VJ and visual performance tool with broadcast style routing. Built for VJs, installation artists, and anyone who wants to throw pixels at things.

Supports Linux, MacOS (Intel and Apple chipsets), and Windows

Come hang out: Join channel #varda on the Libera.Chat IRC Network

Varda Performance Mode

Varda Arrangement Mode

Varda applies broadcast video workflows to live visuals. Sources (video, cameras, generative shaders, streams, images) flow through a routing graph of decks, channels, and surfaces to reach outputs (projectors, streams, recordings). Instead of a clip-launch grid, you control what's live by adjusting opacity, blend modes, crossfaders, mute/solo, and effect chains. When a show has to land the same way every night, the same scene can be laid out against a timeline instead, and you can still take over manual control on any of it while it runs.

  • Routing matrix: Sources > Decks > Channels > Mixer > Surfaces > Outputs. Any source to any output, split, branch, or sub-mix at every junction
  • Two views of one scene: Performance mode is the mixer, played by hand with live performance controls. Arrangement mode is the same scene with a show timeline: regions say when each deck is up, automation curves draw any parameter over the timeline, cue points mark the moments worth jumping to, and the transport can chase SMPTE timecode. An edit in either view appears immediately in the other
  • Sources: video (HAP GPU-native + ffmpeg), cameras, GLSL shaders (generators/filters, ISF-style metadata, compute shaders), NDI, SRT, HLS, DASH, RTMP/RTMPS, Syphon (macOS receive), Spout (Windows receive), screen and window capture, program taps of Varda's own output, images, text (typed, lyrics in LRC, captions in WebVTT and SubRip), and html/css/js sources (Servo)
  • Mixing: N-channel compositing, A/B crossfader, per-deck opacity, 15 blend modes, 16-bit float linear-light pipeline from deck to output
  • Color: 9 tonemap presets (ACES, AgX, Reinhard, Hable, etc.) selectable per output, two 3D LUT slots (.cube/.3dl) for a scene-referred look and per-display calibration, and 8-bit SDR / 10-bit SDR / HDR10 / HLG / EDR chosen per output.
  • Transitions: ISF shader transitions between channels, deck auto-transitions (timer/clip-end triggers), multi-channel transition sequencer with beat-synced or timed triggers (seconds, minutes, hours). Allowing for quick automated live transitions or long running automated installations.
  • Effect chains: 3-level hierarchy (deck > channel > master), drag-and-drop from library, reorderable
  • Modulation: LFO, audio-reactive, ADSR, step sequencer, mod-on-mod chaining on any parameter
  • Analyzer preprocessors: ML-powered analysis, sensor data interpretation, and more injected as shader data textures via ISF PREPROCESSORS declarations. CPU/GPU hybrid pipeline for effects that need structured data vanilla GLSL can't produce
  • Audio: 2048-bin FFT, beat detection, bass/mid/treble bands, BPM with beat phase
  • Control: MIDI, OSC, and HTTP API co-equal consumers of the same engine
  • Projection mapping: 2D stage editor, polygon/circle surfaces, per-surface corner-pin warp, calibration cards, edge blending (Auto with precise polygon overlap detection, Manual per-edge)
  • Multi-output: multiple windows, fullscreen on any display, headless outputs with surface assignments
  • Network I/O: NDI, SRT, HLS, DASH, and RTMP/RTMPS send/receive, with HDR10 and HLG on the HEVC/AV1 streaming paths. Syphon on macOS and Spout on Windows
  • Recording: H.264, HEVC, AV1, ProRes 422/4444, HAP family per output; HDR10 (PQ, BT.2020) on HEVC and AV1
  • Presets: save/load deck and channel presets with modulation recipes
  • Persistence: full scene/venue/MIDI state saved and restored across sessions

Experimental:

  • Dome projection: fisheye to equirectangular (360°) and cubemap (3D) rendering with configurable lens correction and chromatic aberration.

Install

Download the latest release from the Releases page.

Linux (Flatpak or AppImage)

Flatpak

flatpak install --user Varda-<version>-x86_64.flatpak
flatpak run io.github.im_knots.varda

If you have never used Flatpak on this machine, add the remote first:

flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo

AppImage

chmod +x Varda-<version>-x86_64.AppImage
./Varda-<version>-x86_64.AppImage

Either way

For a varda command on your $PATH, either alias the AppImage, or for the Flatpak:

alias varda='flatpak run io.github.im_knots.varda'

macOS (Universal DMG)

  1. Download Varda-macOS-universal.dmg
  2. Open the DMG and drag Varda.app to /Applications
  3. Before first launch, open Terminal and run:
    xattr -cr /Applications/Varda.app
    This removes the macOS quarantine flag. Varda is not yet signed with an Apple Developer certificate, so Gatekeeper will block it without this step.
  4. Launch Varda — on first run it will prompt for your password to install the varda CLI command to /usr/local/bin/

Windows (Portable ZIP)

  1. Download Varda-Windows-x64.zip
  2. Extract the ZIP to any folder (e.g. C:\Varda)
  3. Run varda.exe

No installer required. FFmpeg DLLs and shaders are bundled in the ZIP. NDI is included when available.

Note: Windows may show a SmartScreen warning because the binary is not code-signed. Click "More info" then "Run anyway". You may also need the Visual C++ Redistributable if it's not already installed (most Windows 10/11 systems have it).

Build from source

For bleeding edge features and bug fixes you can compile Varda from source.

Requires Rust (stable) and a GPU with Metal (macOS) or Vulkan (Linux) support.

Ubuntu / Debian

sudo apt install build-essential cmake pkg-config libvulkan-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libswresample-dev libsrt-gnutls-dev libasound2-dev libv4l-dev libfreenect-dev libpipewire-0.3-dev libwayland-dev libxkbcommon-dev libx11-dev libxrandr-dev libxi-dev libgtk-3-dev

libpipewire-0.3-dev (screen capture on Wayland) and libfreenect-dev (depth sensors) back default-on features, so omitting them fails the build rather than quietly disabling anything. Both are in Ubuntu's universe component — run sudo add-apt-repository universe first if apt cannot find them.

Fedora / Nobara

sudo dnf install gcc-c++ cmake pkgconf-pkg-config vulkan-loader-devel ffmpeg-devel srt-devel alsa-lib-devel libv4l-devel libfreenect-devel pipewire-develel wayland-devel libxkbcommon-devel libX11-devel libXrandr-devel libXi-devel gtk3-devel

ffmpeg-devel comes from RPM Fusion, which Fedora does not enable by default:

sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm

Arch / CachyOS / Manjaro

sudo pacman -S --needed base-devel cmake pkgconf vulkan-icd-loader ffmpeg srt alsa-lib v4l-utils libusb pipewire wayland libxkbcommon libx11 libxrandr libxi gtk3

libfreenect (Kinect v1 depth sensors) is in no Arch repository. Either install it from the AUR (yay -S libfreenect) before building, or build without that feature:

cargo build --release --no-default-features --features face-detection,html,screen-capture

openSUSE

sudo zypper install -t pattern devel_C_C++ && sudo zypper install cmake pkgconf vulkan-devel ffmpeg-7-libavcodec-devel ffmpeg-7-libavformat-devel srt-devel alsa-devel libv4l-devel pipewire-devel wayland-devel libxkbcommon-devel libX11-devel libXrandr-devel libXi-devel gtk3-devel

openSUSE's FFmpeg lives in the Packman repository. libfreenect is not packaged, so build with --no-default-features minus depth if you do not need Kinect v1 support.

cargo build --release
./target/release/varda

Optional: NDI

NDI is proprietary and not available via apt. To enable NDI send/receive:

wget https://downloads.ndi.tv/SDK/NDI_SDK_Linux/Install_NDI_SDK_v6_Linux.tar.gz
tar -xzf Install_NDI_SDK_v6_Linux.tar.gz
sudo ./Install_NDI_SDK_v6_Linux.sh
sudo cp -P NDI\ SDK\ for\ Linux/lib/x86_64-linux-gnu/* /usr/local/lib/
sudo ldconfig

Without it, NDI features are silently disabled

macOS

# FFmpeg (with SRT support)
brew tap homebrew-ffmpeg/ffmpeg
brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-srt

# Optional: NDI
brew install --cask libndi
cargo build --release
./target/release/varda

Run from source

cargo run --release

Getting Started

See the manual for a complete guide to using Varda.

CLI flags

varda [OPTIONS]

    --headless                Run without main UI window (API-only control)
    --port <PORT>             HTTP API port [default: 8080]
    --fps <FPS>               Target render FPS in headless mode [default: 60]
    --workspace <DIR>         Workspace root directory [default: cwd]
    --scene <PATH>            Scene file to load
    --stage <PATH>            Stage file to load
    --osc-port <PORT>         OSC input port (overrides osc.json)
    --osc-out <HOST:PORT>     OSC feedback target (repeatable)
    --no-osc                  Disable OSC
    --no-ndi                  Disable NDI
    --no-syphon               Disable Syphon (macOS)
    --no-spout                Disable Spout (Windows)
    --no-screen-capture       Disable screen / window capture sources
    --shader-dir <DIR>        Extra shader library directory (repeatable)

--shader-dir is repeatable and layers on top of the built-in shader directories in a fixed precedence order. see Shader Authoring → File Location for the full hierarchy and override/hot-reload behavior.

Shader format: Varda uses ISF's JSON metadata header with GLSL 450 (Vulkan) shader bodies, not ISF's GLSL ES dialect. Shaders from isf.video need a short mechanical port — see Porting an ISF Shader.

Headless mode runs the full engine without a UI window — controlled via the HTTP API. Outputs defined in stage.json auto-start on launch. Graceful shutdown on Ctrl-C or POST /api/shutdown.

# Headless on custom port with 30fps render
varda --headless --port 9090 --fps 30

# Separate workspace per venue
varda --workspace /shows/festival-2026

# Disable subsystems you don't need
varda --no-ndi --no-syphon --osc-port 7000

# Pull in extra shader folders (repeatable) — e.g. a USB stick + a show pack
varda --shader-dir /media/usb/shaders --shader-dir /shows/festival-2026/shaders

HTTP API

The GUI and HTTP API are co-equal consumers of the same engine. The API runs on port 8080 (configurable with --port) alongside the GUI, or standalone in headless mode (--headless). Interactive docs at /api/docs, OpenAPI spec at /api/openapi.json. WebSocket at /api/ws streams state via JSON Patch (RFC 6902) deltas.

Contributing

Bug reports, feature requests, and pull requests are welcome. See CONTRIBUTING.md for the architecture overview, engineering practices, PR workflow, and benchmarking harness.

License

MIT

Releases

Packages

Used by

Contributors

Languages