OwnTone

Media server with AirPlay, Chromecast and Spotify support

Media Servers ★ 2.6k stars Medium setup GPL-2.0

OwnTone is a media server that streams music to AirPlay and Chromecast devices, with support for Spotify and internet radio. It serves your local library through DAAP and the Subsonic API.

Key features

  • AirPlay and Chromecast output
  • Spotify integration
  • Internet radio

Pros & cons

Strengths

  • Excellent AirPlay support
  • Low footprint

Trade-offs

  • Web UI is minimal
  • Configuration via files

OwnTone replaces

Last reviewed Sep 13, 2026 · 893 words

Most self-hosted music servers are built to stream to a phone. OwnTone is built to stream to the speakers already in your rooms. It discovers AirPlay 1 and 2 receivers and Chromecast devices on the network, lets you group them, and plays your local library, internet radio and Spotify to them in sync, from a C daemon that idles at well under 128 MB. It started life in 2009 as forked-daapd, it is GPL-2.0, and it remains the best answer to a specific question: "I have a NAS full of FLAC and a house full of HomePods, how do I connect them without an Apple device in the middle".

Speakers are the interface, the web UI is the remote

Think of OwnTone as a jukebox with outputs. The web interface on port 3689 is a compact player: browse artists and albums, queue tracks, pick which speakers are active, set per-speaker volume. That is the whole UI, and the catalogue's "minimal" is fair. It works well on a phone browser, and beyond that OwnTone is controlled through protocols rather than apps. It speaks DAAP, so Apple's Music app and old iTunes see it as a shared library. It speaks the MPD protocol, so any MPD client on any platform becomes a remote. It has a JSON API for scripts and Home Assistant, which has a native OwnTone integration and is how I trigger the kitchen radio at breakfast.

What it is not is a Spotify-style app experience. There is no recommendation engine, no per-user accounts, no polished mobile client of its own. If your listening happens on headphones away from home, Navidrome with a Subsonic client is the better fit, and the your own Spotify with Navidrome walkthrough covers that. Many people run both against the same music directory: Navidrome for the commute, OwnTone for the living room.

Everything lives in one config file

There is no settings page. OwnTone is configured in /etc/owntone.conf, and the four lines that matter are:

general {
  uid = "owntone"
  db_path = "/var/cache/owntone/songs3.db"
}
library {
  name = "Music on the NAS"
  directories = { "/srv/music" }
}

Point directories at the library, start the service, and the scanner indexes everything with inotify watching for changes afterwards. A 20,000-track library scans in a few minutes on a Raspberry Pi 4. Playlists are plain M3U files dropped into the library; radio stations are M3U files containing stream URLs, which is how the internet radio feature works. The file-based configuration is a con for people who expect a wizard and a pro for anyone managing the box with Ansible.

Networking is the part to get right. AirPlay and Chromecast discovery rely on mDNS, so OwnTone needs Avahi running and needs to be on the same layer-2 network as the speakers. In Docker that means network_mode: host; a bridged container will start fine and find no speakers, which is the single most common support question. Bare-metal packages for Debian, Ubuntu and Raspberry Pi OS avoid the issue entirely and are the deployment I recommend.

Spotify works, with an asterisk

OwnTone integrates Spotify through librespot, so your Spotify playlists appear next to your local albums and play to the same speaker groups. The asterisk is that it requires a Spotify Premium account, playback comes through Spotify's own restrictions on concurrent streams, and every time Spotify changes its login flow the integration needs an update. It has been broken for weeks at a stretch in the past. Treat it as a convenience, not a dependency; the local library and radio are what OwnTone reliably does.

Multi-room sync is the strength. Grouping 3 AirPlay 2 speakers and a Chromecast into one zone and having them stay in step across a house is something commercial systems charge for, and OwnTone does it from a first-generation Pi. If you also have non-smart speakers on Pi-based players, Snapcast covers those and can take OwnTone's output as a source.

How it compares to the bigger music stacks

Against Navidrome and Gonic, OwnTone is the odd one out: those are Subsonic servers for remote listening, it is a local player for speakers. Against Mopidy, the closest peer in spirit, OwnTone has the far better AirPlay implementation and a lower footprint, while Mopidy has the plugin ecosystem. Against Music Assistant, which is the fastest-growing project in this niche, OwnTone is simpler, lighter and older, and Music Assistant is the one to pick if you want dozens of streaming providers and deep Home Assistant integration in exchange for a heavier install. For a household that is mostly Apple speakers and mostly local files, OwnTone remains the one I would install first.

What I'd do

Install the Debian package on the box nearest the music, on the same VLAN as the speakers, with the library on a local mount rather than over SMB. Add radio stations as M3U files, connect the Home Assistant integration, and leave Spotify off unless someone in the house is already paying for Premium. Pair it with Navidrome on the same library for phones. Total cost is 10 minutes of editing a config file and perhaps 80 MB of RAM, for whole-house audio that does not phone home.

Compare OwnTone

21 head-to-head comparisons.

Similar media servers apps