0fa422e17038adba5caaea2eb3f9e5c3ed2936b3
Search and detail lookup, carrying the two fields the policy engine needs and that are easy to lose at the edge. `original_language` arrives as bare ISO 639-1, which has one code for both Portuguese variants, so the dub rule in §5.2 cannot be expressed against it alone. `Movie` therefore also carries `origin_countries`, from `origin_country` where TMDB has it and `production_countries` otherwise, which is what separates a Brazilian film from a Portuguese one. Digital release dates come back appended to the detail call rather than costing a second round trip, reduced to the earliest type-4 entry across every country: a release existing in one region is a release that exists on the indexers. `Movie::is_digitally_released` puts the §6.2 gate in one tested place. Responses are cached in process for a day, matching the metadata refresh tick. Failures are never cached, so an outage cannot pin a title into a bad state until tomorrow. Tests are wiremock-backed, per §12.
arr
One service that replaces Radarr and Sonarr, and later Bazarr, for a single household.
Five .NET services idle at 600-900 MB to run a loop with four steps in it: decide what you want, find it, fetch it, put it where Jellyfin can read it. Each has a configuration surface an order of magnitude larger than the subset anyone uses, and none of them share a model.
This is that loop, once, in Rust.
- Prowlarr stays — it owns tracker auth, Cloudflare bypass and the indexer definitions, and replacing it buys nothing.
- Transmission stays.
- Jellyseerr stays, talking to a thin Radarr-compatible shim.
Status
Design complete, implementation not started. See DESIGN.md for the contract
and the issue tracker for the work.
Documents
DESIGN.md— the contract. Domain model, policy engine, sourcing, import, crate layout, build order.CLAUDE.md— repository conventions, label taxonomy, and how an autonomous driver session should sequence the work.
Languages
Rust
83.4%
TypeScript
11.5%
CSS
1.9%
Python
1.4%
HTML
1%
Other
0.8%