16 unstable releases (3 breaking)

new 0.5.5 Sep 27, 2023
0.5.4 Sep 27, 2023
0.4.4 Sep 23, 2023
0.3.5 Sep 21, 2023
0.1.2 Sep 17, 2023

#31 in HTTP server

Download history 54/week @ 2023-09-13 213/week @ 2023-09-20

268 downloads per month

MIT license

1.5K SLoC


Proxy that allows put.io to be used as a download client for sonarr/radarr/whisparr. The proxy uses the Transmission protocol.


There are a few ways to install putioarr:


Make sure you have a proper rust installation cargo install putioarr


First, generate a config using putio generate-config. This will generate a config file in ~/.config/putioarr/config.toml. Use -c to override the configuration file location.

Edit the configuration file and make sure you configure the username and password, as well as the sonarr/radarr/whisparr details.

  • Run the proxy:putioarr run
  • Configure the Transmission download client in sonarr/radarr/whisparr:
    • Url Base: /transmission
    • Username:
    • Password:


Docker images are based on linuxserver.io images.


The first time you run your docker container, run it without the -d option, since you'll need a put.io API key. When no configuration is found, it will present you a link and a code that will generate an API key. After the key is generated, putioarr will write a default config in your config volume (see docker compose and docker cli below). Modify the config (like username, password and sonarr/radarr/whisparr configuration) in order to properly use putioarr.

Supported Architectures

We utilise the docker manifest for multi-platform awareness.

Simply pulling ghcr.io/wouterdebie/putioarr:latest should retrieve the correct image for your arch (amd64 or arm64).

version: "2.1"
    image: ghcr.io/wouterdebie/putioarr:latest
    container_name: putioarr
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - /path/to/putioarr/config:/config
      - /path/to/your/downloads:/downloads
      - 9091:9091
    restart: unless-stopped

docker cli (click here for more info)

docker run -d \
  --name=putioarr \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Etc/UTC \
  -p 9091:9091 \
  -v /path/to/deluge/config:/config \
  -v /path/to/your/downloads:/downloads \
  --restart unless-stopped \


Container images are configured using parameters passed at runtime (such as those above). These parameters are separated by a colon and indicate <external>:<internal> respectively. For example, -p 8080:80 would expose port 80 from inside the container to be accessible from the host's IP on port 8080 outside the container.

Parameter Function
-p 9091 Port connecting to putioarr
-e PUID=1000 for UserID - see below for explanation
-e PGID=1000 for GroupID - see below for explanation
-e TZ=Etc/UTC specify a timezone to use, see this list.
-v /config putioarr configs
-v /downloads torrent download directory


The proxy will upload torrents or magnet links to put.io. It will then continue to monitor transfers. When a transfer is completed, all files belonging to the transfer will be downloaded to the specified download directory. The proxy will remove the files after sonarr/radarr/whisparr has imported them and put.io is done seeding. The proxy will skip directories named "Sample".


A configuration file can be specified using -c, but the default configuration file location is:

  • Linux: ~/.config/putioarr/config.toml
  • MacOS: ~/Library/Application Support/nl.evenflow.putioarr

TOML is used as the configuration format:

username = "myusername"
password = "mypassword"

download_directory = "/path/to/downloads"

bind_address = ""

port = 9091

loglevel = "info"

uid = 1000

polling_interval = 10

skip_directories = ["sample", "extras"]

orchestration_workers = 10

download_workers = 4

api_key =  "MYPUTIOKEY"

url = "http://mysonarrhost:8989/sonarr"

url = "http://myradarrhost:7878/radarr"


  • Better Error handling and retry behavior
  • The session ID provided is hard coded. Not sure if it matters.
  • (Add option to not delete downloads)
  • Figure out a better way to map a transfer to a completed import. Since a transfer can contain multiple files (e.g. a whole season) we currently check if all video files have been imported. Most of the time this is fine, except when there are sample videos. sonarr/radarr/whisparr will not import samples, but will make no mention of the fact that the sample was skipped. Right now we check against the skip_directories list, which works, but might be tedious.
  • Automatically pick the right putio proxy based on speed


Thanks to davidchalifoux for borrowed code from kaput-cli.


~741K SLoC