✨ New Features
- Gold Zone — unified Olympics channel with external EPG, date-based stream filtering, stream ordering, managed channel lifecycle, and configurable settings
- Scheduled Backups — cron-integrated with rotation, restore validation, sqlite3.backup(), and path safety checks
- Multi-Template Assignments — template assignment modal redesigned with CheckboxListPicker; templates assignable per sport/league in bulk import
- Conditional Title/Subtitle — postgame and idle filler now support conditional title/subtitle templates
- Playoff Bypass — bypass team filter for playoff games
- Run History Cleanup — cleanup UI in Settings + auto-cleanup after generation
🐛 Bug Fixes
- Fix offset-naive vs offset-aware datetime comparison in channel sorting
- Fix Detection Library 500 errors and ESPN team logo loss
- Fix Dispatcharr pagination and wire up api_timeout/retry settings
- Fix multi-template filler, segment naming, error isolation, and lifecycle path parity
- Fix soccer mode not persisting in group edit UI
- Fix bulk import writing literal 'league' instead of dynamic {league} channel group
- Fix card_segment_display not resolving for non-UFC combat sports
- Fix group processing crash and template display mismatch
- Fix settings page crash on pre-v52 databases
- Fix cache refresh toast showing 0 leagues/teams
- Fix path traversal vulnerability in backup filename endpoints
- Guard against null league names in LeaguePicker to prevent blank screen crash
⚡ Enhancements
- Make tvg-id unique per exception keyword for EPG programme separation
- Sync stream_profile_id to Dispatcharr on existing channel updates
- Custom channel group pattern support in bulk import
- Gold Zone respects stream ordering/priority rules from settings
- Clear stale XMLTV at start of group processing to prevent serving old EPG data
🎨 UI/UX
- Redesigned template assignment modal with reusable CheckboxListPicker component
- Shared SelectedBadges component with overflow tooltip (standardized cap of 10)
- Manual save button for Gold Zone settings
- Fix sticky sport header overlaying leagues in single-sport filtered view
- Fix soccer league picker badge overflow and Clear All visibility
🔧 Under the Hood
- Code health audit: pruned 6 dead API endpoints, 9 dead frontend items, 1805 lines of legacy migration code
- Extracted 25+ SQL violations from routes to database layer
- Split god functions: run_full_generation (576→370), _sync_channel_settings (333→178)
- Pruned dead SearchableMultiSelect component (228 lines)
- Integrate backup into CronScheduler, remove standalone BackupScheduler
- Register Gold Zone as managed channel for standard EPG association and orphan detection
- Diagnostic logging for multi-template resolution and stream profile sync