🚀 Feature Release - All Season Pilot Rolling, Management UI & Real-Time Sessions
Overview
Replaces Plex polling with a real-time Server-Sent Events (SSE) connection for instant session detection, notification delivery, and label syncing. Adds a bulk management UI for rolling monitored shows and a new "All Season Pilot Rolling" monitoring type.
Key Updates
Real-Time Plex SSE
- Instant event processing: Playback events and library scan events are received in real time via a persistent SSE connection to your Plex server, with automatic reconnection and heartbeat monitoring
- Faster rolling monitoring: Session expansion triggers immediately on playback start instead of waiting for the next polling cycle
- Faster notifications & label syncing: Both Plex mobile notifications and label sync now process immediately on library scan completion
- Status badge: Live connection indicator in the Plex Integration and Session Monitoring page headers with hover tooltips
- Graceful fallback: All polling jobs remain as a safety net and automatically skip when SSE is active
All Season Pilot Rolling Monitoring
- New monitoring type: Monitors the pilot episode (E01) of every season. When a user watches any season's pilot, that full season expands automatically. On inactivity reset, it reverts to pilots only
- Automatic pilot seeding: A scheduled sync job detects newly added seasons and monitors/searches their E01 automatically
- Every season visible in Plex: With Pilot or First Season Rolling, users only see S01 in Plex and may not know a show has 5 seasons. All Season Pilot Rolling gives every season an entrypoint so users can browse and watch whatever they want
Rolling Monitoring Management UI
- Manage Rolling button: New button on the Session Monitoring page opens a searchable, sortable, paginated table of all Sonarr shows with enrollment status badges
- Bulk operations: Select multiple shows and enroll, change monitoring type, or reset in a single action
- Multi-instance support: Filter by Sonarr instance when running multiple setups
Trust Proxy & Auth IP Logging (closes #1053)
- Real client IPs:
request.ipnow resolves to the actual client IP behind reverse proxies (nginx, Traefik, etc.), improving auth failure logs
Bug Fixes
- Plex server discovery: Unreachable connections are filtered out via live reachability checks during auto-discovery
- Connection priority: Non-relay connections now preferred over local relay connections
- Webhook pilot fast-path: Pilot episodes for rolling shows notify immediately without waiting for the season queue
- Season expansion race condition: Fixed Sonarr overwriting episode monitoring changes during post-add refresh
- Progressive cleanup: Rolling show cleanup correctly handles mixed monitor/unmonitor episode batches
Migration & Compatibility
Database migration required - runs automatically on startup. Adds the allSeasonPilotRolling monitoring type and a sonarr_series_id column to the junction table (backfills incrementally).
Docker users
docker compose pull && docker compose up -dNative installer users (Linux/macOS/Windows)
- Linux:
curl -fsSL https://raw.githubusercontent.com/jamcalli/Pulsarr/master/scripts/installers/linux/install.sh | sudo bash - Windows: Download the latest installer from Releases
- macOS: Download the latest
.dmgfrom Releases
Manual installation
git pull origin master
bun install
bun run build
bun run migrate
bun run start:prodFull Changelog: v0.13.0...v0.14.0
Docker Images: lakker/pulsarr:0.14.0 | lakker/pulsarr:0.14.0-node
Changes
🚀 Features
- feat(session-monitoring): all season pilot rolling, management UI & real-time sessions (#1065) @jamcalli
- feat(rolling): bulk enrollment and monitoring type management (#1064) @jamcalli
- feat(ui): add Plex SSE connection status badge (#1062) @jamcalli
- feat(auth): add trustProxy and log client IP on auth failures (#1060) @jamcalli
- feat(sse): event-driven Plex session monitoring (#1052) @jamcalli
- feat(rolling-monitor): add allSeasonPilotRolling monitoring option (#1051) @jamcalli
🐛 Bug Fixes
🔄 Dependencies
- chore(deps): update dependency better-sqlite3 to v12.8.0 (#1055) @renovate[bot]
- chore(deps): update docker/build-push-action action to v7 (#1057) @renovate[bot]
- chore(deps): update docker/login-action action to v4 (#1050) @renovate[bot]
- chore(deps): update biomejs/setup-biome digest to 4c91541 (#1049) @renovate[bot]
- chore(deps): update docker/setup-buildx-action action to v4 (#1059) @renovate[bot]
- chore(deps): update docker/metadata-action action to v6 (#1058) @renovate[bot]
- chore(deps): update actions/download-artifact digest to 3e5f45b (#1048) @renovate[bot]
- chore(deps): update oven-sh/setup-bun digest to 0c5077e (#1054) @renovate[bot]
- chore(deps): lock file maintenance (#1045) @renovate[bot]
- chore(deps): update dependency @biomejs/biome to ^2.4.6 (#1044) @renovate[bot]
Docker
docker pull lakker/pulsarr:0.14.0
Synology NAS / Legacy Systems (Linux kernel < 4.11):
docker pull lakker/pulsarr:0.14.0-node
Contributors
@actions-user, @jamcalli, @renovate[bot] and renovate[bot]