✨ New Features
- Filler condition rows (#420) — pregame/postgame/idle filler content now supports full condition-row editors with
is_final/is_not_finalevaluators, per-field selection, and cascade-on-empty; starter templates re-authored natively on the new system - EPG-style timeline preview in the template builder (#416) — see your channel's guide timeline as you edit, with the winning filler condition row rendered in place and fires/outranked badges on every row (#428)
- Template builder authoring workflow (#400) — guide-card preview, header preview controls, and a guided create flow
- Conditional title & subtitle rows (#370) — conditional rows can now override title and subtitle per-field, not just descriptions
- All-Star game matching (#433) — league All-Star events now match in event EPG
- Combat live-sample cascade (#260) — template previews prefer a finished card, then scheduled, then static samples
- Live stream pinning (#232) — a live event's #1 stream is pinned against re-generation rewrites; new streams append below
🐛 Bug Fixes
- Custom extraction patterns now work for tennis groups, and the builtin parser handles
Surname, First - Surname, Firststream names — thanks @lukenmorris for the detailed report (#439) - No more raw
{*.next}braces in guides when a next/last game is missing (#418) - Renamed shadowed combat
matchupvariable tomatchup_combat; duplicate variable registration now fails at import (#411) - Zombie league codes are dropped on subscription save, with stale slugs surfaced in the UI (#408)
- Category input no longer swallows text matching checkbox names; 'Sports event' seeded (#423)
- Channel-source group is now EPG-only (#406)
- Racing matching hardened: matches scoped to the series the stream names, F2/F3/Formula E blocked from binding to F1 events, WEC matchable, session fan-out scoped by stream-name labels, EPG racing matches anchored to the programme's broadcast instant
⚡ Enhancements
- Generation-loop performance: parallel EPG index fetch, negative caching, per-run consolidation, EPG plan memoization, and windowed stream re-add — large-library runs are significantly faster
- Compact Managed Channels event format — abbreviated matchup + provider event id (#403)
- Backup service hardened against path traversal (#397)
🎨 UI/UX
- Template builder sidebar disclosures unified on collapsible sections (#414)
- Pattern Tester and group-form regex hints aligned — both named-group syntaxes accepted (#439)
🔧 Under the Hood
- Starter→XMLTV golden snapshot suite pins end-to-end EPG output for all 10 starter templates (#375)
- Registry-driven sweep test proves all 260 template variables and 33 condition evaluators work (#437)
- Schema migrations v80/v81 (filler conditionals, starter category normalization)
- Dependabot onboarding + first dependency batch (#309)
- ESPN editorial-field drift canary groundwork (#375)