isolate.
Overview
Every stem splitter I found as a producer had a paywall or a sign-up wall before you could do anything. So I built the version that just works. Upload any MP3, WAV, or FLAC and get vocals, drums, bass, and melody back as separate files. Powered by Meta's Demucs model via Replicate. No account, no upsell. Drag, drop, download.
Tech Stack
Next.jsTypeScriptTailwind CSSZodReplicate API
Process
- Designed around one question: what is the simplest version of this that actually works? Every decision came back to that.
- Handled validation at two layers intentionally. Client-side for instant UX feedback, server-side with Zod as the real security boundary.
- Wired the Replicate API to run Demucs in the cloud so users need no GPU, no install, and no setup on their end.
- Built custom toast notifications for errors, an audio preview player before processing, and selective stem extraction so users only download what they need.
- Added memory cleanup for object URLs after noticing they leak in long-running sessions.

What I Learned
- TypeScript is not enough. It checks types at build time but disappears at runtime. Zod fills that gap by validating real data from real users.
- Client and server validation serve different purposes. Client is for UX, server is for security. You need both.
- Middleware is not a security boundary. Auth and validation belong inside route handlers, not in middleware that can be bypassed.
- Environment variables behave differently at build time versus runtime. Moving checks inside request handlers prevents build failures while still catching misconfiguration.
- Memory cleanup matters. Creating object URLs without revoking them leaks memory in long-running sessions.

