Skip to content

Releases: DatanoiseTV/doobie

Doobie v0.13.5

01 Jun 21:28

Choose a tag to compare

Fixed (Linux)

  • Restored GPU compositing on Linux. v0.13.3/v0.13.4 unconditionally
    set WEBKIT_DISABLE_DMABUF_RENDERER=1 and
    WEBKIT_DISABLE_COMPOSITING_MODE=1 as 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. Only GDK_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

01 Jun 08:22

Choose a tag to compare

Changed (Linux)

  • Never use /tmp for JUCE's WebKit subprocess helper. Previous
    release probed /tmp and relocated $TMPDIR only if exec was
    denied. Cleaner approach: always point $TMPDIR at a user-owned
    location from the start. We prefer $XDG_RUNTIME_DIR/doobie
    (= /run/user/$UID/doobie under systemd — always exec-allowed,
    cleared at logout), falling back to ~/.cache/doobie for non-
    systemd systems. A user-set $TMPDIR is still respected. Drops
    the probe-and-warn branch in favour of always-correct.

Doobie v0.13.3

01 Jun 08:00

Choose a tag to compare

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-set WEBKIT_DISABLE_DMABUF_RENDERER=1,
    WEBKIT_DISABLE_COMPOSITING_MODE=1 and GDK_BACKEND=x11 defensively
    (only when those vars aren't already set, so power users can still
    override).
  • /tmp mounted noexec. JUCE extracts a WebKit helper binary to
    $TMPDIR/_juce_linux_subprocess* and execvs 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 $TMPDIR to
    $XDG_RUNTIME_DIR (always exec-allowed under systemd) or
    ~/.cache/doobie before 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)

01 Jun 21:29

Choose a tag to compare

Pre-release

Latest build from main (451e90e). Unstable — use a tagged release if you need a stable version.

Doobie v0.13.2

31 May 12:04

Choose a tag to compare

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 modern MAP_JIT API on Sequoia+.
    allow-unsigned-executable-memory (already present) covers the older
    exception used by juce_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 the TMPDIR workaround for /tmp mounted
    noexec (RHEL hardened images, some snap-confined hosts).

Doobie v0.13.1

31 May 09:56

Choose a tag to compare

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-0 plus 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

30 May 22:13

Choose a tag to compare

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 via WebSliderRelay / 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
    exposes window.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 via onContextMenu. 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 AlertWindow that
    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, reverbLevel atomics in addition to the per-channel
    outputLevel. The WebView's levels event 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

  • WebBrowserComponent use-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
    to https://doobie.localhost; JUCE only registers the juce:// scheme
    for served resources. Switched to getResourceProviderRoot().
  • Two juce_add_binary_data targets (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:: and DoobieUIData::).
  • Vendored JUCE frontend JS still had an import at the top — illegal in
    a non-module script — so the IIFE never executed, window.Juce was
    undefined, and React threw on first render. The check-native-interop
    file is now inlined into the IIFE; verifier asserts no import/export
    survives the wrap.
  • Hooks (useState, useEffect, etc.) were re-declared in multiple
    babel-script files → redeclaration SyntaxError. 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: CSS transform: scale() driven
    off the editor's actual bounds.
  • Convolution-mode controlsirGain / irSpeed and 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
    developerExtrasEnabled is set in Release and setInspectable:YES is
    called on macOS 13.3+. Carry that patch forward when bumping JUCE.

Doobie v0.12.0

29 May 14:53

Choose a tag to compare

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
    reapplies quarters * 60 / bpm so 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 to main and every vX.Y.Z tag — universal
    arm64 + x86_64, code-signed with the Developer ID Application cert, packaged
    as a Distribution .pkg signed with the Developer ID Installer cert,
    notarized via Apple's notary service, stapled. Versioned tags publish a
    stable release; main pushes update a rolling nightly prerelease. 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/ with bootstrap-signing.sh that 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 .p12 with a
    random password, derives the codesign identity CN from the cert subject,
    and pushes all 11 secrets via gh secret set — cert bytes stream via
    stdin so they never appear in shell history.

Fixed

  • Linux build error at ConvolutionReverb.h:205 with
    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 for long long. Replaced the templated call with a plain
    ternary; same call now resolves on all platforms.