Skip to content

What Coldarr does

You've got fast storage and slow storage. Coldarr figures out what's safe to move from the fast drive to the slow one, and does it - without you babysitting it.

The gist

  • Tell it which drives are "hot" (fast, primary) and which are "cold" (overflow - satellite drives, a slower array, whatever you've got).
  • It pulls your whole library from Radarr/Sonarr - age, size, tags, quality profile, whether a series has ended, whether anything's actively downloading right now.
  • Anything that looks safe to move gets ranked coldest-and-biggest-first, and cold drives get packed toward a usage target you set.
  • It never moves a file itself. It asks Radarr/Sonarr to do the move (their own bulk-move API) - or qBittorrent, for downloads - so their database never drifts out of sync with what's actually on disk. Finished seeds you've chosen to have removed go through qBittorrent too. The only files Coldarr deletes itself are orphaned files in a download folder you've marked as not read-only, when you click Delete on them.
  • Moves happen one at a time per physical drive, and Coldarr waits for each one to actually land before starting the next. Firing a dozen simultaneous multi-GB transfers at one NAS is a great way to hang it - this happened during testing, hence the rule.
  • Everything's dry-run by default. report and plan (or the dashboard/plan page in the GUI) never touch anything. apply asks you to confirm first, or skip the prompt with -y for cron.

Downloads, too

Connect qBittorrent and Coldarr runs your download drive as a revolving door:

  • Downloads land on fast storage and are left alone while they download.
  • Once one has finished, sat for a few days, and been imported by whichever of Radarr/Sonarr/Lidarr you've said imports its label, it moves to a cheap, large seed drive - one at a time, each confirmed before the next - and gets a seed label once it has landed.
  • Tell it how long each tracker wants downloads seeded, and once one is done, it can be cleared out - report-only first if you like, never touching a download nobody imported, one sharing files with another that still needs them, or anything near your library.
  • Orphaned Storage checks the download folders against qBittorrent file by file, so leftovers from removed downloads or unfinished moves show up.

Cross-seeds move together, labels you haven't set up are left alone, and nothing moves while qBittorrent is still moving something. See Downloads and seeding.

Why bother splitting hot/cold at all

Your hot storage is probably a real NAS - RAID or similar, actually redundant, survives a drive dying. Your cold/satellite drives are probably just bare USB drives sitting in a closet - zero redundancy, one drive, one point of failure.

So keeping your newest and most-watched stuff on the protected NAS, and only pushing the old, cold, easily-replaceable stuff out to bare drives, means that when - not if - one of those cheap satellite drives eventually dies, you lose the cold stuff. Annoying, not catastrophic. At least until you refactor or throw more infrastructure at it.

What it protects, automatically

  • Anything tagged never-move (or whatever you call it) in your config
  • Anything actively downloading or importing right now
  • Anything any Jellyfin user has favorited - and if you favorite something that's already on cold, the next plan pulls it back to hot, evicting cold-eligible titles from hot first if that's what it takes to fit
  • Anything added recently (a grace period, before it's even considered)
  • Currently-airing TV, if you want that on
  • Anything not released/premiered yet (an unreleased movie, a show that hasn't aired its first episode) - it's about to start actively growing, so it stays off cold storage. If one of these turns up already sitting on a cold drive (imported straight there, or left behind from an earlier season), Coldarr moves it back to hot on its own.
  • Anything monitored whose file hasn't met its quality profile's cutoff yet - Radarr/Sonarr are going to replace it with an upgrade, so it stays on hot storage. Coldarr learns this from the Scan Quality Cutoffs job below (a scheduled Run the Plan always runs that check first).

How you run it

CLI or a small web GUI (coldarr serve) - same config file either way. Cron the CLI, click around in the GUI, or both.

Keeping tabs on it without watching it

Settings > Notifications takes a webhook URL for your own Apprise endpoint. Point it there and every run - scheduled or manual - sends you a one-line summary. Flip on Verbose if you also want a ping per item, not just the summary; it's off by default so a big move doesn't spam you.

Settings > Scheduler adds five jobs, all off until you turn them on (and three more for downloads, with qBittorrent connected - see Downloads and seeding):

  • Run the Plan - does exactly what clicking Apply does, just on a schedule (every N hours, or daily at a time you pick). No cron entry to write, no -y flag to remember.
  • Rescan Cold Storage - a read-only health check on your cold tiers (usage, reachability), nothing gets moved. Handy for those bare satellite drives - you find out one's gone missing or full from a notification, not from a failed transfer at 3am.
  • Refresh Links Cache - keeps the Plan/History pages' Links column (deep links into Radarr/Sonarr/Jellyfin) current without hitting those apps live on every page view.
  • Scan Quality Cutoffs - finds files that don't meet their quality profile's cutoff yet, so scoring keeps them on hot storage while Radarr/Sonarr are still going to replace them. Run the Plan always does this first anyway, so its data is current even with this job off.
  • Scan for Orphaned Storage - walks your tier paths for folders nothing in Radarr, Sonarr, Lidarr, Jellyfin, or qBittorrent tracks anymore, and lists them on the Orphaned Storage page.

Pick one or more Weekly Omit Days at the top of the page to create a recurring blackout for every automatic job. For example, a daily 1:00am Run the Plan schedule with Monday omitted waits until Tuesday at 1:00am. Manual actions remain available on omitted days.

Coldarr remembers when each job last ran, so restarting it or saving a schedule never changes when a job next runs, and never starts one. A run that comes due while Coldarr is down is skipped, not made up when it starts again.

What it's not (yet)

  • No Plex - Jellyfin only, for now
  • No watch-history/play-count scoring - Favorites are in, that's it
  • qBittorrent is the only download client it works with