A lightweight, self-hosted media request relay built for Docker.
Features β’ How it works β’ Install β’ Configuration β’ Support
ArrRelay is a free, open-source automation service that watches selected Discord channels for movie and series requests.
It validates each request, routes movies to Radarr and series to Sonarr, and sends anything uncertain or broken to a private Telegram admin review flow.
π¬ Discord is the request inbox.
π¬ Radarr / Sonarr handle media automation.
π² Telegram is the private review console.
π ArrRelay connects everything together.
| Feature | Description |
|---|---|
| π³ Docker-first | Simple Docker / Docker Compose deployment |
| π Admin-only dashboard | First-run admin setup and protected login |
| π Web UI on port 3032 | Manage integrations and view activity from the browser |
| π¬ Discord listener | Watches only the servers/channels you configure |
| π§ Request validation | Requires Movie/Series + Title + Year before automatic processing |
| π¬ Radarr integration | Movie lookup, duplicate detection, add and search |
| πΊ Sonarr integration | Series lookup, duplicate detection, add and search |
| π² Telegram review | Ambiguous matches and errors are sent privately to the admin |
| β Telegram actions | Select the correct result or cancel directly from Telegram |
| π Duplicate protection | Prevents adding media that already exists |
| ποΈ SQLite history | Request history survives Docker restarts |
| π Usage dashboard | Tracks requests, additions, failures and review activity |
| π₯ Library statistics | Shows Radarr movies and Sonarr episode download totals |
| π§ͺ Dry Run mode | Test safely without actually adding or downloading media |
| π± Responsive UI | Designed for desktop and mobile |
| β Built-in support link | Optional Buy Me a Coffee button for the project |
flowchart LR
A[π¬ Discord Request] --> B{ArrRelay Validation}
B -->|Missing type / year| C[βοΈ Ask Requester]
B -->|Movie| D[π¬ Search Radarr]
B -->|Series| E[πΊ Search Sonarr]
D --> F{Clear Match?}
E --> F
F -->|Yes| G[β
Add + Search]
F -->|No| H[π² Telegram Review]
H --> I[Select Correct Result]
H --> J[β Cancel]
I --> G
G --> K[π Save Request History]
Discord
β
βΌ
ArrRelay
β
βββ Missing information ββββββββΊ Ask requester
β
βββ Movie + clear match ββββββββΊ Radarr βΊ Add + Search
β
βββ Series + clear match βββββββΊ Sonarr βΊ Add + Search
β
βββ Ambiguous / error ββββββββββΊ Telegram Admin
β
βββ Select result
βββ Cancel
ArrRelay is deliberately conservative. A request should contain:
- Type β Movie or Series
- Title
- Year
Movie: No Time to Die (2021)
Series: FBI (2018)
Chicago PD (2014) - Series
The Drop
ArrRelay will not guess and download something automatically.
Instead, it asks the requester for the missing information:
Please include the type, title and year.
Movie: Title (Year)
Series: Title (Year)
When ArrRelay cannot confidently identify the correct item, the request is sent to your private Telegram bot.
Example:
β οΈ ArrRelay review required
Movie: The Drop (2026)
Best confidence: 78%
Select the correct result or cancel.
Telegram buttons allow the administrator to:
- β Select the correct movie or series
- β Cancel the request
- π¨ Receive lookup/add errors
Only the configured Telegram Admin Chat ID is authorized to approve requests.
The dashboard is available at:
http://YOUR-SERVER-IP:3032
It currently shows:
| Metric | Purpose |
|---|---|
| π₯ Total Requests | All requests ArrRelay has received |
| π¬ Movie Requests | Requests routed toward Radarr |
| πΊ Series Requests | Requests routed toward Sonarr |
| Requests waiting for manual attention | |
| β Added | Successfully added items |
| β Failed | Requests that failed |
| ποΈ Radarr Movies | Total movies currently in Radarr |
| πΎ Downloaded Movies | Radarr movies that already have files |
| π‘ Sonarr Series | Total series currently in Sonarr |
| πΊ Episodes | Downloaded vs total episodes |
| π’ Discord Listener | Current bot/listener status |
| π Recent Requests | Latest request activity |
ArrRelay is designed so Discord, Telegram, Radarr and Sonarr credentials are entered in the browser wizard β not in the Docker command.
mkdir -p /opt/arrrelay/data
docker run -d \
--name arrrelay \
--restart unless-stopped \
-p 3032:3032 \
-v /opt/arrrelay/data:/data \
ghcr.io/kasundigital/arrrelay:latestThen open:
http://YOUR-SERVER-IP:3032
That's it. ArrRelay automatically creates and stores its own persistent application secret under /data.
mkdir -p /opt/arrrelay && cd /opt/arrrelay
curl -fsSLO https://raw.githubusercontent.com/kasundigital/ArrRelay/main/docker-compose.yml
docker compose up -dOpen:
http://YOUR-SERVER-IP:3032
Docker Compose:
cd /opt/arrrelay
docker compose pull
docker compose up -dDocker Run:
docker pull ghcr.io/kasundigital/arrrelay:latest
docker stop arrrelay
docker rm arrrelayThen run the same docker run command again. Your settings remain in /opt/arrrelay/data.
Developers who want to build the current source locally can use:
git clone https://github.com/kasundigital/ArrRelay.git
cd ArrRelay
docker compose -f docker-compose.build.yml up -d --buildThe first time you open ArrRelay, a 6-step setup wizard collects everything the application needs:
-
π Admin account
- Admin username
- Admin password
-
π¬ Discord
- Bot token
- Server / Guild ID
- Request channel ID(s)
- Private-DM or temporary channel-reply mode
-
π² Telegram
- Bot token
- Admin Chat ID
-
π¬ Radarr
- URL
- API key
- Root folder
- Quality profile ID
-
πΊ Sonarr
- URL
- API key
- Root folder
- Quality profile ID
-
π§ͺ Automation
- Match confidence
- Dry Run
All integration values are stored in the persistent ArrRelay SQLite database under /data.
Recommended: leave Dry Run enabled until Discord β ArrRelay β Radarr/Sonarr β Telegram has been tested successfully.
Use the detailed setup guide:
The same help link is available directly from the ArrRelay wizard and Settings page.
Your Discord bot should have only the permissions it needs for the configured request channels:
- ποΈ View Channel
- π Read Message History
- βοΈ Send Messages β only if using channel replies
- π Message Content Intent enabled in the Discord Developer Portal
For a quieter setup, choose:
DM requester privately
in ArrRelay settings.
Discord does not support a normal channel message that is visible only to one regular user. Use DM mode when strict privacy is required.
ArrRelay is designed to keep administration private.
- π Never commit your
.envfile - π Never expose Discord / Telegram / Radarr / Sonarr API keys
- π§ Change
APP_SECRETbefore deployment - π Use HTTPS behind a reverse proxy for internet access
- π Keep the dashboard LAN/VPN-only where possible
- π² Use only your private Telegram Chat ID for approval
- π§ͺ Start with
DRY_RUN=true
ArrRelay stores application data in SQLite:
/data/arrrelay.db
Docker Compose maps:
./data:/data
This preserves:
- Admin account
- Integration settings
- Request history
- Request statuses
- Dashboard statistics
across container recreation.
ArrRelay/
βββ app/
β βββ main.py
β βββ web.py
β βββ runtime.py
β βββ discord_bot.py
β βββ telegram_bot.py
β βββ service.py
β βββ parser.py
β βββ arr_client.py
β βββ database.py
β βββ settings_store.py
β βββ models.py
β βββ config.py
β βββ templates/
β βββ static/
βββ tests/
βββ data/
βββ Dockerfile
βββ docker-compose.yml
βββ requirements.txt
βββ README.md
- Discord request listener
- Movie / Series / Year validation
- Radarr lookup and add
- Sonarr lookup and add
- Telegram review buttons
- Admin-only dashboard
- Browser-based settings
- Docker deployment
- Request statistics
- Buy Me a Coffee support link
- Persist Telegram review candidates across container restarts
- Better natural-language request parsing
- Requester follow-up context
- Playback/problem report detection
- Additional dashboard charts
- Release tags and upgrade instructions
Contributions, bug reports and feature requests are welcome.
If you find a problem, open a GitHub issue with:
- ArrRelay version / commit
- Docker logs
- Expected behavior
- Actual behavior
- Radarr / Sonarr version where relevant
Please never include API keys, bot tokens or passwords in an issue.
ArrRelay is free and open source.
If ArrRelay saves you time or you would like to support continued development:
The same support option is available from the ArrRelay admin interface.
Kasun Indika
GitHub: @kasundigital