Skip to content

Releases: stemdeckapp/stemdeck

v0.2.0-alpha.2

Choose a tag to compare

@thcp thcp released this 07 May 19:21

Bug fix release. Addresses mixer volume and mute issues reported in the previous alpha, the download button not working in the Windows desktop app, and the CUDA install failing on machines other than the build machine.

What's fixed

Mixer volume and mute

Volume boost above 0 dB now works correctly. Previously the upper half of every fader had no audible effect — the browser caps HTMLAudioElement.volume at 1.0, so pushing the fader above the midpoint did nothing. On Firefox and Safari, values above 1.0 also threw an exception that aborted the whole mixer pass, which is why muting one channel could permanently silence others until the page was reloaded.

Each track now routes through a Web Audio GainNode instead. GainNode.gain.value accepts any positive number, so boost works and mute is reliable across all browsers and in the desktop app.

Download button (Windows desktop app)

Clicking the download button on a stem now opens the file in the system default browser and triggers a normal download. The Tauri webview silently blocks native <a download> behavior, so the button did nothing before this fix.

CUDA install failing on other machines (#10)

The Windows venv is built on the CI machine, which bakes the build machine's Python path into pyvenv.cfg. When pip ran on a user's machine during the first-launch CUDA torch install, it looked for Python at that path, didn't find it, and failed. The app now patches pyvenv.cfg at runtime before invoking pip, so the install works regardless of where the user extracted the zip.

Setup (macOS / Linux)

Unchanged — ./run.sh setup && ./run.sh start.

Known limitations

Same as alpha.1. The Windows app is ALPHA — expect rough edges.

v0.2.0-alpha.1

Choose a tag to compare

@thcp thcp released this 07 May 16:19
5b251cc

Second alpha of StemDeck. This release adds a self-contained Windows desktop app with dual portable zip variants, and a round of DAW UI polish.

What's new

Windows desktop app

StemDeck is now available as a portable Windows app — no Python, no uv, no system dependencies. Extract and run StemDeck.exe.

Two variants ship with each release:

Download GPU Approx. size
StemDeck-Windows-x64.zip CPU only ~700 MB
StemDeck-Windows-x64.NVIDIA.zip NVIDIA CUDA ~1.6 GB

Use the CPU variant if you don't have an NVIDIA GPU. AMD and Intel GPUs don't support CUDA — CPU is the right pick for those too.

On first launch the app runs a short setup sequence (runtime check, workspace creation, compute device detection, FFmpeg, Demucs model download). Subsequent launches skip most steps and start in seconds.

The bundled Python venv has C++ static libraries stripped out — dnnl.lib alone is 623 MB and is only needed at build time, never at runtime. This is what keeps the CPU zip under 700 MB despite bundling a full PyTorch install.

DAW UI improvements

Waveform lanes and the instrument icon column now expand to fill the full window height, with icons vertically centered in each row at any window size. A ResizeObserver on the wave container keeps the playhead height and multitrack layout in sync when the window is resized.

The play button now glows green when active and the stop button glows red. Help and Tip the maker links now open in the system default browser — previously they did nothing inside the desktop app. The GPU setup step was also renamed to "Configuring compute device" since it applies to both CPU and NVIDIA builds.

Bug fixes

Fixed mixer channels getting stuck after mute or volume adjustments (#7). Per-track volume is now clamped to the browser-safe 0..1 range and each setTrackVolume call is wrapped independently, so one bad fader value can no longer abort the whole mixer pass and leave other channels stale.

Setup (macOS / Linux)

Unchanged from alpha.1 — ./run.sh setup && ./run.sh start.

Known limitations

Same as alpha.1. The Windows app is ALPHA — expect rough edges.

v0.1.0-alpha.1

Choose a tag to compare

@thcp thcp released this 04 May 13:30
19bfd86

First public alpha of StemDeck. Local, single-user audio stem
separation with a DAW-style mixer.

Highlights

  • 6-stem separation via Demucs htdemucs_6s. Auto-selects CUDA →
    MPS → CPU; ~3-5× speedup on Apple Silicon over CPU.
  • DAW-style waveform editor with min/max rendering, zoom, loop
    region drag, gold playhead, and stem-aligned lanes.
  • Per-stem mixer: volume fader, mute, solo, monitor (solo-only),
    with state synced between mixer and stems sidebar.
  • Stem subset extraction: pick which stems to keep on import. The
    studio surfaces a 7th "Original" lane (full song minus selection)
    for A/B reference, plus a downloadable summed mix.wav.
  • Live VU per stem: post-gain RMS via Web Audio with peak hold +
    slow falloff.
  • Song analysis in the now-playing card: BPM (librosa beat
    tracker), key + scale + confidence (Albrecht-Shanahan), integrated
    LUFS (BS.1770 via pyloudnorm), sample peak in dBFS.
  • Cancellable jobs at any pipeline stage (download, Demucs,
    ffmpeg amix). Active subprocess is terminated and the partial job
    dir is cleaned up.

Setup

  • macOS / Linux: git clone … && ./run.sh setup && ./run.sh start.
    The setup subcommand installs ffmpeg + uv via Homebrew or apt and
    runs uv sync.
  • Docker: docker compose -f build/docker-compose.yml up --build.
    No GPU on macOS Docker; Apple Silicon users should prefer the
    native install.

CI / quality

  • Woodpecker pipeline runs lint (ruff), unit tests (pytest), Python
    SAST (bandit), dependency CVE audit (pip-audit), and filesystem
    security scan (trivy fs + trivy config). No build/publish.
  • Container hardening: non-root app user in the runtime image.

Known limitations

  • Local-only / single-user. Not designed for multi-tenant hosting.
  • Single concurrent pipeline (asyncio.Semaphore(1)). Multiple jobs
    queue rather than running in parallel.
  • yt-dlp YouTube downloads are subject to YouTube ToS. See the
    Disclaimer in the README; usage is your responsibility.
  • Browser memory grows on long videos because each stem is decoded
    into a Web Audio buffer for the overview waveform.

Thanks

Demucs (htdemucs_6s), wavesurfer.js, ffmpeg, yt-dlp, librosa,
pyloudnorm — this project is glue around their work.