Releases: kushiemoon-dev/OpenDrop-VJ
Release list
v1.0.0
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/.prjmpresets — 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 CSSmix-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
BroadcastChannelsync 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
Added
- Live video input as a deck source: webcam and NDI network sources (Electron)
- Runtime
.milk/.prjmMilkDrop 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
Added
- Reliable, self-hosted star-history badge (replaces the flaky third-party service)
Fixed
od-pl-moderead 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
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
DataCloneErrorthat 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
undicito 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
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
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
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
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
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.shThis 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
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_audionow 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