v2.3.0 — 2026-03-03
The v2.3.0 release is a major internal overhaul that replaces the parent/child group hierarchy with a sports subscription model and per-league configuration, while removing deprecated features and significantly simplifying the codebase (~770 lines removed net).
⚠️ Migration Notes
Database migrations (v58–v64) run automatically on first startup. No manual database changes needed. However, some features moved or were removed — review these notes after upgrading.
What happens automatically
- League subscriptions created — all leagues from all your groups are merged into a single global subscription
- Soccer config merged — if you had different soccer modes across groups, highest-priority wins (
all>teams>manual); followed teams are unioned - Template assignments deduplicated — group-level templates migrated to global subscription templates
- Groups flattened — all groups become independent (
group_mode=multi, no parent/child) - Channel numbering centralized — per-group settings merged to global; collision-aware numbering enabled
What you may need to reconfigure
- Per-league channel profiles/groups — previously set per-group, now set per-league in Settings → Per-League Config. If you had different channel groups per event group, set them per-league instead.
- Channel numbering — if you used manual start numbers per group, set per-league start numbers in Settings → Channel Numbering
- Soccer mode — if groups had mixed soccer modes, review the merged result in Settings → Soccer
What's permanently gone
- Gold Zone — fully removed (UI, API, consumer, database). If enabled, it's silently ignored.
- Parent/child group hierarchy — child groups become independent. If you relied on inheritance, configure each group separately.
- Per-group channel settings (
channel_profile_ids,channel_group_id,channel_group_mode) — replaced by per-league subscription config
Downgrade safety: Group
leaguescolumns are kept in sync with subscription data, so rolling back to v2.2.x is possible without data loss.
🐛 Bug Fixes
- Fix
{league}variable returning ESPN codes for discovered leagues (#163) - Fix cross-group stream removal in
cleanup_deleted_streams - Fix NCAAW streams misclassified as NCAAM (#150)
- Fix postgame filler
.nextvariables not resolving (#151) - Fix stale closures in template form checkboxes (#156)
- Fix
sort_byAttributeError breaking all event group processing - Fix sport='unknown' for dot-notation soccer leagues without DB mapping
- Fix template fallback when
event_channel_nameis not configured - Fix default channel group not persisting in settings response
✨ New Features
- Sports subscription model — global league subscription replaces per-group league lists, with per-group overrides
- Per-league subscription config — configure channel profiles and channel groups per-league
- Global Defaults page — centralized settings for templates, team filters, subscriptions, and bulk editing
- Channel numbering overhaul (schema v59) — collision-aware numbering respects existing Dispatcharr channels
- Cross-group channel deduplication — event-scoped unique index prevents duplicate channels
- Generation cancel button — stop a running EPG generation from the Dashboard
- Drag-and-drop reorder for Event Groups table with priority ordering
- Stream match cache clear-all button in Settings
- Add World Baseball Classic league
⚡ Enhancements
- Subscription-based template resolution and league matching
- Per-group subscription overrides with global fallback
- Event-scoped channel lookups for cross-group enforcement
- Sport/league filters on channels API and frontend table
- Unified run history tables with shared
RunHistoryTablecomponent - Search filter + subscribed-only toggle for league tables
- Diagnostic logging for template resolution and stream audit
🎨 UI/UX
- Reorganized Global Defaults: templates first, bordered sections, per-section save
- Simplified Event Groups page — removed hierarchy UI, added
SubscribedSports - Simplified EventGroupForm and EventGroupImport
- Rewritten TemplateAssignmentModal for subscription model
- Renamed 'All events' to 'Default' for catch-all template assignments
🔧 Under the Hood
- Removed Gold Zone — frontend, API, consumer, database, and tests fully pruned
- Removed parent/child group hierarchy — single-loop processing, no child processor
- Removed per-group channel settings in favor of subscription config
- Simplified cross-group enforcement to use
sort_orderpriority - Schema v58–v64: subscription tables, per-league config, event-scoped channels, cross-group dedup
- Hardened API: force
group_mode=multi,parent_group_id=NULLon create/update - Normalize sport codes to lowercase across all providers
- Case-insensitive template-to-event matching
- 222 tests (+150 new: subscription, migration, channel numbering, sync reliability, NCAA gender classification)
Full Changelog: v2.2.2...v2.3.0