github stemdeckapp/stemdeck v0.1.0-alpha.1

latest releases: v0.18.0, v0.17.3, v0.17.2...
4 months ago

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.

Don't miss a new stemdeck release

NewReleases is sending notifications on new releases.