StemStudio is a local-first stem separation and mixing workspace. It imports songs from local files or YouTube, runs stem separation in the background, lets you compare runs, shape a mix, and export the result as stems, WAV, MP3, or bundles.
The app is built for local use. Source audio, generated stems, exports, logs, and the SQLite database stay under data/ by default and are ignored by git.
The screenshots use public-domain demo recordings so the repository can show the main flows without committing personal audio metadata.
- Import local audio files or resolve YouTube sources with
yt-dlp. - Queue one song or a batch of songs for stem separation.
- Choose stem presets and quality levels per run.
- Compare completed runs and mark the run you want to keep.
- Adjust stem gain, mute stems, and export mixes.
- Clean up temporary files, export bundles, and non-keeper runs from the app.
- macOS or another local Unix-like development environment.
- Python 3.10 or newer.
- Node.js 20 or newer.
ffmpegandffprobefor audio inspection, conversion, waveform metrics, and mixing.yt-dlpfor YouTube imports.- Optional:
audio-separatorfor real stem separation.
On macOS:
brew install ffmpeg yt-dlpInstall JavaScript dependencies:
npm installCreate the Python virtual environment and install the backend:
npm run setup:pythonInstall the optional processing dependency when you want real stem separation:
npm run setup:processingCopy the example environment file if you need to customize paths or binary names:
cp .env.example .envThe defaults work for the normal local setup, so .env is optional.
Run the API, worker, and Vite frontend together:
npm run devDefault local URLs:
- Frontend:
http://127.0.0.1:5173 - API:
http://127.0.0.1:8000
Run checks before sharing changes:
npm run lint
npm run typecheck
npm run buildnpm run check runs the frontend typecheck and production build.
backend/ FastAPI API, SQLAlchemy models, services, worker code
frontend/ React and Vite app
scripts/ Local helper scripts
data/ Runtime database, uploads, outputs, exports, logs, caches
Only .gitkeep files under data/ are intended to be committed. Do not commit uploaded audio, generated stems, model cache files, exports, logs, or data/app.db.
Runtime settings use the STEMSTUDIO_ environment prefix. The most useful values are:
STEMSTUDIO_FRONTEND_ORIGINSTEMSTUDIO_DATA_ROOTSTEMSTUDIO_DATABASE_PATHSTEMSTUDIO_UPLOADS_DIRSTEMSTUDIO_OUTPUT_DIRSTEMSTUDIO_EXPORTS_DIRSTEMSTUDIO_TEMP_DIRSTEMSTUDIO_MODEL_CACHE_DIRSTEMSTUDIO_FFMPEG_BINARYSTEMSTUDIO_FFPROBE_BINARYSTEMSTUDIO_SEPARATOR_BINARYSTEMSTUDIO_YT_DLP_BINARY
See .env.example for the default local values.
StemStudio is a local app. Audio files and generated artifacts are written to local disk, not to a hosted service. You are responsible for processing only files you have the right to use.
The model cache can become large. It lives at data/cache/models by default and is ignored by git.
If diagnostics report a missing binary, install it and restart the API and worker.
If the app cannot process audio, confirm that ffmpeg, ffprobe, and audio-separator are available inside the same Python environment used by scripts/run-python.sh.
If the frontend cannot reach the API, confirm that the API is running on 127.0.0.1:8000 and that STEMSTUDIO_FRONTEND_ORIGIN matches the frontend URL.
StemStudio is licensed under the GNU Affero General Public License v3.0. See LICENSE.


