# LMS: A Self-Hosted Music Streaming Server with Subsonic API and MusicBrainz Support

> LMS (Lightweight Music Server) is a C++ self-hosted music streaming application that exposes your local music collection through a web interface and a Subsonic/OpenSubsonic-compatible API. It handles multi-valued tags, artist role relationships, MusicBrainz identifiers, scrobbling to ListenBrainz and Last.fm, and an audio similarity recommendation engine built on MusicNN embeddings.

**epoupon/lms** — Lightweight Music Server. Access your self-hosted music using a web interface.

- Repository: https://github.com/epoupon/lms
- Website: http://lms-demo.poupon.dev
- Stars: 1,682 · Forks: 89
- Language: C++
- License: GPL-3.0
- Published: 2026-09-10 · Updated: 2026-09-10 · Language: en
- Canonical page: https://hysenlabs.com/projects/epoupon-lms

## What LMS Does and Who It Is For

LMS is a self-hosted music streaming server written in C++. Its primary purpose is to let you access your personal music collection from any web browser or Subsonic-compatible client application. The server exposes both a web interface and a Subsonic/OpenSubsonic API, which means it works with the large ecosystem of mobile and desktop clients that support the Subsonic protocol.

The target user is someone with an existing local music library who wants to stream it from a self-hosted server rather than a cloud service. LMS assumes the user manages their own music files and tags them with a tool like MusicBrainz Picard. The feature set leans toward users who care about metadata quality: multi-valued tags, artist role relationships (composer, conductor, remixer, etc.), MusicBrainz identifiers, and release group organisation.

A demo instance is available at lms-demo.poupon.dev, though the README notes that administration settings are not available there.

## Feature Set: Tags, Relationships, and Discovery

LMS organises music primarily through tags rather than directory structure, though it also supports directory browsing through the Subsonic API. Supported multi-valued tags include genre, mood, and artists. Artist relationships go beyond a single album artist: LMS tracks composer, conductor, lyricist, mixer, performer, producer, and remixer roles as separate fields.

For release organisation, LMS supports MusicBrainz release types (album, single, EP, compilation, live) and release groups, which let it show different versions of an album such as remasters and reissues. MusicBrainz identifiers are used to disambiguate artists and releases that share the same name.

Discovery features include tag-based filters, radio mode (which fills the queue with tracks similar to what is already playing), starred items, and random or recently-played queries. The recommendation engine has two modes: audio similarity using MusicNN embeddings, and tag-based similarity using genre, mood, grouping, and language tags. The README notes that audio similarity extraction throughput on a Raspberry Pi 4 ranges from roughly 1,000 tracks per hour; an Intel Core i5-13500 reaches roughly 25,000 tracks per hour.

Additional features include ListenBrainz scrobbling and listen synchronisation, Last.fm scrobbling, ReplayGain support, audio transcoding, multi-library support, podcasts, playlists, lyrics, and Jukebox mode.

## Tagging Conventions LMS Expects

LMS works best with tags written by MusicBrainz Picard using its default settings. The README explains that the `artist` tag should hold a single display-friendly value, while the `artists` tag should hold the actual artist names for multi-artist tracks.

For multi-album-artist scenarios, LMS supports the custom `albumartists` and `albumartistssort` tags alongside the standard `albumartist` tag. To populate these with Picard, the README provides a script to add to your Picard configuration:

```bash
$setmulti(artistssort,%_artists_sort%)
$setmulti(albumartists,%_albumartists%)
$setmulti(albumartistssort,%_albumartists_sort%)
```

The canonical artist name in LMS is taken from the `artist.nfo` file in an artist information folder if one is present. If the file exists but has no name field, LMS uses the containing folder name. Without an artist info file, LMS uses the artist name from the latest release.

Album track grouping is best done with the `musicbrainz_albumid` tag. Without it, LMS falls back to matching by album name, total disc count, compilation flag, record label, and barcode.

## Excluding Files with .lmsignore

LMS supports a `.lmsignore` file at the root of each media library to exclude files or directories from scanning. The README describes it as using a gitignore-inspired reduced syntax. The supported patterns are:

