🐛 Bug Fixes
- Race-weekend channels were deleted before the race. The per-run delete-time recalculation overwrote the session-aware end computed at creation with a session-blind
event start + sport duration, so a multi-day event's channel vanished shortly after its first session (e.g. after Friday practice). The session-aware estimate is now persisted and the recalc only applies your timing policy to it. (#522) - Keyword channel-number swaps could desync from Dispatcharr. The swap was written to Teamarr's database whether or not Dispatcharr accepted it — leaving the database agreeing with itself while the real ordering was wrong, with nothing to re-detect it. Both updates must now be confirmed before anything is recorded. (#522)
- Feed identification no longer requires feed separation. Team-branded streams like
Brewers.TVwere invisible to theteam_feedordering rules unless channel splitting was enabled. Identification always runs now; the Feed Separation toggle gates only whether feeds get their own channels. (#527) - Event templates were missing nine conditions. The condition picker omitted
is_final,is_not_final,is_playoff,is_preseason,has_odds,is_national_broadcast,is_conference_game,is_ranked_matchup, andis_top_ten_matchup— even though they work on event templates and the shipped starter templates use them. (#521) - Exception keywords disabled through the API couldn't be re-enabled. They disappeared from the UI entirely; they're now shown dimmed with an on/off toggle. (#522)
- The Channels documentation page was an infinite redirect loop and had been unreachable since the v2.7.0 docs resync. (#535)
- Home/Away feed labels no longer report "Away Feed" for feeds whose side couldn't be determined. (#533)
- The Event Groups Regex badge now lights up for league, fighters, and event-name custom patterns, not just team patterns. (#522)
✨ New Features
- Feed Side stream-priority rules. A standing "always prefer the home broadcast" (or away) preference that applies to whichever teams are playing — no team selection needed. Works as a hard priority band or as scoring points. Each stream's resolved side is stored and shown in a new Feed column on the Dashboard. (#533)
- Channel ID Format now actually applies to team imports. The setting was editable but read by nothing; imports hardcoded PascalCase. It now drives both import and bulk regeneration. Installs using the default see no change — the default is identical to the old hardcoded shape. (#522)
⚡ Enhancements
- Feed side is tracked as home, away, or unknown — never guessed. Streams with no feed signal, and sports with no home/away at all (racing, combat), stay unknown and match neither Feed Side rule rather than being swept into one. (#533)
- The detection-keyword form no longer offers
TEAM_VS_TEAMandFIELD_EVENTas event-type targets; neither was ever consumed, so both were silent no-ops. (#522)
🎨 UI/UX
- The
team_feedrule is now labelled "Specific Team's Feed" — its old name, "Home/Away Feed", became misleading once real feed-side rules existed. Behavior is unchanged. - Corrected stale in-app pointers left over from the v2.7.0 navigation overhaul (Settings → Cache, Settings → EPG, Global Defaults, and others). (#522)
🔧 Under the Hood
- Two new columns, both plain additions handled by schema reconciliation:
managed_channel_streams.feed_sideandmanaged_channels.event_end_estimate. - Removed the community guide link, the third-party Game Thumbs image host, and the community template downloads from the documentation.
- Test suite 2,113 → 2,161.
- Dependency updates across GitHub Actions and frontend npm packages.