The Problem
Navidrome is a great self-hosted music server. Fast, clean UI, solid Subsonic/OpenSubsonic API support. But Yamaha's MusicCast ecosystem doesn't speak that language. MusicCast uses DLNA/UPnP, which Navidrome doesn't serve natively.
The obvious workaround is to run a separate DLNA server like Gerbera or MiniDLNA pointed at your music folder. That works, but it means both containers need access to the same filesystem path, you're maintaining a second index of your library, and you lose any metadata or playlist structure Navidrome manages.
There's a cleaner approach: upmpdcli.
What upmpdcli Actually Does
upmpdcli is a UPnP media server that uses a Subsonic-compatible backend to serve content. You point it at your Navidrome instance via the Subsonic API, and it advertises itself on the network as a DLNA media server. MusicCast discovers it, browses it, and streams directly from Navidrome's library.
No shared volume mounts. No second database. No filesystem access required at all. upmpdcli acts as a protocol translator between the Subsonic API and UPnP.
That's the part that makes this setup worth writing about.
Prerequisites
- Navidrome already running and accessible on your network (Docker or otherwise)
- A Navidrome user account with API access (any account works)
- Your MusicCast device on the same VLAN as the machine running upmpdcli
- Host networking available for the upmpdcli container (required for UPnP/mDNS discovery)
The host networking requirement is non-negotiable. UPnP relies on multicast packets that don't survive Docker's default bridge networking. If your MusicCast gear sits on a separate IoT VLAN, you'll need a multicast proxy. More on that at the end.
The Docker Compose Setup
This is the whole thing. It's refreshingly short.
services:
upmpdcli:
image: giof71/upmpdcli:latest
container_name: upmpdcli
network_mode: host
environment:
- UPMPD_FRIENDLYNAME=Navidrome DLNA
- UPMPD_SUBSONIC_URL=http://192.168.1.X:<your-navidrome-port>
- UPMPD_SUBSONIC_USER=<your-navidrome-user>
- UPMPD_SUBSONIC_PASSWORD=<your-navidrome-password>
- UPMPD_SUBSONIC_ENABLE=yes
restart: unless-stopped
Replace the IP and port with your actual Navidrome address. The UPMPD_FRIENDLYNAME is what shows up in the MusicCast app when you browse for media servers, so name it something you'll recognize.
There are no volume mounts here. upmpdcli doesn't need access to your music files directly. It fetches everything through the Navidrome API and streams audio on demand.
Deploying on Unraid
On Unraid, the easiest path is to drop this into a new compose stack via the Docker Compose manager (or the Community Apps compose UI if you're using that). Set the network mode to host and paste in your environment variables.
Because upmpdcli uses host networking, it won't appear in Unraid's Docker network view the same way bridge-networked containers do. That's expected. Check that it's running with:
docker logs upmpdcliYou should see output indicating it connected to your Navidrome instance and started the UPnP advertisement. If it throws a connection error, double-check the URL. Even with host networking, localhost won't resolve to another container. Use the actual LAN IP of the machine running Navidrome.
Connecting MusicCast
Open the MusicCast Controller app. Navigate to the room with your device, tap the input source, and look for Server or Media Server. "Navidrome DLNA" (or whatever you set as the friendly name) should appear automatically within a minute or two of the container starting.
Browse in and you'll see your Navidrome library organized by Artist, Album, Genre, and Playlist. Select something and play it. Audio streams directly from Navidrome to the MusicCast device.
The playlists part is worth calling out specifically. Because upmpdcli pulls from the Subsonic API rather than just reading a filesystem, it can expose playlists you've built in Navidrome. A basic DLNA file server can't do that.
If Your MusicCast Gear Is on a Separate VLAN
UPnP discovery breaks across VLANs because multicast doesn't route between network segments. If you've got your IoT devices isolated (good practice with UniFi), you need to reflect those multicast announcements between VLANs.
Enabling IGMP snooping helps within a VLAN but won't bridge between them. For cross-VLAN UPnP, you need a multicast proxy. Running avahi-daemon with enable-reflector=yes on a host with interfaces on both VLANs handles this. It can also run as a Docker container with host networking:
services:
avahi:
image: flungo/avahi
container_name: avahi
network_mode: host
volumes:
- ./avahi-daemon.conf:/etc/avahi/avahi-daemon.conf
restart: unless-stopped
In your avahi-daemon.conf, set enable-reflector=yes under the [reflector] section. Once that's running, MusicCast should find upmpdcli even across VLAN boundaries.
What You're Trading Away
MusicCast's DLNA client is functional but not fancy. No queue management beyond what the device itself supports, no scrobbling, no smart playlists generated on the fly. You're browsing a tree, not using a purpose-built music app.
For day-to-day listening I still reach for Symfonium on my phone connected to Navidrome directly. But for whole-home audio through MusicCast receivers and speakers, upmpdcli just works. It's local, fast, and the only thing that can break it is Navidrome going down, which would break everything else anyway.
One container, a handful of environment variables, and your Navidrome library shows up on hardware that has no idea what a Subsonic API is.
Comments