issue/244-root-slash-stored
#243 normalised the incoming path but compared it against the value read raw from the database, so a root stored with a trailing separator never compared equal. Every edit of it -- a policy change included -- took the relocation branch, where each planned destination is its own source and the pre-check refuses. That root could not be edited at all. `update` now normalises both sides, and hands `relocate_root` the normalised stored value. `path_is_free` normalises the stored side in SQL and `create` goes through it too, so `/mnt/x` and `/mnt/x/` cannot be two roots for one directory -- the unique index compares raw strings and cannot see that. Migration 0031 strips the separator from rows already written. It skips any row whose stripped form another row would also hold, rather than tripping the unique index: a migration that cannot apply stops the daemon booting, which is worse than two roots naming one directory. Also from the same review: `undo` recorded only the leaf directory, so a failed move into `/mnt/media-v2/tv/kids` left `tv` behind. It now records every level `create_dir_all` materialised, deepest first, and still never touches one that was already on disk. Refs #244. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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%