The vault was 155 pages / 31,210 lines, most of it measurement ledgers for payloads that no longer run. A throughput figure for a runtime nobody operates is not a record: AI moves faster than the vault, so the number is wrong before anyone reads it, and a wrong number in a runbook gets believed. Per the new purpose test in `AGENTS.md` → *Documentation Policy*, it is destroyed. Gone (`.AGENTTRASH/20261019-destruction/`, KILL-LIST.txt is the manifest): - the `frank-medium` endpoint and its five era pages, `frank-npu`, FastFlowLM, the ikllama/kingjones/dealign/frank-redo eras, the ling/swift15/freetoken/ubatch campaign pages, qwen3.8 spec-matrix and strix-optimizations, the two "Running Qwen3.6 …" pages; - the whole `Pipeline Parallelism/` folder (no live script passes a pipeline flag) and the multi-device/x4-pair/hybrid/offload experiment pages; - every vLLM page — no vLLM endpoint exists on this fleet; - `LLM/deployment.md` (`Architecture/Deployment Flow.md` is the test-referenced owner) and the external surveys (SGLang, Lemonade, llama.cpp forks/diff, self-hosted app census, the TTS survey) that were obsolete by construction; - `log.md`, 2,380 lines. Git holds the chronology; a causal law belongs to the page that owns the thing it governs, never to a diary. Survivors: 101 pages, 17,542 lines, 0 OKF violations, 0 unresolved links. Eras tables keep the window, payload, runtime, reason and rollback pointer; the rate columns are blanked. The live shapes stay verbatim — those numbers are what the deployer and `models.yml` consume.
127 lines
5.6 KiB
Markdown
127 lines
5.6 KiB
Markdown
---
|
||
type: reference
|
||
title: Prowlarr
|
||
description: "Indexer management for the *arr stack: feed routes, the sync model, the API surface, and verified live gotchas."
|
||
tags: [prowlarr, arr-stack, frankbook-pro]
|
||
timestamp: 2026-09-03T00:00:00Z
|
||
---
|
||
|
||
# Prowlarr
|
||
|
||
Prowlarr is the indexer management layer for the *arr stack. It hosts the
|
||
indexer definitions and exposes them as Torznab feeds and downloads;
|
||
Sonarr, Radarr, Lidarr, and Readarr query those feeds and receive results.
|
||
|
||
**Host:** FrankBook-Pro (podman machine) — **Access:** direct port `9696` (no
|
||
reverse-proxy vhost; the *arr stack is exempt by construction from the Anubis
|
||
guard chain) — **Docs:** https://wiki.servarr.com/prowlarr
|
||
|
||
## Facts
|
||
|
||
| Item | Value |
|
||
|------|-------|
|
||
| Image | `lscr.io/linuxserver/prowlarr:latest` (runs v2.5.2 line) |
|
||
| Port | 9696 (host) → 9696 (container) |
|
||
| Env | `PUID=0`, `PGID=0`, `TZ=America/Los_Angeles`, `UMASK_SET=022` |
|
||
| Config root | `/Volumes/COMPLETE/prowlarr-data:/config` |
|
||
| Min RAM | 256 MB |
|
||
| Auth | Forms (web UI) + API key (`/api/v1/...` and feed routes) |
|
||
|
||
## Deployment (current)
|
||
|
||
Quadlet unit `prowlarr.container` from this repo
|
||
(`frankbook-pro/prowlarr/quadlet/`), installed inside the podman machine at
|
||
`/home/core/.config/containers/systemd/prowlarr.service` by the frankbook-pro
|
||
handler in `scripts/deploy-remote.sh`:
|
||
|
||
```ini
|
||
[Container]
|
||
ContainerName=prowlarr
|
||
Image=lscr.io/linuxserver/prowlarr:latest
|
||
Environment=PUID=0
|
||
Environment=PGID=0
|
||
Environment=TZ=America/Los_Angeles
|
||
Environment=UMASK_SET=022
|
||
Volume=/Volumes/COMPLETE/prowlarr-data:/config
|
||
PublishPort=9696:9696
|
||
|
||
[Service]
|
||
TimeoutStartSec=900
|
||
Restart=always
|
||
```
|
||
|
||
## Live wiring (verified end-to-end 2026-08-30)
|
||
|
||
Indexer queries flow **through** Prowlarr; a grab hands off to the querying
|
||
app's own qBittorrent download client. Feeds are per-indexer:
|
||
|
||
```
|
||
http://prowlarr:9696/{indexerId}/api?apikey={GLOBAL_KEY}&t=caps|search|tvsearch|movie|music|book&...
|
||
http://prowlarr:9696/{indexerId}/download?link=...&file=... (torrent handoff)
|
||
```
|
||
|
||
| App | Indexer row | Prowlarr id | Categories | Status |
|
||
|---|---|---|---|---|
|
||
| Radarr | Prowlarr-YTS | 7 | [2000] | ✅ grabbed + imported 2160p Dark Knight 2026-08-30 |
|
||
| Sonarr | Prowlarr-Nyaa | 4 | [5000] | ✅ connection validated (202) |
|
||
| Lidarr | Prowlarr-Nyaa | 4 | [3000] | ✅ connection validated (202) |
|
||
| Readarr | Prowlarr-Byrutor | 3 | [7000] | indexer valid; download client parked |
|
||
|
||
The global API key is in `config.xml` (`<ApiKey>`); per-application keys are
|
||
only used by Prowlarr's own sync calls, NOT by the feeds. The arr download
|
||
clients authenticate to qBittorrent with the permanent WebUI password stored
|
||
in `/home/dank/.qbpass` (mode 600, owner `dank`) on Dankserver —
|
||
[[qBittorrent]] for why that password must be pinned in the conf file.
|
||
|
||
**Readarr caveat:** Readarr is abandoned upstream; its qBittorrent client
|
||
cannot authenticate against newer qB Web-API versions (`Authentication
|
||
failure` on the connection test while Sonarr/Lidarr/Radarr pass with the same
|
||
credentials — root cause: qB ≥ 5's 204 empty-body login success, fixed fleet-
|
||
wide by pinning qB to 4.6.7). The books pipeline is parked pending a Readarr
|
||
successor; the indexer row itself is healthy.
|
||
|
||
## Gotchas (verified live 2026-08-30)
|
||
|
||
- **The feed route is `/{indexerId}/api`.** There is no `/torznab/{id}/feed`
|
||
— that path (and any other unmatched path) hits the Forms-auth catch-all
|
||
and gets `302 → /login?returnUrl=…`. An arr following the redirect parses
|
||
the login HTML and fails with a cryptic
|
||
`'/' is an unexpected token … Line 54` XML error that looks like an auth
|
||
problem. It is a path typo. Source: `NewznabController`
|
||
(`[HttpGet("{id:int}/api")]` + absolute
|
||
`/api/v1/indexer/{id}/newznab`).
|
||
- **The arr's Torznab joiner is `TrimEnd(baseUrl,'/') + apiPath` with NO
|
||
separator.** `baseUrl="…/7/" + apiPath="api"` silently becomes `…/7api`.
|
||
Either keep the leading slash on `apiPath` (`"/api"`) or end the baseUrl
|
||
with `/api`.
|
||
- Categories in the indexer row must be a subset of what the feed's `caps`
|
||
advertises; extras log "does not support the following categories" and
|
||
some feeds reject them.
|
||
- **A freshly created indexer row defaults to all-off.** If `enableRss`
|
||
`enableAutomaticSearch`, or `enableInteractiveSearch` aren't set, the
|
||
app logs `Searching indexers for [X]. 0 active indexers` (Lidarr,
|
||
verified). Search proves TV + music chains 2026-08-30: Sonarr returned
|
||
76 live releases for an anime term, Lidarr 18 for YOASOBI – THE BOOK,
|
||
all via the Prowlarr-Nyaa feed.
|
||
- The v1 API collection is `/api/v1/applications` (not `/api/v1/app`)
|
||
GET responses carry `fields: []` — real settings values live in
|
||
`prowlarr.db` → `Applications.Settings` JSON (read-only inspection).
|
||
- Instance name/`InstanceName=Prowlarr` in `config.xml` does NOT prefix the
|
||
API/feed routes on this build (they answer at root; the `/Prowlarr/...`
|
||
prefix 302s to the SPA).
|
||
- **Application auto-sync model (v2):** Applications are first-class rows in
|
||
the `Applications` table; each of the four app rows (sonarr/radarr/lidarr/
|
||
readarr) carries the real baseUrl+apiKey with `SyncLevel=FullSync`. The
|
||
earlier v1-era failure where `POST /api/v1/applications/test` threw
|
||
`Unable to cast object of type 'NzbDrone.Core.Thing…'` (v1 could not
|
||
deserialize Radarr 6.3's newer response types) is historical — it was the
|
||
reason the manual Torznab rows were created in the first place.
|
||
- Prowlarr runs `AuthenticationMethod=Forms` + `AuthenticationRequired=Enabled`
|
||
healthily — the DryIoc crash combo was `None`+`Enabled` only (see
|
||
[[radarr]] auth notes).
|
||
|
||
## See Also
|
||
|
||
- [[ARR-Stack]] — full *arr stack documentation
|
||
- [[Radarr]] · [[Sonarr]] · [[Lidarr]] · [[Readarr]] · [[qBittorrent]]
|