Homelab Academy / Modules
Guided practice + break/fix + lab gate.
Module: Module 2: ARR Media Automation
Activity type: Lab (Practice)
Objective: Given playback and storage constraints, the learner can write a plain-language quality policy, configure Custom Formats and cutoff/upgrade settings, and prove ranking on five controlled candidates.
Work in one app first (Sonarr or Radarr). Export/backup before edits. TRaSH Guides are a reference for intent, not a blind paste.
Export / back up current quality profiles.
cd COMPOSE_DIR
# UI: Settings → General → Backup, download zip to a private folder
# Also copy config bind mount:
Copy-Item -Recurse .\sonarr\config $HOME\backups\sonarr-profiles-$(Get-Date -Format yyyyMMdd) -ErrorAction SilentlyContinue
cd COMPOSE_DIR
# UI backup zip AND:
mkdir -p ~/backups/profiles-$(date +%Y%m%d)
cp -a ./sonarr/config ~/backups/profiles-$(date +%Y%m%d)/sonarr 2>/dev/null || true
cp -a ./radarr/config ~/backups/profiles-$(date +%Y%m%d)/radarr 2>/dev/null || true
Record current state (workbook table).
For the profile you will change: allowed qualities, order, cutoff, upgrade allowed?, minimum Custom Format score, upgrade-until score, list of Custom Formats + scores.
Optional API dump of profiles (redact; replace KEY/PORT):
curl -s "http://127.0.0.1:8989/api/v3/qualityprofile?apikey=YOUR_KEY" | head -c 400; echo
curl -s "http://127.0.0.1:8989/api/v3/customformat?apikey=YOUR_KEY" | head -c 400; echo
curl.exe -s "http://127.0.0.1:8989/api/v3/qualityprofile?apikey=YOUR_KEY"
curl.exe -s "http://127.0.0.1:8989/api/v3/customformat?apikey=YOUR_KEY"
Write the local requirement in one sentence (example: “Prefer 1080p WEB, reject incompatible HDR for this TV, allow upgrades until score ≥ X”).
Import or create only the Custom Formats that match that sentence. Assign scores and write why each score exists.
Set qualities, cutoff, min CF score, upgrade-until. Save the profile.
Interactive search a controlled monitored title. For ≥5 release candidates, record in the workbook:
release name | quality | CF score | preferred? | reason accepted/rejected
If ranking violates the written policy, change only one rule, save, repeat the five-candidate table.
Prove rollback: restore from the backup zip or copied config (app stopped if required), reopen profile UI, confirm original scores return.
docker compose stop sonarr
# restore config from ~/backups/... then:
docker compose start sonarr
docker compose logs --tail=50 sonarr
Set an unreachable upgrade-until score; observe endless “not done” behavior; restore.
Give a minor preference a higher score than a hard compatibility CF; observe bad ranking; restore.
Temporarily remove an incompatible-HDR (or similar) CF; inspect newly eligible junk; restore.
Restore backup and prove the five-candidate ranking matches the pre-change table.
All boxes must be true before the next class unlocks. If you fail: feedback → targeted review → new practice → reassess.