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 summedmix.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.
Thesetupsubcommand installs ffmpeg + uv via Homebrew or apt and
runsuv 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
appuser 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.