Skip to content

Releases: kushiemoon-dev/OpenDrop-VJ

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 22 Jul 18:31

OpenDrop VJ 1.0.0 — first stable release

OpenDrop VJ is a live visual instrument built on Butterchurn (a WebGL port of the Milkdrop engine). Four independent decks — each assignable to bus A, B, or off — mix through a single live crossfader, and a GPU compositor layers, blends, and chroma-keys them on top of each other in real time. Runs in any browser with no install, or as an Electron desktop app that unlocks native I/O.

→ Try it live: opendrop.kushie.dev — no install required.

What it offers

Mixing & decks

  • 4 independent Butterchurn decks, each routed to bus A, B, or off, mixed through one live A↔B crossfader
  • Per-deck playlists — auto-cycle sequential/shuffle, 2–120s interval, prev/next
  • Beat / volume-peak trigger per deck — auto-advance the playlist on the beat or on a volume peak
  • Q-var live editing — override a preset's own internal q1–q32 variables per deck in real time (NestDrop-style)
  • Time param sliders — per-deck speed/zoom/rotation/warp multipliers layered on top of any preset

GPU compositor & overlays

  • 4 blend modes (normal / additive / screen / multiply) + per-layer LumaKey and ColorKey chroma keying, all GPU-side
  • Text and media overlays — image/video sprites or text layers, with transform, blend mode, beat-reactive scaling, spin, and drift
  • Overlay auto-cycling queue — sequential or shuffled rotation

Automation & performance state

  • Snapshots / macros — 8 slots capturing and recalling a full "look" (color + compositing) with smooth interpolation
  • Timeline / keyframes — sequence the 8 snapshot slots on a looping wall-clock timeline
  • LFO×4 (sine / saw / square / sample-and-hold), routable to any control, plus a strobe effect
  • Share a set via URL — encode the current visual state into a link, one-click import for the recipient

Presets & video

  • 16,375 built-in presets — search, 5-color favorites, cached lazy-rendered thumbnails
  • Import your own .milk/.prjm presets — drag one onto the visualizer to convert and load it on the fly
  • Presets cloud — a private per-device library for your own custom presets (no account, just a portable token)
  • Video loops — beat-reactive flash/hue/scale, now composited as a real GPU layer (see below)
  • Live video layer — webcam or an NDI network source (Electron), as an alternative to a video loop clip

Control surfaces

  • MIDI — CC/note/pitchbend mapping (14-bit CC support) with bidirectional LED feedback
  • OSC input over UDP, Ableton Link tempo sync (Electron)
  • Remote control from a phone or tablet over LAN, token-authenticated (Electron)
  • Fully customizable keymap

Output & capture

  • Detached output window for a second monitor or an OBS Browser Source
  • NDI output, Spout output (Windows), virtual webcam via v4l2loopback (Linux) — all Electron
  • Multi-display targeting, adjustable quality tiers, invisible-mode perf throttling

What changed to get here

The video layer was the last rough edge before calling this stable:

  • Video now composites as a real WebGL texture layer inside the GPU compositor, instead of a DOM <video> blended via CSS mix-blend-mode — that approach was unreliable across two independently GPU-composited surfaces on some Chromium/Mesa/Wayland setups and could leave the video invisible. It's also drawn after the 4 decks now, so it's always visible at exactly its own opacity slider — previously a deck at full opacity could hide it entirely.
  • Fixed a real crash: selecting a CDN-hosted video clip could throw an uncaught cross-origin security error inside the render loop, freezing the whole app until reload. Fixed the root cause and added a safety net so no future per-frame error can do that again.
  • Fixed a BroadcastChannel sync bug that spammed the console when video was enabled with the output window open.
  • Fixed the video clip list collapsing into unreadable ~2px rows once there were enough clips to need scrolling.

Full technical changelog: CHANGELOG.md

