Your Sonarr instance has 41 custom formats. Radarr has 38. You run a 4K instance too, so that is 117 objects that drift every time the TRaSH Guides team revises a release group score. Clicking through that by hand is not configuration management — it is data entry with extra steps, and one forgotten CF score is the difference between grabbing a clean WEB-DL and a 30 GB remux with three audio tracks.

That is the problem three open-source tools solve: Recyclarr, Profilarr, and Configarr. All three read TRaSH Guides definitions and push them into your *arr instances through the API. They differ violently in how much control you get and how much of your sanity you trade for it.

TL;DR / Quick Verdict

If you already run the standard TRaSH setup and want it to keep working — install Recyclarr, schedule it hourly, forget it exists. It is the most battle-tested option by a wide margin and the only one whose YAML format the TRaSH Guides documentation itself assumes.

If you manage multiple instances and want to see what changed before it lands — pick Profilarr. It ships a real web UI, a central library of quality profiles, and diff views instead of blind cron jobs.

If TRaSH Guides is only the starting point and you maintain your own custom formats — pick Configarr. It merges TRaSH definitions with local YAML and inline definitions in a deterministic order, which neither of the other two does cleanly.

Running two of them at once is the one thing you must not do. They will overwrite each other’s quality profile scores on every sync, and you will spend a weekend wondering why your Radarr keeps flip-flopping.

Side-by-Side Comparison

All figures pulled from the projects’ GitHub repositories on 2026-11-09.

DimensionRecyclarrProfilarrConfigarr
Stars2,1512,770673
LanguageC# (.NET)TypeScriptTypeScript
LicenseMITAGPL-3.0AGPL-3.0
Last commit2026-11-082026-11-072026-11-06
InterfaceCLI + cron daemonWeb UI + APICLI + cron
Config formatrecyclarr.ymlUI-managed + exportconfig.yml
TRaSH Guide syncNative, first-classNativeNative
Custom formats of your ownLimitedYes, via libraryYes, three merge layers
Multi-instanceYes, per-instance blocksYes, central server registryYes, arrays
Docker imageghcr.io/recyclarr/recyclarr:8ghcr.io/dictionarry-hub/profilarr:developghcr.io/raydak-labs/configarr:latest
Learning curveLow if you like YAMLLow if you like clickingMedium
Best fitSingle-admin homelabMulti-instance householdsConfig-as-code purists

Use Case Decision Matrix

Your situationUse thisWhy
One Radarr, one Sonarr, stock TRaSH profilesRecyclarrFive-line YAML, cron schedule, zero UI maintenance
Three instances, two users, different profile setsProfilarrCentral library with per-instance assignment and visual diffs
You maintain 20 custom formats of your ownConfigarrMerge order TRaSH → local files → inline config is explicit
You want to review changes before they hit productionProfilarrSync preview and drift detection in the browser
You run everything in GitOps and never open a browserConfigarrConfig file is the source of truth, diffable in Git
You are on ARM64 (Raspberry Pi, Oracle A1)Any of the threeAll publish multi-arch images
You want the smallest possible footprintRecyclarrSingle static binary, ~50 MB RAM, read_only container

Recyclarr — The Reference Implementation

Recyclarr has been the default answer since 2022, and the ecosystem treats its configuration format as the lingua franca. The tool syncs custom formats, quality definitions, media naming, and media management settings from TRaSH Guides, and it does so idempotently: if the remote state already matches, nothing is written.

The deployment is deliberately boring. Create config/recyclarr.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
radarr:
  movies:
    base_url: http://radarr:7878
    api_key: !env_var RADARR_API_KEY
    replace_existing_custom_formats: true
    quality_definition:
      type: movie
    quality_profiles:
      - name: HD Bluray + WEB
        reset_unmatched_scores:
          enabled: true
        upgrade:
          allowed: true
          until_quality: Bluray-1080p
          until_score: 10000
        min_format_score: 0

sonarr:
  series:
    base_url: http://sonarr:8989
    api_key: !env_var SONARR_API_KEY
    replace_existing_custom_formats: false
    quality_definition:
      type: series
    quality_profiles:
      - name: WEB-1080p
        reset_unmatched_scores:
          enabled: true

Note what the API key does not do: it does not get written into Git. The !env_var tag is Recyclarr’s mechanism for pulling secrets from the environment at runtime, which is the only reason this file is safe to version-control.

The official container is intentionally minimal:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  recyclarr:
    image: ghcr.io/recyclarr/recyclarr:8
    container_name: recyclarr
    user: 1000:1000
    volumes:
      - ./config:/config
    environment:
      TZ: Europe/Berlin
      CRON_SCHEDULE: "0 3 * * *"
    restart: unless-stopped

