Warning
This project was largely written with GitHub Copilot. I apologize to all developers out there for using GitHub Copilot. I’m looking for a competent maintainer. If multiple users rely on it and no maintainer steps up, I’ll level up my Django skills and take it over myself.
Lightweight web UI for Sonarr/Radarr subscriptions with Jellyfin login, calendar, and flexible notifications via Email, ntfy, and Apprise.
- Sign in with Jellyfin
- Sonarr/Radarr‑style calendar (upcoming episodes/movies)
- Subscribe/unsubscribe from the UI (series & movies)
- Admin overview of all users subscriptions
- Per‑user notification channels:
- Email (SMTP)
- ntfy (Bearer token or Basic Auth)
- Apprise (Discord, Gotify, Pushover, Webhooks, and many more)
- Docker‑ready
- Multiple Sonarr/Radarr instances
- Early‑availability notifications (configurable lookahead)
- Duplicate suppression per user/item/day and admin tooling (send test, reset tokens)
- 4K subscriptions: detection across all Radarr instances
- YouTube subscriptions
| Release Overview | 4K Movies Section | YouTube Section |
|---|---|---|
![]() |
![]() |
![]() |
| Main release overview page | 4K movie management | YouTube subscription management |
| Calendar Month View | Calendar Week View | Calendar List View |
|---|---|---|
![]() |
![]() |
![]() |
| Monthly calendar view | Weekly calendar view | List view of releases |
| Administration Panel | Additional Admin Features | Profile Settings |
|---|---|---|
![]() |
![]() |
![]() |
| Main administration panel | Additional admin tools | User profile settings |
| User Profile | User Subscription Management | User Subscription Details |
|---|---|---|
![]() |
![]() |
![]() |
| User profile configuration | Managing user subscriptions | Detailed subscription view |
Create a docker-compose.yml file:
version: '3.8'
services:
subscribarr:
image: 10010011/subscribarr:latest
container_name: subscribarr
ports:
- "8081:8000"
environment:
- DJANGO_ALLOWED_HOSTS=*
- DJANGO_SECRET_KEY=change-me
- NOTIFICATIONS_ALLOW_DUPLICATES=false
- DJANGO_CSRF_TRUSTED_ORIGINS="http://localhost:8081,http://127.0.0.1:8081"
# Cron schedule (default every 30min)
- CRON_SCHEDULE=*/30 * * * *
volumes:
- ./data:/app/data
restart: unless-stoppedRun with:
docker compose up -dAccess at: http://127.0.0.1:8081
Create a docker-compose.yml file:
version: '3.8'
services:
subscribarr:
image: 10010011/subscribarr:latest
container_name: subscribarr
ports:
- "8081:8000"
environment:
- DJANGO_ALLOWED_HOSTS=*
- DJANGO_SECRET_KEY=change-me
- DJANGO_CSRF_TRUSTED_ORIGINS="https://subscribarr.example.com"
- USE_X_FORWARDED_HOST=true
- DJANGO_SECURE_PROXY_SSL_HEADER=true
- DJANGO_CSRF_COOKIE_SECURE=true
- DJANGO_SESSION_COOKIE_SECURE=true
# Cron schedule (default every 30min)
- CRON_SCHEDULE=*/30 * * * *
volumes:
- ./data:/app/data
restart: unless-stoppedRun with:
docker compose up -dReplace https://subscribarr.example.com with your actual domain.
After starting the container, open the web interface and complete the first‑run setup:
- Jellyfin server: URL + API key (required)
- Sonarr/Radarr: URLs + API keys (optional, can add more later)
Note:
DJANGO_CSRF_TRUSTED_ORIGINSmust include the exact scheme+host (+port if used).
- Settings → Jellyfin: server URL + API key
- Settings →Sonarr/Radarr: base URLs + API keys (with “Test” button)
- Settings →Mail server: SMTP (host/port/TLS/SSL/user/password/from)
- Settings →Notifications:
- ntfy: server URL, default topic, Basic Auth or Bearer token
- Apprise: default URL(s) (one per line)
- Profile (per user):
- Choose channel: Email, ntfy, or Apprise
- ntfy topic (optional, overrides default)
- Apprise URL(s) (optional, appended to defaults)
- Server URL: e.g.,
https://ntfy.shor your own server - Auth:
- Bearer token (Authorization header)
- Basic Auth (username/password)
- Topic selection:
- Per user in the profile, or a global default topic in Settings
Provide one or more destination URLs (one per line), e.g.:
gotify://TOKEN@gotify.example.com/discord://webhook_id/webhook_tokenmailto://user:pass@smtp.example.compover://user@tokenjson://webhook.example.com/path
User URLs are added in addition to global defaults.
- Series: on the air date, Subscribarr checks Sonarr for the episode and only notifies when episode is downloaded and present.
- Movies: similar via Radarr when movie is downloaded and present.
- Duplicate suppression: entries are recorded in
SentNotificationper user/title/day; if sending fails, no record is stored. - Fallback: if ntfy/Apprise fail, Subscribarr falls back to Email (when configured).
- Periodic check via cron
- Perform manual check:
docker exec -it subscribarr python manage.py check_new_mediadocker exec -it subscribarr python manage.py check_4kdocker exec -it subscribarr python manage.py check_youtube- Set
DJANGO_ALLOWED_HOSTSto your hostnames. - Include all used origins in
DJANGO_CSRF_TRUSTED_ORIGINS(http/https and port where applicable). - Behind a reverse proxy with TLS: enable
USE_X_FORWARDED_HOST,DJANGO_SECURE_PROXY_SSL_HEADER, and secure cookie flags.
- Backend: Django 5 + DRF
- Integrations: Sonarr/Radarr (API v3)
- Auth: Jellyfin
- Notifications: SMTP, ntfy (HTTP), Apprise
- Frontend: Templates + FullCalendar
- DB: SQLite (default)
MIT (see LICENSE).