Known limitations

  • Installers are unsigned on all platforms — expect an OS security warning on first launch
  • Web MIDI: Chromium / Electron only (not Firefox / Safari)
  • System audio on macOS (browser): tab audio only — install BlackHole for full capture
  • Spout output is Windows-only; virtual webcam output is Linux-only; NDI receive is Electron-only

Full list: README § Known Limitations


Full Changelog: v0.9.0...v1.0.0

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 16 Jul 21:18

Added

  • Live video input as a deck source: webcam and NDI network sources (Electron)
  • Runtime .milk/.prjm MilkDrop preset import via drag-and-drop — no rebuild needed

Fixed

  • Linux output-window audio reactivity: PCM capture retry decoupled from the one-shot state resync (previously required re-picking the audio device once per session)

Changed

  • +page.svelte (2,570+ lines) further split — 15 new engine stores and action modules extracted (deck/mixer state, beat-sync, MIDI connection/mapping, audio source, Electron feature toggles, run status, share-set, the visualizer startup sequence, output-window management); down to ~1,900 lines

Full Changelog: v0.7.0...v0.8.0

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 11 Jul 04:06

Added

  • Reliable, self-hosted star-history badge (replaces the flaky third-party service)

Fixed

  • od-pl-mode read from localStorage is now validated instead of blindly cast
  • No timer scheduled when the playlist interval is Infinity

Changed

  • +page.svelte (1,500+ lines) split into focused engine modules and stores — cloud presets, overlay, video-loop playback, and playlist subsystems extracted, plus 14 sidebar sections (stage-common and mixer-only) pulled into standalone components; each extraction preceded by characterization/reactive-wrapper tests
  • README rewritten for the current 4-deck feature set

Full Changelog: v0.6.0...v0.7.0

v0.6.0 — GPU Compositor, Snapshots & Timeline, MIDI LED Feedback, Presets Cloud

Choose a tag to compare

@github-actions github-actions released this 06 Jul 19:03

This release covers everything shipped since v0.5.3 — the app has grown substantially: a GPU compositor, snapshot/timeline automation, per-deck parameter editing, MIDI LED feedback, URL-based set sharing, a private preset cloud, and a wave of smaller fixes.

Added

GPU compositor & keying

  • Per-deck compositor with 4 blend modes (normal, additive, screen, multiply), plus LumaKey and ColorKey chroma keying, all computed on the GPU
  • Existing color controls (hue/saturation/brightness/contrast/invert) folded into the same shader
  • Full parity between the Stage window and the Output window

Overlays

  • Text overlays (font, color, size) alongside the existing image/video overlays, with transform, blend mode, beat-reactive scaling, spin, and drift
  • Overlay auto-cycling queue — sequential or shuffled rotation through a set of overlays

Snapshots & automation

  • Snapshots: 8 slots capturing and recalling a full "look" (color + compositing) with smooth interpolation
  • Timeline: sequence the 8 snapshot slots on a looping wall-clock timeline
  • Q-var live editing: override a preset's own internal q1–q32 variables per deck in real time, similar to NestDrop's Q-var controls, opt-in per slot via a watchlist

Per-deck parameters & triggers

  • Time param sliders — per-deck speed/zoom/rotation/warp engine multipliers layered on top of any preset
  • Per-deck beat / volume-peak trigger for playlist auto-advance, independent of the shared auto-crossfade timer

MIDI

  • Bidirectional LED feedback — mapped controller pads now reflect the state of toggles (strobe, playlist play/pause) and flash on trigger

Sharing & cloud

  • Share a set via URL — encodes the current visual state into a link; the recipient gets a one-click import
  • Presets cloud — a private, per-device library for your own custom presets, backed by a small Cloudflare Worker + R2, identified by a portable token (no account)

