An acetate is the one-off reference disc a mastering engineer cuts before an album goes to press โ a personal cut of the real thing. This is that, for a listening life: every play since 2012, archived on hardware I own, analyzed by neural networks that have listened to the entire library, and turned back into playlists, maps, and answers.
Playlists and liked songs are content-hashed and snapshotted on change. A deleted playlist โ or a song that quietly un-likes itself โ leaves a trace forever.
The GDPR export reaches back to 2012; a 15-minute poller keeps it current with no gaps. A canonicalization pass collapses duplicate track IDs so your favorites don't split their counts.
Year, quarter, month or week โ top tracks, artists, genres, discovery rate, listening clock. In July, without asking anyone.
Monthly liked archives, top-played rotations, lost gems. Proposed and maintained by robots that can never touch a playlist a human made.
Every track is embedded from actual audio โ a genre-shaped space (discogs-effnet) and a description-shaped one (CLAP). Genre stops being metadata and becomes a property of the sound.
The library as a 3D point cloud โ UMAP over the embeddings, HDBSCAN finding the continents. Taste, it turns out, has geography.
In late 2024, Spotify turned off the APIs that made this hobby possible for new apps. The message was clear: if you want analysis, compute it yourself โ from your own listening history, open data, and the audio itself.
So acetate does. It runs on a small box at home. Spotify can't delete it, redesign it, or decide the feature I use isn't worth maintaining.
Everything sits on one SQLite file. That's not a compromise โ it's a thesis: at personal scale, a single WAL-mode file outruns any database you'd deploy, backs up with cp, and will still open in thirty years.
acetate is a uv-managed Python app: FastAPI + HTMX dashboard, APScheduler jobs, one SQLite file, Docker Compose on whatever box you own. Nothing about it is specific to my library โ that's just the copy it grew up around.
The open-source repo is coming soon. The code was built in the open with my own listening data wired all the way through, and separating the instrument from the specimen deserves a careful pass, not a Friday-night force-push. Until then, the journey post is the documentation: the architecture, the model choices, and the graveyard of what not to build.
How a playlist-backup script became a lab notebook: the genre saga (four acts, one heartbreak), teaching machines to hear and to read, the dependency-hell trophies, and the graveyard of roads not taken โ with real spectrograms, real cosine matrices, and real numbers from the real database.