A beautiful dashboard for your Servarr media stack on TRMNL e-ink displays. Monitor download queues, upcoming releases, recently added content, and library statistics from Sonarr, Radarr, Lidarr, Readarr, or Prowlarr.
- Monitor download queues with progress bars
- View upcoming releases (calendar)
- See recently added media
- Library statistics with icons
- Health status monitoring
- Support for all Servarr apps (Sonarr, Radarr, Lidarr, Readarr, Prowlarr)
- Multiple display modes (Dashboard, Calendar Daily/Weekly/Monthly)
- Responsive layouts for all TRMNL screen configurations
- Go to your TRMNL Dashboard
- Navigate to Plugin Directory
- Search for "Servarr Dashboard"
- Click Add to My Plugins
- Copy the Webhook URL from the plugin settings
The collector fetches data from your Servarr apps and sends it to TRMNL. Run it with Docker:
# Create a directory for the collector
mkdir trmnl-servarr && cd trmnl-servarr
# Download the required files
curl -O https://raw.githubusercontent.com/pythcon/trmnl-plugin-servarr/master/collector/docker-compose.yml
curl -O https://raw.githubusercontent.com/pythcon/trmnl-plugin-servarr/master/collector/config.example.yaml
# Create your config from the example
cp config.example.yaml config.yamlEdit config.yaml with your Servarr details:
# Global settings
interval: 900 # Collection interval in seconds (900 = 15 minutes)
timezone: America/New_York # Your timezone (for timestamp display)
# Instance definitions
instances:
- name: sonarr
url: http://localhost:8989 # Your Sonarr URL
api_key: your-sonarr-api-key # Settings > General > API Key
webhook: https://usetrmnl.com/api/custom_plugins/your-webhook-idFinding your API Key: In any Servarr app, go to Settings > General > Security > API Key
docker compose up -dThat's it! The collector will now send data to your TRMNL device every 15 minutes.
Add multiple instances to your config.yaml:
interval: 900
timezone: America/New_York
instances:
# Each instance needs its own webhook URL from a separate plugin install
- name: sonarr
url: http://localhost:8989
api_key: your-sonarr-api-key
webhook: https://usetrmnl.com/api/custom_plugins/sonarr-webhook-id
- name: radarr
url: http://localhost:7878
api_key: your-radarr-api-key
webhook: https://usetrmnl.com/api/custom_plugins/radarr-webhook-id
- name: lidarr
url: http://localhost:8686
api_key: your-lidarr-api-key
webhook: https://usetrmnl.com/api/custom_plugins/lidarr-webhook-id| Setting | Description | Default |
|---|---|---|
interval |
Collection interval in seconds (0 = run once) | 900 |
timezone |
Timezone for display (e.g., America/New_York, Europe/London) |
UTC |
| Setting | Description | Required |
|---|---|---|
name |
Display name for logs | Yes |
url |
Servarr instance URL | Yes |
api_key |
Servarr API key | Yes |
webhook |
TRMNL webhook URL | Yes |
type |
App type (auto-detected if not set) | No |
calendar_days |
Days forward for calendar | No (default: 7) |
calendar_days_before |
Days back for calendar | No (default: 0) |
calendar_only |
Only send calendar data | No (default: false) |
Configure these in your TRMNL plugin settings:
| Setting | Description | Options |
|---|---|---|
| Display Mode | Layout style | Dashboard, Calendar_Daily, Calendar_Weekly, Calendar_Monthly |
| Show Queue | Display download queue | Yes/No |
| Show Calendar | Display upcoming releases | Yes/No |
| Show Recently Added | Display recently imported media | Yes/No |
| Show Stats | Display library statistics | Yes/No |
| Max Queue Items | Maximum queue items shown | 1-10 |
| Show Network | Display TV network names | Yes/No |
| Show Quality | Display quality profiles | Yes/No |
| Show ETA | Display download time remaining | Yes/No |
| Date Format | How dates are displayed | Relative, Short, Full |
Three-column layout showing Queue, Recently Added/Upcoming, and Library Stats.
Shows all releases for the current day with times.
7-day grid view (Sun-Sat) with releases on each day.
Full month grid with releases marked on each day.
docker compose logs -fRun with --dry-run to see the JSON output:
docker compose run --rm trmnl-collector python /app/trmnl_collector.py --config /app/config.yaml --dry-run"Cannot connect to..."
- Verify your Servarr URL is accessible from the Docker container
- If using
localhost, try using your machine's IP address orhost.docker.internal(on Docker Desktop)
"Authentication failed..."
- Double-check your API key in Settings > General > API Key
Times are wrong
- Set the correct
timezonein your config.yaml (e.g.,America/New_York,Europe/London)
If you only have one Servarr instance, you can use docker run with environment variables instead of a config file:
docker run -d \
--name trmnl-servarr \
--restart unless-stopped \
-e SERVARR_URL=http://localhost:8989 \
-e API_KEY=your-api-key \
-e WEBHOOK_URL=https://usetrmnl.com/api/custom_plugins/xxx \
-e INTERVAL=900 \
-e TZ=America/New_York \
ghcr.io/pythcon/trmnl-servarr-collector:latest| Environment Variable | Description | Required |
|---|---|---|
SERVARR_URL |
Servarr instance URL | Yes |
API_KEY |
Servarr API key | Yes |
WEBHOOK_URL |
TRMNL webhook URL | Yes |
APP_NAME |
Display name for title bar (e.g., "TV Shows") | No (auto from app type) |
INTERVAL |
Collection interval in seconds (0 = run once) | No (default: 0) |
TZ |
Timezone for display | No (default: UTC) |
APP_TYPE |
App type (sonarr/radarr/lidarr/readarr/prowlarr) | No (auto-detected) |
CALENDAR_DAYS |
Days forward for calendar | No (default: 7) |
CALENDAR_DAYS_BEFORE |
Days back for calendar | No (default: 0) |
CALENDAR_ONLY |
Only send calendar data (true/false) | No (default: false) |
If you run a self-hosted Terminus instance, the collector can serve data via HTTP instead of pushing to webhooks. See the Terminus Setup Guide for details.
Run the collector directly with Python if you prefer not to use Docker:
# Clone the repository
git clone https://github.com/pythcon/trmnl-plugin-servarr.git
cd trmnl-plugin-servarr/collector
# Install dependencies
pip install requests pyyaml
# Run with config file (recommended for multiple instances)
python trmnl_collector.py --config config.yaml
# Or run with CLI arguments (single instance)
python trmnl_collector.py \
-u http://localhost:8989 \
-k your-api-key \
-w https://usetrmnl.com/api/custom_plugins/xxx \
-z America/New_York \
-i 900| Option | Description | Default |
|---|---|---|
-C, --config |
Path to YAML config file | None |
-u, --url |
Servarr instance URL | Required (if no config) |
-k, --api-key |
Servarr API key | Required (if no config) |
-w, --webhook |
TRMNL webhook URL | None (prints to stdout) |
-n, --name |
Display name for title bar (e.g., "TV Shows") | Auto from app type |
-t, --type |
App type (sonarr/radarr/lidarr/readarr/prowlarr) | Auto-detected |
-d, --days |
Calendar days forward | 7 |
-b, --days-before |
Calendar days back | 0 |
-c, --calendar-only |
Only send calendar data | Off |
-z, --timezone |
Timezone for display | UTC |
-i, --interval |
Run interval in seconds (0 = run once) | 0 |
-v, --verbose |
Verbose output | Off |
--dry-run |
Print JSON, don't send to webhook | Off |
To run the collector as a background service on Linux:
# Create service file
sudo tee /etc/systemd/system/trmnl-servarr.service << EOF
[Unit]
Description=TRMNL Servarr Collector
After=network.target
[Service]
Type=simple
User=$USER
WorkingDirectory=/path/to/trmnl-plugin-servarr/collector
ExecStart=/usr/bin/python3 trmnl_collector.py --config config.yaml
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Enable and start the service
sudo systemctl daemon-reload
sudo systemctl enable trmnl-servarr
sudo systemctl start trmnl-servarr
# Check status
sudo systemctl status trmnl-servarrSee the Development Guide for information on local development and contributing.
- TRMNL - E-ink smart display
- Servarr Wiki - Sonarr, Radarr, Lidarr, Readarr, Prowlarr documentation
MIT License
