‹ Index
Platform October 21, 2026

Still fly

Can't keep a player down. Mainstream is cool but in my heart forever underground - Big K.R.I.T.

BY THE NUMBERS PLATFORM · LIVE
WIKIPEDIA EDITIONS 25
CLASSICAL ALBUMS UNTIED 6,629
API SURFACE Article language, station albums
CONTAINERS HANDLING REQUESTS 2

The headline of 1.6 is Remote, and Remote doesn’t touch Kapell’s servers at all: one of your Macs controls another. It’s dope, but didn’t demand a lot of the backend. So we’ll prepare and polish!

Wikipedia, In Your Language

Until now, every Wikipedia excerpt in Kapell came from English Wikipedia. Kapell now loads Wikipedia’s links for 25 language editions (English, German, Japanese, French, Spanish, Swedish, Korean and more) and picks the article based on your language preferences — provided by the client, more on that later — falling back to English when there isn’t one in your language.

Each article now reports which language it came from and links back to that article, so you know what you’re reading. These language settings are provided by the Accept-Language header which I’d never used in anger! The client will let you choose that in the next release.

Share Pages Got Bigger

The /l/ pages that open when someone sends you a Kapell link, like this one for James Brown (on Kapell), used to be not much more than a “this opens in Kapell” handoff. Artist and album pages now have:

  • a row of Listen on chips (Apple Music, Spotify, Tidal, Qobuz and others) for friends who don’t have Kapell yet (philistines!),
  • links that MusicBrainz knows about (AllMusic, Discogs, Rate Your Music, Last.fm and friends)
  • a short Wikipedia excerpt, credited and localized as above,
  • a link to the MusicBrainz entry, and
  • a Six Degrees strip to start a chain from that artist.

This is all stuff Kapell has close at hand, so it’s inexpensive to render. I’m interested in expanding this later!

Classical, Continued

In an earlier platform note I added classical works. Two follow-ups:

  • Work names in English. MusicBrainz names a work in its original language, so you’d get “Sinfonia nro 7 C-duuri, op. 105” for Sibelius’s Seventh — whatever that is. Works now use the English alias where MusicBrainz has one, and the movements follow it, so their headers still line up with the work.
  • Box sets. Labels apparently love reissuing the same recordings in box sets and anthologies, which made it impossible for Kapell to tell which album was the real one. Kapell now breaks the tie by comparing track counts and ISRCs, which settled 6,629 albums that had been unmatched.

Places (studios, venues) also learned where they are. The graph now gives you a place’s area hierarchy, like the city, state and country rather than just a bare word.

Groove Engine prep

Kapell’s front page now teases the Groove Engine, which is my take on stations.

The engine “wanders” the credit graph (who played, wrote and produced what) from your seed artists to find the next track. I’ve been iterating on this quite a bit and have recently added:

  • keeping a share of each page close to the artists you started with,
  • following Apple’s songwriter credits, which reach new releases before MusicBrainz credits them,
  • hopping between records in the same scene and era, and
  • recommending albums, not just songs, while skipping compilations, DJ mixes and live albums.

It’s been interesting to make what is effectively a music recommendation algorithm that is a pure function, operating in tandem with a client that reports recently heard songs. I am looking forward to starting the 1.7 release cycle where I get to experiment with this more and see how it performs against the black-box systems in Apple Music. Anyway, expect a longer, more interesting post about this later.

Housekeeping

Not everything is glorious features. I’ve spent time reworking API services to be more flexible as I consider a hosting move or at least expansions.

  • The catalog moved out. The index behind genre browsing and artist discographies now runs as its own small service next to the API. The catalog service uses custom indexes and DuckDB, so has larger memory requirements. Now the API is smaller and easier to orchestrate.
  • Separate write pool. The API does a few writes — mostly cache fills. These connections have now been moved into their own pool for future flexibility.
  • Sorting. Collation/sorting have been adjusted to better accommodate database changes. I sorta track pages for a bit on Oct 8. Sorry about that!
  • Builds. CI builds have been improved with parallelization, and the API is now deployed as containers. There’s now a green and blue API instance to avoid outages on deploys!