Most of my recent music listens have been based on algorithmically generated dynamic playlists on various streaming platforms. This is not a bad thing since I have found many good artists and songs this way. But there is another kind of playlists that I have historically underused: static playlists.
With static lists, I refer to plain fixed lists of songs that, when collected together, mean something. When a friend makes me listen to a few songs, they tell me why they are important, and there is a whole conversation that I keep with me whenever I listen to the same set again. This is not replicable in machines because my friend is unrepresentable.
I have come to appreciate static playlists more in the last few months because of the human connection. But I also found that, presently, it's hard to share context along with lists, and it's also just plain hard to share playlists across platforms, say from Spotify to your local Subsonic setup1. To solve these issues I built mbzlists with the help of unnu. It still has many rough edges but the core capability works fine.
mbzlists helps you create portable playlists that are annotated with rich text and images. Think of these as playlists blogs. Here is an example test list showing formatting capabilities. Here is another list that I wrote. The tool allows you to play individual songs on YouTube and Spotify, at the moment of writing. You can also play the whole list on YouTube and import in your Spotify account. Of course these lists are also Subsonic importable as that was one of my initial motivations.
1. Context & Portability
Mbzlists is a very simple system that sits on the shoulder of giants. It identifies tracks using the MusicBrainz database, and stores context along with songs using a custom XML extension over XSPF (spiff) data files. Playlist authors can add context and stories via annotation.
The web app is just assisting all these operations and allowing shareable view and edit links. But this can also be self-hosted, or you can just take the spiff files and use them directly without storing data on the server2.
I think it's also worth mentioning that if you just want universal playlist capabilities without annotations and are okay to have public lists, ListenBrainz already exists. Also XSPF itself is a format that's ready for universal usage but it needs content resolvers and some sort of universal identification to materialize that promise, which is what mbzlists does.
1.1. Format-First Development
While developing this, I realized that I should focus more on the data format than on the web app. So when someone is thinking about keeping a list private, it shouldn't come to the data storage policy of the application, but the availability of local tools to operate on the core file format. In this case, I would want mzblists-extended spiff files to be created and worked on locally without interacting with the web app. I mean the web application can stop having a database in an ideal world and can just be a local-first tool to work with list files.3
A point I would like to reiterate is that these annotated playlists are, by design, harder to machine-pollute. Of course I can generate one using an LLM, but making these lists is not the point, sharing is. When I make and share an annotated playlist, I plan to engage in a conversation with another human. While I can just share a link to an annotated playlist and broadcast on the internet, the point is for me to take the link with me, share it to someone in a way where it's expected that we both are interested in the story behind because of our personal dynamics.
If you have tried the tool or generally have views on how to do this, feedback, bug reports, conversations are all welcome. Also check out the documentation since not all workflows (specially search) are super intuitive right on the interface.