v1.0.0 — Open-source release
What's Changed
- fix: shaping reliability — metrics endpoint, pattern start, apply-on-click by @jonathaneoliver in #73
- docs: add docker run quickstart and run-image Makefile target by @jonathaneoliver in #74
- Bundle go-proxy into main container image by @jonathaneoliver in #76
- feat: cloud-based encoding via AWS EC2 spot instances by @jonathaneoliver in #78
- docs: audit and fill gaps (closes #79) by @jonathaneoliver in #80
- feat(dashboard): visualization improvements — PiP, events swim lane, compact UI by @jonathaneoliver in #82
- fix(go-proxy): remove memcache, fix concurrent map crashes, add per-session SSE by @jonathaneoliver in #88
- perf(go-proxy): regex hoisting, atomic reads, SSE pre-marshal, active_sessions for grouping by @jonathaneoliver in #93
- fix: grouped session shaping propagation by @jonathaneoliver in #100
- feat(apple): metrics POST endpoint, SSE player_id filter, ubuntu server by @jonathaneoliver in #102
- perf(go-live): singleton generator, single-lock DASH cache by @jonathaneoliver in #103
- feat(android): ExoPlayer test app for ABR characterization by @jonathaneoliver in #105
- feat(apple): scrollable content picker sheet by @jonathaneoliver in #106
- infra: add go.mod to go-proxy and go-live, enable local go test by @jonathaneoliver in #107
- fix(go-live): cap live window at loop wrap (closes #109) by @jonathaneoliver in #114
- feat(android): TV-friendly UI, real bandwidth metric, gradle wrapper (closes #115) by @jonathaneoliver in #116
- feat(go-proxy): broadcast significant player events + log abandoned transfers (closes #117) by @jonathaneoliver in #118
- refactor(go-proxy): per-session save for group link/unlink + auto-ungroup singles (closes #119) by @jonathaneoliver in #120
- fix(go-proxy): shouldApplyFailure returns false on empty entries (closes #121) by @jonathaneoliver in #122
- feat(apple): local HTTP forward proxy for wire-level metrics (closes #123) by @jonathaneoliver in #124
- chore(apple): drop redundant ISO timestamp from TestingSession stdout log (closes #125) by @jonathaneoliver in #126
- feat(dashboard): compare mode, chart pause, loop swim-lane, wire bitrate, throughput sync (closes #127) by @jonathaneoliver in #128
- chore: gitignore .claude/ (closes #129) by @jonathaneoliver in #130
- fix(apple): restore ContentView compact layout, Go Live toggle, IPv4 host (closes #131) by @jonathaneoliver in #132
- chore(dashboard): rename 'Player Wire Bitrate' to 'Player Network Rate' (closes #133) by @jonathaneoliver in #134
- fix(apple): silence LocalHTTPProxy ECANCELED log flood (closes #135) by @jonathaneoliver in #136
- fix(apple): pass through Content-Length to silence URLAsset err=-12174 (closes #137) by @jonathaneoliver in #138
- feat(dashboard): show Player Network Rate per session in compare-mode charts (closes #139) by @jonathaneoliver in #140
- fix(apple): 'Allow 4K' OFF actually caps at 1080p (closes #141) by @jonathaneoliver in #142
- revert(apple): restore 'Allow 4K' OFF = .zero (closes #143) by @jonathaneoliver in #144
- fix(go-live): emit EXT-X-DISCONTINUITY-SEQUENCE, enlarge live window by @jonathaneoliver in #150
- feat(go-live): declare SERVER-CONTROL:HOLD-BACK on range HLS playlists by @jonathaneoliver in #152
- feat(go-live): inject EXT-X-START on master; go-proxy replaces on liveOffset by @jonathaneoliver in #154
- chore(go-live): remove dead legacy spawn/continuous/once/LoadByteranges by @jonathaneoliver in #156
- feat(apple): track per-segment identity via LocalHTTPProxy by @jonathaneoliver in #158
- feat(apple): enrich PlaybackDiagnostics with unified snapshot by @jonathaneoliver in #160
- feat(apple): preserve live offset across stall recovery by @jonathaneoliver in #162
- feat(dashboard): buffer depth chart y-axis rounds to 5-second steps by @jonathaneoliver in #164
- fix(dashboard): include all grouped sessions when sizing buffer chart by @jonathaneoliver in #166
- feat(metrics): rework player bitrates as avgNetworkBitrate + networkBitrate by @jonathaneoliver in #167
- chore: bump version to v0.9.0 by @jonathaneoliver in #169
- feat(androidtv): iOS parity — UI, content fetch, player metrics by @jonathaneoliver in #171
- feat(dashboard): cross-session legend hover highlight in compare mode by @jonathaneoliver in #173
- feat(apple): tvOS options row, D-pad nav, local proxy, sleep prevention, deploy targets by @jonathaneoliver in #179
- feat(android): fullscreen toggle, layout improvements, app icon banner by @jonathaneoliver in #180
- feat(dashboard): tag all sessions with (SX) in compare view, update nav logo by @jonathaneoliver in #181
- chore: open-source readiness cleanup by @jonathaneoliver in #184
- chore: tag Quartet and Live Offset as Alpha by @jonathaneoliver in #186
- chore: dashboard cleanup batch by @jonathaneoliver in #188
- chore: bump VERSION to v1.0.0 by @jonathaneoliver in #190
- docs(readme): rate shaping as top-level differentiator by @jonathaneoliver in #192
- docs(readme): broaden audience line by @jonathaneoliver in #194
- docs(readme): tvOS in bundled clients + role clarification by @jonathaneoliver in #196
- feat(encoder): prefer 2-channel audio when source has multiple tracks by @jonathaneoliver in #198
- feat(upload): clean filenames + show on-disk name in Source Library by @jonathaneoliver in #200
- chore: scrub personal IPs/hostnames; add QR pairing in Server Info by @jonathaneoliver in #203
- docs(rendezvous): note that fork builds should change the baked-in Worker URL by @jonathaneoliver in #205
- fix(k3s): distinct server_id per deployment so dev + release both appear in discovery by @jonathaneoliver in #206
- fix(ios,tvos): ATS exception for the public HTTP deployment + cleartext docs by @jonathaneoliver in #207
- ci: release automation — semver GHCR tags, Release Drafter, version-tagged k3s image by @jonathaneoliver in #208
Full Changelog: v0.6.0...v1.0.0