A TypeScript web app for LG webOS TVs (webOS 5 / Chromium 68 and newer), driven by the remote: Movies and Series search with the Trakt lists, Library with status, title and file-property filters and download marks, seasons and episodes, release search and grab, Downloads, Calendar, Settings and Log. It talks to Radarr, Sonarr, SABnzbd and Trakt directly (they answer cross-origin requests); the arr-tui config is baked in at build time and can be changed on the TV. dev/screenshots/server.py answers cross-origin requests and accepts writes for it; webos/dev/drive.mjs drives the app in Chromium for screenshots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Local test instances
Radarr, Sonarr and SABnzbd in containers (same versions as the author's setup), pre-wired together:
fixed dev API keys, root folders /media/movies and /media/tv, and SABnzbd registered as the
download client in both (categories radarr / sonarr).
dev/up.sh # start + configure (idempotent); needs docker/podman compose
go run ./cmd/arr-tui --config dev/config.json
docker compose -f dev/compose.yaml down # stop; state lives in dev/data (gitignored)
| Service | URL | Port |
|---|---|---|
| Radarr | http://127.0.0.1:17878 | 17878 |
| Sonarr | http://127.0.0.1:18989 | 18989 |
| SABnzbd | http://127.0.0.1:18080 | 18080 |
No indexers or Usenet servers are configured, so nothing actually downloads. To get something into the SABnzbd queue, upload any NZB:
curl -F name=@some.nzb -F cat=radarr \
"http://127.0.0.1:18080/api?mode=addfile&output=json&apikey=devsabnzbdapikey0000000000000000"
Metadata lookups (search) need internet access, since Radarr/Sonarr query their cloud metadata services.
To get an item into the Radarr (or Sonarr) queue as well, add a movie to Radarr, serve an NZB from the
host and push it as a release. Containers reach the host as host.containers.internal:
python3 -m http.server 19191 --bind 0.0.0.0 & # directory containing some.nzb
curl -H "X-Api-Key: devradarrapikey00000000000000000" -H 'Content-Type: application/json' \
-d '{"title":"The.Matrix.1999.1080p.BluRay.x264-DEV","downloadUrl":"http://host.containers.internal:19191/some.nzb","protocol":"usenet","publishDate":"2026-01-01T00:00:00Z"}' \
http://127.0.0.1:17878/api/v3/release/push
Interactive search without a real indexer
dev/fake-indexer.py is a tiny Newznab indexer that returns a fixed set of releases for "The Matrix (1999)"
and "Breaking Bad"; Radarr/Sonarr still do their own parsing and approve/reject decisions. Its NZBs are
dummies, so grabbed releases just sit in the SABnzbd queue.
python3 dev/fake-indexer.py & # listens on :19292
dev/add-indexer.sh # registers it in the dev Radarr and Sonarr
Add the movie / series to the dev instances first (e.g. from the TUI), then press i on it.
To test with a real indexer, add it in the dev Radarr/Sonarr web UI (Settings, Indexers) instead of pasting
credentials anywhere else.
Screenshots
dev/screenshots/take.sh makes the README screenshots from a fake, made-up library; see
screenshots/README.md.