Marc KelechavaPROJECTS · 3 MIN READ

Cosine Club Digger

2026 · in progress

A music-discovery app I’ve been building since January. I start from tracks I love and follow what they sound like, one step at a time, and every pick says why it’s there. No language model runs anywhere in it.

Cosine Club Digger in a browser: a player across the top, a trail of four steps on the left, step 4 listing tracks that sound like the label Ilian Tape in the middle, and a small map of the step on the right.
A dig that started from two Skee Mask tracks. Step 4 follows the label of a pick in step 1, Ilian Tape.

Digger runs on my laptop and opens in the browser. A dig starts from a track or two that I love, typed in or pasted as a Discogs, YouTube or cosine.club link. Each step asks cosine.club for the tracks that sound closest and lists up to 25 of them, best first. I play them in the built-in player and keep or pass as I go.

From any pick I can take the next step. It can be tracks that sound like the pick itself, like its label, like its artist, or like the records a producer or remixer on its credits worked on. The labels, artists and credits come from Discogs. A label step reads the label’s newest releases there and digs from up to five that cosine.club knows. A dig is the saved trail of these steps, so I can always walk back up it. The one in the screenshot has four steps.

Where the why comes from

No language model runs anywhere in Digger, so every reason is put together from the route the dig took. Select a pick and the inspector says something like “Sounds like Florian T M Zeisig - 85805. Nearness 0.97, rank 2 of 25.” A pick found from several seeds lists how close it is to each one.

With more than one seed, each seed’s list of neighbours votes by rank. A track scores the sum of 1 / (60 + rank) over the seeds that found it, with rank counted from 0. Rank fusion became the default on March 31. Before that Digger averaged the raw similarity scores, and the changelog entry for the switch says vinyl-sourced tracks no longer get buried by score miscalibration.

When a seed isn’t in cosine.club’s index, the step says so and digs from that artist’s tracks that are. 85805 is a track I own that cosine.club doesn’t have, so a dig from it opens with the note “Your file ‘Florian T M Zeisig - 85805’ isn’t on cosine.club. Using 2 indexed Florian T M Zeisig tracks instead: Been Listening A Lot, Aspire.”

The playlists

The tracks I keep and pass shape two private YouTube Music playlists, Digger Daily with about 20 tracks and Digger Weekly with about 50. Each run samples anchor tracks from my profile, the heavier ones more often and a fifth of them from the lighter half, so the less-used parts of my taste get a turn. It combines their cosine.club neighbours the same way a dig does. The weekly run also follows labels and artists one hop through Discogs.

Nothing I own, kept, passed on or was already served comes back. Served means a ledger, one SQLite table that records every track ever written to a playlist. Searching, playing and digging around teach Digger nothing about my taste. Only keeps, passes and the music I own do.

Each refresh replaces the playlist, then reads it back and checks it track by track. The check is there because YouTube Music doesn’t always store what it’s sent. It keeps some songs under another video ID, declines a few, and now and then puts a different recording in a declined song’s place.

There’s also an iPhone and iPad app. It pairs with the Digger on my computer over the local network with a token, and the phone and the browser show the same digs. For agents there’s a /dig command that turns a few tracks into a private playlist with a reason for every pick.

What it is not

It isn’t released. Version 0.4 hasn’t shipped and the repo is private, so you can’t install it yet.

The whys say where a track came from and nothing about how it sounds. A typical one names a seed, a nearness and a rank.

It only knows the tracks cosine.club has indexed. YouTube Music access goes through ytmusicapi with my own browser headers, which is unofficial and can break.

The audio model behind the similarity isn’t mine. The README credits Pablo Alonso-Jiménez, Xavier Serra and Dmitry Bogdanov for Music Representation Learning Based on Editorial Metadata from Discogs, ISMIR 2022, and none of it would work without cosine.club and Discogs.

All projects