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, cast to a Chromecast, Nest Audio, or a multiroom speaker group; on TV and desktop, listen through your speakers.
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, send a queue to a Chromecast or a whole-house speaker group.
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. On Android: full off/track/album modes with a configurable preamp in dB. On the GNU/Linux desktop: libvlc handles ReplayGain natively, the way it does for every other libvlc-backed player.
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.
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.
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.
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 only. The app's network traffic goes to your UPnP server on your LAN — that's the entire surface. No cloud servers, no telemetry endpoints, no third-party APIs.
- 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 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 on Codeberg. 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-only 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?"); a drag-to-reorder queue; and
keyboard shortcuts that read like a music player should
— Space for play/pause, ←/→ for
prev/next track, Ctrl+F to focus search, Esc
to dismiss modals. A Cast sender for the desktop is in the works; for
now, audio plays through the machine's own outputs.
.deb · Codeberg → · AppImage · Codeberg →
x86_64 · keyboard & mouse first · ~114 MB AppImage
Source code on Codeberg. Issue tracker, changelogs, and build instructions all live there. GPLv3+ — fork and ship.
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