Fade To
Curator-first music platform with in-browser mixing
Weekly mixtape-shape Drops and curated Scenes on top of Spotify, Apple Music, and YouTube Music. In-browser mixing engine with Camelot harmonic key matching and equal-power crossfade over the YouTube IFrame API. Three-layer architecture designed for swappable AI engines.
Mixing
In-browser, equal-power
Key matching
Camelot wheel
Platforms
YouTube · Spotify · Apple
Paid product
/curate (events)
The problem
What I set out to solve
Streaming services optimize for autoplay, not curation. Real playlist artistry — mixed with harmonic key changes, deliberate energy arcs, cue-point crossfades — has nowhere to live between DJ software and a Spotify playlist. And nobody has a good way to buy a professionally-curated playlist for a specific event.
What I built
The build
- Weekly Drops — mixtape-shape releases with a curator arc, embedded palette, and per-track cue points.
- Scenes — explorable rooms with palette + sound, tag-queryable.
- Personal Vols — user-saved curated playlists that grow, saveable to Spotify / Apple Music / YouTube Music.
- In-browser mixing engine — YouTube IFrame API + equal-power crossfade + Camelot harmonic key matching. Pre-buffering, per-track cue points, mixer state machine — all client-side.
- /curate — paid event playlists (weddings, parties, dinners). Standard and Full tiers.
- Three-layer architecture (UI → Engines → Adapters) with a lint rule preventing engines from importing React — so heuristic v1 engines can swap to AI-augmented v2 without touching consumers.
Key decision
Why the three-layer architecture with swappable engines
The mixer runs on heuristics today (Camelot compatibility + BPM proximity + equal-power crossfade math). Some engines — curate, living (find fresh tracks for saved Vols), scene-match, recommend — will only get good with AI. But I don't want the UI to know or care. Engines are pure TypeScript, no React, no DOM, tested in Node. Adapters wrap external I/O (YouTube, Spotify, OpenAI). UI dispatches intent, engines resolve it. A lint rule enforces that engines never import React — so v2 AI engines drop in with zero consumer changes.
Outcome
Where it landed
- ✓Mixer engine fully built and shipping — Camelot key matching + equal-power crossfade over YouTube.
- ✓Make engine has a heuristic v1 implementation.
- ✓Adapters implemented for Apple, Spotify, YouTube, Supabase, Resend.
- ✓OpenAI adapter and Curate engine are typed interface stubs — ready for AI wiring without changing anything above them.
Stack
Deep dive
Going deeper
Optional reading for the technically curious.