How it decides

The whole argument, in one page.

What your Arrs already know and what they do not do with it, the four steps, how a decision explains itself, how a destination is declared, the full specification, and the objections worth raising before you install anything.

The gap

Your Arrs know. They do not choose.

Every film they fetch already carries its genres, its original language and its certification. Nothing reads any of it to pick a root folder, so the whole library lands in the same one.

Routarr is that missing decision layer: one place where the logic lives, using the folders your Arrs already have. On a webhook it decides before the download even lands, while the folder is still empty and nothing has to move.

Four steps, three are enough.

Nothing is written until an explicit action asks for it, and the global dry-run switch blocks writes at the server no matter what the interface does.

  1. 01

    Sync

    Reads films, series, tags and root folders from every Radarr and Sonarr you connect. An empty response is never treated as a mass deletion.

    Reads Radarr, Sonarr Writes nothing

  2. 02

    Enrich

    Genres, language and certification come free with the sync. Add TMDB for keywords and country: one call per title, cached, deduplicated, bounded concurrency.

    Reads TMDB, AniList, OMDb… Writes its own cache

  3. 03

    Decide

    Rules run by ascending priority, and the first match wins. Exclusions veto a rule that otherwise matched. Anything unmatched falls to your default category.

    Reads your rules Writes a plan you can read

  4. 04

    Apply

    Each move is written through the Arr API title by title, and Routarr follows the Arr until its move is done. Every applied move can be reverted.

    Reads the plan you approved Writes your library

one step writes to your libraryand the global dry-run switch blocks that one at the server

Explainability

Every decision shows its work.

A classification you cannot audit is one you cannot trust. Routarr records, condition by condition, what was expected and what was observed, for the winning rule and for every rule that did not win.

Akira (1988) · every rule that looked at it

#10

Japanese animation

won

met: original_languageexpected ja
observed ja

met: genre_containsexpected Animation
observed Animation, Science Fiction

met: certification_inexpected not G, U, TV-Y
observed 15

routed to anime, 70% confidence
#20

Concert films

did not match

not met: genre_containsexpected Music
observed Animation, Science Fiction

not met: keyword_containsexpected concert, live performance, tour
observed anime, cyberpunk

needs both, met neither
#30

Family & kids

did not match

not met: genre_containsexpected Family
observed Animation, Science Fiction

not met: certification_inexpected G, U, TV-Y, TV-G
observed 15

one is enough, met neither

The engine itself never writes prose: it emits keys and parameters, and the text is rendered in your language at display time. The justifications are translated in all 26 languages, not frozen in English at the moment they were computed.

Root folders

Your folders, your names, nothing invented.

Routarr never creates a library layout. It reads the root folders Radarr and Sonarr declare, and where you want a destination they do not list you type it here and it is marked as such. Either way you attach it to a category you named, and a declared folder takes its free space and reachability from the synced folder it sits under.

PathInstanceOriginFree spaceCategory
/moviesRadarrsynced2.4 TBstandard
/movies/animeRadarrdeclared2.4 TBanime
/movies/kidsRadarrdeclared2.4 TBkids
/movies/concertsRadarrdeclared2.4 TBconcerts
/tvSonarrsynced6.1 TBstandard
/tv/animeSonarrsynced6.1 TBanime
/mnt/archiveSonarrsyncedunreachableunmapped

seven destinations across two instancesthree declared here, four read from the Arrs

Free space and reachability come straight from the Arr. Two folders claiming the same category on one instance is refused rather than silently resolved, and a category no folder provides is reported before it can quietly skip your media.

Features

Webhooks, backups, 26 languages.

One dashboard over every connected instance: what is tracked, what is enriched, what is waiting for you.

Instances

any number, Linux or WindowsMultiple instances

Any number of Radarr and Sonarr instances, each with its own sync interval, folders and mappings.

Ingest

a secret URL per instanceReal-time webhooks

A per-instance secret URL. New additions are synced, enriched and evaluated immediately instead of at the next poll.

Exceptions

outranks every ruleExceptions and revert

Force a title's category and the engine stops arguing. An exception outranks every rule, and any applied move can be undone from the history.

Observability

/api/v1/metrics, same API keyPrometheus metrics

Library size, decisions per category and status, instance health, and the state of the guardrails, all behind the same API key.

Notifications

five formats, one test messageOutbound notifications

One webhook, written the way Discord, ntfy, Gotify or Apprise reads it, or as JSON for anything else, and a test message to check it. An Arr that stops answering is reported once, and again when it is back, not on every retry. Failed syncs and finished runs can be switched on too.

Portability

AES-256-GCM at restPortable config, sealed keys

Rules, categories, mappings and exceptions export as JSON and travel between installations. Arr API keys are AES-256-GCM-encrypted and never leave.

Questions

Before you install it.

Most of the answers below are no, which is the most useful thing this section has to say.

The worry The answer What guarantees it

Does it move my files around?

only if you ask twice

Global dry-run, on by default

In detail

Global dry-run is on from the first launch, the option to move files on disk is unchecked by default, and applying past a threshold needs an explicit confirmation. Without the disk-move option, Routarr only re-points the library entry and leaves the files where they are.

Will it rename my folders?

no

The root folder, not the name

In detail

A move changes the root folder above your title and keeps the folder name exactly as it is, so a library pointed at it by Plex or Jellyfin keeps working.

Do I need a TMDB key?

no

The Arrs are a source of their own

In detail

Radarr and Sonarr are a metadata source of their own. They already report genres, original language and certification, and Routarr reads them from the same response it syncs the library with. For the keywords and origin country of anime, AniList needs no key either. TMDB, OMDb and TheTVDB are there if you want them. Sources are an ordered list, so you decide which one wins when they disagree.

Does it replace Radarr or Sonarr?

no

Two fields, through their own API

In detail

It deliberately does not try. Routarr never manages downloads, indexers or the library itself. It writes exactly two things through the Arr API, the root folder and the path, and the Arr moves the files itself.

Does it phone home?

never

No outbound request nobody asked for

In detail

No telemetry, no analytics, no update check. The only outbound calls go to your Radarr and Sonarr instances, to the metadata sources you enable (TMDB, AniList, Jikan, OMDb, TheTVDB), to your OpenID Connect provider if you use one, and to a notification webhook if you set one.

Can I put it behind a reverse proxy?

yes

One environment variable

In detail

Including under a sub-path. Set ROUTARR_BASE_PATH=/routarr and the API, the interface and the webhook URLs all move with it, with no image rebuild.

What does it run on?

a Pi is enough

One image, one file

In detail

One Docker image for amd64 and arm64, so a Pi on a 64-bit system or an N100 is enough. Storage is a single SQLite file. There is no database service to run. Radarr and Sonarr may run anywhere, Windows included: a path on a drive letter or a network share is compared as Windows compares it, whatever its case or separator.

Stop choosing by hand.

Read the plan, keep what you agree with, and let the rules do the rest.

What you have just been shown

It cannot write until you let it

Global dry-run is on from the first launch, and five more gates stand after it.

Every decision shows its work

What each condition expected, what it observed, and the rules that did not win.

One image, one file, one port

amd64 and arm64, a single SQLite file, no database service to run.