Skip to content

Example configuration

Copy the repository's coldarr.example.yaml to coldarr.yaml and adjust the paths and policy for your setup. In Docker, place it in the host directory bound to /config. Alternatively, add tiers through the web interface and let Coldarr create the file.

Connection credentials are configured separately; see Connections. See Storage tiers and Scoring and Favorites for how the policy is used, and Downloads and seeding for the commented-out download tiering section.

coldarr.example.yaml
# Coldarr example configuration.
#
# Copy this to coldarr.yaml and edit for your setup (or skip this file
# entirely and configure tiers through the web GUI - `coldarr serve`
# creates one for you as you go).
#
# Connection info (Radarr, Sonarr, Lidarr, Jellyfin, qBittorrent) does NOT
# live here - it's stored encrypted, separately, via the GUI's Connections
# page, the `coldarr connections set` CLI command, or RADARR_URL/
# RADARR_API_KEY (SONARR_*, LIDARR_*, JELLYFIN_*, QBITTORRENT_*) environment
# variables, which always take precedence over whatever is stored.
#
# Values in this file can still reference environment variables, e.g.
# ${SOME_VAR}, for anything below.

# Tiers are named storage policies applied to one or more physical paths.
# Every path in a tier is checked independently - a tier is a shared
# policy, not a pooled volume.
#
# - role: hot   -> primary storage. Coldarr never proactively steers this
#                  toward any usage level - it's runoff, not a control
#                  variable. Every cold-eligible item sitting on a hot path
#                  is a move candidate, whenever cold tiers have room to
#                  accept it. No target_used_percent here. When Coldarr
#                  pulls a grow-risk item back onto hot (e.g. an unmet
#                  quality-cutoff file), it still won't push a hot path
#                  past 97% used unless you set max_used_percent yourself -
#                  packing hot storage to the wire would leave no room for
#                  the very growth that move exists to make space for.
# - role: cold  -> overflow storage. Coldarr actively packs cold-eligible
#                  items toward target_used_percent (the fill goal),
#                  falling back to max_used_percent (the hard ceiling,
#                  never crossed) only when nothing has room under target.
#
# max_used_percent has no built-in ceiling on cold tiers - if you want a
# satellite drive packed to 100%, set it to 100. Coldarr will respect
# that. On a hot tier, max_used_percent overrides the 97% default
# described above (also up to 100 if that's genuinely what you want).
tiers:
  - name: hot
    role: hot
    paths:
      - /data/media/movies
      - /data/media/tv
    media_types: [movie, tv]
    require_mount: false # the primary NAS mount is expected to always be present

  - name: cold-movies
    role: cold
    paths:
      - /mnt/sat1/movies
      - /mnt/sat2/movies
    media_types: [movie]
    target_used_percent: 92
    max_used_percent: 95
    require_mount: true # refuse to use these paths if the drive isn't actually mounted

  - name: cold-tv
    role: cold
    paths:
      - /mnt/sat1/tv
    media_types: [tv]
    target_used_percent: 92
    max_used_percent: 95
    require_mount: true

policy:
  # Don't touch anything moved within the last N days.
  cooldown_days: 30

  # Don't bother moving items smaller than this - not worth the risk for
  # a couple of GB.
  min_move_size_gb: 1

  # Newly added items stay on hot storage for at least this long,
  # regardless of score.
  hot_grace_days: 14

  # Tags that make an item completely untouchable.
  never_move_tags: [never-move]
  protected_tags: [keep-hot, favorite]

  # Tag that pushes an item strongly toward cold storage.
  cold_ok_tags: [cold-ok]

  # A continuing/currently-airing series is always kept hot, regardless
  # of score, when this is true.
  protect_continuing_series: true

  # Quality profiles considered lower priority - a small scoring bump
  # toward cold storage.
  low_priority_quality_profiles: []

  # Minimum score (see internal/scoring) an item needs to be considered
  # a cold candidate. Raise this to be more conservative about what
  # moves, lower it to move things more aggressively.
  cold_score_threshold: 40

history:
  path: ./coldarr-history.json

# Optional download tiering, with qBittorrent connected: finished downloads
# move from the download drive to seed storage once they've settled, and
# can be removed once their trackers' seeding requirements are met. Add two
# tiers with `domain: downloads` - mounted into Coldarr at the same paths
# qBittorrent uses - and uncomment below. See the docs' "Downloads and
# seeding" page.
#
#  - name: download-ssd        # (under tiers:)
#    domain: downloads
#    role: hot
#    paths: [/downloads]
#
#  - name: seed
#    domain: downloads
#    role: cold
#    paths: [/seed]
#    target_used_percent: 92
#    max_used_percent: 97
#    require_mount: true
#
# torrents:
#   settle_days: 3
#   seed_label: seed           # given only once a move has landed
#   labels:                    # labels with no rule are left alone
#     - {label: movies, action: move, imported_by: radarr}
#     - {label: tv, action: move, imported_by: sonarr}
#     - {label: transfer, action: ignore}
#   seeding:
#     min_seed_days: 0         # 0 = forever: nothing is done until you say so
#     grace_days: 7
#     overrides:
#       - {host: tracker.example.org, min_seed_days: 14}
#   removal:
#     mode: off                # off, report, or remove
#     max_per_run: 25

# Optional web GUI authentication. Client secret is stored encrypted
# alongside connection credentials, not in this YAML. Environment variables
# named COLDARR_OIDC_* always override these saved values when set.
auth:
  oidc:
    enabled: false
    issuer_url: https://auth.example.com
    client_id: coldarr
    redirect_url: https://coldarr.example.com/auth/callback
    required_group: coldarr
    groups_claim: groups
    token_auth_method: auto # auto, client_secret_basic, or client_secret_post
    auto_login: false