⬇️ Download
| Get this one | Or | You should know | |
|---|---|---|---|
| 🪟 Windows | ⬇️ Installer | Portable no install |
Only the installer registers the Dynamic Lighting background identity. Per-application audio capture needs Windows build 20348 or newer. |
| 🍎 macOS | ⬇️ .dmg | .zip | Apple Silicon. Unsigned — one Terminal command is needed, see below. |
| 🐧 Linux | ⬇️ AppImage | .deb Debian / Ubuntu |
x64. Needs PulseAudio or PipeWire, which desktop installations already have. |
Important
🍎 macOS: the app will say it is damaged. It is not.
This build is not signed — the Apple Developer Program has not been bought. macOS puts a quarantine flag on anything unsigned that arrives from the internet and refuses to open it, reporting it as "damaged and can't be opened." Right-clicking and choosing Open does not clear this on macOS 15 and later.
Open the .dmg, drag the app into Applications, then run this once in Terminal:
xattr -dr com.apple.quarantine "/Applications/CAYADEV Visualizer.app"After that it opens normally, every time. The command removes the download flag; it does not change the application.
Then, for sound: macOS has no way to record its own output, so install BlackHole (free) and pick it as the audio source. Microphones and line inputs work with no extra setup — macOS will ask for microphone permission the first time.
An interim release. v3.1.3's streaming overlay was blank for everyone who used it, and the transparent background had never actually worked. Both are fixed here, together with the MilkDrop fidelity work that had been waiting on main since v3.1.3. The refinements this work turned up are planned for v3.1.5 rather than rushed in.
On v3.1.3 and using Streaming Output (OBS or a browser)? Update to this release — the overlay page cannot start in v3.1.3.
Streaming overlay works again (#563)
In v3.1.3 the overlay page crashed on every load. Aspect correction made the visualizer call SVAspect while sizing its canvas, and the overlay page never loaded aspect.js — nor timeline.js, clipdeck.js or three MilkDrop modules. The page stopped at a 2×2-pixel canvas.
It looked like a connection problem, and it was not one. Probed as an OBS client, the v3.1.3 stream server sent its greeting, the configuration, the presets and audio frames within 40 ms of connecting; the page had already failed. The reason was invisible because the start-up error went into a box the overlay hides, and nothing reached the console.
- The overlay loads everything the desktop visualizer loads, and a unit test compares the two script lists so they cannot drift apart again.
- A start-up failure is no longer a silent blank page. The error is shown on the page and logged to the console.
- The self-test now opens the overlay from the real stream server on every run and fails unless the page connects and starts. The packaged build runs the same self-test, so the page is also checked as served from inside the archive. Checked by deleting the
aspect.jstag and watching the self-test fail with v3.1.3's exact error. - The overlay follows the app's Transparent Background switch. It no longer rewrites the background type to
transparent, which dropped background effects and sent text through brightness-as-alpha.
Transparent background — for real
Background → Transparent Background creates a transparent window, but the page then painted its own background colour inline on top of it — an inline style beats the rule that was meant to clear it — so the desktop never showed through, in any version. Every settings change wrote the colour again.
Separately, every post-processing pass wrote an opaque alpha. With a single effect enabled, the transparent streaming overlay was an opaque rectangle in OBS, and so was the transparent window.
- The page stays clear in transparent mode, and alpha survives post-processing: in transparent mode the scene goes through the effect chain premultiplied, and coverage is taken from the source alpha so dark glyphs, black outlines and shadows stay intact. Bloom and blur can still spread into empty pixels. Projection mapping gets the same treatment. Nothing changes in the opaque path.
- Background effects can be transparent too. A background effect paints every pixel, so it used to hide the desktop completely. Its dark parts now turn transparent below a Transparency Threshold — black always, bright areas stay — applied the same way whether or not post-processing is on.
- Windows no longer uses exclusive fullscreen when the window is transparent, so the desktop shows through instead of a black frame. Open visualizer windows are recreated when the switch changes.
- The layer stack exposes the same switch at the top of the layer list (the Background card is hidden while the stack is on).
- Spout/Syphon stays opaque. The GPU shared texture cannot carry alpha without dropping the sender, so that output paints the full scene. Use the local window or the OBS browser source for a transparent overlay.
- A blackout stays black, as it already did in the overlay.
Measured with a screen capture of a second display (liquid background, desktop average rgb(39, 39, 39)): rgb(51, 137, 129) at threshold 0, rgb(51, 94, 85) at threshold 1, and rgb(52, 99, 90) at threshold 1 with bloom enabled. The window stayed transparent with Always on top switched on. The self-test reads the pixels of a white square drawn on a clear canvas through bloom: the empty corner is transparent and the square opaque.
A regular browser tab always draws a page over its own background, so it cannot show what is behind it — transparency is visible in OBS's Browser Source. Add ?transparent=0 to the overlay address to force an opaque source, or ?transparent=1 to force a keyed one.
MilkDrop, much closer to MilkDrop (#560)
Everything below was measured against a 10,332-preset corpus and checked against Nullsoft's own MilkDrop 2 source.
- Every shader stage in the corpus compiles. The first measurement after v3.1.3 found 94.3%; the causes were traced one by one, including HLSL's implicit conversions, array initialisers and
boolused as a number. - New engine features: textured shapes, motion vectors, rotation matrices, mesh density, internal resolution scale and mouse input; preset transitions as MilkDrop's dual pipeline (both presets keep running while their warp meshes blend per node); and user textures loaded from a MilkDrop texture folder (16.9% of presets ask for one).
- Fidelity fixes from the source: the mesh transform's order, the swapped
aspectx/aspecty, a vertically mirrored warp mesh, the warp ripple's real constants, header values that never reached the equations, the shader clock, per-frame variables andt1..t8reloading every frame, the blur chain reading the warp's input, vertex colours wrapping instead of clamping, borders and centre darkening, custom waves at their real size and source, MilkDrop's waveform smoothing, and a feedback buffer that clamps like MilkDrop's without losing precision. - Presets hear the music the way MilkDrop hears it.
bass,mid,treband their_attvalues now come from MilkDrop's own analysis chain. The old path putbasslower just after a kick than between kicks, and_attnever rose on a hit; MilkDrop's chain gives 2.45× on a kick. Spectrum waves read the newest audio instead of sound from ~30 ms earlier. - Waveforms, outlines and motion vectors are drawn as anti-aliased ribbons by default, with MilkDrop's own line drawing as one setting for all three; shape outlines honour
thick. - Safer to watch: flash limiting caps sudden full-screen luminance changes at WCAG's general-flash value; 90% of presets never reach it and are left untouched.
- Fixed: auto advance now advances (the setting had never been read); a MilkDrop layer survives scene transitions instead of restarting its preset and losing its trail — which happened on every track with the dynamic colour theme on; a MilkDrop scene exported as a 0-byte video; MilkDrop did not render in the streaming overlay.
- The preset's own
monitorvariable is shown live in the MilkDrop panel, and a decay of exactly zero is honoured.
881 of 900 sampled presets render a live image, measured frame by frame in a real WebGL context.
Also in this release
- The self-test puts your settings back when it exits; it runs against the real profile and could leave
settings.jsonas factory defaults plus test values. - The release translation gate no longer fails when a Turkish song title is playing.
Verification
1597 unit tests pass, 469 of them added since v3.1.3. The GPU smoke test passes, and the packaged Windows build passes its own self-test — including the new streaming overlay check, the transparency pixel check and a video export of a MilkDrop scene (1,255 KB, no black frames).