Your home music library, on every screen you own.
A UPnP/DLNA music player for Android TV, Android phones, Android Auto, and GNU/Linux desktop. One APK across every Android surface. From an Android phone or the GNU/Linux desktop, cast to a Chromecast, Nest Audio, or a multiroom speaker group; on TV and desktop, audio can also play through the device's own outputs.
Every other music app expects a streaming subscription, a tracked account, or a phone within arm's reach. Earhorn Music expects a UPnP server on your local network — and any device you already own: the TV in the living room, the phone in your pocket, the head unit in your car, the desktop in your study. Browse, search, queue, and play your own files (FLAC, ALAC, MP3, AAC, Opus, WAV — and DSD on the GNU/Linux desktop via libvlc; anything else your UPnP server transcodes on the fly will Just Work). From the phone or the desktop, send a queue to a Chromecast or a whole-house speaker group; from the TV or the desktop, play locally on the device's own outputs.
The screens you own had music apps.
None of them were yours.
You own the files
Music you ripped, bought, downloaded — sitting on a NAS, a Raspberry Pi, an old laptop, an actual UPnP server. Not in someone else's cloud.
One library, three surfaces
Same player on the TV in the living room, the laptop on the desk, and the car on the road. Same browse, same queue, same hi-fi-grade playback. The library is the truth; the screens just show it.
No phone tether
Earhorn Music runs directly on the TV or the desktop. No "open the app on your phone first." No casting handshake. The app and the audio live on the same device.
No subscription, no account
No login screen. No upsell. No telemetry. The app talks to your local server and to nothing else.
A music player that respects your remote, your keyboard, and your steering wheel.
Point Earhorn at your UPnP server
It auto-discovers servers on your local network. MinimServer, JRiver, Plex, Jellyfin, Universal Media Server, Asset UPnP, Twonky — anything that speaks UPnP/DLNA shows up in the picker. Pick yours, and your library is there.
Browse, search, queue
D-pad through albums and artists like you'd expect. Long-press anything to add to the queue, queue next, or play it now. Live search narrows across albums, artists, tracks, and genres as you type. Voice search uses the system keyboard's mic.
Cover art on the big screen, gapless audio out
Lyrics view shows the year, format, sample rate, bit depth, and genre tags pulled directly from your file metadata. Gapless playback for albums that need it. ReplayGain support. Sleep timer. Shuffle. Everything a music player should have, none of it learned from a marketing meeting.
Built for how a music room actually works.
Gapless playback
Albums that bleed track-to-track — Dark Side of the Moon, Endtroducing, anything live — play without a gap. The way the artist intended.
Smart queue
Add to queue, play next, play now, save as playlist. Long-press any track or album from anywhere in the app. Reorder with the D-pad.
Sleep timer
Five minutes, fifteen, thirty, an hour. Pick a duration; playback fades out and stops when you're asleep. The TV doesn't have to.
ReplayGain
Honors track and album ReplayGain tags so a quiet jazz record doesn't follow a loud one at twice the volume. Off, track and album modes with a configurable preamp in dB, on Android and on the GNU/Linux desktop. On the desktop, the gain scales your volume setting instead of replacing it, so a track change never jumps past where you left the slider.
Random shelf
Pick a count — ten, twenty-five, fifty, or a hundred — and Earhorn pulls a random shelf of albums or tracks from your library. Surfaces the records you forgot you owned.
Lyrics & album info
Time-synced lyrics fetched from lrclib.net, with sibling .lrc files in the same directory as a fallback. The Album info button surfaces the COMMENT tag or a sibling .txt — liner notes, reviews, whatever you've stashed. Lyrics lookups can be switched off in Settings. Both Android and desktop.
Multi-bucket search
One query — "miles" — hits five buckets at once: albums by title, albums by artist, tracks by title, tracks by artist, genres. Drill into the bucket you actually meant. Your last ten searches are a click away. Both Android and desktop.
Genre filters
Block genres you don't want surfacing in random shuffle. Tag the kids' soundtracks, the meditation tracks, the holiday playlists. They stay in the library; they stop showing up in the picker.
Android Auto
The same library on your dashboard. Browse albums and artists from the car's display, tap to play, queue with one press. Audio routes through the car's speakers; the head unit owns the controls so the phone stays in your pocket. Works whenever the phone can reach your UPnP server — anywhere from home Wi-Fi to a remote (or onboard) server.
MinimServer indexTags, first class
If your library runs on MinimServer, Earhorn Music renders its
indexTags the way MinimServer means them — including the
synthetic browse entries the server generates, like >> Show All, [folder view], and [untagged],
set off in sage italics so you can see at a glance what the server is
offering versus what's a real folder on disk. Both Android and desktop.
Rescan your library from the app
Added new records or fixed some tags? On a MinimServer library, ask the server to re-index without leaving Earhorn Music. It shows the rescan while the server restarts and tells you when your library is back. Both Android and desktop.
M3U playlists & a queue that remembers
Read M3U playlists from anywhere on your UPnP server, and write them back when you save a queue you like. The current queue itself persists across app restarts — close Earhorn Music in the middle of an album, reopen it the next morning, hit play. Both Android and desktop.
Animated album art
Animated GIF and WebP cover art renders the way the artist made it — the looping inner sleeve, the throbbing record label, the visual gimmick the digital-only release shipped with. Powered by Coil 3 with a generous 256 MB on-disk cache so the art is there the second the track loads. Android only.
What Earhorn Music does not do.
- No accounts. No sign-up, no login, no password, no email collection. Nothing to register with because there's nothing on the other end.
- No telemetry. No Firebase, no crash reporting, no analytics, no usage tracking. Earhorn Music has no mechanism to phone home.
- No ads. No ad SDKs, no sponsored content, no affiliate links, no monetization of attention. The app costs nothing and shows nothing.
- Local network first. The app's network traffic goes to your UPnP server and your speakers on your LAN. The one outside service is lrclib.net for time-synced lyrics: it receives the title, artist, album and length of the track you're looking up, and one switch in Settings turns it off. When you follow a Cast speaker that another app is driving, the cover art comes from wherever that app says it lives. No cloud accounts, no telemetry endpoints.
- VPN-safe discovery. If you've got a VPN running, Earhorn Music's SSDP multicast pins itself to the real LAN interface instead of leaking probe traffic up the tunnel. On the desktop, the same logic skips Docker, KVM, and libvirt bridges, and WireGuard and Tailscale tunnels, so the discovery packets actually reach your server.
- No third-party SDKs that phone home. The dependencies are AndroidX, Jetpack Compose for TV, Media3, jUPnP, Hilt — first-party Google libraries plus a UPnP control stack. Everything runs locally.
- Open source. The full source code is in every download as the source zip. Read it. Fork it. Build it yourself. No black boxes, no licensing handshakes.
Your library lives on your server. Your remote lives in your hand. Earhorn Music sits between them and gets out of the way.
Two builds. Three surfaces. One library.
Earhorn Music · Android TV, phones & Android Auto
A single APK that adapts to the device. On Android TVs (any Android TV 8.0+ — Sony, Hisense, TCL, Shield TV, Fire TV, and the rest of the field) it installs as a Leanback-launcher app: banner art, D-pad-first focus, big-screen browse. On Android phones (stock, GrapheneOS, /e/OS, CalyxOS — with or without Google Play Services) it installs as a regular app with a compact touch layout — and from a phone you can cast a queue to a Chromecast, Nest Audio, or a whole-house speaker group, so the room you're not in plays the album you picked. It also registers with Android Auto, so when you connect to your car's head unit Earhorn Music shows up in the media-app picker. One install, every Android surface in your life. Sideload-ready, no app store account required.
Got a Chromebook on the home network? The same APK installs on ChromeOS via the Android Runtime for Chrome (ARC), and behaves like any other Android app on the machine.
Package · dev.stave · Android 8.0+ · ~12 MB
Earhorn Music · GNU/Linux Desktop
The same player, packaged for the desktop. Same UPnP/DLNA discovery, same library browse, same queue, same gapless playback — at a desk, in a study, or wired into a hi-fi rack. Distributed as a .deb for Debian / Ubuntu / Pop!_OS / Mint, or as a portable AppImage for everything else.
Desktop extras worth knowing about: DSD playback through libvlc, for audiophiles; party mode — 42 random tracks loaded and playing the instant you ask (the answer to life, the universe, and "what do I put on?"), one click on the Party button at the top of the library; a drag-to-reorder queue; Cast — play to a Chromecast, Chromecast Audio or speaker group, or follow one that another app is already driving, with its song, art and controls on your desktop; album notes, and a choice of which details Now Playing shows; and keyboard shortcuts that read like a music player should — Space for play/pause, Ctrl+←/Ctrl+→ for prev/next track, Ctrl+K to search, Ctrl+L for lyrics, Esc or Alt+← to close a menu or go back. Media keys and the desktop's media controls work through MPRIS.
Download the .deb or AppImage ↓
x86_64 · keyboard & mouse first · ~114 MB AppImage
Both builds, the source of both apps, and the checksums are in the Download section below. GPLv3+ — fork and ship.
Download
Earhorn Music 0.5.0
The first release hosted here. Adds library rescan from the desktop app, keeps the Party button off the library navigation, and fixes what a full review found.
Android (with Cast): earhorn-0.5.0-play-release.apk 14.0 MBSHA-256 8776b9b5f1fed9babc10e1b689b2bda9a84b9192de9c9f7833d8d2ac1c9a14e3
SHA-256 086f92b3ea417b0ca3b926f2567522125186701e00144fa110f482d9ee485a1a
SHA-256 d706e999fbe242f68bd1087ac5db38165e6e930a462389266e6a142866418d55
SHA-256 68b72e4f9f4b678893dd5865194f3393c9e73eeed1861f8ede1211b45b00039a
The source of both apps (android/ and desktop/, each a complete Gradle project), the README and the GPL license. The packages above are separate downloads.
SHA-256 921748853c314016e7978898777fa5c855a0534e0c7f127c63d7f4c4b8aa1233
SHA256SUMS- The SHA-256 checksum of every file here.
Check your download
Save SHA256SUMS in the same folder as the download, then:
sha256sum -c SHA256SUMS --ignore-missing
Each file you have should say OK. On a Mac, run shasum -a 256 earhorn-0.5.0.zip; on Windows, certutil -hashfile earhorn-0.5.0.zip SHA256. The result must match the SHA-256 above.
In praise of the long-form listen.
Music is the wine which inspires one to new generative processes, and I am Bacchus who presses out this glorious wine for mankind.
Ludwig van Beethoven — Composer
Without music, life would be a mistake.
Friedrich Nietzsche — Philosopher
Music expresses that which cannot be said and on which it is impossible to be silent.
Victor Hugo — Writer
Music is no longer tasted, it is swallowed.
Jules Verne — Novelist
Music is the divine way to tell beautiful, poetic things to the heart.
Pablo Casals — Cellist
I would rather build great records than play them.
Brian Eno — Producer
Music is a world within itself, with a language we all understand.
Stevie Wonder — Musician
After silence, that which comes nearest to expressing the inexpressible is music.
Aldous Huxley — Writer
The only truth is music.
Jack Kerouac — Writer