An acetate is the one-off reference disc a mastering engineer cuts before an album goes to press. Acetate does the same 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. Deletions and quietly un-liked songs leave 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.
Pick a year, quarter, month or week and see top tracks, artists, genres, discovery rate, and 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 its audio in two spaces: a genre-shaped space (discogs-effnet) and a description-shaped one (CLAP). Genre stops being metadata and becomes a property of the sound.
UMAP projects the embeddings into a 3D point cloud; HDBSCAN finds the clusters. Taste has geography.
In late 2024, Spotify turned off the APIs that made this hobby possible for new apps. I started computing the missing analysis from my 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. 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, and Docker Compose on whatever box you own. The app works with any library; mine is the dataset used during development.
The open-source repo is coming soon. The code was built in the open with my own listening data wired all the way through. Separating the instrument from the specimen deserves more than a Friday-night force-push. Until then, the journey post is the documentation: the architecture, the model choices, and the graveyard of things I tried and dropped.
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. It includes actual spectrograms, cosine matrices, and numbers from the database.