A Discord bot for requesting media through *arr backends, written in Rust.
Each backend you configure creates a /request <media> slash command — e.g. /request movie and /request series.
Go to the Discord Developer Portal, create a new application, then open the Bot tab and create a bot. Copy the token — you'll need it in your config.
Under OAuth2 → URL Generator, tick the bot and applications.commands scopes. Open the generated URL to invite the bot to your server.
Note
To post request confirmations in the channel for everyone to see, also tick the Send Messages permission. Without it, requests still work — the public announcement is just skipped.
- Sonarr / Radarr: Settings → General → Security → API Key
- Seerr: Settings → API Key — must be an admin key
Create a config.toml (see Configuration below), then start the bot with Docker Compose:
services:
doplarr:
image: ghcr.io/activexray/doplarr_rs:latest
container_name: doplarr
restart: unless-stopped
volumes:
- ./config.toml:/config.toml:roCommands register automatically on startup. If they don't appear right away, wait a minute or restart your Discord client.
Doplarr reads a single config.toml. A minimal one looks like this:
discord_token = "YOUR_DISCORD_BOT_TOKEN"
# Movies via Radarr → /request movie
[[backends]]
media = "movie"
[backends.config.Radarr]
url = "http://localhost:7878"
api_key = "your_radarr_api_key"
# TV via Sonarr → /request series
[[backends]]
media = "series"
[backends.config.Sonarr]
url = "http://localhost:8989"
api_key = "your_sonarr_api_key"Each [[backends]] block adds one /request <media> command. Any option you
leave out (quality profile, root folder, …) is simply asked for in Discord at
request time.
That's all most setups need. For the full list of options — plus Seerr, 4K, anime, and pointing several commands at one instance — see the annotated config.example.toml.
Tip
- No config yet? Start the bot without one and it writes a starter
config.tomlfor you to edit. - Keep secrets out of the file by referencing environment variables:
api_key = "${RADARR_API_KEY}". - Coming from the Clojure Doplarr? Your old environment variables still work with no config file at all — see MIGRATING.md.
Important
If you request through Seerr/Overseerr/Jellyseerr, each user must link their
Discord account, or their requests are rejected. In Seerr, enable the Discord
notification agent (Settings → Notifications → Discord), then each user enters
their Discord User ID on their profile. To accept requests from unlinked users
instead, set fallback_user_id in the config.
# /etc/systemd/system/doplarr.service
[Unit]
Description=Doplarr Discord Bot
After=network.target
[Service]
Type=simple
User=doplarr
Group=doplarr
ExecStart=/opt/doplarr/doplarr /opt/doplarr/config.toml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now doplarrWith Nix:
nix build
nix run . /path/to/config.tomlWith Cargo (requires Rust, OpenSSL dev libraries, and pkg-config on Linux):
cargo build --release
./target/release/doplarr /path/to/config.tomlBot doesn't respond to commands
- Make sure you invited the bot with both
botandapplications.commandsscopes - Commands register on startup — wait a minute or restart Discord if they're missing
- Check logs for connection errors
Backend connection errors
- Test your API keys directly in the *arr web UI
- If running in Docker, make sure the container can reach your *arr services (check network/hostname)
- Quality profile names are case-sensitive and must match exactly what's in Sonarr/Radarr settings
Seerr: "user not found" or requests rejected
- Enable the Discord notification agent in Seerr (Settings → Notifications → Discord)
- Each user goes to their Seerr profile → Settings → Notifications → Discord and enters their Discord User ID
- Or set
fallback_user_idin your config to accept requests from unlinked users
Config parse errors
- Validate your TOML syntax (e.g. jsonformatter.org/toml-validator)
discord_tokenand at least one[[backends]]entry are required- Each backend's
mediavalue must be unique
See MIGRATING.md for the full config mapping from the old EDN format to TOML, renamed options, what's been removed, and running from environment variables.
See README_DEVELOPER.md for adding new backends, generating API bindings, and contributing.
Licensed under either of Apache License 2.0 (LICENSE-APACHE) or MIT License (LICENSE-MIT) at your option.
- Twilight for Discord API bindings
- OpenAPI Generator for *arr API clients
