This roadmap focuses on reliability first, then user experience, then advanced capabilities.
- Make playback resilient across channel switches and weak streams.
- Improve day-to-day usability for TV and radio browsing.
- Add visibility into stream and transcode health.
- Grow toward recorder and richer metadata features without destabilizing core playback.
- Added configurable concurrent stream capacity for multi-user viewing (
MAX_CONCURRENT_STREAMS) so the server can match tuner count (for example 4 on Quatro). - Completed core EPG guide UX (now/next in list plus guide panel) and landed sidecar-first setup flow in docs.
- Completed EPG scheduled refresh and last-known-good cache fallback behavior in backend.
- Add automated tests for stream URL selection and player lifecycle.
- Add end-to-end smoke tests for HD passthrough, SD transcode, and radio playback.
- Add structured server logs for stream start, stop, error, and retry events.
- Add health and diagnostics endpoint for runtime checks.
- Add user-facing playback error taxonomy with clearer recovery messages.
Exit criteria:
- Core playback paths are covered by tests.
- Channel switch regressions are caught automatically.
- Stream failures are diagnosable from logs alone.
- Favorites and pinned channels.
- Last-channel resume and quick-switch history.
- Search and sort controls for large lineups.
- Better subtitle UX with channel-level preference memory.
- Playback status panel with current mode (HD passthrough vs transcode).
Exit criteria:
- Frequent actions (find channel, switch, subtitle toggle) take fewer clicks.
- Returning users recover previous viewing context automatically.
- Multiple transcode profiles with runtime switching.
- Optional low-latency mode tuning.
- Smarter retry strategy by error class.
- Optional tuner-aware backoff when switching rapidly.
Exit criteria:
- Reduced buffering and startup delay on constrained networks.
- Lower CPU usage at equivalent perceived quality.
- EPG ingestion and now/next display.
- Channel logos and richer metadata.
- Better radio presentation and background playback hints.
EPG implementation milestones (free-first strategy):
- Milestone A: XMLTV ingestion baseline (1 to 2 days).
- Milestone B: Channel mapping and now/next API (2 to 3 days).
- Milestone C: Frontend TV guide panel and per-channel schedule (2 to 4 days).
- Milestone D: Scheduled refresh, caching, and stale-data handling (1 to 2 days). Status: mostly complete.
- Milestone E: Optional over-the-air EIT fallback spike (2 to 4 days, research-heavy).
Milestone details:
- Milestone A (XMLTV ingestion baseline). Deliverables: Parse XMLTV feed, normalize to internal model, persist to local cache. Primary file changes: server.mjs, compose.yaml, README.md.
- Milestone B (channel mapping and now/next API). Deliverables: Map lineup channels to xmltv ids and expose now/next backend endpoint. Primary file changes: src/hdhomerun.ts, server.mjs.
- Milestone C (frontend guide UX). Deliverables: Render now/next in channel list and show a compact per-channel timeline. Primary file changes: src/app.ts, src/channelList.ts, src/style.css.
- Milestone D (refresh and resilience). Deliverables: Add background refresh schedule, stale cache policy, and user-visible guide freshness state. Progress: background refresh and stale cache fallback are in place; remaining work is stronger guide telemetry/logging and endpoint hardening. Primary file changes: server.mjs, compose.yaml, src/app.ts.
- Milestone E (EIT fallback spike). Deliverables: Prototype free over-the-air fallback path and compare quality/maintenance cost. Primary file changes: separate prototype module and docs notes in README.md.
Exit criteria:
- Users can browse by content context, not only channel name.
- Now/next is available for the majority of mapped channels.
- Guide data remains available during temporary upstream failures via cache.
- Optional DVR recording scheduler.
- Basic multi-user profiles for per-user hidden channels and preferences.
- Optional remote access hardening guide.
Exit criteria:
- Advanced features do not regress core playback reliability.