kaos::reactor turns your music and a single still image into a music-reactive video — perfect for creating an eye-catching visual to accompany your track when publishing to social media. Unlike complicated general-purpose video editing software, kaos::reactor keeps it simple. There's no timeline to assemble and no animation to keyframe: simply drag and drop an audio file and an image into the application, enable a combination of GPU-accelerated audio-reactive image processing effects, preview the result instantly with the playback scrubber, then export a ready-to-post MP4. Audio analysis and rendering run locally and in real time. Switch on feedback for several effects at once and they start reading from each other's output frame to frame, compounding into rich, chaotic, ever-evolving patterns — one of the most distinctive and fun things to explore in kaos::reactor.
kaos::reactor is completely free. Use it without restriction for as long as you like. If you find it useful and want to support development, you can buy me a coffee at the link below, or file bug reports and feature requests on the GitHub issues page.
kaos::reactor analyzes the audio offline before playback begins. It runs a 2048-point FFT at 60 fps hops and extracts per-frame features — RMS energy, bass / mid / treble band energy, spectral centroid, spectral flux, beat events, and onset events. Those features are packed into a GPU uniform buffer each frame and drive a Vulkan fragment shader that applies effects in real time to the source image.
The timeline scrubber lets you preview any moment of the audio-visual sync before committing to an export. Export pipes raw RGBA frames to ffmpeg via stdin, muxing the original audio into the final MP4.
All effects are off by default. Enable any combination with the checkboxes in the right panel.
Each enabled effect exposes two sliders:
- Intensity — how strongly the effect reacts to the audio.
- Feedback — controls what the effect reads as its source. At 0 it reads the base image; at 1 it reads the output of the previous rendered frame; in between it blends the two. Setting feedback above 0 causes an effect to feed back on its own output across frames, producing accumulation and self-reinforcing loops. UV warp effects with feedback zoom or distort the previous frame rather than the source image, which creates infinite tunnel and liquid-metal effects. Colour and texture effects with feedback apply to the previous frame's colours, which causes saturation, brightness, glows, and similar effects to accumulate over time.
The Trails effect is complementary to per-effect feedback: rather than changing what an effect reads, Trails blends the final rendered output with the previous frame using an audio-reactive decay — trails fade faster when the audio is louder. This prevents runaway accumulation and gives the feedback loop a natural rhythm. Trails and per-effect feedback can be combined freely.
These distort the sampling coordinates before the image is read. The Warp Scale slider at the top of the effects panel is a global frequency multiplier that applies to Wave Warp, Displacement Warp, Perlin Warp, and Polar Warp simultaneously — higher values produce finer, more textural distortion.
| Effect | What it reacts to |
|---|---|
| Wave Warp | Sinusoidal UV distortion driven by bass |
| Displacement Warp | Independent X/Y sinusoidal displacement driven by bass |
| Perlin Warp | Smooth noise-field distortion driven by mids |
| Barrel Lens | Radial lens distortion — bass pushes edges outward |
| Ripple | Radial sine waves emanating from center, driven by bass |
| Polar Warp | Converts to polar coordinates and perturbs radius by angle, driven by mids |
| Kaleidoscope | Folds the frame into 6 mirrored segments; rotation speed scales with intensity |
| Pixelate | UV quantization — bass pulses the block size |
| Zoom Pulse | Radial zoom driven by RMS and beat events |
| Effect | What it reacts to |
|---|---|
| Hue Shift | Rotates image hue based on spectral centroid |
| Saturation | Pumps colour saturation with RMS |
| Brightness | Flashes luminance on beats, scales with RMS |
| Posterize | Quantizes colours to fewer levels on high spectral flux |
| Solarize | Inverts pixels above an RMS-driven brightness threshold (Sabattier effect) |
| Duotone | Remaps the image to two complementary hues derived from spectral centroid — the palette shifts with frequency content |
| Channel Swap | Rotates R→G→B colour channels on beat and onset events |
| Effect | What it reacts to |
|---|---|
| Glow | Multi-sample bloom driven by RMS |
| Edge Glow | Sobel edge detection — edges expand and brighten with bass and beats |
| Emboss | Directional relief highlight driven by treble; angle rotates slowly over time |
| Erode / Dilate | Morphological effect — loud audio dilates (grows) bright regions, quiet audio erodes (shrinks) them |
| Scanlines | Horizontal darkening bands; depth pulses with bass |
| Vignette | Edge darkening that pulses with RMS |
| Chroma Split | Radial R/B channel separation driven by treble and onsets |
| Film Grain | Temporal noise scaled by spectral flux |
| Glitch | Row-shift chromatic aberration on beats and onsets |
Note: Glitch and Chroma Split share the texture sampling stage. When both are enabled, Glitch takes priority since it already includes its own channel split.
A separate camera-movement effect that runs independently of the audio-reactive effects and the manual pan/zoom controls. It animates purely over the length of the clip — no audio reactivity.
Enable the Cinematic Zoom checkbox to reveal two controls:
- Frame picker — a grid showing the export frame aspect ratio. Click or drag anywhere inside it to place a crosshair marking the target center point. At the start of the clip the view is exactly where you set it with the mouse; by the end it has smoothly zoomed in and panned so the selected point is centered.
- Zoom slider — controls how much magnification is added by the final frame. 0 = pan only (no zoom), 50 = 1.5× zoom, 100 = 2.0× zoom.
The cinematic transform is applied before the interactive pan/zoom, so the two systems remain fully independent and can be used together.
Set the resolution, frame rate, quality, and audio bitrate in the right panel before exporting. Export is available from File → Export Video… and produces an H.264 MP4 with AAC audio via ffmpeg.
| Setting | Options |
|---|---|
| Resolution | 720p · 1080p · 2K · 4K · Square 1080 · Portrait 1080 · Vertical 1080×1920 |
| Frame rate | 24 · 30 · 60 fps |
| Quality | High (CRF 18) · Medium (CRF 23) · Low (CRF 28) |
| Audio bitrate | 192k · 128k · 96k |
Effects fade in and out over the first and last 0.5 seconds of the export to mask spectral features produced by zero-padded FFT windows at the audio boundaries.
sudo pacman -S meson ninja qt6-base vulkan-headers vulkan-icd-loader \
shaderc libsndfile fftw ffmpegFor NVIDIA GPUs, also install nvidia-utils. If the driver was updated recently, reboot before running — a kernel/userspace version mismatch causes Vulkan to silently find no physical device (nvidia-smi will report the mismatch).
Ubuntu 24.04 ships Qt 6.4.2, which is too old (Qt 6.6+ required for QRhiWidget). Install Qt 6.8 via aqtinstall, then install the system dependencies:
pip install aqtinstall
aqt install-qt linux desktop 6.8.0 -m qtmultimedia qtshadertools
export PATH="$HOME/Qt/6.8.0/gcc_64/bin:$PATH"
export CMAKE_PREFIX_PATH="$HOME/Qt/6.8.0/gcc_64"
sudo apt install meson ninja-build libvulkan-dev libsndfile1-dev libfftw3-dev ffmpegsudo dnf install meson ninja-build qt6-qtbase-devel vulkan-headers \
vulkan-loader-devel libsndfile-devel fftw-devel ffmpegPre-built binaries are available on the Releases page.
Download kaos-reactor-<version>-linux-x86_64.AppImage, then:
chmod +x kaos-reactor-*-linux-x86_64.AppImage
./kaos-reactor-*-linux-x86_64.AppImageNo installation required. The AppImage is self-contained and runs on Ubuntu 24.04 and later (and compatible distros with glibc 2.39+).
Download kaos-reactor-<version>-windows-x86_64.zip, extract the folder, and run kaos_reactor.exe inside it. No installer — all required DLLs are included in the zip.
Windows may show a SmartScreen warning ("Windows protected your PC") the first time you run an unsigned executable. Click More info → Run anyway to proceed.
git clone https://github.com/kwehage/kaos-reactor.git
cd kaos-reactor
meson setup build
meson compile -C buildThe build compiles GLSL shaders to Qt shader bundles (.qsb) and embeds them into the binary as Qt resources. The resulting binary is self-contained and can be copied or installed anywhere without needing any shader files alongside it.
./build/kaos_reactorLoad audio and an image via File → Open Audio / Open Image, or drag and drop files directly onto the preview. Use the timeline scrubber to preview the sync, then export when ready.
| Type | Formats |
|---|---|
| Audio | WAV · FLAC · MP3 · OGG · AIFF |
| Image | PNG · JPEG · BMP · TIFF |
| Export | MP4 (H.264 + AAC, via ffmpeg) |
