···338338Find the on-disk config with `fin config --path`; print it with
339339`fin config --show`.
340340341341+While the TUI runs, logs are written to `fin.log` in the cache directory
342342+(next to `queue.json`) rather than stderr, so they can't corrupt the
343343+display; one-shot CLI commands log to stderr as usual. `-v` / `-vv` and
344344+`RUST_LOG` control the level either way.
345345+341346## Multiple servers
342347343348fin authenticates against as many servers as you like — Jellyfin and
···430435431436## Playback modes & effects
432437433433-All of these run only on the local renderer (audio path). Chromecast and
434434-UPnP receivers each do their own thing; toggles no-op on those renderers.
435435-Settings persist to `config.toml` and are mirrored back on next launch.
438438+**Shuffle and repeat work on every renderer** — the queue lives on the
439439+client, so they apply while casting to Chromecast or UPnP too. The audio
440440+*effects* (ReplayGain, crossfade, EQ, bass & treble) run only on the local
441441+renderer; Chromecast and UPnP receivers do their own DSP, so those toggles
442442+no-op there. Settings persist to `config.toml` and are mirrored back on
443443+next launch.
436444437445### Shuffle
438446···546554 already streaming.
547555- Skipping (`>` / `<`) triggers a `load` for the next queue item
548556 immediately — no waiting for the current one to finish.
557557+- Shuffle (`z`) and repeat (`Shift+R`) act on this client-side queue, so
558558+ they work while casting exactly like local playback.
549559- Stopping clears the local queue and stops the receiver's playback.
550560551561UPnP renderers without a `RenderingControl` service (rare, but it happens)
···584594│ ├── fin/ # binary — clap CLI + startup
585595│ ├── fin-config/ # TOML config file, credentials, mode enums
586596│ ├── fin-jellyfin/ # Jellyfin HTTP API client
597597+│ ├── fin-subsonic/ # Subsonic HTTP API client (Navidrome, Airsonic, …)
598598+│ ├── fin-media/ # MediaClient trait over both backends + login probe
599599+│ ├── fin-mediarenderer/ # built-in UPnP MediaRenderer — casting *to* fin
587600│ ├── fin-player/ # Renderer trait, queue, symphonia audio path,
588601│ │ # mpv video, Chromecast + UPnP, replaygain,
589602│ │ # crossfade, queue persistence