- Rust 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| src | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| config.example.json | ||
| Justfile | ||
| README.md | ||
arr
arr is a Rust/Ratatui terminal UI for understanding a title across Seerr,
Radarr/Sonarr, the download queue, and Jellyfin. Its Requests view answers two
questions directly: what is happening with this title, and what should I do
next?
Configure
Copy config.example.json to ~/.config/arr/config.json
(or set ARR_CONFIG to another path). Restrict that file to your user because
it contains API keys and, optionally, the qBittorrent password.
Every service URL must include its reverse-proxy base path, for example
https://bread.example.net/movies. arr appends /api/v3 itself.
Jellyfin is optional. Add its URL, API key, and the profile's user ID to enable the Watching view.
Seerr is optional. Add its URL and API key to enable title lookup, requesting, approval, retry, and request status. Requests are joined to their Radarr or Sonarr title and active queue item, so approved-but-idle titles are visible.
refresh_seconds controls automatic refreshes and defaults to 30 seconds.
language_policy.preferred lists acceptable languages. Set minimum to
"subtitles" to accept preferred-language subtitles when dubbed audio is not
available, or "audio" to require preferred-language audio in every file.
Run
cargo run --release
Keys: 1–6, Tab, or h/l change views; j/k move; / filters the
current Library, Requests, Watching, or Watchlist view; in Search, / performs
a separate Seerr title lookup. s cycles the current view's sorting, f
cycles request status filters, m asks Radarr/Sonarr to search for missing
media, a requests/approves/retries, o opens the selected title in an available
Seerr, Sonarr, Radarr, Jellyfin, or qBittorrent source, r refreshes, and ?
opens help.
In Library, b asks the selected title's Radarr/Sonarr instance to search its
configured indexers for alternatives. Candidates show parsed audio language,
custom-format score, quality, size, and *arr rejection reasons. Grabbing a
candidate requires a separate confirmation. d offers two deletion modes:
keep the Sonarr/Radarr entry while deleting files and unmonitoring it, or remove
the *arr entry along with its files. Both modes retain the completed Seerr
request/history.
Library defaults to title sorting. Repeated s cycles title, recently added,
recently downloaded, size, missing-first, audio-language, and subtitle-language
sorting. Rows stay focused on title, availability, file count, and size. A
high-contrast details section shows the full audio/subtitle language sets plus
per-file policy coverage and added/downloaded dates. Library rows use AUDIO ✓,
SUBS ✓, or LANG ! as compact policy verdicts. PageUp/PageDown, Home, and
End are supported, and list scroll position remains stable while moving back
from the end.
In Search, w adds the selected result to Seerr Watchlist after confirmation.
Covers for Library and Search selections appear inline in capable terminals.
On wide terminals the cover shares a compact header area with core metadata.
Requests from Search and Watchlist use Seerr's configured default server and
quality profile. TV requests select seasons first, then the request is
confirmed. Existing requests can still have their server/profile edited with
E.
In Downloads, j/k selects a grouped title and J/K selects an individual
torrent inside that group. The status pane follows the selected torrent, and
d removes that torrent after confirmation.
In Requests or Library, E edits the Radarr/Sonarr server and quality profile
for the selected request. e opens the TV season manager. The new selection is
applies immediately to Seerr after selection.
Watchlist reads the current Seerr user's synced watchlist and shows only titles that are absent from both Requests and the existing library. Requesting one uses the same confirmation flow as Search.
The header shows the combined media-file size plus free and total capacity for the configured library volumes. Shared volumes reported by multiple *arr instances are counted once.
Mutating actions always require confirmation.
Build
cargo fmt --check
cargo test
cargo build --release