Fixed

  • Canvases no longer get unmounted when switching between Stage and Mixer layout, which used to cause a black screen on returning to Stage
  • Electron no longer crashes with an EPIPE dialog when its stdout pipe closes unexpectedly
  • Corrected the system-audio setup script to target the default PipeWire sink instead of the first alphabetical monitor
  • Fixed a DataCloneError that could silently break overlay sync to the Output window
  • Fixed a Svelte state-proxy leak that could affect cross-window sync of Q-var data
  • Fixed a file-input bug that silently no-op'd every custom-preset upload
  • Hardened the presets-cloud Worker against malformed request bodies
  • Moved the presets-cloud auth token from a URL query string to a request header
  • Bumped undici to resolve outstanding dependency advisories

Docs

  • Rewrote the README to reflect the current feature set (previously described a 2-deck, 1,754-preset app) — corrected platform packaging info (Windows/macOS/Linux are all packaged, not source-build-only) and added real screenshots

v0.5.3 — CPU Performance Optimization

Choose a tag to compare

@github-actions github-actions released this 20 Jun 13:47

What's new

Render FPS cap

All decks now run at a configurable frame rate cap (default 45 fps, selectable: 30 / 45 / 60). The cap uses modulo-aligned timestamp gating to prevent drift on 60 Hz displays — 45 fps stays at exactly 45, not 30.

Eco mode for invisible decks

Decks hidden by the crossfader or bus routing are throttled to ~8 fps instead of rendering at full rate. Three modes available in the UI:

  • Eco (default) — throttle invisible decks to ~8 fps, no visual pop on crossfade
  • Pause — fully pause invisible decks
  • Off — all decks run at full target fps

Persistent settings & output sync

FPS target and eco mode are persisted in localStorage and synced to the output window in real time. Opening the output window after a settings change applies the current profile immediately.

Accurate FPS counter

The fps counter now measures actual Butterchurn render calls per second instead of the RAF tick rate, so it correctly reflects the active cap.

Downloads

Platform File
Linux OpenDrop.VJ-0.5.3.AppImage
Windows OpenDrop.VJ.Setup.0.5.3.exe
macOS (Apple Silicon) OpenDrop.VJ-0.5.3-arm64.dmg
macOS (Intel) OpenDrop.VJ-0.5.3.dmg

Full Changelog: v0.5.2...v0.5.3

v0.5.2 - 4-Deck Compositor + Spout Windows

Choose a tag to compare

@github-actions github-actions released this 19 Jun 16:21

What's new

  • 4-deck compositor - four independent Butterchurn visualizers (A/B/C/D), additive layering per bus, cycle bus and start/stop per deck
  • Spout output (Windows) - share the output window as a GPU texture with Resolume, TouchDesigner, OBS+Spout2 via native SpoutDX addon
  • Stream controls in the mixer - NDI / V4L2 / Spout buttons moved out of the output window into a collapsible panel in the mixer

Bug fixes

  • Fixed Windows crash at launch (SyntaxError in main.cjs from a block comment containing a closing sequence)

Downloads

Platform File
Windows OpenDrop.VJ.Setup.0.5.2.exe
Linux OpenDrop.VJ-0.5.2.AppImage
macOS Intel OpenDrop.VJ-0.5.2.dmg
macOS Apple Silicon OpenDrop.VJ-0.5.2-arm64.dmg

v0.4.8 - Music-Reactive Video Loop Layer

Choose a tag to compare

@github-actions github-actions released this 17 Jun 21:27

What's New

Video Loop Layer

OpenDrop VJ now supports a music-reactive video background. Short clips (memes, loops, anything) sit behind the Butterchurn visuals and react to the music in real time.

Two sources of clips

  • Built-in clips — shipped via a video megapack (same pattern as the preset megapack, optional download)
  • Your own clips — drag any video file directly onto the visualizer, or use the + Video button in the sidebar

Four independently toggleable reactions

Each reaction can be switched on or off independently:

  • Cut — switches to the next clip every N beats (4 / 8 / 16 / 32)
  • Flash — brightness and scale pulse on each beat
  • Warp — playback speed follows bass energy: slow in breakdowns, fast on drops
  • Hue — color hue shift pulsed on the beat

Clip advance modes

  • Shuffle — random clip on each cut
  • Sequential — cycles through clips in order
  • Manual — one fixed clip; Flash, Warp and Hue still apply

