Maloja
Maloja gives you music scrobble database for personal listening statistics and charts on your own infrastructure.
Self-hosted music scrobbling, honestly reviewed. What you actually get when you stop trusting Last.fm with your data.
TL;DR
- What it is: A self-hosted scrobble database — track every song you listen to, build personal charts and listening statistics, and own the data entirely [2][3].
- Who it’s for: Music obsessives who use Last.fm or ListenBrainz today and want the same functionality without handing their listening history to a third party. Also anyone who got burned by Last.fm’s declining reliability and wants a local backup [4].
- Cost savings: Last.fm is nominally free, so the case for Maloja isn’t primarily financial — it’s about data sovereignty and permanence. Your scrobble history on Last.fm is hostage to a service that’s been in slow decline for years. Maloja runs on a $5–10/mo VPS and the data is yours in flat files [3].
- Key strength: Drop-in compatible with the entire Last.fm and ListenBrainz scrobbler ecosystem — your existing apps work without modification [3]. File-based storage means no database to manage and trivially simple backups.
- Key weakness: 1,674 GitHub stars puts this solidly in the “niche but maintained” category rather than “well-funded project with a roadmap.” It’s a one-developer project, the website is unavailable at time of writing, and documentation is thin outside the README [1][merged profile].
What is Maloja
Maloja is a Python application that records every track you play — a “scrobble” — and turns that stream of plays into personal listening statistics: top artists, top albums, top tracks, listening trends over time, hourly and weekly patterns. Think Last.fm but running on your own server, storing data in flat files on your own disk [2][3].
The pitch in the GitHub README is direct: “Simple self-hosted music scrobble database to create personal listening statistics.” The developer runs a public demo at maloja.krateng.ch so you can see what it looks like before installing [README].
What makes it practically useful rather than just a fun side project is that it implements the Last.fm scrobbling API and is compatible with the ListenBrainz API — meaning every scrobbling client that already works with Last.fm (Web Scrobbler browser extension, Pano Scrobbler on Android, multi-scrobbler, and dozens of others) works with Maloja out of the box, with no changes [3]. You point your existing scrobbler at your Maloja server instead of at Last.fm, and everything else continues working. One user described setting it up alongside Navidrome for music streaming: “I also set up Maloja as a self-hosted last.fm / Listenbrainz alternative (and imported all my legacy data in). Navidrome has built-in support for both Listenbrainz and last.fm, so I’m going to continue mirroring my data to both, but I like that I can hit the eject button any time I want and move purely to a self-hosted solution.” [4]
The project sits at 1,674 GitHub stars [merged profile] and is maintained by a single developer (krateng). It’s GPL-3.0 licensed, written in Python, and deployed via Docker.
Why people choose it
The self-hosted community’s case for Maloja comes down to three specific frustrations with Last.fm:
Data ownership. Last.fm has no export tool that gives you your complete history in a clean, portable format. Your 15 years of scrobbles live in their database and you access them through their API — which they can rate-limit, change, or shut down. Maloja stores everything in flat files you can copy, inspect, and move at will [2][3]. If the service disappears or the developer stops maintaining it, your data is already sitting in a directory on your hard drive.
Accuracy and tagging control. Last.fm normalizes your track metadata against their music database, which sometimes mangles artist names, merges artists incorrectly, or forces their tagging schema onto your library. Maloja explicitly doesn’t sync with any public music database: “Your library is not synced with any public or official music database, so you can follow your own tagging schema.” [README] You can configure rules to fix inconsistencies and merge duplicate entries the way you want them merged, not the way MusicBrainz thinks they should be [3].
No feature creep. Last.fm has been accumulating social networking, recommendations, radio, and promotional content for two decades. The README’s “Keep it Simple” feature is deliberately listed as a selling point: “Unlike Last.fm and similar alternatives, Maloja doesn’t have social networking, radios, recommendations or any other gimmicks. It’s a tool to keep track of your listening habits over time — and nothing more.” [README] For users who want a clean statistics dashboard without being nudged toward concert tickets, that restraint is a feature.
Proxy scrobbling. Rather than forcing you to choose, Maloja can forward your scrobbles to Last.fm and ListenBrainz simultaneously — so you keep your public profile on those services while also maintaining a local backup [README]. This is the setup the cassie.ink user described above [4]: redundancy without friction.
Features
Core scrobbling and statistics:
- REST API compatible with Last.fm and ListenBrainz scrobbling clients — existing apps work unchanged [3]
- Charts for top artists, albums, and tracks over any time period [3]
- Hourly and weekly listening trend visualizations
- Manual scrobble entry via web interface — for vinyl, CDs, or anything you can’t scrobble automatically [README]
- CSV import from Last.fm, ListenBrainz, Spotify, and other sources [3]
- Proxy scrobble — forward scrobbles to other services simultaneously [README]
Data and metadata handling:
- Associated Artists — link subunits, collaboration projects, and solo work by band members so they compete in a single artist’s chart rather than fragmented entries [README]
- Multi-Artist Tracks — tracks listed as “Artist A feat. Artist B” count for both artists individually rather than creating a separate “Artist A feat. Artist B” entity [README]
- Artist name rules engine — configure how inconsistent metadata gets normalized [3]
- Custom artist images — upload your own instead of relying on community-selected photos [README]
Infrastructure:
- File-based storage — no external database needed, backup is a directory copy [3]
- Docker and Podman deployment [README]
- REST API for external integrations [merged profile]
What it deliberately doesn’t have: social features, music recommendations, radio, or anything that would make it a platform rather than a tool.
Pricing: SaaS vs self-hosted math
This is a different calculation than most self-hosted tools because Last.fm is free. The case for Maloja isn’t saving money — it’s data permanence and control.
Last.fm:
- Free with ads and promotional content
- No complete data export
- Scrobble history is theirs, accessed via API at their discretion
- The service has been declining in development investment since CBS sold it in 2014
ListenBrainz:
- Free, open-source, non-profit (MetaBrainz Foundation)
- Better data export than Last.fm
- Still a third-party service you depend on
- Less polish than Last.fm for statistics visualization
Maloja self-hosted:
- Software: $0 (GPL-3.0)
- VPS: $5–10/mo on Hetzner, Contabo, or similar
- Your scrobble data: in a directory on your server, in an easily-parseable format
The honest framing: if you’re currently happy with Last.fm’s free tier and don’t care about data ownership, Maloja doesn’t save you money — it costs you VPS spend you weren’t paying before. The value proposition is entirely about owning your history and being immune to Last.fm’s continued decline. For someone with 10+ years of scrobble history, that’s a real concern. For someone who started scrobbling last month, it’s less urgent.
The practical middle path — and what the cassie.ink user does — is run Maloja as a local backup while still scrobbling to Last.fm/ListenBrainz via proxy mode [4]. You keep the social profile on public services and gain a local copy that can’t be taken away.
Deployment reality check
The README is explicit on one point: Docker only. The developer states: “To avoid issues with version / dependency mismatches, Maloja should only be used in Docker or Podman, not on bare metal. I cannot offer any help for bare metal installations.” [README]
A minimum working Docker command:
docker run -p 42010:42010 -v $PWD/malojadata:/mljdata -e MALOJA_DATA_DIRECTORY=/mljdata krateng/maloja
The container runs on port 42010 by default. You’ll want a reverse proxy (Caddy or nginx) in front of it for HTTPS and a real domain.
Environment variables that matter:
MALOJA_SKIP_SETUP— required for non-interactive container startupMALOJA_FORCE_PASSWORD— set your admin password on first runMALOJA_DATA_DIRECTORY— where your data volume mountsPUID/PGID— needed on Docker/Linux to avoid file permission issues with the mounted volume [README]
For artist images you’ll need API keys from Last.fm and Spotify — the README cuts off mid-sentence on this point, but the implication is that images are fetched from those services rather than shipped locally [README].
Realistic time to working install:
- Docker-comfortable user: 20–30 minutes to a working instance
- Someone setting up Docker for the first time: 2–3 hours including domain and reverse proxy
- Non-technical user with no Linux experience: find someone to help or use a managed deployment service like Zeabur [3]
One practical note from the Zeabur deployment guide: “on first access, you’ll set up your admin credentials and API key” — the initial setup is interactive through the web UI, not config file editing [3]. That’s a better experience than many self-hosted tools that require you to edit YAML before you can log in.
What can go wrong:
- The developer’s website (maloja.krateng.ch) returned a fetch error at time of writing [merged profile] — either intermittent or the demo is currently down. For an active project this is a yellow flag.
- This is a single-developer project at 1,674 stars. There’s no company behind it, no commercial license tier, and no support contract available. If it breaks, you fix it or wait for the developer.
- Documentation outside the README is sparse. The README itself cuts off partway through — the full text wasn’t available in our scrape.
Pros and cons
Pros
- Compatible with every existing Last.fm scrobbler. Web Scrobbler, Pano Scrobbler, multi-scrobbler, and anything else that speaks the Last.fm or ListenBrainz API works with no changes [3]. Setup is pointing your existing tool at a new URL.
- File-based storage — no database to manage. Your scrobble history is flat files. Backup is
rsync. Restore isrsync. Inspect it with any text editor. No PostgreSQL migrations, no Redis memory tuning [3]. - Proxy scrobbling. You don’t have to choose between Maloja and Last.fm — run both simultaneously [README][4]. This is the practical “belt and suspenders” setup most users actually want.
- Clean focus. No social features, no recommendations, no ads, no corporate roadmap. It does one thing [README].
- Manual scrobble entry. For vinyl, CDs, cassettes, or any format that doesn’t have a scrobbling client [README].
- Data import from Last.fm, Spotify, ListenBrainz. You can migrate your history rather than starting from zero [3].
- Associated Artists and Multi-Artist Track handling. Better than Last.fm’s approach to subunits and featured artists [README].
- GPL-3.0 license. You can inspect, fork, and modify the code. Unlikely to matter for most users but it’s the right license for a privacy-focused tool.
Cons
- Single-developer project. 1,674 stars is healthy for a niche tool, but there’s no company, no team, and no paid tier funding ongoing development [merged profile][1]. If krateng stops maintaining it, you’re either on your own or on the last working version indefinitely.
- Demo site was unreachable at time of writing [merged profile]. For a project where the developer runs a public demo, this is a yellow flag about overall reliability and maintenance attention.
- Sparse documentation. The README is the primary documentation and it’s not comprehensive. Zeabur and community guides fill some gaps, but there’s no official docs site with a full configuration reference [3].
- Images require external API keys. Last.fm and Spotify API keys are needed for artist artwork — you haven’t fully escaped those services if you want images [README].
- No SSO, no multi-user features. Maloja is a single-user tool. If your household has multiple people who want separate scrobble histories, you’d need separate instances [3].
- Python + Docker only. Bare metal installs are explicitly unsupported [README]. This is fine for most deployments but limits options on some homelabs.
- Limited third-party review coverage. Unlike major self-hosted tools with dozens of independent reviews, Maloja has thin coverage — most “reviews” are brief directory listings [2][5]. It’s harder to form a full picture from outside perspectives.
Who should use this / who shouldn’t
Use Maloja if:
- You’ve been scrobbling to Last.fm for years and want a local backup before the service degrades further or you want to leave.
- You care about your listening history but don’t want to depend on a third-party service staying alive and maintaining your data faithfully.
- You’re already running a Docker homelab and adding another container is trivial.
- You want custom tagging control — your own artist associations, your own image choices, no external database imposing a canonical metadata schema on your library.
- You want to keep scrobbling to Last.fm and have a local backup — proxy mode makes this a non-choice.
Skip it if:
- You want recommendations, social features, or music discovery — Maloja explicitly doesn’t do these [README].
- You’re not comfortable with Docker and have no one to help deploy it.
- You want a well-staffed project with paid support options.
- You’re happy with Last.fm’s free tier and don’t care about data ownership.
Consider ListenBrainz instead if:
- You want a free hosted alternative with better ethics than Last.fm (non-profit, open source) but aren’t ready to self-host. You can run both — Maloja proxies to ListenBrainz.
Alternatives worth considering
- Last.fm — the incumbent. Free, massive dataset, music recommendations and social features, but closed-source, declining investment, and no real data export. Your history is theirs.
- ListenBrainz — open-source, non-profit, free hosted service by the MetaBrainz Foundation. Good option if you want the ethics of open source without self-hosting. Maloja can proxy to it simultaneously.
- Funkwhale — broader self-hosted music platform (streaming, library management, social federation). More complex, does far more than scrobbling, ActivityPub support for federation between instances.
- Beets — music library manager and tagger (CLI, Python). Handles metadata and organization rather than scrobbling statistics, but complementary to Maloja for anyone who cares deeply about their music library. Listed on the same awesome-selfhosted page [5].
- multi-scrobbler — a scrobbling proxy/aggregator that feeds multiple services simultaneously. Not a statistics tool, but useful alongside Maloja for routing scrobbles from multiple sources.
For someone who just wants out of Last.fm: the realistic choice is Maloja vs ListenBrainz. ListenBrainz if you want zero maintenance. Maloja if you want the data local and the statistics richer.
Bottom line
Maloja is a well-scoped tool for a specific kind of music nerd: someone with years of scrobble history who has started to notice that Last.fm is a service slowly going nowhere, and who wants a local copy of their listening data that can’t be taken away. The API compatibility with every existing Last.fm client is the key practical feature — you don’t rebuild your setup, you redirect it. File-based storage makes backup trivial. Proxy mode means you don’t have to choose between Maloja and staying on Last.fm.
The caveats are real: this is one developer, the documentation is thin, and the demo was down at time of review. You’re not buying into a product with a roadmap. But for what it does — honest personal listening statistics, owned data, no social noise — it does it cleanly and the format is stable enough that it’s unlikely to break in ways that lose your data. If you’re already comfortable running Docker containers, the marginal cost of adding Maloja to your homelab is low and the data you preserve has value that compounds over years.
Sources
- r/selfhosted — “Want to self-host your last.fm data? I could use some beta testers!” reddit.com. https://www.reddit.com/r/selfhosted/comments/tzv67m/want_to_selfhost_your_lastfm_data_i_could_use/
- LinuxLinks — “Maloja - simple self-hosted music scrobble database” linuxlinks.com. https://www.linuxlinks.com/maloja-simple-self-hosted-music-scrobble-database/
- Zeabur — “Maloja Deploy Guide” zeabur.com. https://zeabur.com/templates/84M8F7
- cassie.ink — Week Notes #40 cassie.ink. https://cassie.ink/week-notes/40/
- awesome-selfhosted.net — Python platforms listing awesome-selfhosted.net. https://awesome-selfhosted.net/platforms/python.html
Primary sources:
- GitHub repository and README: https://github.com/krateng/maloja (1,674 stars, GPL-3.0 license)
- Official website: https://maloja.krateng.ch
- Docker Hub: https://hub.docker.com/r/krateng/maloja
Features
Integrations & APIs
- REST API
Related Media & Streaming Tools
View all 334 →Immich
95KHigh-performance self-hosted photo and video management — automatic backup, ML-powered search, and a Google Photos-like experience on your own server.
Jellyfin
49KThe volunteer-built media solution that puts you in control of your media. Stream movies, shows, music, and photos to any device from your own server.
PhotoPrism
39KAI-Powered Photos App for the Decentralized Web. Tag and find pictures automatically without getting in your way.
Cobalt
39KSave what you love without ads, tracking, paywalls or other nonsense. Just paste the link and you're ready to rock.
qBittorrent
36KAn open-source software alternative to uTorrent. Feature-rich and runs on all major platforms.
SRS
29KSimple, high efficiency, realtime video server. Supports RTMP, WebRTC, HLS, HTTP-FLV, SRT, MPEG-DASH and GB28181.