Repo: adapter-kit-servarr
Rendered from spec at76d46f3 (2026-10-25) · its source · Edit this page
Status: Proposed
The client the adapters in front of Sonarr, Radarr, Lidarr and Prowlarr share, written once: a Rust library none of them publishes and each takes at an exact commit. Rust, Hippocratic 3.0. It serves no contract, builds no image and has no binary of its own.
Implements: the Servarr half of
ADR-0045’s
moves, for F14-R15;
consumes lemonfiber-ports and lemonfiber-error from lemonfiber.
Why this is a separate repo
Sonarr, Radarr, Lidarr and Prowlarr speak one HTTP API: the same key header, the same
versioned prefix, the same resources for download clients, root folders, quality
profiles, the queue, history and commands. The three curators answer
library.curate alike, told apart by a handful of words — a path, a query parameter,
a command name. Written into each adapter, that is four copies of one client and three
of one contract’s translation, and a fix to one would leave the others wrong with
nothing to say so. Held in one adapter, the other three would depend on that
adapter’s internals.
The one property to remember
One copy, taken by commit. Each Servarr adapter names this repository in its
Cargo.toml as a git dependency at an exact rev, the way it takes
lemonfiber-adapter-kit from the core. Nothing is published to a registry. The kit
and every adapter taking it name the same core commit, so the port types the kit
implements are the ones the adapter serves.
What’s in it
adapter-kit-servarr/
└── src/
├── client the keyed, versioned Servarr client: requests, reads, the
│ status a versioned prefix it does not serve answers with,
│ identity and key replacement
└── curator library.curate as Sonarr, Radarr and Lidarr answer it: download
clients, root folders, quality profiles, hard links, records
carried between curators, the catalogue, the queue, release
probes and the reads a trace makes, each kind of media in the
Servarr words it is spoken in
What only one upstream answers stays in that upstream’s adapter: Lidarr’s music
formats in plugin-lidarr, Prowlarr’s applications and indexers in
plugin-prowlarr, and each adapter’s release, digest, settings and recorder in its
own repository.
Maintenance
A change lands here with its tests, and reaches an adapter when that adapter’s pin on
this repository moves. Moving an adapter’s core commit moves this repository’s first,
and the adapter then takes the kit commit naming the core commit it moves to. CI
reuses the shared workflows exactly as every other repository does (Q-R56).
Requirements
| ID | Requirement |
|---|---|
| REPO-R99 | The client the Sonarr, Radarr, Lidarr and Prowlarr adapters share — the keyed, versioned Servarr client, identity and key replacement — and library.curate as Sonarr, Radarr and Lidarr answer it alike MUST be written here once, and MUST NOT be copied into any adapter; what only one upstream answers MUST stay in that upstream’s adapter. |
| REPO-R100 | An adapter MUST take this repository at an exact commit recorded as a git rev in its Cargo.toml, and nothing here is published to a package registry. This repository and every adapter taking it MUST name the same core commit for the core’s crates, and moving an adapter’s core commit MUST move this repository’s first. |
| REPO-R101 | This repository MUST serve no contract, build no image and hold no adapter’s release, digest, settings, recorder or recordings; what an adapter says it is and what it was recorded against stays in that adapter. |
| REPO-R102 | Every module under src/ MUST be covered by tests at 100% of lines, asked over a fake HTTP transport with no service running. |
Affected repos (GOV-R7): plugin-sonarr, plugin-radarr, plugin-lidarr, plugin-prowlarr.
Related
- first-party plugins — the four repositories that take it
- ADR-0045 — every bundled part has its repository now, and its adapter later
- website-kit — the same shape for what the sites share