Two details bite people here. First, the latest tag does not exist — Recyclarr publishes major-version tags only, so :8 is correct and :latest will fail to pull. Second, the container runs as the UID you pass in user:; if /config is owned by root, the container starts and then silently fails to write its cache.

A manual sync is a single command, which makes it easy to wire into a systemd timer or a CI job instead of the built-in scheduler:

1
2
docker exec recyclarr recyclarr sync
docker exec recyclarr recyclarr list custom-formats radarr

The last command is the underrated feature: it prints every custom format Recyclarr knows about with its score, so you can audit drift without opening Radarr at all.

Where Recyclarr falls short is anything TRaSH Guides does not model. You can define your own custom formats, but you cannot express multi-step merge logic, and the config file grows into a small program once you maintain more than two profiles.

Profilarr — Configuration Management With a Face

Profilarr reframes the problem as a management problem rather than a sync problem. It runs a server that holds a library of quality profiles, custom formats, and regular expressions, then lets you assign that library to registered *arr instances. The UI shows you what will change before you commit it.

Profilarr quality profile library and instance overview

The Compose file from the project repository is short. The optional parser service powers regular expression testing against real release names, which is worth running if you write your own formats:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
services:
  profilarr:
    image: ghcr.io/dictionarry-hub/profilarr:develop
    container_name: profilarr
    restart: unless-stopped
    ports:
      - "6869:6868"
    volumes:
      - ./config:/config
    environment:
      - PUID=1000
      - PGID=1000
      - UMASK=022
      - TZ=Etc/UTC
      - PARSER_HOST=parser
      - PARSER_PORT=5000
    depends_on:
      parser:
        condition: service_healthy

  parser:
    image: ghcr.io/dictionarry-hub/profilarr-parser:develop
    container_name: profilarr-parser
    restart: unless-stopped
    expose:
      - "5000"

The develop tag is not a typo — the project publishes its actively maintained build there, and pinning to latest may leave you on a stale snapshot. Check the repository’s tags before you freeze a version in production.

The practical advantage shows up the moment you have more than one instance. With Recyclarr, a 1080p profile and a 4K profile live in the same YAML file and you copy-paste blocks to add a second instance. With Profilarr you define HD Bluray + WEB once, assign it to radarr-main and radarr-4k, and change the score in one place. When the TRaSH Guides team bumps a release group, the diff view tells you exactly which instances are affected before anything is written.

The trade-off is state. Profilarr keeps its own database of what it believes your instances contain, so a manual change inside Radarr’s interface gets flagged as drift rather than silently accepted. That is the correct behaviour for configuration management and it is also the reason some homelab users bounce off it — the tool will keep telling you that you have unmanaged changes.

Configarr — Config-as-Code Without Compromise

Configarr is the newest of the three and the most explicit about merging. Its selling point is a documented precedence order: TRaSH Guides first, then local custom format files, then formats defined inline in the config. Last writer wins, deterministically, and you can see the whole stack in one file.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
sonarr:
  - name: main
    base_url: http://sonarr:8989
    api_key: !env SONARR_API_KEY
    quality_definition:
      type: series
    include:
      - template: sonarr-quality-definition-series
      - template: sonarr-v4-quality-profile-web-1080p
      - template: sonarr-v4-custom-formats-web-1080p
    custom_formats:
      - trash_ids:
          - 496f355514737f7d83bf7aa4d24f8169
        assign_scores_to:
          - name: WEB-1080p
            score: 101
    replace_existing_custom_formats: true

radarr:
  - name: movies
    base_url: http://radarr:7878
    api_key: !env RADARR_API_KEY
    quality_definition:
      type: movie
    include:
      - template: radarr-quality-definition-movie
    custom_formats:
      - trash_regex: German
        assign_scores_to:
          - name: HD Bluray + WEB

The !env, !secret, and !file tags are the reason this tool exists: every value can come from the environment, a secrets file, or a mounted file, which means the config itself contains no credentials and no environment-specific drift.

Deployment is a single container with a mounted config directory:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
services:
  configarr:
    image: ghcr.io/raydak-labs/configarr:latest
    container_name: configarr
    restart: unless-stopped
    volumes:
      - ./config:/app/config
    environment:
      TZ: Europe/Berlin
      LOG_LEVEL: info

Run it on demand rather than on a schedule if you prefer explicit control:

1
2
3
docker run --rm -v ./config:/app/config \
  -e SONARR_API_KEY="$SONARR_API_KEY" \
  ghcr.io/raydak-labs/configarr:latest

