The documentation here is for an unreleased version of Recyclarr.
Visit the documentation site for the Current Version instead.Version 9.0 (Unreleased)
This page tracks deprecations and breaking changes planned for Version 9.0, which is currently in development. The content here may change as features are added, modified, or removed during the development cycle.
Overview
Recyclarr is now two programs: a server that runs your syncs, and the recyclarr CLI, which sends
commands to a server. What that means for you depends on how you run Recyclarr:
- Docker: There is still one image and one container. The container now runs the server, which
stays running and syncs on its own schedule instead of using cron. To run a command yourself, use
the CLI included in the image through
docker exec, for exampledocker exec recyclarr recyclarr sync. See Docker: Persistent Server for a v8 compose file and its v9 equivalent. - Without Docker: You run
recyclarr syncand other commands the same way. If you have not set up a server, each command starts a temporary server in the background, uses it, and stops it when the command ends. You do not need to set anything up, butrecyclarr-servermust stay in the same directory asrecyclarr. See Temporary Server and CLI: Server Executable Required.
Your configuration files keep working: the YAML format of recyclarr.yml and the files in configs
has not changed. In Docker, you change environment variables in your compose file and move the sync
schedule to settings.yml. These changes affect how Recyclarr finds and checks your configuration
files:
Docker: Persistent Server
The Docker image now runs the Recyclarr server instead of a cron job. The server stays running, syncs on a built-in schedule, and accepts commands from the CLI. See the Docker guide for the full setup.
Here is a v8 compose file and the same setup in v9. The sections below explain each change.
networks:
recyclarr:
name: recyclarr
external: true
services:
recyclarr:
image: ghcr.io/recyclarr/recyclarr:8
container_name: recyclarr
user: 1000:1000
networks: [recyclarr]
volumes:
- ./config:/config
environment:
- TZ=America/Santiago
- CRON_SCHEDULE=0 4 * * *
- RECYCLARR_CREATE_CONFIG=true
- RECYCLARR_LOG_LEVEL=debug
networks:
recyclarr:
name: recyclarr
external: true
services:
recyclarr:
image: ghcr.io/recyclarr/recyclarr:9 # <<< CHANGED
container_name: recyclarr
restart: unless-stopped # <<< ADDED
user: 1000:1000
networks: [recyclarr]
volumes:
- ./config:/config
environment:
- TZ=America/Santiago
- RECYCLARR_API_KEY=${RECYCLARR_API_KEY} # <<< ADDED
# CRON_SCHEDULE: moved to settings.yml
# RECYCLARR_CREATE_CONFIG and RECYCLARR_LOG_LEVEL: removed
server:
schedule:
cron: 0 4 * * *
To upgrade:
- Add an API key in
RECYCLARR_API_KEY. - Move the schedule from
CRON_SCHEDULEtosettings.yml. - Remove
RECYCLARR_CREATE_CONFIGandRECYCLARR_LOG_LEVEL. - Add a restart policy so scheduled syncs keep running.
- Replace
docker compose runcommands withdocker exec.
API Key Required
The server requires an API key of at least 32 characters and does not start without one. The image
has no default key. Set RECYCLARR_API_KEY on the container:
services:
recyclarr:
image: ghcr.io/recyclarr/recyclarr:9
environment:
- TZ=America/Santiago
- RECYCLARR_API_KEY=${RECYCLARR_API_KEY} # <<< ADDED
See API Key for how to create the key and store it in a .env file or a Compose
secret. CLI commands you run with docker exec use the same key automatically.
Schedule Moved to settings.yml
The CRON_SCHEDULE environment variable is no longer read. Remove it from your compose file and put
the same cron expression in server.schedule.cron in settings.yml. If you did
not set CRON_SCHEDULE, you can skip this step: the new default also syncs once a day at midnight.
services:
recyclarr:
image: ghcr.io/recyclarr/recyclarr:9
environment:
- TZ=America/Santiago
- CRON_SCHEDULE=0 4 * * * # <<< REMOVED
# settings.yml
server:
schedule:
cron: 0 4 * * *
Container Arguments No Longer Run the CLI
Arguments after the image name no longer run Recyclarr commands. For example,
docker compose run --rm recyclarr sync does not sync anymore. Run commands in the running
container with docker exec instead:
docker exec recyclarr recyclarr sync
If an external scheduler ran Recyclarr this way, see Using an External Scheduler.
Removed Environment Variables
Remove these variables from your compose file. Recyclarr ignores them:
RECYCLARR_CREATE_CONFIG: Create your configuration files in/configyourself.RECYCLARR_LOG_LEVEL: Use--logon CLI commands to show log output on the console.
Add a Restart Policy
The container must keep running for scheduled syncs to happen. Add a restart policy so the server starts again after a crash or a reboot:
services:
recyclarr:
restart: unless-stopped
To call the HTTP API from outside the container, you also need to publish port 7982. See
HTTP API.
edge Tag Replaced by Dev Images
The edge tag is no longer updated on Docker Hub or GHCR. The existing edge images stay where
they are but get no new builds. The latest unreleased code is now in the master dev image,
published to GHCR only:
services:
recyclarr:
# <<< CHANGED from ghcr.io/recyclarr/recyclarr:edge
image: ghcr.io/recyclarr/recyclarr-dev:master
Dev images are just as unstable as edge was. See Dev Builds for branch tags, digest
pins, and how long old builds are kept.
Default Files No Longer Created
Recyclarr no longer creates the configs and includes subdirectories or an empty settings.yml.
A missing directory or settings file is not an error: without settings.yml, Recyclarr uses default
settings. Create these yourself when you need them. Existing files and directories keep working as
before.
By default, the state and data directories are inside the configuration directory, so Recyclarr
still creates it when it is missing. To leave the configuration directory untouched, for example to
mount it read-only, move both directories out of it with the new RECYCLARR_STATE_DIR
variable and RECYCLARR_DATA_DIR. See
File Structure.
If your configuration directory still has cache or repo folders from an older version, start
Recyclarr once with it writable so its migrations can move or delete them. You can
also delete the folders yourself. Otherwise, startup fails on a read-only mount.
You can reuse your old v8 configuration volume as the new state directory, for example as the state
volume of the Helm chart. v8 kept state in a state folder inside that volume, so
the server moves its contents up to the root of the state directory when it starts. Recyclarr does
not delete the other files on the volume, such as old configs, settings.yml, and logs. It logs a
warning that lists them so you can delete them yourself.
Invalid Configuration Stops the Server
Previously, when a configuration file had errors, Recyclarr reported them and still synced the instances in your other files. Now the server checks your configuration files when it starts, and an error in any of them stops it from starting. Fix every error the server logs, then start it again. See Client and Server.
Log Files and Console Format
Log files moved from logs/cli/ to logs/server/ in the data directory. The CLI no
longer writes log files; the server writes them instead. Use --log on CLI commands to show log
output on the console.
When its output is not a terminal, as with docker logs, the server now writes one JSON object per
line instead of text. To keep text output, set server.logging.format in
settings.yml:
# settings.yml
server:
logging:
format: text
CLI: Server Executable Required
The release archives now contain two executables: recyclarr and recyclarr-server. The CLI sends
its work to a server and starts recyclarr-server from its own directory when needed. If you copy
the recyclarr executable somewhere by hand, copy recyclarr-server to the same directory. See
Client and Server.
CLI: sync --config Removed
The -c|--config option of recyclarr sync has been removed. The server loads configuration only
from its default locations. Move any configuration files you passed with --config
into the configs directory.
recyclarr sync --config ../myconfig.yml # <<< REMOVED
CLI: config list local Removed
The recyclarr config list local command has been removed. The server loads every configuration
file in its default locations, so there is no separate list of local files to check.
Remove any calls to recyclarr config list local from your scripts.
recyclarr config create and recyclarr config list templates keep their syntax.
Recyclarr now generates their templates from the TRaSH Guides instead of downloading the
config-templates repository.
CLI: migrate Removed
The recyclarr migrate command has been removed. Migrations already ran automatically, and they now
run each time the server starts. Remove any calls to recyclarr migrate from your scripts. See
Migration System.
CLI: state repair Removed
The recyclarr state repair command and its --adopt flag have been removed. Sync is now
self-healing: when a configured resource matches an existing resource in the service by name but has
no state mapping, Recyclarr automatically adopts it and emits a warning:
Adopted Custom Format '3D' (b8cd450cbfa689c0259a01d9e29ba3d6) from service ID 66
Previously, this scenario required running recyclarr state repair --adopt to resolve the conflict.
Common situations where this occurred:
- Pointing Recyclarr at an existing Sonarr/Radarr instance with matching resources
- Relocating a service to a new URL (changing
base_url) - Database rebuilds or instance migrations
All of these are now handled automatically during sync.
The only scenario that still requires manual intervention is ambiguous matches: when 2+ service resources share the same name (case-insensitive), Recyclarr cannot determine which one to adopt. The error message instructs you to resolve the duplicates in the service directly.
New Mental Model
If it's in your config, Recyclarr owns it. If you want to manually manage a resource, remove it from your config. Recyclarr warns you when it adopts something that already existed, giving you a chance to notice and adjust your config if needed.