The project's README from github.com/danielravina/stemkit. As one markdown file: README.md.
Split any YouTube song into isolated stems — vocals, drums, bass, guitar, piano and more — right on your machine.
Search YouTube or paste a link, pick the instruments you want, and play the result like a mini DAW: the video on one side, every stem on its own fader, all perfectly in sync. Karaoke, acapellas and instrumentals are one click away.
Everything runs locally — no accounts, no cloud, no API keys.
Grab installers from Releases:
StemKit-x.y.z-mac-arm64.dmgStemKit-Setup-x.y.z.exe (installer) or portable .zipStemKit-x.y.z-linux-x86_64.AppImage (portable, self-updating) or StemKit-x.y.z-linux-amd64.debFirst launch creates a private Python environment and downloads the separation engine (~2 GB) — one time. ffmpeg is bundled — nothing else to install.
Optional quality upgrades live behind a gear icon in the app (Settings), each with its own one-time download:
macOS first launch: builds are signed with a Developer ID but not notarized, so macOS may say it "cannot verify the developer". One-time fix: System Settings → Privacy & Security → Open Anyway (or
xattr -cr /Applications/StemKit.app).Windows: SmartScreen may warn on first run — "More info → Run anyway".
npm install
npm run dev
Wrong Node version? Scripts auto-relaunch with a suitable one (nvm / nvm-windows).
bash scripts/fetch-ffmpeg.sh # mac/linux (one time)
powershell scripts/fetch-ffmpeg.ps1 # windows (one time)
npm run dist # mac dmg -> release/
npm run dist:win # windows nsis+zip -> release/
npm run dist:linux # linux AppImage+deb (x64) -> release/
npm run dist:all # both (on the matching OS)
Linux: building the
.debneedsdpkg+fakerooton the host; running the.AppImageneeds FUSE. In-app self-update works on the AppImage —.debinstalls update by re-downloading.
Releases are built by GitHub Actions:
v* → binaries attach to a draft GitHub Releaseworkflow_dispatch ("Run workflow") → on-demand artifacts on the run pagemacOS builds are Developer-ID-signed when the certificate is available — see Signing in CI below for the one-time setup, plus optional notarization.
Local builds sign with your keychain cert automatically. CI runners have empty keychains, so hand them the certificate via repo secrets:
Developer ID Application: ... → Export → .p12 (set an export password)CSC_MAC_P12 — the base64 string: base64 -i developer-id.p12 | pbcopyCSC_MAC_PASSWORD — the export password from step 1APPLE_ID, APPLE_APP_SPECIFIC_PASSWORD, APPLE_TEAM_ID and set repo variable ENABLE_NOTARIZATION to true (Settings → Secrets and variables → Actions → Variables). Requires an active Apple Developer membership — Apple's notary service rejects expired accounts.Without these secrets CI falls back to ad-hoc signing (app runs, but Gatekeeper complains on download).
YouTube URL ──► yt-dlp (+JS runtime) ──► bundled ffmpeg ──► mel-band roformer (vocals) ─┐
│ ├─► stems/*.wav
└─────────────► demucs htdemucs ────────────────┘
(drums/bass/other, shift-averaged)
Electron renderer ◄──── IPC events ─────┘
video iframe (muted) + Web Audio stem playback · master clock = the audio itself
yt-dlp + the challenge solver together).src/main Electron main process (pipeline, env bootstrap, library)
src/preload IPC bridge
src/renderer React UI (player, sync engine, waveforms)
python/ separate.py (demucs) and roformer.py (neural vocals) with JSON progress output
python/vendor/ patched model code — see python/vendor/README.md
scripts/ node runner, ffmpeg fetchers
build/ icon sources