{"slug": "stemdeck-free-open-source-local-stem-separation", "title": "Stemdeck – Free, open-source, local stem separation", "summary": "StemDeck, a free and open-source stem separation tool, has been released, allowing users to split local audio files or YouTube URLs into up to six stems (vocals, drums, bass, guitar, piano, other) entirely on their own machine, with no account, quota, or subscription. The tool uses Demucs' htdemucs_6s model and includes a DAW-style mixer, waveform editor, stem subset extraction, and song analysis features, positioning itself as a local alternative to cloud services like Moises and LALAL.AI.", "body_md": "Drop in an MP3, WAV, FLAC, OGG/Opus, MP4, or M4A file, or paste a YouTube URL, and StemDeck splits the audio into up to six stems (vocals, drums, bass, guitar, piano, other). Play them back in a DAW-style multitrack mixer: mute, solo, balance levels, zoom the waveform, loop a region, and export individual stems or a custom mix. Everything runs locally on your own machine.\n\nWhat is this?StemDeck is a stem separation tool, not a downloader. Its main job is processing audio you already own: drag an MP3, WAV, FLAC, OGG, or M4A onto the import bar and go. YouTube support is a convenience for content you have the right to process. StemDeck does not store, cache, or redistribute any downloaded content. Everything happens locally and nothing leaves your machine.\n\nStemDeck is a free, open alternative to cloud stem-splitters like Moises and LALAL.AI: no account, no quota, no uploads, no subscription. If you want stems for personal study and prefer to keep things local and free, StemDeck has you covered. If you need the polish, a mobile app, or deeper musician tooling, the commercial products are a better fit.\n\nStemDeck is free and **does not accept any money, sponsorship, or funding** - not from users, not from anyone listed below. We share these makers and artists purely for the joy of pointing you toward wonderful people doing beautiful work. Go meet them ❤️\n\n| Name | What they do | Link |\n|---|---|---|\n| Dlima Guitars | Custom guitars and basses |\n|\n\n[dlimaguitars.com](https://dlimaguitars.com)[@jay_glaspar](https://www.instagram.com/jay_glaspar)[@krisluthier](https://www.instagram.com/krisluthier)[@thomann.music](https://www.instagram.com/thomann.music)[@analog4lyfe](https://www.instagram.com/analog4lyfe)[empresseffects.com](https://empresseffects.com)[@morenoteslesstalk](https://www.youtube.com/@morenoteslesstalk)**6-stem separation** via Demucs `htdemucs_6s`\n\n, with auto-detection of the best Torch device (CUDA on NVIDIA, MPS on Apple Silicon, CPU fallback).\n\n**YouTube and local file import.** Paste a YouTube URL or drop an MP3, WAV, FLAC, OGG/Opus, MP4, or M4A directly onto the import bar.\n\n**DAW-style waveform editor** with min/max sample rendering across all stems, shared normalization, zoom in/out/Fit, loop drag on the ruler, gold playhead overlay, and stem-aligned lanes.\n\n**Stem subset extraction.** Click stem chips to choose which stems to keep. Clicking from \"all selected\" snaps to \"only this one\"; subsequent clicks add or remove.\n\n**\"Original\" backing track.** When you pick a subset, a 7th lane contains the complement (full song minus selected stems), perfect for A/B reference without doubling.\n\n**Downloadable selected mix.** A single `mix.wav`\n\nof just your selected stems, summed via ffmpeg amix.\n\n**Per-stem mixer** with volume fader, mute, solo, and \"monitor\" (solo-only) per stem. State syncs between the preview mixer and the stems sidebar.\n\n**Live VU meters** per stem. Post-gain RMS via Web Audio analysers with peak hold and slow falloff.\n\n**Song analysis** including BPM (librosa beat tracker), key, scale, and confidence (Albrecht-Shanahan profiles), integrated LUFS (BS.1770), and sample peak in dBFS.\n\n**Cancellable jobs.** Cancel mid-pipeline and the runner terminates the active subprocess immediately, deletes the partial job dir, and returns to ready.\n\n**Library panel** with folder-based track organisation, drag-and-drop, search, and trash.\n\nStemDeck is not trying to compete with commercial stem-separation products. It covers the core use case well and stops there. This table exists so you can make an informed choice rather than discover the gaps after the fact.\n\n| StemDeck | Moises / LALAL.AI / similar | |\n|---|---|---|\nPrice |\nFree, forever | Freemium; credits or subscription required for regular use |\nHosting |\nRuns entirely on your machine | Cloud; audio must be uploaded to their servers |\nAccount / login |\nNone | Required |\nInternet required |\nOnly for YouTube download and first model fetch (~170 MB, cached after) | Always; no offline use |\nPrivacy |\nAudio never leaves your machine | Audio is uploaded and processed on third-party servers |\nData retention |\nYou control it; delete anytime | Governed by their privacy policy and retention period |\nStem model |\nDemucs `htdemucs_6s` (open source, Meta AI) |\nProprietary models, regularly updated, generally higher quality |\nStem count |\n6 (vocals, drums, bass, guitar, piano, other) | Up to 10 depending on service and plan |\nInput formats |\nYouTube URL, MP3, WAV, FLAC, OGG/Opus, MP4, M4A | MP3, WAV, FLAC, M4A, and more depending on service |\nProcessing speed |\nDepends on your hardware; fast with a GPU, slow on CPU only | Fast regardless of your hardware (runs on their servers) |\nBatch processing |\nOne job at a time | Yes, on paid plans |\nMobile app |\nNo | iOS and Android |\nExtra features |\nNo (no pitch shift, chord detection, lyrics, click track, BPM tap) | Yes, varies by product |\nPolish |\nFunctional, hobby-grade UI | Polished, production-grade apps |\nSource code |\nOpen source, forkable, self-hostable | Closed source |\n\nIf you need speed, quality, mobile access, or the extra musician tooling, the commercial products are worth the money. If you want stems for personal study, prefer to keep audio private, or just want something that runs locally with no strings attached, StemDeck is enough.\n\nPre-built installers and zips are attached to each [GitHub Release](https://github.com/stemdeckapp/stemdeck/releases).\n\n**macOS**\n\n| DMG | GPU | Chip |\n|---|---|---|\n`StemDeck-macOS-arm64.dmg` |\nApple Silicon (MPS) | M1 and later |\n`StemDeck-macOS-x64.dmg` |\nCPU only | Intel |\n\nOpen the DMG, drag StemDeck to Applications, and launch it. On first launch the setup screen downloads the Python runtime (~500 MB), FFmpeg, and the Demucs model (~170 MB). Subsequent launches skip setup and start in seconds. No Python or system dependencies required.\n\nmacOS may show a Gatekeeper prompt on first open — right-click the app and choose Open to bypass it.\n\n**Windows**\n\n| Zip | GPU | Approx. size |\n|---|---|---|\n`StemDeck-Windows-x64.zip` |\nCPU only | ~700 MB |\n`StemDeck-Windows-x64.NVIDIA.zip` |\nNVIDIA CUDA | ~1.6 GB |\n\nExtract the zip anywhere, run `StemDeck.exe`\n\n. On first launch the app verifies the bundled Python runtime and downloads FFmpeg and the Demucs model (~170 MB). Subsequent launches skip this and start in seconds. Everything is self-contained; no Python or system dependencies required.\n\nStemDeck is built on ** Python 3.12** managed via\n\n**, with a**\n\n[uv](https://github.com/astral-sh/uv)**backend serving REST and Server-Sent Events. Stem separation uses**\n\n[FastAPI](https://fastapi.tiangolo.com)**(**\n\n[Demucs](https://github.com/facebookresearch/demucs)`htdemucs_6s`\n\n), Meta AI's open-source 6-stem neural network. YouTube audio is fetched via **; transcoding and mixing use**\n\n[yt-dlp](https://github.com/yt-dlp/yt-dlp)**. BPM detection and key analysis run on**\n\n[FFmpeg](https://ffmpeg.org)**; loudness measurement uses**\n\n[librosa](https://librosa.org)**(ITU-R BS.1770). The macOS and Windows desktop shells are**\n\n[pyloudnorm](https://github.com/csteinmetz1/pyloudnorm)**(Rust/WKWebView on macOS, Rust/WebView2 on Windows). The frontend is vanilla JS with the Web Audio API, no framework and no build step; waveforms are rendered on**\n\n[Tauri v2](https://tauri.app)`<canvas>`\n\nusing min/max sample rendering.*Thanks to the creators and maintainers of all the open-source libraries that make StemDeck possible.*\n\nRequires Rust, Node.js, and Python 3.12. Builds a self-contained `.app`\n\nthat downloads its own runtime on first launch.\n\n```\n# First time only — add the cross-compilation targets\nrustup target add aarch64-apple-darwin   # Apple Silicon\nrustup target add x86_64-apple-darwin    # Intel\n\n# Build Apple Silicon\nARCH=arm64 scripts/macos/make-runtime-pack.sh\nARCH=arm64 scripts/macos/make-app.sh\nARCH=arm64 scripts/macos/make-dmg.sh\n\n# Build Intel (requires Rosetta 2 and an x86_64 Python)\nARCH=x64 scripts/macos/make-runtime-pack.sh\nARCH=x64 scripts/macos/make-app.sh\nARCH=x64 scripts/macos/make-dmg.sh\n```\n\nThe `.app`\n\nlands at `desktop/src-tauri/target/<target>/release/bundle/macos/StemDeck.app`\n\n. The DMG lands at `.build/macos-dist/StemDeck-macOS-<arch>.dmg`\n\n.\n\nTo run a fresh build directly without the DMG:\n\n```\nopen desktop/src-tauri/target/aarch64-apple-darwin/release/bundle/macos/StemDeck.app\n```\n\nIf macOS blocks the app with a Gatekeeper prompt, run:\n\n```\nxattr -dr com.apple.quarantine desktop/src-tauri/target/aarch64-apple-darwin/release/bundle/macos/StemDeck.app\n```\n\nNote:To test a clean first-launch during development, you can wipe previous app data first:`rm -rf ~/Library/Application\\ Support/StemDeck`\n\n. Don't do this on a real install.\n\nPython 3.12 or newer, `ffmpeg`\n\non your PATH, and [uv](https://github.com/astral-sh/uv). Around 170 MB of free disk for the Demucs model, which downloads automatically on first run.\n\n```\ngit clone https://github.com/stemdeckapp/stemdeck stemdeck && cd stemdeck\n./run.sh setup     # installs ffmpeg + uv, runs uv sync\n./run.sh start\n```\n\nOpen [http://localhost:8000](http://localhost:8000).\n\n`setup`\n\nuses Homebrew on macOS and `apt-get`\n\non Debian/Ubuntu. For other Linux distros, install `ffmpeg`\n\nand [uv](https://github.com/astral-sh/uv) manually, then run `uv sync`\n\nfollowed by `./run.sh start`\n\n.\n\nInstall prerequisites:\n\n[uv](https://docs.astral.sh/uv/getting-started/installation/)—`winget install astral-sh.uv`\n\n[ffmpeg](https://ffmpeg.org/download.html)—`winget install Gyan.FFmpeg`\n\n(or Chocolatey:`choco install ffmpeg`\n\n)\n\n```\ngit clone https://github.com/stemdeckapp/stemdeck stemdeck; cd stemdeck\nuv sync\nuv run uvicorn app.main:app --host 127.0.0.1 --port 8000 --timeout-graceful-shutdown 5\n```\n\nOpen [http://localhost:8000](http://localhost:8000).\n\n`run.sh`\n\nis macOS/Linux only. On Windows use the PowerShell commands above, or run inside WSL.\n\n**NVIDIA GPU (CUDA):** install the CUDA-enabled torch build before starting:\n\n```\nuv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124\n$env:STEMDECK_DEMUCS_DEVICE = \"cuda\"\nuv run uvicorn app.main:app --host 127.0.0.1 --port 8000 --timeout-graceful-shutdown 5\ngit clone https://github.com/stemdeckapp/stemdeck stemdeck && cd stemdeck\nuv sync\nuv run uvicorn app.main:app --reload --timeout-graceful-shutdown 5\n```\n\n`--timeout-graceful-shutdown`\n\nbounds how long uvicorn waits for open connections when you stop it. StemDeck keeps a long-lived SSE stream open for the import queue while a browser tab is on the app, so without it Ctrl-C waits for that stream instead of exiting.\n\n```\ndocker compose -f build/docker-compose.yml up --build\n```\n\nStems land in `./jobs/`\n\non the host. Demucs weights are cached in a named volume so they don't re-download on rebuild. Note: no GPU passthrough on macOS Docker.\n\nA prebuilt image is published to GHCR. Tags: `edge`\n\n(rolling, rebuilt on every merge to main), `latest`\n\n(newest stable release), and `X.Y.Z`\n\n(pinned to a release).\n\n```\ndocker run -d --name stemdeck -p 8000:8000 \\\n  -v /path/to/jobs:/app/jobs \\\n  -v /path/to/cache:/cache \\\n  -e STEMDECK_PERSIST_LIBRARY=1 \\\n  ghcr.io/stemdeckapp/stemdeck:edge\n```\n\nOn a Linux host with an NVIDIA GPU (driver + NVIDIA Container Toolkit installed), add `--runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all`\n\nand StemDeck auto-detects CUDA. The image already bundles CUDA-enabled torch, so no separate CUDA install is needed.\n\nStemDeck is available in Unraid Community Applications: open **Apps**, search \"StemDeck\", and install. Map the two volumes to persistent appdata paths:\n\n`/app/jobs`\n\n->`/mnt/user/appdata/stemdeck/jobs`\n\n(library + stems)`/cache`\n\n->`/mnt/user/appdata/stemdeck/cache`\n\n(model weights)\n\nThe library is persistent by default (`STEMDECK_PERSIST_LIBRARY=1`\n\n), so tracks are never auto-deleted. For GPU acceleration, install the **Nvidia Driver** plugin, then set the container's Extra Parameters to `--runtime=nvidia`\n\n(the `NVIDIA_VISIBLE_DEVICES`\n\nand `NVIDIA_DRIVER_CAPABILITIES`\n\nvariables are already in the template). CPU-only works with no extra configuration.\n\n```\n./run.sh setup      # one-shot: install ffmpeg + uv, then uv sync\n./run.sh start      # boots uvicorn in the background\n./run.sh stop       # graceful shutdown\n./run.sh restart    # stop + start\n./run.sh status     # is it running?\n```\n\n- On the import bar, click stem chips to choose which stems to extract (defaults to all 6).\n- Paste a YouTube URL\n**or** drop an audio file (MP3, WAV, FLAC, OGG, MP4, M4A), then click**Process**. - Wait through\n`Uploading...`\n\n/`Downloading...`\n\n→`Analyzing...`\n\n→`Separating...`\n\n→`Mixing tracks...`\n\n. - When done, the studio dashboard appears. If you picked a subset, the first lane is\n**Original**(full song minus your selection); the rest are your isolated stems. - Mix:\n**Play/Pause/Stop** controls the master transport.**M** mutes a stem,**S** solos it (additive; multiple solos stay audible),**Monitor** solos only that stem and clears others. The volume fader moves 1:1 with drag; double-click resets to 0 dB;`Shift+wheel`\n\ngives coarse adjustment and plain wheel gives fine. The**Reset**,** Mute**, and** Solo**toolbar buttons act on all stems at once. - Drag on the ruler to define a loop region; click\n`Loop`\n\nto enable. Use`+`\n\n/`-`\n\n/`Fit`\n\nor`Ctrl/Cmd+wheel`\n\nto zoom. **Download Mix** in the footer gives you a WAV of your selected stems summed together.\n\n**Keyboard shortcuts:** `Space`\n\nplay/pause · `[`\n\nseek -5s · `]`\n\nseek +5s · `L`\n\nloop · `I`\n\nloop in · `O`\n\nloop out\n\n| Variable | Default | Purpose |\n|---|---|---|\n`STEMDECK_DEMUCS_DEVICE` |\nauto | Force Torch device: `cuda` , `mps` , or `cpu` . |\n`STEMDECK_DEMUCS_MODEL` |\n`htdemucs_6s` |\nDemucs model name. |\n`STEMDECK_JOBS_DIR` |\n`./jobs` |\nWhere job directories land. |\n`STEMDECK_DATA_DIR` |\n(none) | Portable mode root; sets all sub-dirs below to live inside it. |\n`STEMDECK_CACHE_DIR` |\n`<data>/cache` |\nTorch model cache directory. |\n`STEMDECK_DOWNLOADS_DIR` |\n`<data>/downloads` |\nyt-dlp download scratch space. |\n`STEMDECK_MODELS_DIR` |\n`<data>/models` |\nDemucs model weights directory. |\n`STEMDECK_LOGS_DIR` |\n`<data>/logs` |\nLog file output directory. |\n`STEMDECK_FFMPEG_DIR` |\n(none) | Directory containing a bundled ffmpeg binary. |\n`STEMDECK_FFMPEG` |\n`ffmpeg` |\nPath to the ffmpeg executable. |\n`STEMDECK_FFPROBE` |\n`ffprobe` |\nPath to the ffprobe executable. |\n`STEMDECK_MAX_DURATION_SEC` |\n`1200` |\nReject audio longer than this (seconds). |\n`STEMDECK_JOB_TTL_SECONDS` |\n`86400` |\nHow long to keep job dirs on disk. |\n`STEMDECK_MAX_PENDING_JOBS` |\n`3` |\nMax queued jobs before returning 503. |\n`STEMDECK_TIMEOUT_FFMPEG` |\n`300` |\nffmpeg subprocess timeout (seconds). |\n`STEMDECK_TIMEOUT_ANALYZE` |\n`120` |\nAudio analysis timeout (seconds). |\n`STEMDECK_TIMEOUT_DEMUCS_STALL` |\n`1800` |\nKill Demucs if no output for this many seconds. |\n\n`run.sh`\n\nalso reads: `HOST`\n\n(default `127.0.0.1`\n\n), `PORT`\n\n(default `8765`\n\n), `RELOAD=1`\n\n(enable uvicorn auto-reload for development), `FOREGROUND=1`\n\n(run in foreground instead of backgrounding).\n\n| Method | Path | Purpose |\n|---|---|---|\n| GET | `/api/health` |\nServer health and version info |\n| POST | `/api/jobs` |\nJSON `{url, stems?}` or multipart `file + stems` → `{job_id}` |\n| GET | `/api/jobs` |\nList completed (library) jobs |\n| GET | `/api/jobs/{id}` |\nJob state snapshot |\n| GET | `/api/jobs/{id}/events` |\nSSE stream of job state |\n| POST | `/api/jobs/{id}/cancel` |\nTerminate active subprocess and cancel job |\n| PATCH | `/api/jobs/{id}/sections` |\nSave waveform section markers for a job |\n| GET | `/api/jobs/{id}/stems/{name}.wav` |\nStream a single stem WAV file |\n| GET | `/api/jobs/{id}/stems/{name}.mp3` |\nTranscode and stream a stem as MP3 |\n| GET | `/api/jobs/{id}/video.mp4` |\nMux the current mix with the source video (MP4 upload or YouTube) into an MP4 |\n| DELETE | `/api/jobs/{id}` |\nRemove job dir from disk (terminal jobs only) |\n\n** ffmpeg: command not found:** install ffmpeg and restart with\n\n`./run.sh restart`\n\n.** WARNING: [youtube] No supported JavaScript runtime:** install deno (\n\n`brew install deno`\n\non macOS) and restart. Downloads still work without it but may pick suboptimal formats.**First separation is very slow:** Demucs downloads `htdemucs_6s`\n\nweights (~170 MB) on first run; cached afterwards.\n\n**Demucs runs on CPU only:** check the startup log for `device=mps`\n\nor `device=cuda`\n\n. If you see `cpu`\n\n, your torch install may be CPU-only.\n\n**Page reloaded mid-job:** the job keeps running server-side. Wait for it to finish, then resubmit.\n\n** ./run.sh: Permission denied:** run\n\n`chmod +x run.sh`\n\n.\n\n```\njobs/<job_id>/\n└── stems/\n    ├── vocals.wav      # the 6 Demucs stems (always present)\n    ├── drums.wav\n    ├── bass.wav\n    ├── guitar.wav\n    ├── piano.wav\n    ├── other.wav\n    ├── original.wav    # sum of un-selected stems (subset only)\n    └── mix.wav         # ffmpeg amix of selected stems (subset only)\n```\n\nJob state is in-memory. Restart the server and the job list resets, but files persist on disk. Old dirs are swept automatically (TTL 24 h, configurable).\n\nStemDeck is a local audio stem separation tool intended for personal study, research, and experimentation. It is not a downloading service. It does not store, cache, or redistribute any audio content. All processing runs on the user's own machine and no audio is transmitted anywhere.\n\nYouTube URL support is provided via [yt-dlp](https://github.com/yt-dlp/yt-dlp) as a convenience. Automated downloading may violate YouTube's Terms of Service. You, the user, are solely responsible for ensuring you have the right to process any audio you submit, complying with the terms of service of any site you download from, and respecting the copyright of the material you work with.\n\nYou are also responsible for following the licenses of the underlying tools this project depends on (yt-dlp, Demucs, FFmpeg, PyTorch, and others listed in `pyproject.toml`\n\n).\n\nThe author(s) of StemDeck provide this software \"as is\", without warranty of any kind, and accept no responsibility or liability for how it is used.\n\nWindows releases of StemDeck are Authenticode-signed. Free code signing is provided by\n[SignPath.io](https://signpath.io/), certificate by [SignPath Foundation](https://signpath.org/).\n\nThe signed binary is `StemDeck.exe`\n\ninside `StemDeck-Windows-x64.zip`\n\nand\n`StemDeck-Windows-x64.NVIDIA.zip`\n\n. The zip archives themselves are not signed; verify them with\nthe `.sha256`\n\nfile published alongside each release asset. macOS and Linux builds are not\ncurrently signed.\n\n**Team roles**\n\n| Role | Members |\n|---|---|\n| Committers | Thales Pereira (\n|\n\n[@thcp](https://github.com/thcp))[@thcp](https://github.com/thcp))**How signing works**\n\nThe executable is built from this repository by the\n[Windows Release workflow](/stemdeckapp/stemdeck/blob/main/.github/workflows/windows-release.yml) on a GitHub-hosted runner,\nuploaded as a workflow artifact, and submitted to SignPath for signing. SignPath verifies the\nbuild's origin (repository, branch, commit, and build job) before the certificate is applied.\nEvery release signing request is approved manually by an approver listed above.\n\n**Privacy**\n\nStemDeck does not transmit any personal data. All audio processing happens on the user's own\nmachine. See the [Disclaimer](#disclaimer) for details.\n\n| Platform | Link |\n|---|---|\n| GitHub |\n|\n\n[discord.gg/2MVsWqaPRe](https://discord.gg/2MVsWqaPRe)[r/StemDeckApp](https://www.reddit.com/r/StemDeckApp/)[@stemdeck](https://www.instagram.com/stemdeck)[@StemDeckApp](https://x.com/StemDeckApp)[stemdeck.app](https://stemdeck.app)*(coming soon)*These are for development and testing. Release builds only recognize the variables marked \"release\".\n\n| Variable | Platform | Scope | Description |\n|---|---|---|---|\n`STEMDECK_DATA_DIR` |\nall | release | Override the user data directory (default: platform-standard location) |\n`STEMDECK_ROOT` |\nall | release | Override the app root directory (default: derived from executable path) |\n`STEMDECK_PYTHON` |\nall | debug builds only |\nOverride the Python executable path |\n`STEMDECK_FFMPEG_URL` |\nWindows, macOS | release | Override the FFmpeg download URL |\n`STEMDECK_FFPROBE_URL` |\nmacOS | release | Override the ffprobe download URL |\n\nIssues, feature suggestions, and pull requests are welcome. See open issues for what's planned.", "url": "https://wpnews.pro/news/stemdeck-free-open-source-local-stem-separation", "canonical_source": "https://github.com/stemdeckapp/stemdeck", "published_at": "2026-08-20 07:49:17+00:00", "updated_at": "2026-08-20 08:15:01.891817+00:00", "lang": "en", "topics": ["ai-tools", "artificial-intelligence", "machine-learning"], "entities": ["StemDeck", "Demucs", "Moises", "LALAL.AI", "ffmpeg", "librosa"], "alternates": {"html": "https://wpnews.pro/news/stemdeck-free-open-source-local-stem-separation", "markdown": "https://wpnews.pro/news/stemdeck-free-open-source-local-stem-separation.md", "text": "https://wpnews.pro/news/stemdeck-free-open-source-local-stem-separation.txt", "jsonld": "https://wpnews.pro/news/stemdeck-free-open-source-local-stem-separation.jsonld"}}