Skip to content

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 30 Apr 16:54
· 70 commits to refs/heads/main since this release
d3370cc

v1.1.0 — first feature release after the open-source GA

The v1.0.0 GA proved the core loop works. v1.1.0 leans hard into diagnostics: every fault is now legible at a glance, every player has a 911 button that captures forensic-quality HAR files, and the device apps were rebuilt around a cinematic UI that doubles as release-quality demo material.

🎯 All-tab fault injection override

A new All tab on the Fault Injection panel applies one rule to every HTTP request kind in a single click — segments, media manifests, master. The Segment / Manifest / Master tabs disable with an "All override active" banner while it's on. Use it for blunt-instrument blast tests; drop back to per-kind tabs when you need different rules per request kind.

🌊 Streaming-aware HAR with !✂ / !⏱ / !↩ glyphs

Every request the proxy serves is captured as a HAR-format network log entry and rendered as a Chrome DevTools-style waterfall in the dashboard. The glyph column tells the truth even when the status code can't:

  • !✂ — proxy deliberately tore down the connection (fault injection: request_body_*, request_first_byte_*, etc.)
  • !⏱ — server transfer timeout fired (active or idle)
  • !↩ — player gave up mid-transfer
  • ! — plain HTTP fault (4xx / 5xx)

Status codes were also fixed to reflect what the client actually saw on the wire, not internal sentinels: 200 for body/header mid-stream cuts, 0 for connect-time aborts, 503 only on hijack fallback. A row that looks like a successful 200 download but shows !↩ next to its method tells you the player abandoned it — exactly the signal that used to disappear into the void.

🚨 One-tap 911 incident capture

Every player platform (iOS, iPadOS, tvOS, Android TV) now has a "911" button right of the Reload action. One tap on a problem fires a user_marked event the server captures as a HAR snapshot — last 10 minutes, every play within the window, written to the new Incidents browser. Cross-layer "911" log lines are grep-friendly across Apple device console, adb logcat, and docker logs, so tracing one user complaint across all three layers is one search. Auto-snapshots also fire on detected stalls / segment-stalls.

📂 Incidents page

New dashboard page that browses every saved HAR snapshot — manual saves, 911 captures, and auto-captured stalls — with reason filters, bulk delete, and click-to-render-waterfall inline. Replays the same rendering machinery as the live testing-session view; no separate viewer to learn.

📊 Playback state chart

The per-session bitrate chart now stacks an events timeline above the bandwidth / buffer / FPS panels, all sharing the same x-axis. Swim-lanes for PLAYER variants (one row per ladder rung), DISPLAY RES, PLAYERSTATE, PLAYBACK / IMPAIRMENT markers, and SERVER LOOP boundaries make a single screenshot tell the whole "what the player was doing while the network was being shaped" story.

🎬 Apple + AndroidTV cinematic UI

The iOS, iPadOS, tvOS, and AndroidTV apps were rebuilt around a shared cinematic dark UI: a "Now Playing" hero, a LIVE row of live preview tiles (real LL-HLS preview frames within a per-device decode budget, not stale stills), and a slide-from-right Settings drawer with sticky picker focus. The Apple side reaches parity with the AndroidTV redesign that landed earlier in the same line of work.

⏱ Server transfer timeouts

Per-session active and idle transfer timeouts the proxy enforces against the player. ATS-style — total wall-clock budget vs gap-since-last-write timer — with per-kind opt-in (Apply To: Segments / Media manifests / Master manifest) so you can timeout segments without falsely tripping tiny manifest fetches. Fires render as !⏱ rows on the network log waterfall.

🕒 Wall-clock offset metric

A new player_metrics_true_offset_s metric: how far behind live the player is, computed server-side from the encoder's PDT at the playhead and the server's own receive clock. Independent of any clock skew between the client device and your laptop, immune to phone vs laptop NTP drift, and immune to whatever offset the player engine is internally applying. Surfaces on the buffer-depth chart's right Y-axis and as the basis for cross-client comparison.

🛠 Encoding & content

  • Source audio is normalized to AAC during transcode regardless of input format, so every variant on the ladder has a uniform audio layer (no more "this segment plays on iOS but not Android" audio-codec surprises).
  • New make test-pattern Makefile target generates a 4K synthetic test pattern as a controlled source — deterministic visuals, no copyrighted material, useful for "is this the player or is this the content?" debugging.

🔁 Reset All Settings

Every device app got a destructive Reset All Settings action at the bottom of Settings → Advanced. Wipes the saved server list, playback history, and Advanced flags, then routes back to the ServerPicker — equivalent to a fresh install but without losing the app itself.

🐛 Fault-decision correctness fixes

Fault injection got a series of correctness fixes around concurrent requests and timing semantics. Frequency now means full cycle length (fault start → next fault start) instead of gap-after-recovery, matching what the slider label implies. The video-and-audio-arrived-in-the-same-millisecond double-fire bug is gone (single decision mutex around the read-modify-write). Default Mode aligns server-side init with the dashboard's visible default so first-use rate-limits behave as expected.

🧰 Other improvements

  • Network-log waterfall: Follow Latest sticky checkbox, alt-wheel inner scroll restored, brush minimum drops to 30 s, 40-row default height, page-aware auto-snap.
  • Apple TV: launcher icon + top shelf brand assets (the app was invisible on the Home Screen before).
  • Default Bitrate Y-Max now offers a 100 Mbps option for high-bitrate experiments.
  • Buffer-depth, bandwidth, and FPS charts' plot areas now share the same right edge so vertical x-axis ticks align across every chart.

Full commit-level changelog: v1.0.0…v1.1.0

Container images: ghcr.io/jonathaneoliver/infinite-streaming:v1.1.0 (also tagged :v1.1 and :v1).