Miguel PalhasandClaude Opus 5 c4d4ade4da fix(api): normalise stored root paths
#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>
2026-08-25 11:28:35 +01:00
2026-08-22 19:20:47 +01:00
2026-08-22 19:20:47 +01:00

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.
S
Description
No description provided
Readme
17 MiB
Languages
Rust 83.4%
TypeScript 11.5%
CSS 1.9%
Python 1.4%
HTML 1%
Other 0.8%