v1.4.0 — The WebView Editor
Custom plugin GUIs in plain HTML/CSS/JS, embedded in the host window — no GUI framework, nothing to install.
The editor layer (plugin/webview/): declare hasEditor = true and serve your page from editorHtml(); the VST3 and CLAP backends embed the platform web engine (WebView2 on Windows, WKWebView on macOS; Linux falls back to the host generic UI for now). The vendored MIT webview library and the BSD-3 WebView2 SDK header keep it zero-download.
The dspark JS bridge: onReady hands the page the parameter table with live values; setParam/onParam move plain values both ways using the same stable text ids as automation and state; beginEdit/endEdit drive host gestures and undo. DSP-to-UI sync polls the wrapper's atomic shadows — no native timers, no locks, nothing on the audio thread.
Sizing that survives real hosts (field-validated in REAPER at 200% display scaling): OS-level frame limits (WM_GETMINMAXINFO/WM_SIZING), honest VST3/CLAP size negotiation, and JUCE-style proportional content scaling with Fixed / Free / KeepAspect policies.
A real workflow: develop the UI as ordinary separate web files — dspark_add_plugin(... EDITOR_HTML ui/editor.html) inlines and embeds them at build time; editorDevFile() reloads the page from disk while iterating; editorDebug opens the browser DevTools; tools/vst3_editor_host opens any editor without a DAW and self-tests the resize chain; DSPARK_WEBVIEW_LOG=1 traces every size negotiation.
Hardened in CI: dspark_add_plugin now assembles AU .component bundles too (FORMATS VST3 CLAP AU), and every example plugin must pass Tracktion pluginval (strictness 8) and clap-validator on Windows, Linux and macOS — the latter immediately caught and got fixed a real toggle text-parsing bug in both backends.
Examples: examples/plugin_webview_editor/ (single-file, draggable SVG knobs) and examples/plugin_webview_files/ (separate-files workflow). Full guide: docs/plugins.md.