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

Configure Feed

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

Update README for 0.4.0 changes

Shuffle/repeat now work while casting, logs go to a file in TUI mode,
and the workspace layout gained fin-subsonic, fin-media, and
fin-mediarenderer.

Tsiry Sandratraina (Jul 7, 2026, 4:56 PM +0300) 4dfd7b7a 68a592a8

+16 -3
+16 -3
README.md
··· 338 338 Find the on-disk config with `fin config --path`; print it with 339 339 `fin config --show`. 340 340 341 + While the TUI runs, logs are written to `fin.log` in the cache directory 342 + (next to `queue.json`) rather than stderr, so they can't corrupt the 343 + display; one-shot CLI commands log to stderr as usual. `-v` / `-vv` and 344 + `RUST_LOG` control the level either way. 345 + 341 346 ## Multiple servers 342 347 343 348 fin authenticates against as many servers as you like — Jellyfin and ··· 430 435 431 436 ## Playback modes & effects 432 437 433 - All of these run only on the local renderer (audio path). Chromecast and 434 - UPnP receivers each do their own thing; toggles no-op on those renderers. 435 - Settings persist to `config.toml` and are mirrored back on next launch. 438 + **Shuffle and repeat work on every renderer** — the queue lives on the 439 + client, so they apply while casting to Chromecast or UPnP too. The audio 440 + *effects* (ReplayGain, crossfade, EQ, bass & treble) run only on the local 441 + renderer; Chromecast and UPnP receivers do their own DSP, so those toggles 442 + no-op there. Settings persist to `config.toml` and are mirrored back on 443 + next launch. 436 444 437 445 ### Shuffle 438 446 ··· 546 554 already streaming. 547 555 - Skipping (`>` / `<`) triggers a `load` for the next queue item 548 556 immediately — no waiting for the current one to finish. 557 + - Shuffle (`z`) and repeat (`Shift+R`) act on this client-side queue, so 558 + they work while casting exactly like local playback. 549 559 - Stopping clears the local queue and stops the receiver's playback. 550 560 551 561 UPnP renderers without a `RenderingControl` service (rare, but it happens) ··· 584 594 │ ├── fin/ # binary — clap CLI + startup 585 595 │ ├── fin-config/ # TOML config file, credentials, mode enums 586 596 │ ├── fin-jellyfin/ # Jellyfin HTTP API client 597 + │ ├── fin-subsonic/ # Subsonic HTTP API client (Navidrome, Airsonic, …) 598 + │ ├── fin-media/ # MediaClient trait over both backends + login probe 599 + │ ├── fin-mediarenderer/ # built-in UPnP MediaRenderer — casting *to* fin 587 600 │ ├── fin-player/ # Renderer trait, queue, symphonia audio path, 588 601 │ │ # mpv video, Chromecast + UPnP, replaygain, 589 602 │ │ # crossfade, queue persistence