finale

A minimalist music player for Jellyfin.

macOS iOS Android Linuxbeta Webbeta
Finale's albums page: a grid of album covers with a search field above An album page: the cover, title and year, a Play button and the track list Now playing: the album cover, track title, a progress bar and the playback controls

What it is

Finale plays the music on your own Jellyfin server. There's no account to create and no catalogue but yours — point it at the server you already run, sign in, and your library is there. No ads, no analytics, no recommendations.

It exists because none of the Jellyfin clients I tried did exactly what I wanted. It is cross-platform, switches cleanly between libraries, keeps playing offline, and stays stable when reaching your server over Tailscale (IMHO the best way to get "play anywhere" from locally hosted services).

Features

Browse & search

Artists, albums and playlists, with search across all of them.

Listen offline

Download albums to the device and play them anywhere your server isn't reachable.

Playback

Gapless playback with a queue and repeat modes.

In the background

Playback continues when you leave the app, with lock-screen, headphone and car controls.

Now playing

A full-screen player with the current track and its controls; the queue is a tap away.

Playlists

Create, rename, edit and delete Jellyfin playlists from inside the app.

Recently played

Pick up where you left off without digging through the library.

Remote-friendly

Connects to your Jellyfin server over your local network or Tailscale.

Try it in the browser beta

There's a hosted web build at /app/. It runs in any modern browser and connects directly to your Jellyfin server — your library and listening history stay between your browser and your server.

Your Jellyfin server has to be reachable over HTTPS from your browser. The cleanest way to do that without putting Jellyfin on the public internet is Tailscale.

  1. Install Tailscale on the device running Jellyfin and on every device you want to play music from.

    If you don't have a tailnet yet, sign up at tailscale.com — the free plan is enough.

  2. Expose Jellyfin over HTTPS via Tailscale Serve. On the Jellyfin host:
    sudo tailscale serve --bg --https=443 http://localhost:8096

    This gives Jellyfin a real Let's Encrypt cert at https://<host>.<tailnet>.ts.net. The hostname only resolves on devices logged into your tailnet — it isn't public.

  3. Open the web player at /app/ from a tailnet-connected device. On the setup screen, enter your Jellyfin URL — the https://<host>.<tailnet>.ts.net one, no port — and sign in.

Caveats: clearing your browser's site data resets Finale's cached library info — it'll reload it from your server next time. And any device not on your tailnet will load this page but won't reach Jellyfin.

Download

The macOS app is signed with a Developer ID and notarized, so it opens without a Gatekeeper warning.

iOS and Android versions are on their way to the App Store and Google Play. Links will appear here once they're live.

Support

Something not working, or a question about Finale? Email support@psugar.xyz, or open an issue on GitLab.

It helps to include your device, the app version (Settings → About), and — for anything to do with connecting or playback — the debug log (Settings → Debug log → Copy).