Releases: DatanoiseTV/doobie
Releases · DatanoiseTV/doobie
Doobie v0.13.5
Fixed (Linux)
- Restored GPU compositing on Linux. v0.13.3/v0.13.4 unconditionally
setWEBKIT_DISABLE_DMABUF_RENDERER=1and
WEBKIT_DISABLE_COMPOSITING_MODE=1as a blanket fix for the
NVIDIA-proprietary-Wayland white-window class. That worked, but it
also turned off GPU compositing for everyone else -- a user on
Ubuntu 26.04 + Intel iGPU reported 1 fps in Ardour because of
this. Both env vars removed from the defaults. OnlyGDK_BACKEND=x11
stays (correctness fix -- JUCE's WebKit child is an X11 client). The
README now documents these env vars as opt-in workarounds for users
who actually hit the NVIDIA-Wayland white window.
Doobie v0.13.4
Changed (Linux)
- Never use
/tmpfor JUCE's WebKit subprocess helper. Previous
release probed/tmpand relocated$TMPDIRonly if exec was
denied. Cleaner approach: always point$TMPDIRat a user-owned
location from the start. We prefer$XDG_RUNTIME_DIR/doobie
(=/run/user/$UID/doobieunder systemd — always exec-allowed,
cleared at logout), falling back to~/.cache/doobiefor non-
systemd systems. A user-set$TMPDIRis still respected. Drops
the probe-and-warn branch in favour of always-correct.
Doobie v0.13.3
Fixed (Linux defensive hardening)
A Linux user still reported a white window on v0.13.2 even after the
webkit2gtk-4.1 fix. Deep audit surfaced three additional silent
failure modes JUCE 8 has no host-side log for. All three are now
guarded in WebEditor.cpp before the WebBrowserComponent is
constructed:
- WebKitGTK DMA-BUF renderer. WebKitGTK 2.42+ defaults to a
DMA-BUF/EGL path that fails silently (white window, no log) on
NVIDIA proprietary drivers under Wayland, in VMs without virgl,
and in several sandbox configs (WebKit bug 262607). Now we
pre-setWEBKIT_DISABLE_DMABUF_RENDERER=1,
WEBKIT_DISABLE_COMPOSITING_MODE=1andGDK_BACKEND=x11defensively
(only when those vars aren't already set, so power users can still
override). /tmpmounted noexec. JUCE extracts a WebKit helper binary to
$TMPDIR/_juce_linux_subprocess*andexecvs it; on hardened
RHEL/Rocky, Snap-packaged DAWs (AppArmor), Fedora 41+ (SELinux),
and Flatpak/bubblewrap-confined hosts the exec silently fails →
no WebKit process → blank window. We now probe with a tiny shell
script, and if exec is denied, relocate$TMPDIRto
$XDG_RUNTIME_DIR(always exec-allowed under systemd) or
~/.cache/doobiebefore JUCE looks at it. Either way a stderr
warning is logged so support reports become actionable.- CI matrix now covers Ubuntu 24.04 alongside 22.04 — modern
distros catch webkit2gtk-4.1 regressions before users do.
Documentation
- README + CHANGELOG both reference the new env-var workarounds
users on weird configs can fall back to.
Doobie nightly (2026-06-01 451e90e)
Latest build from main (451e90e). Unstable — use a tagged release if you need a stable version.
Doobie v0.13.2
Fixed
- Linux builds now load on modern distros. CI was installing only
libwebkit2gtk-4.0-dev, so the binary preferred libsoup-2 at runtime.
On distros that ship WebKitGTK 4.1 / libsoup-3 (Ubuntu 24.04+, Fedora
40+, Debian 13+, Arch, …) any other process-loaded library that pulled
in libsoup-2 aborted WebKit's network process with
libsoup2 symbols detected. Using libsoup2 and libsoup3 in the same process is not supported.→ white window. Now we build with both
4.1 + 4.0 dev packages so JUCE's pkg-config picks the modern path and
the binary dlopens whichever the user's distro provides. Aligns with
the WebKitGTK upstream deprecation of libsoup2 (final removal in
2.52.0, March 2026). - macOS hardened-runtime: added
com.apple.security.cs.allow-jit.
Required for JavaScriptCore's modernMAP_JITAPI on Sequoia+.
allow-unsigned-executable-memory(already present) covers the older
exception used byjuce_dsp's FFT JIT but doesn't satisfy the new
WKWebView check on its own.
Documentation
- README's Install section now distinguishes the two Linux runtime
paths (WebKitGTK 4.1 vs 4.0), warns against mixing them in one
system, and documents theTMPDIRworkaround for/tmpmounted
noexec(RHEL hardened images, some snap-confined hosts).
Doobie v0.13.1
Added
- Diagnostic banner at the top of the WebView (auto-hides as soon as
React mounts). When the UI fails to load on a user's machine the
banner stays visible and ticks off the stages we got past
(HTML → juce bridge → React → Babel → App mounted), plus shows any
uncaught JS error. Makes Linux WebKit-related bugs reportable
without needing the user to open dev tools.
Documentation
- Linux runtime dependencies spelled out in the README's Install
section:libwebkit2gtk-4.0-37 libgtk-3-0 libglib2.0-0 libsoup2.4-1 libasound2 libjack-jackd2-0plus the WebKitGTK 4.0 vs 4.1
compatibility note for Ubuntu 24.04+. A Linux user reported a
white-window-after-install on 0.13.0; this is the documentation half
of the fix.
Doobie v0.13.0
Added
- Full UI rebuild on JUCE 8's
WebBrowserComponent— the entire editor
is now an HTML/CSS/JS app served from BinaryData (no network), bridged to
the audio engine viaWebSliderRelay/WebToggleButtonRelay/
WebComboBoxRelay+ their matching*ParameterAttachments. All 96 APVTS
parameters are two-way bound; host automation and preset loads flow
through the same path as user drags. React + Babel-standalone vendored
locally; the JUCE frontend JS is wrapped into a non-module IIFE that
exposeswindow.Juce. CSP + WKWebView native scheme (juce://)
configured correctly so the bundle loads fully offline. - Gated reverb — new
src/dsp/GatedReverb.{h}: plate core with an
envelope-keyed sidechain gate. Classic 80s drum-gate sound — snare
triggers a bright bloom that snaps to silence at the gate boundary.
Surfaced as reverb mode #8 in the dropdown; three new APVTS params
(gateThreshold,gateHold,gateRelease) appear as a row in the
Reverb panel only when Gated is selected. - Right-click knob context menu — Reset to default, Copy value, Paste
value, Enter value… (the Enter-value path opens the styled modal). Per-
knob viaonContextMenu. The browser's native context menu is suppressed
globally so the plugin reads as a native desktop app. - Styled save-preset modal — replaces the JUCE
AlertWindowthat
looked alien against the dark chrome. Cancel on Esc / scrim click; Enter
to confirm; payload travels through the existing
Juce.backend.emitEvent('preset_save', {name})channel. - Per-stage live VU bridge — engine now publishes
inputLevel,
delayLevel,reverbLevelatomics in addition to the per-channel
outputLevel. The WebView'slevelsevent ticks at 30 Hz with proper
20·log10 dBFS values; the digital meters do their own RMS / peak-hold- clip indicator on top.
- Modulation indicators on every knob — any knob whose APVTS id is a
matrix destination shows a dim outer arc + animated dot driven live by
matrix amount × source depth. Includes the per-head pan/time
destinations. - Native-feel polish — selection / drag-select / right-click-Inspect
suppressed via CSS + JS for everything except real<input>/
<textarea>elements (so the preset-rename modal still accepts typing). - Reverb route selector moved out of the top meter bridge into the
Reverb panel itself, where it belongs.
Changed
- DecayGraph wired to the decay knob (was wired to size, which is
unrelated to tail length — graph looked decorative). - REC indicator removed from the cassette area (we're a tape echo, not
a recorder; the light was misleading).
Fixed
WebBrowserComponentuse-after-free on close: the relays are
WebViewLifetimeListeners whose destruction order had to come after
the browser. Reordered class members.- WKWebView showed "Could not connect to the server" because we navigated
tohttps://doobie.localhost; JUCE only registers thejuce://scheme
for served resources. Switched togetResourceProviderRoot(). - Two
juce_add_binary_datatargets (Voxengo IRs + UI assets) shared the
BinaryData::namespace, so the linker silently picked one and the UI
resource lookup ran against the WAV file table. Each target now lives in
its own namespace (DoobieIRData::andDoobieUIData::). - Vendored JUCE frontend JS still had an
importat the top — illegal in
a non-module script — so the IIFE never executed,window.Jucewas
undefined, and React threw on first render. The check-native-interop
file is now inlined into the IIFE; verifier asserts noimport/export
survives the wrap. - Hooks (
useState,useEffect, etc.) were re-declared in multiple
babel-script files → redeclarationSyntaxError. Hoisted to globals in
the HTML shell so each .jsx can reference them directly.
Known issues (next iteration)
- Window scaling — the editor is 1520 × 960 native pixels and doesn't
scale to fit smaller displays. Pending: CSStransform: scale()driven
off the editor's actual bounds. - Convolution-mode controls —
irGain/irSpeedand the factory IR
picker / "Load custom…" file dialog aren't surfaced; the Reverb panel
shows the plate knobs even when the mode is Convolution. - DecayGraph is approximated, not live. It draws an
exp(-t/τ)
envelope from the decay knob rather than the actual reverb impulse
response. Live data would need an extra IR/RT60 emission from the
engine. - WKWebView inspection — patched the vendored JUCE source so
developerExtrasEnabledis set in Release andsetInspectable:YESis
called on macOS 13.3+. Carry that patch forward when bumping JUCE.
Doobie v0.12.0
Changed
- Whole UI restyled as a cassette deck. Pure-black panels (
#000) matching
the cassette interior, white linework everywhere, knobs redrawn as cassette
spindle / idler-roller analogues (dark inset + white rim + white pointer +
white centre dot), toggles as small white-rim circles with an amber LED dot
when lit, head-matrix pads flip to a solid white face with black letter when
selected. Teal dropped entirely; amber kept only as the single "this is
live" accent (head body when playing, lit toggle LED, VU bar). The
brushed-metal gradients and horizontal grain on the chassis are gone. - Cassette grew to 180 px as the centerpiece of the DELAY panel (was 98 px),
with the head, both reels including 3-spoke spindles, and the tape line
through all idler rollers clearly readable. - Reel rotation now tracks delay time. Real tape echoes have fixed
head-to-head distance, so longer delay → slower capstan. Mapping:
speed = clamp(pow(0.375 s / t, 0.6), 0.15, 5.0)— 1.0 × at the 375 ms
default, ~4.3 × at a 30 ms flanger, ~0.15 × at an 8 s dub. Sync mode
reappliesquarters * 60 / bpmso the visual tracks host tempo. Freeze
and delay-bypass stop the capstan. - Window height 870 → 1024 to fit the bigger cassette + the echo-tap
strip without crushing the knob rows.
Added
- Echo-tap timeline strip sitting below the cassette in the DELAY panel
(56 px). The cassette shows transport state; the strip shows where the four
heads land along 0 → master-delay with feedback fall-off. Complementary,
not replacing each other. - macOS code-signed + notarized release pipeline.
.github/workflows/
builds Doobie on every push tomainand everyvX.Y.Ztag — universal
arm64 + x86_64, code-signed with the Developer ID Application cert, packaged
as a Distribution.pkgsigned with the Developer ID Installer cert,
notarized via Apple's notary service, stapled. Versioned tags publish a
stable release; main pushes update a rollingnightlyprerelease. End users
install with no Gatekeeper warning. - Linux CI build on
ubuntu-22.04. Catches platform-specific build issues
at PR time (would have caught the SIMD bug below). packaging/macos/withbootstrap-signing.shthat takes a fresh Apple
Developer membership all the way to populated GitHub Secrets in one pass:
generates RSA key + CSR locally, opens the developer portal for the cert
bits Apple's API refuses to issue, bundles each cert into a.p12with a
random password, derives the codesign identity CN from the cert subject,
and pushes all 11 secrets viagh secret set— cert bytes stream via
stdin so they never appear in shell history.
Fixed
- Linux build error at
ConvolutionReverb.h:205with
juce::jmax<juce::int64>. JUCE 8's maths overload set includes
dsp::SIMDRegister<T>variants, so the compiler considers
SIMDRegister<long long>during overload resolution — which requires a
complete type, which on Linux's SSE-only fallback is forward-declared but
never defined forlong long. Replaced the templated call with a plain
ternary; same call now resolves on all platforms.