putiorr

A stable put.io bridge for the *arr family.

putiorr presents a Transmission-compatible RPC endpoint to Sonarr, Radarr, Lidarr, Readarr, Prowlarr, and similar apps, then copies completed put.io files into the download target your importers already know.

Its browser extension takes the same route for everything no *arr asks for: click a magnet link or a .torrent on any site and it lands in the profile you chose for that site.

Transmission-compatible RPC
put.io OAuth
RR profiles and routing
Completed-download handling
putiorr Transmission-compatible put.io bridge for Sonarr, Radarr, Lidarr, Prowlarr, and friends.
Put.io
RR profiles Use the setup wizard to create one profile per app.
Setup profile
RadarrEnabled
Radarr

Imports to /movies.

Put.io
putiorr
Download
/downloads
RPC
/radarr/transmission/rpc
SonarrEnabled
Sonarr

Imports to /series.

Put.io
putiorr
Download
/downloads
RPC
/sonarr/transmission/rpc
Download profiles Tune slow-speed reset by download shape.
Add profile
Default100 MB/s120s
Current downloads Combined put.io and local transfer state.
No active downloads yet. Progress appears here.

How the bridge works

1. put.io

Remote transfers are created and prepared in put.io.

2. putiorr

RPC requests look like Transmission to your *arr apps.

Target

3. Download target

Completed files are copied to a shared local target.

*arr

4. Import

Completed-download handling imports from the same mounted path.

5. Library

Your media ends up organized in the normal library folders.

Junk releases never reach your disk

When put.io finishes a transfer, putiorr can read what is actually in it before copying a single byte. A release Sonarr or Radarr could never import is blacklisted, searched again, and dropped from put.io — instead of downloading, failing to import, and blocking that episode or movie in Activity until someone clears it by hand.

putiorr Rejected releases screen listing four refused releases with the reason for each, the profile that owned it, and whether it was blacklisted or downloaded because the app could not be told.

Nothing it can import

A folder of .exe and .txt, an audio-only release, or a lone PDF. What counts is decided per app, not by one shared list.

Still packed in archives

Neither Sonarr nor Radarr extracts a .rar from a torrent, so a packed release is the classic "no files eligible for import".

Far short of what was promised

put.io finished but produced a fraction of the size the torrent announced. An optional minimum size catches the rest.

Off by default, and off after upgrading. It needs the app's URL and API key, because this lives only in the Sonarr and Radarr REST API (they call it the blocklist) — a download client cannot ask for it. putiorr runs the replacement search itself, so it works whether or not Redownload Failed is enabled.

Every rejection is kept on its own screen with the reason, the profile and the time, so a release thrown away wrongly can still be found. Leave the setting off if you run Unpackerr or another extractor, which makes packed releases importable after all.

Dashboard screenshots

Current putiorr uses a topbar, clear profile cards, panel actions, and focused empty states.

putiorr dashboard showing RR profile cards, download profile controls, and current downloads panel.

Connect with OAuth or token

The Put.io connection dialog keeps the default OAuth relay path simple, while still allowing a direct token paste or rotation when that fits the install.

  • OAuth starts from the browser with hosted relay defaults.
  • Direct Token supports paste-and-save for manual or rotated credentials.
  • Connection testing stays disabled until credentials are present.
putiorr Put.io connection dialog showing the OAuth tab and Connect with put.io action.
Put.io OAuth
putiorr Put.io connection dialog showing the Direct Token tab and token input.
Direct Token

Profile setup is guided

The setup wizard explains the field you are editing, keeps app-specific defaults aligned, and shows the final category folder before you save.

  • Semantic Field Guide changes with the selected input.
  • Computed values make shared download paths easy to verify.
  • Copy settings gives each *arr app the matching client values.
putiorr profile setup wizard showing semantic field help for the shared download folder and the computed final category folder.

Download profiles tune each use case

Download profiles let each media shape use the right slow-speed reset policy, keeping large copies patient and small imports responsive.

  • Startup grace gives large transfers time to reach normal throughput.
  • Ignore-below rules keep tiny files from distorting reset behavior.
  • Slow threshold and duration can match movies, episodes, music, or books.
putiorr download profile modal showing startup grace, ignore-below, duration, slow threshold, and semantic field guidance.

Paste the generated client values into Sonarr

Sonarr sees putiorr as a Transmission download client. When both containers share a Docker Compose network, the Host can be the putiorr service name.

  • Name and Host can both be putiorr inside the compose network.
  • Port 9091 and Category sonarr match the Sonarr RR profile defaults.
  • Completed Download Handling can remove imported items from the client history.
Sonarr Transmission download client configuration showing putiorr as the host, port 9091, category sonarr, and completed download handling enabled.

Built for reliable imports

Durable queue state

SQLite state keeps the bridge steady across restarts.

Secure OAuth flow

The static relay only returns the token to the user's putiorr instance.

One owner per download

The RPC path names the profile, or the app's own User-Agent does; the category only names the staging subfolder.

Shared download target

Mount the same host folder at the same container path everywhere.

Safe cleanup

Delete-local-data and remote cleanup are handled intentionally.

Resumable local copies

Partial files resume with range requests after restarts.

Unimportable releases refused

Sonarr and Radarr profiles can blacklist a junk release and search again before it is ever downloaded.

Setup in minutes

Run putiorr near your *arr stack, share one download target mount, and point each app at its matching Transmission URL base.

services:
  putiorr:
    image: ghcr.io/ptheofan/putiorr:latest
    restart: unless-stopped
    volumes:
      - /volume1/docker/putiorr-config:/data/putiorr-config
      - /volume/downloads:/downloads
  1. Create persistent config and download target folders.
  2. Start the container on the same Docker network as your *arr stack.
  3. Mount the download target into putiorr and each *arr app at the same path, such as /downloads.
  4. Connect put.io with OAuth or a direct token.
  5. Create one RR profile per app.
  6. Paste the Transmission host, port, category, and URL base into each app.

Grab straight from your browser

The grab extension captures the magnet links and .torrent downloads you click on any site, and putiorr queues them on put.io and copies them down locally. Which site routes to which profile is configured in putiorr, not in the extension.

Install the extension

OAuth relay remains available

The hosted relay page is still the dedicated browser handoff for put.io OAuth flows.

Open OAuth relay