A free music player for macOS · self-hosted · agent-native
Conduct your music.
Baton has a music friend: ask for something in plain language and it works out what you meant, then plays it from your own library. "Something calmer." "What is this?" "Play the live version instead." Underneath, it is a careful player for the library you already own (your Navidrome or Subsonic server) with the depth most desktop apps skip: true gapless, ReplayGain, a real EQ. It also hosts an MCP server, so any AI agent can pick up the baton too.
Free. No account, no subscription, no catalog rent.
What Baton looks like
Shown with the public Navidrome demo library — Creative Commons music from blocsonic. Baton itself ships with no catalog; you bring the library.
No. 1 The agent angle
A player your agent can actually drive.
Every music app has buttons. Baton also has a control surface for software:
an embedded MCP server on
127.0.0.1, token-authenticated, exposing playback, search, queue, and
playlists as tools. Point Claude Desktop, Claude Code, or any MCP client at it,
and you can just ask for your music instead of clicking for it.
Not a plugin. Not a cloud API with OAuth and rate limits. A documented localhost
interface where every capability the UI has, an agent has too: 28
music_* tools, from music_play to
music_build_mix (which assembles a set to a length you ask for). Other
apps can compose with it: the same interface lets Tonebox duck your music while you
dictate, then hand it back.
And Baton can talk back. Through speak_summary, an agent
has Baton read a short result aloud in a natural voice, so you hear "deploy
finished, all green." Give each agent its own voice and you can follow a whole
multi-agent run by ear.
music_playmusic_searchmusic_build_mixmusic_now_playingmusic_create_playlistspeak_summary- + the rest of the catalog
Local-first by design: loopback-only binding, bearer token, secrets in the Keychain. Baton talks to your server and nothing else, apart from update checks and any scrobbling you turn on.
Play something like this, but calmer.
music_now_playing · music_search · music_play
Now playing: a slower cut from the same corner of your library.
Make me a 40-minute focus mix.
music_search ×3 · music_queue_add
Queued 11 tracks · 40 min · instrumental, low-tempo, no vocals.
Call starting, duck the music.
audio focus · suspend
Paused. It resumes when your call ends, but only if the agent was the one that paused it.
Say when the mix is ready.
speak_summary · voice: deploy
Spoken aloud: "Your focus mix is queued, 40 minutes."
No. 2 Already in the box
Audiophile playback, built in.
Baton's playback engine ran for years inside Tonebox before it shipped on its own. It does what mainstream desktop players skip: true gapless, ReplayGain, a real EQ.
Playback engine
-
True gapless: the next track is pre-inserted and even prefetched to disk, so network streams advance with zero gap.
-
Crossfade: overlap tracks by taste, or keep a hard gapless cut.
-
ReplayGain / R128 loudness: track or album mode, preamp, clipping headroom. Albums keep their dynamics.
-
Graphic + parametric EQ: a 10-band curve or per-band frequency, Q, and gain, real biquad DSP on the render thread; off = bit-exact pass-through.
-
Sleep timer that fades out gently, by the clock or at end of track.
Discovery
-
Mixes: Most Played, Fresh Additions, Forgotten Favorites, Discover, and per-genre daily mixes, built from your listening.
-
Home, “For You”: recently played, because-you-liked radio, rediscover shelves. Tap to play.
-
Song radio: endless similar-songs autoplay, with local bans so a bad pick never returns.
-
History & stats: a local play log with top tracks and artists by week, month, all time. Yours, on your Mac.
-
Podcasts: browse, stream, and download episodes from your server's podcast feeds.
-
Internet radio: play and manage your server's radio stations right alongside your library.
Your library
-
Navidrome & Subsonic: first-class client for the server you already run. Likes and ratings sync back.
-
Offline downloads: keep songs, albums, or whole mixes on disk; playback prefers the local file automatically.
-
Playlists, properly: create, rename, drag-reorder, batch add. Edits persist to the server.
-
Likes & 5-star ratings: instant, optimistic, server-synced. Finder-style multi-select for batch actions.
-
Multiple servers: connect more than one Navidrome or Subsonic account and switch between them without signing out.
On stage
-
Floating mini player: a compact always-on-top panel with Up Next, rating, and a scrubber.
-
Waveform scrubber: see the shape of the song and drag straight to the drop.
-
Synced lyrics: karaoke-style auto-scroll when your server has timed lyrics, plain text when it doesn't.
-
Dual scrobbling: native Last.fm and ListenBrainz, plus server play counts. No bridge apps.
-
Media keys & AirPlay: F7/F8/F9, Bluetooth remotes, Now Playing widget, and system AirPlay routing.
No. 3 Own your library
Stop renting your record collection.
Streaming services lease you a catalog: pay monthly, forever, and lose it all when you stop. Albums vanish mid-playlist. Recommendations serve the platform, not you.
Baton takes the other path. Your files live on your server (Navidrome or any Subsonic-compatible host), and Baton is the polished macOS front end they deserve. No account with us, no telemetry by default, no monthly toll. If Baton disappeared tomorrow, your music wouldn't.
- $0, honestly: the app is free. Your only cost is the server you already run.
- Your data stays local: history, stats, and settings live on your Mac; secrets in the Keychain.
- Open protocol: standard Subsonic API. Switch clients or servers anytime; nothing is held hostage.
- Offline is yours too: downloads are ordinary files in a folder you choose.
No. 4 The field
Where Baton stands.
The honest version: Plexamp and Symfonium are excellent, and the streaming apps have catalogs we'll never rent. Baton's claim is narrow: the best self-hosted macOS player an agent can actually control.
| Desktop, mid-2026 | Baton | Spotify | Apple Music | Plexamp | Navidrome web |
|---|---|---|---|---|---|
| You own the library | ● | ○ | ○ | ● | ● |
| Free, no subscription | ● | ◐ads / Premium | ○ | ◐Plex Pass extras | ● |
| True gapless + stream prefetch | ● | ◐ | ◐ | ● | ○ |
| EQ + ReplayGain on desktop | ● | ○ | ◐ | ● | ○ |
| Native dual scrobbling | ● | ◐Last.fm link | ○ | ◐ | ◐server-side |
| Agent control (MCP server) | ● | ○ | ○ | ○ | ○ |
● yes ◐ partial / paid ○ no. A best-effort snapshot of typical desktop behavior. Capabilities vary by platform, plan, and version. Where Baton lags today, we say so: it's macOS-only and casts via AirPlay only. Both are on the roadmap.
Version 0.17.12
Take the baton.
The standalone build is here: free, signed, and notarized. It updates itself from here on. Needs macOS 15 or later and a Navidrome or Subsonic server.
Or with Homebrew: brew tap anatoliv/baton https://github.com/anatoliv/baton, then brew trust anatoliv/baton, then brew install --cask baton. (Homebrew 6 and later requires third-party taps to be trusted explicitly.)
There is an iPhone app too: Baton Music on the App Store. It connects to the same server and plays the same library, with offline downloads and the music friend, on iOS 18 or later. It costs money where this one doesn't, and that is what covers the Apple developer account this build is signed with. The source is in the repo under the same licence if you would rather build it yourself.
- Free for your own library
- macOS 15+
- Signed & notarized
- Navidrome & Subsonic servers
- iPhone app on the App Store