Gamedev, graphics, open source. Shuffling bytes and swizzling vectors since 2004...
12 October 2025
diig is a music discovery app and the beginnings of a music platform that I started working on a few years ago. In that time I have been using the app myself, and so have a few friends, but I haven’t really announced much about it so I thought I would get some words down about the project. The name diig comes from the term crate digger which is given to record collectors who dig though vast quantities of records to find hidden gems.
The idea came from a frustration in my user experience of online record stores. Online record shops have audio snippets of the records they sell so you can browse and listen before you buy, obviously if you want to buy music it is usually best to know what it sounds like first (although I have been known to buy blindly, especially if it has a really cool sleeve or artwork!). The problem with these websites is that their music players are not perfect, consistency across different stores is variable, the desktop versions of websites usually perform much better than the mobile ones, and I just found the general UX of listening to snippets while browsing online just never felt how I wanted it to.
I am mainly interested in buying physical vinyl records. The main goal of digging is to go through a lot of music as quickly as possible to find obscure things that your friends might not know, buying in physical shops is nice especially if you have a store where they let you listen before you buy and the responsiveness of dropping a needle into a groove, skipping through tracks is really nice. But in the modern world with so much music being released all the time, online shopping is still a crucial part of record collecting for me and I have to buy some stuff online I won’t find anywhere else. The two can also compliment one another - it’s nice to have an idea of stuff you like in advance of visiting a physical store.
For the first part of the project my focus has been on a mobile app and I wanted to optimise that experience. So what constitutes feeling nice? And what am I trying to optimize for here? I found online record store players to be quite laggy with a good deal of latency between pressing play on a track and actually hearing the audio, we are talking fine margins here but if you want to listen through something like 400 snippets of audio in 10 minutes then the latency adds up. I also found the UI just not great for mobile, having to click instead of swipe just doesn’t help the experience and makes it feel clunky.
There was one place that I found to be really nice in terms of UX for browsing music snippets and this was on Instagram. Record labels would put up new releases and you could swipe right to go through the individual tracks. The problem is that the Instagram algorithm pollutes everything and you can’t curate a purely music only feed. So with this idea in mind, I was sure I could implement something similar to provide myself a niche app tailored perfectly to my use case.
Having worked on game engines, games and low level high performance systems I knew I had the skills to make the app. I also had the added boost and insights from the previous company I worked at where we made the live action branching narrative game Erica, which required low latency video and audio playback. Here I was dealing with streaming, buffering, and decoding audio and high definition video… I thought to myself just having to play some compressed mp3 snippets is going to be easy!
It was in fact easy, the iOS app itself was up and running in a couple of weekends. I also “rawdogged” pretty much all of this code, no LLM and no Copilot. I had a head start because I used my game engine pmtech to do all the graphics, os and low level stuff. The app is mostly C style C++ with some objective-C for iOS and I built the UI in ImGui. To get data into the app I am scraping info from my favourite record shops. The scrapers are written in python and use simple ad hoc parsing code which just extracts information about releases, mp3 and image links into a simple unified schema. The releases are uploaded to a firebase database where they can be fetched from the app and you can log in as a user to store your own likes and sync over different devices. Scrapers run nightly on a GitHub action and once a release has been populated on the initial scrape their availability is the only thing that needs updating, that is if it is available for preorder, available to buy in stock, or out of stock. The scrapers also track position information so that you can view things in a chart format as the record stores usually have a chart for each genre or category. I have an automated GitHub action which can be used to push updates to the app to iOS via TestFlight, but the app doesn’t need updating often and the data it pulls is all stored and updated in the cloud.
And that is about it, the main app and scraper ecosystem has been up and running for a few years and I have been using diig to help me browse for and discover new music. I recently added a new scraper to the project and put some videos on YouTube about that process in more detail. I plan on continuing work on this project and now have some ideas for more components to the diig platform. I would like to add Android support and also a web front end that can provide a different user experience. All of this stuff is currently in closed beta, if you’re interested in trying it out then please contact me. If you want to contribute the code is available on GitHub.