More IndieRadio(?) progress
You can always tell when I’ve been deep into a project when my feed reader stats go off-kilter:

Anyway yeah I’m working on the radio thing!
So far I’ve been focusing on the publishing side of things. In particular, I finally have a very basic end-to-end music feed. (This is a work in progress and I have a few things I want to change about the protocol. I will also be embedding a player onto that page!)
The technical details of this are fun, for me, anyway.
First, I’d improved camptown (the player component for bandcrash) so that it could generate embeds that look decent on my music website; this took the form of figuring out a fun CSS hack that lets you put basic layout options into the fragment of the embed URL. The short version of that is at the top level I have a bunch of empty divs like:
<div id="foo"></div> <div id="bar"></div> <div id="baz"></div>
and then I have CSS rules that basically treat their :target pseudo-elements like media queries:
#foo:target ~ main { display: none; }
I also built a script that let me quickly re-encode my albums, upload them to my static web hosting, and then ingest the data into my website, using the new #compact layout so that it doesn’t present redundant data. For example, on the page for Transitions.
The ingested data also includes metadata about each individual track’s stream URL, and then I use that to build the radio feed!
Not all of my albums are in the feed yet, and also the feed format needs some love (like I’ve come to realize that it really needs an optional album/track nesting), but this will be a nice proof of concept.
Next steps
My upcoming plan for this is to build the following:
- A JSON feed syntax because that would be a lot easier for folks to support, I think
- A basic radio (i.e. feed subscription and playback engine), as described in the previous thing (just using Authl for authentication)
- A script to ingest my purchased music collection into a private feed
My plan is to make all this stuff public, including making a public instance for folks to use, and then try to get other music platform creators to add radio feed support. Faircamp is an obvious choice, for example. I also know that the folks behind Mirlo are interested in potentially joining in.
JSON feed format
This would probably be easier to ingest and support than the html+mf2 concept.
{ "artist": "Sockpuppet", "links": { "homepage": "https://sockpuppet.band/", "support": "https://sockpuppet.band/support", "blog": "https://sockpuppet.band/blog/", "bandcamp": "https://sockpuppet.bandcamp.com/", "mirlo": "https://mirlo.space/sockpuppet" }, "images": { "band": "https://sockpuppet.band/static/_img/4b/9af2/band-photo_ecda7e6b14_q60.jpg", "icon": "https://sockpuppet.band/static/sockpuppet-icon.png", "thumbnail": "https://sockpuppet.band/static/_img/3c/b7c4/sockpuppet-band_a8816c25b3_480x480_0-0-2384-2384.jpg" }, "releases": [{ "title": "The War Machine", "url": "https://sockpuppet.band/track/the-war-machine", "releaseDate": "2025-08-01", "stream": "https://cdn.sockpuppet.band/the-war-machine/2a2346e1c910a39b891eb5b36d3266ec.mp3", "artwork": "https://sockpuppet.band/static/_img/48/7a98/the-war-machine_b3fee9285d.jpg" }, { "title": "Transitions", "url": "https://sockpuppet.band/album/transitions", "releaseDate": "2024-11-20", "artwork": "https://sockpuppet.band/static/_img/d5/d6a8/a1931562590_10_54907a6d53.jpg", "tracks": [{ "title": "I LOVE YOU", "url": "https://sockpuppet.band/track/i-love-you", "stream": "https://cdn.sockpuppet.band/transitions/93885817fb568d29e1dacbe8a865f0d2.mp3" }, { "title": "Repair My Heart", "url": "https://sockpuppet.band/track/repair-my-heart", "stream": "https://cdn.sockpuppet.band/transitions/7024fdae392583e7606eba821ba934f1.mp3" }] }, { "title": "We Did Everything We Could", "artist": "The Richard Donner Party", "releaseDate": "2021-09-02", "stream": "https://www.songfight.org/music/we_did_everything_we_could/richarddonnerparty_wdewc.mp3", "artwork": "http://www.songfight.org/pix/we_did_everything_we_could/cover400.jpg" }] }
I also think that the protocol itself needs a name and an appropriate <link rel> for the feed discovery, e.g. <link rel="indieradio" href="https://sockpuppet.band/radio"> or something. I am very much open to suggestions.