a Jellyfin & Subsonic client for the terminal — powered by mpv, Chromecast and UPnP MediaRenderer
mpv chromecast mpris navidrome jellyfin upnp tui
0

Configure Feed

Select the types of activity you want to include in your feed.

Changelog#

All notable changes to fin are documented here.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.5.0 - 2026-07-08#

Added#

  • MPRIS support (fin-mpris) — on Linux and the BSDs, fin registers org.mpris.MediaPlayer2.fin on the D-Bus session bus while the TUI runs, so media keys, GNOME/KDE applets, waybar and playerctl can drive playback: play/pause, next/previous, seek and SetPosition, volume, shuffle and repeat (mapped to MPRIS LoopStatus), with track metadata (title, artist, duration, cover art) pushed as PropertiesChanged/Seeked signals. The MPRIS player shares the same swappable renderer handle as the TUI and the UPnP MediaRenderer, so desktop controls follow you when you switch to a Chromecast or UPnP device. Built on zbus (pure Rust — no dbus system library needed); starting without a session bus (headless/SSH) is a non-fatal warning. A second fin instance falls back to a pid-suffixed bus name per the MPRIS spec.

0.4.0 - 2026-07-07#

Added#

  • Built-in UPnP MediaRenderer (fin-mediarenderer) — fin now advertises itself as a cast target on the LAN while the TUI runs. Any UPnP control point (BubbleUPnP, Kodi, Jellyfin's "Play On", …) can push streams at this machine: audio decodes in-process via symphonia, video is handed to mpv, and the pushed track shows up in the Now Playing bar with a ⇊ UPnP badge plus a status-line notice naming what arrived. Includes SSDP presence (alive/byebye + M-SEARCH answers), AVTransport / RenderingControl / ConnectionManager SOAP control, and GENA LastChange eventing. On by default; disable with --no-media-renderer, FIN_NO_MEDIA_RENDERER=1, or media_renderer.enabled = false. media_renderer.friendly_name / .port are also configurable, and the device UDN is generated once and persisted so control points recognize the machine across restarts.

Changed#

  • Logs no longer corrupt the TUI — while the TUI owns the terminal, tracing output is routed to fin.log in the cache directory instead of stderr (any GENA notify failure, cast-in notice, or playback warning used to print straight over the interface). CLI one-shot commands still log to stderr, and -v/RUST_LOG behave as before.

Fixed#

  • Idle volume readbackLocalRenderer reported 100% volume while idle even after a volume change; it now mirrors the audio player's actual volume, so the TUI slider and UPnP GetVolume stay truthful between tracks.
  • Queue marker stuck while casting — when playing to a UPnP or Chromecast renderer, auto-advance and Next/Previous moved the queue cursor without updating the shared playback state, so the Queue screen's ▶ marker and (n/total) counter stayed on the old track.
  • Shuffle & repeat while castingz and Shift+R were silent no-ops on UPnP and Chromecast renderers; both now drive the shared queue, so shuffle order and repeat one/all work the same as local playback.

0.3.1 - 2026-07-05#

Added#

  • Shuffle-play shortcutShift+X plays the highlighted container (album, artist, playlist, series) or, on flat views, everything in the current list (all favorite tracks, all videos, an open album/playlist's tracks) in random order. The pool is shuffled up front so the first track is random too, and shuffle mode is switched on for whatever joins the queue later.

Changed#

  • Videos tab is now Jellyfin-only — Subsonic has no video API, so on a Subsonic server the tab is hidden from the bar, Tab/Shift+Tab skip it, and 2 shows a hint. Switching servers while on Videos bounces to Music.
  • ReplayGain now runs in the Rockbox DSP — upgraded rockbox-dsp to 0.2.0 and moved gain application into its pre-gain (PGA) stage, the same fixed-point pipeline as the EQ and tone controls. Tag extraction stays in fin; the old f32 multiplier survives only as a fallback for paths the PGA can't reach (crossfade-incoming track, non-stereo output, first primed packet).

0.3.0 - 2026-07-05#

Added#

  • Subsonic backend with auto-detection at login — point fin login at a Jellyfin or Subsonic server (Navidrome, Airsonic, Gonic, Astiga, …) and the flavour is probed automatically. Multiple servers of either kind can be saved side by side.
  • Favorites tab (, key 4) listing everything you've liked — Jellyfin favorites and Subsonic stars alike. Supports the usual actions (Enter to play/drill, a enqueue, n play next, x play container, r refresh).
  • Like / dislike shortcutsShift+L favorites (stars) the highlighted item, Shift+D removes it. Both fall back to the now-playing track on screens without a library selection, so you can like a song from anywhere while it plays. Disliking from the Favorites tab drops the row immediately.
  • Server-backend badge — the header shows ◈ Jellyfin / ≋ Subsonic for the active server, and each row in the Settings server list shows its backend between the name and URL.
  • In-process audio path — HTTP streaming, symphonia decode, resampling, and cpal output all run in-process; mpv is now used only for video.
  • 10-band Rockbox equalizer with interactive band selection and per-band gain nudging on the Settings screen.
  • Bass & treble shelves (Rockbox tone controls), b/Shift+B and y/Shift+Y.
  • ReplayGain (off / track / album) and crossfade (crossfade / mixed modes, cyclable duration).
  • Queue persistence, shuffle, repeat, and queue-management keys; Enter on the Queue screen jumps the playhead instead of collapsing the queue.
  • Album detail view with disc grouping, track numbers, year, and a client-side sort safety net.
  • ? keyboard-shortcuts help modal.

Changed#

  • Screen tab shortcuts: Music 1, Videos 2, Playlists 3, Favorites 4, Queue 5, Search 6, Devices 7, Settings 8.
  • README, in-app header, and help modal describe fin as a Jellyfin and Subsonic client rather than Jellyfin-only.

Fixed#

  • "Recent listens not updated" on the Jellyfin/Subsonic scrobble path.
  • Scrobble/session errors now stay warn-only instead of interrupting playback.
  • Now-playing marker no longer shifts by one after a play-triggered crossfade.

0.2.0 - 2026-07-03#

Added#

  • UPnP MediaRenderer discovery and streaming (Sonos, Kodi, Roon endpoints, Samsung/LG TVs, gmediarender, …) alongside the existing local and Chromecast renderers.

0.1.0 - 2026-07-03#

Added#

  • Initial release — a Ratatui TUI plus one-shot CLI for Jellyfin.
  • Local mpv playback and Chromecast streaming.
  • fzf-style instant search, playlist browsing, and drill-in navigation.
  • Full pagination of the Items endpoint so large libraries load completely.