- `*.jpg`: ignores all `.jpg` files at any depth
- `/Unsorted/`: ignores only the top-level `Unsorted/` directory
- `extras/`: ignores any `extras/` directory at any depth
- `!cover.jpg`: re-includes a file previously excluded by a broader rule
- `?`: matches any single character except `/`
- `[abc]`: character class matching

Lines beginning with `#` are comments. An empty file has no effect. The README notes one important constraint: only one `.lmsignore` file per library root is supported. Files placed in subdirectories are ignored entirely.

This design is simpler than gitignore but adequate for common use cases like excluding cover art, temporary files, or an unsorted directory from the music scan.

## Comparison With Navidrome

Navidrome is another open-source self-hosted music server with Subsonic API support. It is written in Go and is one of the most commonly cited alternatives in the LMS community, as seen in the related search data for this project.

Both LMS and Navidrome implement the Subsonic/OpenSubsonic API and work with the same ecosystem of mobile clients. The practical differences are in the metadata handling and the recommendation engine.

LMS supports multi-valued artist role tags (composer, conductor, remixer, and others) as named fields and uses MusicBrainz identifiers to handle duplicate artist names. It also includes an audio similarity recommendation engine using MusicNN embeddings, which Navidrome does not offer. Navidrome has a reputation for simpler initial setup and broader documentation aimed at first-time self-hosters.

For users who want deep metadata and recommendation features and are comfortable with a more complex tagging workflow, LMS provides more of those capabilities. For users who want the quickest path to a working Subsonic server, Navidrome is the more commonly recommended starting point.

## Releases, Maintenance, and License

The repository is not archived. The last push was on 2026-09-23. Recent releases include v3.81.0 on 2026-09-18, v3.80.0 on 2026-08-19, and v3.79.0 on 2026-07-18, indicating a roughly monthly release cadence consistent with active maintenance.

LMS is licensed under GPL-3.0. This means redistribution or modification of the server itself must be done under the same license. Derivative works must also remain open source under GPL-3.0. The GPL does not restrict using LMS to serve your personal music collection.

The repository includes separate Docker build files for Alpine and Arch Linux distributions (Dockerfile-build-alpine, Dockerfile-build-arch), as well as a release Dockerfile. Installation and authentication backend details are documented in INSTALL.md, which is referenced in the README for authentication configuration. The repository also includes a SUBSONIC.md document that details the Subsonic and OpenSubsonic API support, including Jukebox configuration.

## Conclusion

LMS is a strong choice for users who want a self-hosted music server with deep metadata support, Subsonic client compatibility, and audio similarity recommendations without relying on external metadata APIs. It requires more setup effort than simpler servers, particularly for tagging conventions with MusicBrainz. Navidrome is a Go-based alternative with a similar feature set and broader documentation for first-time setup. Check INSTALL.md before deploying for authentication backend requirements.

## FAQ

### What is the best self-hosted music server?

LMS and Navidrome are two widely used self-hosted Subsonic-compatible music servers. LMS offers deeper metadata support with MusicBrainz IDs, multi-role artist relationships, and audio similarity recommendations. Navidrome is generally cited as easier to set up for first-time self-hosters.

### How can I stream my own music?

LMS lets you host your music collection on your own server and access it through a web browser or any Subsonic-compatible mobile or desktop client. It also exposes a Subsonic/OpenSubsonic API for third-party clients.

### What Subsonic clients work with LMS?

LMS implements the Subsonic/OpenSubsonic API, so any client that supports this protocol can connect to it. The README and SUBSONIC.md file document the supported API features, including Jukebox support.

### Does LMS support podcasts and radio?

The README lists Podcasts support as a core feature. Radio mode is a discovery feature that fills the play queue with tracks similar to those already in the queue, using either audio similarity (MusicNN embeddings) or tag-based similarity.

## Sources

- [epoupon/lms on GitHub](https://github.com/epoupon/lms)
- [License: GPL-3.0](https://github.com/epoupon/lms/blob/master/LICENSE)
- [Project website](http://lms-demo.poupon.dev)
- [README](https://github.com/epoupon/lms/blob/master/README.md)
- [Releases](https://github.com/epoupon/lms/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/epoupon-lms
