Japanese animation
wonmet: original_languageexpected ja
observed ja
met: genre_containsexpected Animation
observed Animation, Science Fiction
met: certification_inexpected not G, U, TV-Y
observed 15
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.
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.
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.
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
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
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
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
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
met: original_languageexpected ja
observed ja
met: genre_containsexpected Animation
observed Animation, Science Fiction
met: certification_inexpected not G, U, TV-Y
observed 15
not met: genre_containsexpected Music
observed Animation, Science Fiction
not met: keyword_containsexpected concert, live performance, tour
observed anime, cyberpunk
not met: genre_containsexpected Family
observed Animation, Science Fiction
not met: certification_inexpected G, U, TV-Y, TV-G
observed 15
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.
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.
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.
One dashboard over every connected instance: what is tracked, what is enriched, what is waiting for you.
any number, Linux or WindowsMultiple instances
Any number of Radarr and Sonarr instances, each with its own sync interval, folders and mappings.
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.
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.
/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.
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.
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.
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
only if you ask twice
Global dry-run, on by default
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.
no
The root folder, not the name
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.
no
The Arrs are a source of their own
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.
no
Two fields, through their own API
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.
never
No outbound request nobody asked for
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.
yes
One environment variable
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.
a Pi is enough
One image, one file
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.
Read the plan, keep what you agree with, and let the rules do the rest.
What you have just been shown
Global dry-run is on from the first launch, and five more gates stand after it.
What each condition expected, what it observed, and the rules that did not win.
amd64 and arm64, a single SQLite file, no database service to run.