Configarr explicitly supports Sonarr v4 and the v5 beta plus Radarr v5, v6, and v7 through the same API v3 surface, and it detects the Sonarr API version at runtime. That matters in 2026 because Radarr v7 and Sonarr v5 changed authentication defaults, and older sync tools that hard-coded API v3 paths without version detection started failing on the develop channel.

The cost is documentation depth. Recyclarr has years of Stack Overflow answers and a dedicated docs site; Configarr has a config template and a growing documentation site. If something breaks at 1 a.m., Recyclarr is easier to debug from memory.

Pitfalls and Migration Notes

Never run two of these tools against the same instance. All three write quality profile scores through the same API endpoints. If Recyclarr syncs at 03:00 and Profilarr syncs at 03:05 with a different library version, your scores will oscillate and your downloads will become inexplicably bad. Pick one and disable the others’ schedulers.

replace_existing_custom_formats: true deletes formats you created by hand. It is the single most destructive option in all three tools. Turn it on for a clean instance; leave it off on an instance where you have hand-tuned formats, and let the tool add rather than replace.

API keys are not the same as the web UI password. Radarr and Sonarr expose the key under Settings → General. A 401 in the logs almost always means you copied the wrong field, not that the container is broken.

Quality profile names must match exactly. TRaSH templates reference profiles by name. If you renamed HD Bluray + WEB to HD Bluray + WEB (custom), the sync will create a second profile instead of updating the first, and you will end up with two profiles competing for the same releases.

Score zero is not the same as no score. A custom format that exists but is scored 0 still participates in decisions in some *arr versions. reset_unmatched_scores is what normalises this, and leaving it disabled is a common cause of “why did it grab that release” threads.

Why Self-Host Your Media Automation At All?

The honest answer is that the alternative is worse in three specific ways.

First, cost. A hosted media automation stack that covers library management, indexer aggregation, and quality enforcement runs well past the price of a small VPS per year, and it still requires you to host the storage. A single 4 GB VPS running Sonarr, Radarr, Prowlarr, and one of these config tools costs less than a streaming subscription and does not raise prices annually.

Second, data ownership. Watch history, quality preferences, and library metadata are the most commercially valuable data a household produces. Keeping them in a PostgreSQL volume you control means no export requests and no terms-of-service changes.

Third, correctness. The entire reason these three tools exist is that quality enforcement is a maintenance problem. TRaSH Guides update weekly. A managed service gives you whatever profile its operators chose; a self-hosted sync tool gives you a diff and a rollback.

If you are still assembling the stack, our Sonarr vs Radarr vs Prowlarr vs Bazarr comparison covers which services you actually need, and the download automation guide explains how indexers and filters fit together. Once people start requesting titles, the Overseerr vs Jellyseerr vs Ombi breakdown handles the front door.

FAQ

Do I need Recyclarr if I already use Profilarr? No, and you should not run both. They write to the same quality profile endpoints. Choose one: Profilarr if you want a UI and multi-instance library management, Recyclarr if you want a cron job and a YAML file.

Does Recyclarr work with Radarr v7 and Sonarr v5? Yes. Recyclarr tracks the *arr API surface closely, and current releases handle the v7 authentication changes. The develop images of Radarr and Sonarr change behaviour frequently, so pin your *arr images to stable tags if sync failures would disrupt your household.

Can these tools create quality profiles from scratch? Recyclarr and Configarr both create profiles from TRaSH templates, including custom formats and scores. Profilarr creates profiles from its internal library, which can be seeded from TRaSH or built by hand in the interface. None of them will invent a scoring scheme for you.

What happens if I edit a quality profile manually after a sync? On the next sync, Recyclarr will overwrite the managed fields unless you disable that behaviour for the profile. Profilarr will flag the drift and show it to you before applying changes. Configarr will overwrite anything matched by its merge layers. This is why the tools are mutually exclusive in practice.

How often should the sync run? Daily is enough for most households. TRaSH Guides revisions are not emergencies, and a nightly 03:00 sync keeps scores current without repeatedly hitting the *arr API. Run it manually after you change your own config.

Is a database required? Recyclarr needs only a config directory and a cache. Configarr needs only a config directory. Profilarr keeps a database inside its /config volume, so back that volume up alongside your *arr configuration if you want to preserve your library.


💰 想测试你的市场判断力?我用 Polymarket 做预测市场交易——这是全球最大的预测市场平台,从大选结果到技术监管时间线,什么都可以押注。和赌博不同,这是真正的信息市场:你懂的信息越多,胜率越高。我靠预测技术相关事件的走向已经赚了不少。用我的邀请链接注册:Polymarket.com