Fully optional

The layer is off by default. Toggle it on and off at any time with no impact on Butterchurn rendering. All settings (reactions, opacity, advance mode, beats per cut, clip list) persist across sessions.

The output window (OBS Browser Source / projector) stays in sync automatically — same clip, same reactions, same timing.


Downloads

Platform File
Windows OpenDrop.VJ.Setup.0.4.8.exe
macOS (Apple Silicon) OpenDrop.VJ-0.4.8-arm64.dmg
macOS (Intel) OpenDrop.VJ-0.4.8.dmg
Linux OpenDrop.VJ-0.4.8.AppImage

Web version: https://opendrop.kushie.dev

Megapack Presets v1

Megapack Presets v1 Pre-release
Pre-release

Choose a tag to compare

@kushiemoon-dev kushiemoon-dev released this 17 Jun 09:59

Static asset release — 16376 MilkDrop/Butterchurn megapack preset files (6.2 MB compressed). Downloaded by CI before each build.

v0.4.1 — All 1754 presets + Linux loopback fix

Choose a tag to compare

@github-actions github-actions released this 15 Jun 16:24

What's Changed

All 1754 presets now available

The preset browser previously loaded only 100 of the 1754 Milkdrop presets bundled with butterchurn-presets. This release loads all of them.

Preset names are available immediately on startup (derived from file paths at build time). The actual preset data is loaded lazily on first use and cached — so the app starts as fast as before, and switching presets is still instant after the first load.

The preset browser also received UX improvements: the author tag chips were removed (unworkable at this scale) in favor of a clean search bar and a ★ Favorites filter. Preset list items are more compact so more presets are visible at once.

Linux loopback fix

The Loopback button previously opened the Wayland screen-share portal (wrong behavior — desktop capture, not audio). On Linux it now shows a setup guide instead:

bash scripts/setup-audio.sh

This creates a PipeWire virtual source named "OpenDrop - Son du PC". Select it via Pick device to capture system audio output. The Loopback button continues to work as expected on Windows and macOS.


Downloads

Platform File
Linux OpenDrop.VJ-0.4.1.AppImage
Windows OpenDrop.VJ.Setup.0.4.1.exe
macOS (Intel) OpenDrop.VJ-0.4.1.dmg
macOS (Apple Silicon) OpenDrop.VJ-0.4.1-arm64.dmg

Note: Installers are unsigned. macOS: right-click → Open to bypass Gatekeeper. Windows: click "More info" → "Run anyway" on the SmartScreen prompt.

Full changelog: v0.4.0...v0.4.1

v0.3.6 — Windows Compatibility Fixes & In-App Error Log

Choose a tag to compare

@github-actions github-actions released this 15 Apr 21:17

v0.3.6 — Windows Compatibility Fixes & In-App Error Log

Bug Fixes

Renderer crashes on Windows

  • Replaced all panicking expect() calls in the OpenGL context setup with graceful error handling — the renderer now sends a descriptive error message and exits cleanly instead of crashing silently
  • Renderer errors are now forwarded to the main app and surfaced as toast notifications

UI freezes when stopping audio

  • Stopping audio input/output no longer freezes the interface — added a 2-second timeout on the audio thread shutdown, preventing a WASAPI deadlock from locking up the UI indefinitely
  • stop_audio now uses non-blocking lock acquisition to avoid contention with the audio pump loop

VU meters not responding

  • CPAL/WASAPI stream errors are now captured and shown as toast notifications
  • When loopback capture is active but nothing is playing, a hint appears after 5 seconds: "No audio detected — play audio through the selected output device"

New Feature

In-App Error Log

  • Settings panel now includes an Error Log section (collapsible)
  • Captures renderer crashes, audio stream errors, and other diagnostics with timestamps
  • Copy to clipboard button for easy bug reporting
  • Clear button to reset the log

Full Changelog: v0.3.5...v0.3.6