11193677cf64b44dd1a1274415735b40063ce569
				
			
			
		
	Subscribarr
Lightweight web UI for Sonarr/Radarr subscriptions with Jellyfin login, calendar, and flexible notifications via Email, ntfy, and Apprise.
Features
- Sign in with Jellyfin (no separate user store)
- Sonarr/Radarr‑style calendar (upcoming episodes/movies)
- Subscribe/unsubscribe from the UI (series & movies)
- Admin overview of all users’ subscriptions with posters
- Per‑user notification channels:
- Email (SMTP)
- ntfy (Bearer token or Basic Auth)
- Apprise (Discord, Gotify, Pushover, Webhooks, and many more)
 
- Docker‑ready; environment‑driven security (ALLOWED_HOSTS, CSRF, proxy)
Screenshots
Quickstart (Docker Compose)
- Ensure the lockfile matches your Pipfile (e.g., after adding packages):
pipenv lock
- Build and run:
docker compose build
docker compose up -d
- Open the app and complete the first‑run setup (Jellyfin + Arr URLs/keys).
Important environment variables (examples):
- DJANGO_ALLOWED_HOSTS=subscribarr.example.com,localhost,127.0.0.1
- DJANGO_CSRF_TRUSTED_ORIGINS=https://subscribarr.example.com,http://subscribarr.example.com
- Reverse proxy/TLS:
- USE_X_FORWARDED_HOST=true
- DJANGO_SECURE_PROXY_SSL_HEADER=true
- DJANGO_CSRF_COOKIE_SECURE=true
- DJANGO_SESSION_COOKIE_SECURE=true
 
Note:
DJANGO_CSRF_TRUSTED_ORIGINSmust include the exact scheme+host (+port if used).
Local (Pipenv)
pipenv sync
pipenv run python manage.py migrate
pipenv run python manage.py runserver
In‑App Configuration
- 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)
 
ntfy Notes
- 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
 
Apprise Notes
Provide one or more destination URLs (one per line), e.g.:
- gotify://TOKEN@gotify.example.com/
- discord://webhook_id/webhook_token
- mailto://user:pass@smtp.example.com
- pover://user@token
- json://webhook.example.com/path
User URLs are added in addition to global defaults.
Notification Logic
- Series: on the air date, Subscribarr checks Sonarr for the episode and only notifies when hasFileis true (downloaded/present).
- Movies: similar via Radarr hasFileand matching the release date (Digital/Disc/Cinema) for today.
- 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).
Jobs / Manual Trigger
- Periodic check via management command (e.g., cron):
pipenv run python manage.py check_new_media
- In Docker:
docker compose exec web python manage.py check_new_media
Security & Proxy
- 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.
Tech Stack
- Backend: Django 5 + DRF
- Integrations: Sonarr/Radarr (API v3)
- Auth: Jellyfin
- Notifications: SMTP, ntfy (HTTP), Apprise
- Frontend: Templates + FullCalendar
- DB: SQLite (default)
License
MIT (see LICENSE).
					Languages
				
				
								
								
									Python
								
								54%
							
						
							
								
								
									HTML
								
								33.3%
							
						
							
								
								
									CSS
								
								10.7%
							
						
							
								
								
									Shell
								
								1.5%
							
						
							
								
								
									Dockerfile
								
								0.5%
							
						
					




