Directory Structure
multilinguarr requires a three-tier directory structure. This is the most important concept to understand before setting up.
The three tiers
/srv/media/
downloads/ ← arr download clients write here (temporary)
storage/ ← arr moves completed files here (permanent)
radarr-fr/
radarr-en/
sonarr-fr/
sonarr-en/
library/ ← multilinguarr manages this (symlinks/hardlinks)
movies/fr/
movies/en/
tv/fr/
tv/en/| Tier | Who manages it | What's in it |
|---|---|---|
downloads/ | Download client (qBittorrent, etc.) | Temporary files being downloaded |
storage/ | Radarr/Sonarr | Completed, organized media — one directory per arr instance |
library/ | multilinguarr | Symlinks/hardlinks organized by language — media server reads from here |
Why not downloads → library directly?
Most arr setups use two tiers: downloads → library (with hardlinks or moves). This works fine for single-language setups. But multilinguarr needs the middle storage/ tier because:
- Each arr instance owns its storage — Radarr-FR manages
storage/radarr-fr/, Radarr-EN managesstorage/radarr-en/ - multilinguarr never touches real files — it only creates/removes links in
library/ - Language routing happens at the link level — the same file in
storage/radarr-fr/Movie (2024)/can appear in bothlibrary/movies/fr/andlibrary/movies/en/via symlinks
Migration from a flat setup
If you currently have a single Radarr with downloads/ → movies/:
- Create the new directory structure:
storage/radarr-fr/,library/movies/fr/, etc. - Move your existing media from
movies/intostorage/radarr-fr/ - In Radarr, update the root folder to
storage/radarr-fr/ - Set up multilinguarr and run a regeneration to create the library links
WARNING
Back up your media database before moving files. Radarr tracks files by path — changing the root folder requires a library refresh.
Docker volume mapping
All services (arr instances, multilinguarr, media server) must see the same paths. The simplest approach:
volumes:
- /srv/media:/srv/mediaMount the entire media tree at the same path in every container. This ensures webhook file paths match what multilinguarr and Jellyfin see on disk.
TIP
If you use hardlinks, storage/ and library/ must be on the same filesystem. Symlinks work across filesystems.