A VST3/CLAP audio plugin with a Rust backend (nih-plug) and a Compose Multiplatform desktop UI.
βββββββββββββββββββ TCP/JSON ββββββββββββββββββββββββ
β DAW (host) β localhost:9847 β Compose Desktop UI β
β ββββββββββββββββββββΊβ β
β βββββββββββββββββ β - Cutoff slider β
β β Rust Plugin ββ state updates β - Resonance slider β
β β (nih-plug) ββ βββββββββββββββββΊ β - Freq response plotβ
β β ββ param changes β β
β β Biquad LPF ββ βββββββββββββββββ β Material 3 dark UI β
β βββββββββββββββββ β β
βββββββββββββββββββ ββββββββββββββββββββββββ
Plugin (Rust) β loaded by the DAW as a native .vst3 shared library. Handles real-time audio processing with zero GC pauses.
UI (Compose Desktop) β separate JVM process. Communicates with the plugin over TCP with newline-delimited JSON.
- Rust (stable) β
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - JDK 21+ β for Compose Desktop
- Gradle wrapper is included in
ui/
cd plugin
cargo build --releaseThe compiled .vst3 bundle will be in target/release/. Copy it to your DAW's VST3 folder.
cd ui
./gradlew run # Run directly
./gradlew packageDeb # Package as .debNewline-delimited JSON over TCP on localhost:9847.
Plugin β UI (state updates, ~30Hz):
{"type":"state","cutoff":1000.0,"resonance":0.5}UI β Plugin (parameter changes):
{"type":"set_param","name":"cutoff","value":2000.0}
{"type":"set_param","name":"resonance","value":0.7}compose-vst/
βββ plugin/ # Rust VST3/CLAP plugin
β βββ Cargo.toml
β βββ src/
β βββ lib.rs # Plugin entry + DSP loop
β βββ filter.rs # Biquad low-pass filter
β βββ ipc.rs # TCP server for UI communication
βββ ui/ # Compose Desktop app
βββ build.gradle.kts
βββ settings.gradle.kts
βββ src/main/kotlin/com/composevst/
βββ Main.kt # App entry + main Compose UI
βββ IpcClient.kt # TCP client with auto-reconnect
βββ components/
βββ ParamSlider.kt # Logarithmic/linear slider
βββ FrequencyResponse.kt # Biquad magnitude response plot
MIT