Episeerr Documentation
Complete guide to episode management and automation
What is Episeerr?
Episeerr is an intelligent episode management system that automates content delivery and cleanup for Sonarr-managed TV shows.
Ways to Manage Episodes:
Manual Selection
Select specific episodes across multiple seasons
- Pick any episodes you want
- Multi-season support
- Perfect for catching up
Viewing-Based
Automatic based on what you watch
- Watch episode → Get next
- Webhook integration
- Zero manual work
Time-Based
Automatic cleanup after inactivity
- Grace periods
- Dormant timers
- Smart cleanup
Approval-Based
Review deletions before they happen
- Dry run mode enabled by default
- Approve or reject each deletion
- Full transparency on cleanup decisions
Setup Page - Configure Services
No .env file needed — configure everything through the web interface. Database configuration takes priority over env vars.
Accessing Setup Page
URL: http://your-server:5002/setup
Or click "Setup" in the sidebar
Required Services
Required for: All features
You need:
- Sonarr URL (e.g.,
http://sonarr:8989) - API Key from Sonarr → Settings → General
Required for: Episode selection
You need:
- TMDB API Read Access Token
- Get one free at themoviedb.org/settings/api
Optional Services (For Automation)
Choose one:
- Plex - Native webhook (Plex Pass) or via Tautulli
- Jellyfin - Real-time or polling
- Emby - Polling mode
Enables: Viewing automation (next episode on watch)
For Plex users
Tautulli bridges Plex viewing data to Episeerr
Enables: Viewing automation with Plex
Choose one:
- Overseerr
- Jellyseerr
Enables: Automatic episode selection for new requests
Setup Page Features
- Test Connections: Verify URLs and API keys before saving
- Quick Links: Auto-populate sidebar links to configured services
- Database Storage: Configuration persists across container restarts
- No .env needed: Fresh installs can configure everything via GUI
- Migration Support: Existing .env values appear as defaults
Configuration Priority
Database configuration takes priority over .env files. You can use both (database overrides .env), but we recommend configuring everything through the GUI for easier management.
After Setup
- Configure your services on the Setup page
- Test each connection (green checkmark = success)
- Save configuration
- Check Quick Links in sidebar - they should auto-populate
- Set up webhooks (see Webhook Setup section below)
- Create your first rule!
Getting Started - Initial Setup
Before using Episeerr, you need to configure Sonarr and set up a default rule.
Step 1: Sonarr Delay Profile
When adding externally with episeerr_select, without a delay profile:
- ❌ Sonarr downloads ALL available episodes immediately
- ❌ Episeerr can't hold downloads for your selection
With a delay profile tagged episeerr_select:
- ✅ Episodes stay "monitored" but don't auto-download
- ✅ Episeerr confirms your selection, then Sonarr grabs only those
How to Set Up Delay Profile in Sonarr:
- Go to Sonarr → Settings → Profiles → Delay Profiles
- Click Add New Delay Profile or edit existing
- Set delays:
- Usenet Delay: 999999 minutes (essentially infinite)
- Torrent Delay: 999999 minutes (essentially infinite)
- Set Tags:
episeerr_[rule_name]and/orepiseerr_select - Save
Step 2: Create Your First Rule
- Go to Admin Panel
- Scroll to Rule Management
- Click Create New Rule
- Configure:
- Rule Name: e.g., "Default Weekly Shows"
- Get: 1 episode
- Keep: 0 or 1 episodes
- Grace Unwatched: 7 days
- Grace Watched: 3 days
- Dormant Timer: 30 days
- Save
Step 3: Add Shows to Episeerr
Three paths — pick what fits your workflow:
Method 1: Search in Episeerr
- Use the search bar in Episeerr
- Click Add on the result
- Season/rule selection opens — nothing written yet
- Confirm → Sonarr add + Plex watchlist update happen
- Cancel → nothing happens
No tag or delay profile needed
Method 2: Sonarr Rule Tag
- Add show to Sonarr with tag
episeerr_[rule_name] - Webhook fires → rule applied immediately
- Tag removed automatically
Good for nzb360, Seerr, or direct Sonarr adds where you want instant processing
Method 3: episeerr_select Tag
- Add show to Sonarr with tag
episeerr_select - Delay profile holds downloads
- Pending request appears in Episeerr
- You pick rule + episodes, then confirm
Requires delay profile from Step 1
Step 4: Set Up Webhooks
Configure webhooks for automation (see Integration section below for details):
- Sonarr webhook: ✅ REQUIRED -
http://your-server:5002/sonarr-webhook - Jellyseerr/Overseerr: ✅ REQUIRED if using *seerr
- Tautulli/Jellyfin: ⚙️ OPTIONAL - For viewing-based automation
You're Ready!
With delay profiles set and a rule created, Episeerr is now managing your shows. Add tags to shows and watch the automation happen!
Rules System
Rules define how episodes are managed for different shows. Each rule has four main settings:
Get Settings
Controls what new content to download after watching:
| Type | Behavior | Example |
|---|---|---|
| Episodes | Get X episodes ahead | Get 2 = next 2 episodes |
| Seasons | Get X seasons ahead | Get 1 = entire next season |
| All | Get everything available | All = complete series |
Keep Settings
Controls what watched content to retain:
| Type | Behavior | Example |
|---|---|---|
| Episodes | Keep X watched episodes | Keep 1 = last watched only |
| Seasons | Keep X watched seasons | Keep 1 = current season |
| All | Keep everything watched | Never delete watched |
Always Have (Optional)
An expression that defines episodes to always keep downloaded and protected from cleanup. Think of it as the baseline state of a show — these episodes are always there regardless of what Get/Keep does.
When a show is assigned to a rule with Always Have, those episodes get monitored and searched immediately. Cleanup (grace, keep) will never delete them. Dormant cleanup is the only exception — dormant is nuclear and ignores Always Have.
| Expression | What It Grabs | Use Case |
|---|---|---|
s1e1 |
Just the pilot | Placeholder in Plex |
s1 |
All of season 1 | First season to try |
s1, s*e1 |
Season 1 + first episode of every other season | Plex shows all seasons exist without downloading everything |
s1-3 |
Seasons 1 through 3 | First few seasons to start |
s1e1-5 |
Season 1, episodes 1-5 | Try first handful of episodes |
all |
Everything | Combined with Keep for full protection |
Combine with commas: s1, s3e1-3, s*e1. Leave blank to skip — Get/Keep will handle everything.
How The Pieces Fit Together
Always Have = what's always present on disk (the floor)
Get = what to download next when you watch (ongoing)
Keep = how many watched episodes to retain (immediate cleanup after watching)
Grace = time-based cleanup for inactive shows (days since last watch)
Dormant = nuclear cleanup for abandoned shows (ignores everything)
They're all independent — use any combination. A show can have Always Have + Get + Grace with no Keep, or just Get with no cleanup at all.
- Get 1, Keep 1: Rolling window - always have 1 watched + 1 unwatched
- Get 3, Keep 0: Binge mode - get 3 ahead, delete after watching
- Get 1 season, Keep 1 season: Season-based - entire seasons at a time
- Get All, Keep All: Hoarder mode - download everything, keep forever
- Always Have: s1, s*e1 + Get 1: Showcase — Plex shows all seasons, grab 1 at a time when watching
Example Scenarios
Rule Settings:
- Get: 1 episode
- Keep: 0 episodes
- Grace Unwatched: 7 days
Rule Settings:
- Get: 3 episodes
- Keep: 1 episode
- Grace Watched: 14 days
Rule Settings:
- Get: 1 episode
- Keep: 1 season
- Grace Watched: 14 days
- Grace Scope: Per Season
Rule Settings:
- Get: 1 episode
- Keep: 0 episodes
- Grace Unwatched: 3 days
- Dormant: 30 days
- Storage Threshold: 20 GB
Grace Periods & Time-Based Cleanup
Grace periods free up space from inactive shows while preserving your position so you can always resume where you left off.
Bookmark Preservation System
Grace periods now keep "bookmarks" so you never lose your place! Even after cleanup, you keep:
- Last watched episode - Your "finished watching" bookmark
- Next unwatched episode - Your "resume here" bookmark
Grace Watched
What: Deletes all watched episodes EXCEPT the last one after X days of inactivity
Exception: Keeps most recent watched episode (reference point)
Overrides: Keep settings (independent cleanup)
Example: Grace Watched: 14 days
→ Watch S2E1-E5
→ 14 days later (no activity)
→ Delete S2E1-E4, keep S2E5 (bookmark)
→ Marked as cleaned until you watch again
Grace Unwatched
What: Deletes unwatched episodes after X days (watch deadline)
Exception: Keeps next unwatched episode (resume point)
Overrides: Get settings (independent cleanup)
Use case: Clear backlog while keeping position
Example: Grace Unwatched: 10 days
→ Got S2E6, S2E7, S2E8
→ 10 days later (didn't watch any)
→ Delete S2E7, S2E8
→ Keep S2E6 (next episode bookmark)
Dormant Timer
What: Nuclear option for abandoned shows
When it expires: Deletes EVERYTHING (all episodes)
Reset by: Watching ANY episode in the series
Use case: Final cleanup for shows you'll never return to
Example: Dormant: 60 days
→ No activity for 60 days
→ Delete entire show (no bookmarks)
How Grace Periods Work Together
Grace Watched + Grace Unwatched: Maximum space savings while preserving position
- After inactivity, you're left with just 2 episodes: last watched + next unwatched
- Both bookmarks preserved automatically
- Can resume anytime, even months later
Cleanup Loop Behavior
How grace cleanup stops and starts:
- Has bookmark: Marked as cleaned → Won't check again until you watch
- Missing next episode: Keeps checking daily until episode grabbed
- Watch activity: Clears flag → Re-enters grace period after inactivity
Webhooks required:
- Watch webhook (Tautulli/Jellyfin): Clears grace_cleaned flag, applies Get rule
- Grab webhook (Sonarr): Sets grace_cleaned flag, stops checking loop
Grace Period Scope
Choose how grace timers are tracked:
- Per Series (default): One timer for entire show - watching ANY episode resets grace for ALL episodes
- Per Season: Independent timers per season - perfect for multi-viewer households where different people watch different seasons
Grace vs Keep vs Dormant vs Always Have
| Setting | When It Acts | What It Does | Preserves Position? |
|---|---|---|---|
| Always Have | On rule assignment + during cleanup | Downloads matching episodes, protects from deletion | N/A (these never leave) |
| Keep | Immediately after watching | Deletes beyond Keep window (real-time) | Yes (last_season/episode) |
| Grace Watched | After X days of inactivity | Deletes watched episodes except last one | Yes (keeps 1 watched bookmark) |
| Grace Unwatched | After X days of inactivity | Deletes unwatched episodes except first one | Yes (keeps 1 unwatched bookmark) |
| Dormant | After X days of inactivity | Deletes EVERYTHING (nuclear, ignores Always Have) | No (complete removal) |
Pending Deletions - Approval System
All deletions go through an approval queue first - giving you full control before anything is removed.
Safety First
Dry run mode is now enabled by default. This means all cleanup operations queue deletions for your review instead of executing immediately.
How It Works
- Cleanup Runs: Scheduled cleanup identifies episodes for deletion based on your rules
- Queued for Review: Episodes are added to pending deletions (not deleted)
- You Review: Visit the Pending page to see what would be deleted and why
- You Decide: Approve (deletes immediately) or Reject (caches for 30 days)
Review Options
Approval Levels
Approve deletions at multiple levels:
- Individual Episodes: One at a time
- Entire Season: All episodes in a season
- Entire Series: All queued episodes
- Selected Episodes: Check boxes and bulk approve
Rejection Behavior
When you reject an episode:
- Removed from pending queue
- Cached for 30 days
- Won't reappear during that time
- After 30 days, can be flagged again
What You See
Each pending deletion shows:
- Series/Season/Episode: Organized hierarchically
- Reason: Why it's marked (Grace Period, Keep Rule, Dormant, etc.)
- Rule Name: Which rule triggered it
- Date Source: Tautulli or Sonarr air date
- Date Used: The actual date in the decision
- File Size: How much space you'll reclaim
Configuring Dry Run Mode
Dry run can be enabled at two levels:
Location: Admin → Scheduler → Global Dry Run Mode
Effect: Applies to ALL rules
Default: ✅ Enabled (for safety)
Location: Admin → Dry Run Settings → By Rule
Effect: Applies to specific rule only
Use case: Test one rule while others run normally
How They Work Together
If either global OR per-rule dry run is enabled, deletions are queued for approval. This gives you maximum flexibility - protect everything globally or test individual rules.
Notifications
The navigation badge shows combined pending items:
- Pending Requests: Episode selection requests
- Pending Deletions: Episodes awaiting approval
- Badge: Shows total count of both
Best Practices
- Start with dry run enabled (default) - Review deletions for a few weeks
- Check pending deletions regularly - Weekly or after each cleanup run
- Create proper rules instead of repeatedly rejecting the same content
- Monitor the logs to understand why episodes are targeted
- Use rule-specific dry run to test changes to individual rules
Important Notes
- Rejection is temporary: Use proper rules for permanent protection
- Dry run doesn't affect "Get": New episodes are still monitored/searched
- Badge updates every 30 seconds: Reflects real-time pending count
- Approved deletions execute immediately: No undo after approval
Add Workflows
Three paths into Episeerr — choose based on where you're adding from:
Search within Episeerr (no tags needed)
Search TMDB → click Add → season/rule selection opens → confirm → Sonarr add happens. Cancel at any point and nothing is written to Sonarr or Plex.
Movies: add to Radarr immediately on confirm, Plex watchlist updated.
External Tag-Based Workflows:
Rule Tags
Direct Rule Assignment
Tag shows with episeerr_[rule_name] to process immediately:
episeerr_one_at_a_timeepiseerr_gracewatchedepiseerr_keepall- Or any rule you've created
How it works:
- Add rule tag to show in Sonarr
- Episeerr processes immediately
- Episodes managed by that rule
Perfect for shows you want managed by a specific rule
episeerr_select
Manual Episode Selection
- Add tag to show in Sonarr
- Creates selection request in Episeerr
- You manually pick episodes
- Tag removed after selection
Perfect for catching up or selecting specific episodes
Auto-Assign (Separate Feature):
Auto-assign is independent from tags - it automatically adds new shows to your default rule when they're added to Sonarr without any tags.
- Enable it: New shows automatically join default rule (waits for first watch)
- Disable it: Only tagged shows get managed
- Works together: You can use BOTH auto-assign AND direct rule tags
See the Auto-Assign section below for full details.
Jellyseerr/Overseerr Integration:
When requesting shows through Jellyseerr/Overseerr:
- Request gets sent to Sonarr
- Episeerr captures the requested seasons
- If auto-assign is ON, automatically adds to default rule
- If you tagged it with a rule tag, uses that rule instead
- Season-aware: starts from the season you requested, not always Season 1
Tag Management & Drift Detection
Tags are automatically created and managed by Episeerr. You don't need to manually create or maintain them.
How Tags Work:
- When you create a rule called "binge_watcher":
- Episeerr creates
episeerr_binge_watchertag in Sonarr automatically - Tag is added to Sonarr's delay profile (if configured)
- Episeerr creates
- When series is assigned to that rule:
- Episeerr applies
episeerr_binge_watchertag to the series in Sonarr - Tag indicates which rule manages this series
- Episeerr applies
- If you manually change the tag in Sonarr:
- Episeerr detects the drift (on next watch, cleanup, or startup)
- Automatically moves the series to the correct rule in config
- Your manual tag change becomes the new source of truth
- When you delete a rule:
- Tag removed from all series
- Tag removed from Sonarr entirely
- Tag removed from delay profile
Drift Detection:
Episeerr checks for tag mismatches in 4 places:
Watch Webhooks
When you watch an episode
Cleanup Cycles
Every 6 hours (configurable)
Startup
When Episeerr starts
Clean Config
When you click button
What Gets Detected:
| Scenario | Detection | Action |
|---|---|---|
| Tag changed in Sonarr | ✓ Detected | Series moved to matching rule |
| Tag removed in Sonarr | ✓ Detected | Tag re-added from config |
| Tag added to unmanaged series | ✓ Detected | Series added to that rule |
Tag-Based Management
You can manage series assignment entirely through Sonarr tags if you prefer!
Just tag shows in Sonarr with episeerr_rulename and Episeerr will automatically detect and assign them.
No need to use the Episeerr UI at all.
Example Workflow:
Scenario: Series "Breaking Bad" is in "binge_watcher" rule
- You manually change tag to
episeerr_weeklyin Sonarr - Next time Episeerr checks (watch/cleanup/startup/clean_config):
- ✓ Detects drift
- ✓ Moves "Breaking Bad" from "binge_watcher" to "weekly" rule
- ✓ Series now managed by "weekly" rule
Your manual tag change in Sonarr becomes the new source of truth!
Rule Descriptions:
Add optional descriptions to rules to document their purpose:
- Hover over rule names to see descriptions as tooltips
- Helps organize and understand multiple rules
- Examples: "Weekly shows I'm actively watching", "Binge-watching mode - get full seasons"
Webhook Integration
Supported Services:
Tautulli (Plex Option A)
Tracks viewing activity in Plex — handles TV shows and movies
Webhook URL:
http://your-server:5002/webhook
Trigger: Watched
(set % threshold in Tautulli
Settings → General)
TV → rule automation | Movies → watchlist status
Plex Native Webhook (Option B)
Direct Plex webhook — no Tautulli needed. Handles TV shows and movies.
Configure in:
Integrations → Plex
→ Watch Detection
Modes: Scrobble |
Stop+Threshold |
Polling
Choose one: Tautulli or Plex native — not both
Jellyfin (3 Modes)
Mode 1: PlaybackProgress (real-time)
Mode 2: Session Start/Stop (polling)
Mode 3: Playback Stop (on-stop)
Webhook URL:
http://your-server:5002/api/integration/jellyfin/webhook
Trigger: (depends on mode)
See full guide below
Sonarr
Detects new series additions
Webhook URL:
http://your-server:5002/sonarr-webhook
Trigger:
On Series Add
Sonarr Delay Profiles
episeerr_select. Not needed when adding via Episeerr search — Sonarr isn't touched until you confirm.
Delay profiles tell Sonarr to wait before downloading. For episeerr_select tagged shows, this holds all downloads until you confirm your selection in Episeerr.
Setup:
- Sonarr → Settings → Profiles → Release Profiles → Add New
- Name:
Episeerr Episode Selection Delay - Delay:
10519200(20 years) - Tags:
episeerr_select - Save
For rule-managed shows (episeerr_rulename tags), a separate delay profile is optional but recommended so Sonarr doesn't grab episodes before Episeerr's GET rule fires:
Name: Episeerr Managed
Usenet/Torrent Delay: 999999 minutes
Tags: episeerr_[each_rule_name]
Auto-Assign New Series
Auto-assign is a separate feature from tags - it automatically adds new shows to your default rule when they're added to Sonarr WITHOUT any tags.
How It Works:
What happens:
- Add show to Sonarr
- Nothing happens (unless you tag it)
- Must use rule tags to manage
- Or use
episeerr_selectfor manual selection
Only tagged shows get managed
What happens:
- Add show to Sonarr (no tags)
- Episeerr automatically assigns to default rule
- Waits for first watch to start processing
- Zero manual work!
Passive assignment - waits for viewing activity
Tags and Auto-Assign Work Together:
You can use BOTH at the same time:
- Tagged shows: Process immediately with their rule tag
- Untagged shows (with auto-assign ON): Automatically join default rule
- Untagged shows (with auto-assign OFF): Not managed at all
When to Enable Auto-Assign:
| Scenario | Auto-Assign Setting | Reason |
|---|---|---|
| All shows managed by Episeerr | ON | Automatic - every new show gets managed |
| Mix of Episeerr + regular shows | OFF | Manual control - only tagged shows managed |
| Using Jellyseerr/Overseerr | ON | Requests automatically managed |
| Testing/Learning Episeerr | OFF | Better control during learning phase |
How to Enable/Disable:
- Go to Settings (in sidebar)
- Find Global Storage Gate card at top
- Check/Uncheck "Auto-assign new series"
- Click Save Global Settings
Important Notes:
- Only affects NEW shows: Existing shows are not automatically assigned
- Requires default rule: Must have at least one rule marked as "default"
- Tags override auto-assign: If a show has a rule tag or
episeerr_select, it uses that instead - Works with *seerr: Shows requested through Jellyseerr/Overseerr are auto-assigned if enabled
- Passive mode: Auto-assigned shows wait for first watch before processing
Workflow Comparison:
Manual Workflow (Auto-Assign OFF):
- Add show in Sonarr
- Go to Sonarr → Series → Select show
- Add rule tag (e.g.,
episeerr_one_at_a_time) - Save
- Episeerr processes via webhook
Automatic Workflow (Auto-Assign ON):
- Add show in Sonarr
- That's it!
- Episeerr automatically assigns and manages
- Zero extra steps
Troubleshooting
Common Issues:
Check:
- Is the series assigned to a rule?
- Are webhooks configured and firing?
- Check logs: Admin → View Logs → episeerr.log
- Verify Sonarr tags are correct (episeerr_[rule_name] or episeerr_select)
Solution:
- Increase Grace Watched/Unwatched periods
- Check if Dormant timer is too short
- Consider changing Keep settings to retain more episodes
Check:
- Is cleanup scheduler running? (Admin → Scheduler Status)
- Check Storage Gate - cleanup only runs when below threshold
- Verify grace periods aren't too long
- Check if Dry Run Mode is enabled globally
Solution:
- Reject the deletion: Removes it for 30 days
- Better solution: Create a rule with no cleanup parameters (leave grace periods empty)
- Adjust existing rule: Increase grace periods or change dormant timer
- Check why it's targeted: Review the "Reason" field in pending deletions
Check:
- Refresh the page (F5)
- Check browser console for JavaScript errors
- Verify /api/pending-deletions/count endpoint is working
- Clear browser cache and reload
Frequently Asked Questions
- Q: Which webhooks do I need?
-
A: It depends on your setup:
- Sonarr webhook: ✅ REQUIRED - Detects new series and processes tags (episeerr_[rule_name]/episeerr_select)
- Jellyseerr/Overseerr webhook: ✅ REQUIRED if you use *seerr - Captures requested seasons for proper automation
- Tautulli or Plex native webhook: ⚙️ OPTIONAL - For viewing-based automation (TV: auto-get next episode; Movies: update watchlist status). Choose one, not both.
- Jellyfin webhook: ⚙️ OPTIONAL - Same as above for Jellyfin users
Without viewing webhooks, you can still use manual selection and time-based cleanup rules.
- Q: Can I use multiple rules?
- A: Yes! Create different rules for different types of shows (weekly vs binge, kids vs adults, etc.)
- Q: What happens if I don't set grace periods?
- A: Without grace periods, episodes are deleted immediately based on Keep settings only.
- Q: Can I test rules without actually deleting?
- A: Yes! Enable Dry Run Mode in Admin → Global Settings, or set it per-rule.
- Q: How do I know what's being deleted?
- A: Check Admin → View Logs → cleanup.log for detailed deletion logs.
- Q: What is "Pending Deletions"?
- A: A safety system that queues all deletions for your review before executing them. When dry run mode is enabled (default), cleanup operations add episodes to a pending queue instead of deleting immediately. You review the queue and approve or reject each deletion.
- Q: Why aren't episodes being deleted?
- A: Check if dry run mode is enabled (Admin → Scheduler → Global Dry Run Mode). When enabled, all deletions go to the Pending page for review. This is the default behavior for safety. Review and approve deletions from the Pending page, or disable dry run if you want automatic deletion.
- Q: What happens if I reject an episode deletion?
- A: The episode is removed from the pending queue and cached for 30 days. It won't appear in pending deletions again during that time. After 30 days, if cleanup rules still target it, it will reappear. For permanent protection, create a rule with no cleanup parameters.
- Q: Can I approve/reject multiple episodes at once?
-
A: Yes! You can approve or reject at multiple levels:
- Individual episodes (one at a time)
- Entire seasons (all episodes in that season)
- Entire series (all pending episodes for that show)
- Selected episodes (check boxes and bulk approve/reject)
- Q: What's the difference between global and per-rule dry run?
-
A:
- Global dry run: Affects ALL rules - all deletions are queued
- Per-rule dry run: Affects only that specific rule - lets you test individual rules
- Either one enabled: Deletions are queued for approval
- Q: Can different family members watch different seasons?
- A: Yes! Use "Grace Scope: Per Season" in your rule settings.