Selected Work

Case study

Discogs Spinner

A local-first desktop, web, and CLI companion for browsing, spinning, and understanding a personal Discogs record collection.

Discogs Spinner browse view showing a grid of album cover art from a synced record collection
The browse view: a local copy of the shelf, easier to scan than a long account page, with a one-click random pick.

What it is

Discogs Spinner is a local-first companion for vinyl collectors who already keep a Discogs collection. It syncs the shelf once, keeps the useful context close, and turns “what should I play?” into a small, repeatable workflow: browse, spin, inspect, and move on to the record.

A few plain answers up front:

Why I built it

My collection lived in a browser tab. I would scroll when I could not decide what to play, open a second tab to check what something was worth, and a third app once I finally picked a record. I wanted one focused tool that kept the shelf, the random pick, the wantlist context, and the market value in the same place, on my own machine. The first useful version was not a dashboard. It was a practical record-picker that could grow into analytics once the data was clean enough.

The collector loop

The app is built around a short, repeatable loop:

  1. Sync the collection and wantlist from Discogs into a local cache.
  2. Browse and filter the shelf in a gallery, carousel, or text view.
  3. Spin for a random pick that honors the current filters.
  4. Inspect the release: details, cached tracklist, market value, and wantlist context.
  5. Play or open the record, handing it to an external player when that is configured.
Animated demo of Discogs Spinner browsing the collection, spinning for a random record, and opening the release detail
The loop in motion: browse, spin, and inspect a release without leaving the app.

What works today

Screenshots

Technical shape

The project is mostly Python. One shared local data model sits behind three surfaces: the native desktop app, the dplayer CLI, and the web-app mode. Ingestion is kept separate from presentation, so the sync layer can pull collection, wantlist, and market data into a local cache while the views stay free to render from whatever is already on disk.

Practical details matter here. A personal access token is configured once. Cover art and tracklists are cached so the common workflows do not hammer the API. The desktop builds are packaged for Windows, macOS, and Linux, and every workflow is also reachable from the terminal, which keeps the tool usable over SSH or from a script.

Privacy and boundaries

Discogs Spinner is designed around a personal local cache. It uses a personal token and does not require an extra cloud account. Nothing about it asks the collection to leave the machine.

That boundary carries over to this page. The screenshots here are the sanitized ones from the public repository, and the writeup stays at the level of summaries and workflows. It does not publish a raw private inventory, prices for specific owned records, or anything that belongs in the local cache rather than on a public site.

This project uses the Discogs API but is not affiliated with, sponsored by, or endorsed by Discogs. Discogs is a trademark of Zink Media, LLC. Collection, wantlist, and market data in the screenshots is provided by Discogs.

What I learned

The useful lesson was the same one I keep relearning in professional data products: ingestion, modeling, and presentation need different boundaries, and the best interface starts from the decision someone is actually trying to make. A small personal tool benefits from the same discipline as a larger one. Keep enough source detail to rebuild any view, separate the sync from the screen, and design the surface around a real human moment, which here is simply deciding what to put on the turntable.

Try it / source

What’s next

The next useful improvements are sharper collection health checks, clearer wantlist workflows, and more focused “what should I play?” views. There is also a longer-term naming question worth sitting with: a unique mark such as “Crate Spinner for Discogs” would read more clearly as an unaffiliated tool. That is a future exploration, not this pass; for now the page documents the current public project name and repository.