Adding stats to my music stack

Adding stats to my music stack

When I listen to music, I mostly play something from my local collection that I've been amassing since I was a teenager. (That's not to say it's particularly big, though.) I do use Youtube or Spotify as well, but way less, and I mostly use them for discovery.

For a long time, I had my music folder synced to my NAS, and I used a Synology app to download songs to my phone for offline listening. But over the years I got really fed up with that app and looked for a replacement.

The music stack

I recently bought cheap a laptop decommissioned from work and started using it as my home server. That's where my music stack now lives. It consists of Navidrome (the actual music server) and Substreamer (a web app that connects to Navidrome and acts as a nicer player). On Android, I also use the Substreamer and Ultrasonic apps - both connect to Navidrome and let me stream or download songs.

I spent an hour today downloading and storing various soundtracks I have on Steam and Itch; this is what they look like in Navidrome:


And on Substreamer's home page:


Stats and scrobbling

There are services like that let you 'scrobble' your music - i.e. log the songs you listen to and share and/or analyze them. The concept is somewhat appealing, but I don't like strangers having unnecessary access to my data, so I never used any such thing.

I thought - hey, can't Navidrome do something like that?
Turns out - no, it can't. So for a long time, that was that.

But yesterday I went ahead and installed a few more services. Without further ado, here they are:

Maloja: the star of the show. It ingests tracks and shows them on a nice dashboard. It also has many interesting breakdowns: you can see history and stats for various artists, albums, et cetera.


Here is the author's public instance, in case you want to try digging around. (Seems to be enjoying some k-pop today.)

Multi-scrobbler: Since Maloja doesn't load any data by itself, this works as a middle-man that integrates multiple systems; basically, it pushes song info from one system to another. I've set it up to fetch listening stats from Navidrome to Maloja. Then I also added Spotify - now I get both in a single dashboard!


It supports quite a few data sources. One disadvantage is that I don't get historical data, but whatever.

Your Spotify: a nice dashboard for Spotify data. I'd been eyeing this one for a while, but I couldn't be bothered to register a Spotify API app. However, I had to do that for Multi-scrobbler anyway, so why not do both. 🤷🏻‍♀️

Your Spotifyn

It seems to have a plethora of charts and dashboards, which at the moment of course are all empty in my instance. There's one big advantage: it should be able to import the entire Spotify history. I have requested an export and will try importing it - but they say it may take up to 30 days to prepare.

But it uses MongoDB, which I've been successfully avoiding so far. I resent having had to deploy it.

Tech info

Security is easy - I use Tailscale to connect to the laptop/server, so nothing is exposed to the Internet. That thing is a godsend.

Setup was done entirely with docker and the default compose files, except Your Spotify where I used the linuxserver's image.


The laptop this runs on only has limited storage - but the main limiting factor is its 8GB of non-upgradable RAM. Still, with over two dozen containers running it sits at ~40% memory usage, so all is well. (Note that for most of them, I'm the only user.)

In total, the 4 new containers (3 apps and MongoDB) seem to take up ~300MB, which is reasonable.

Navidrome is the biggest resource hog, taking up ~2GB RAM when listening to music. Substreamer takes up 13MB, which is impressive.

Summing up

I really like this setup so far. All my priorities are now met:

  • It still works offline-first: I can use the apps to download songs and listen without internet access.
  • I can stream anything from anywhere: Tailscale makes this safe and easy.
  • I get stats: though not for offline playback. That's okay.
  • It is private: nobody but me gets to see this. There are 'generate share link' features, but those will not work for anybody, since they're not on my Taliscale network.

We'll see if it holds up.