Stable release v1.0.0 — changes since v0.5.0
What's changed
- chore(release): bump version to 1.0.0 (#54) (2f20987)
- feat(connection): connect watchdog + splash Cancel so connects can't hang (#53) (80876e6)
- chore(rebrand): retire legacy token path + rename signing-key doc (#52) (86037c0)
- chore(rebrand): finish Kite rename with a one-time settings migration (#51) (fbf794b)
- chore(repo): rename default branch master -> main; pin Dependabot to dev (#39) (99c100b)
- ci: add PR test workflow (frontend check+vitest, cargo test) (7c3fc62)
- chore(repo): add MIT LICENSE + branded social-preview image (b1add34)
- docs(readme): add Download section, fix rebrand + broken links, add disclaimer (7682db8)
- feat(about): show release notes / version history from GitHub releases (2a91281)
- feat(theme): default to Midnight (cyan/blue) to match the Kite brand (60af426)
- ci(release): disable Linux AppImage build for the 1.0 Windows-first phase (708112c)
- feat(hud): gate the diagnostics HUD behind a setting (on nightly / off stable) (e194fba)
- fix(input): unmap backtick from Guide so it does not fire on HUD toggle (f0e768b)
- fix(hud): stop each_key_duplicate crash that blocked the HUD from opening (6ad1670)
- refactor(hud): drop the redundant top-right "` HUD" hint, keep the button (f1e2ccb)
- fix(hud): open the panel reliably — internal $state, not unbound $bindable (9e4da91)
- feat(settings): mount SettingsView from ConsoleList, drop SettingsModal (6b3cd78)
- feat(settings): full-window SettingsView shell (nav + content pane) (af6e072)
- feat(settings): per-category settings components (a61362b)
- feat(settings): pure category model for the settings view (bf66df8)
- fix(splash): make the audio-only "video" step legible (opacity 0.35 -> 0.55) (61b8db7)
- fix(window): allow window.destroy so close quits when tray setting is off (f740799)
- chore(gitignore): ignore local dev-workflow docs (specs/plans) (df3f8d8)
- feat(tray): always-on system tray with Show/Quit + restore-on-click (4ec2658)
- feat(window): wire close-to-tray + settings toggle + hide capability (15c56a2)
- feat(window): pure close-to-tray decision + window glue (6806131)
- feat(settings): add minimize-to-tray preference (default off) (84b7bfc)
- fix(splash): gray out the video step in audio-only mode (99bc285)
- fix(hud): theme-adaptive HUD toggle pill background (light-theme contrast) (b7b9d97)
- fix(stream): hide Fix Video / Clip / Immersive in audio-only mode (a67e627)
- fix(rebrand): remaining "Xbox Remote" product strings -> Kite (#28) (84b0d30)
- ci(release): consolidate to single public repo (drop cross-repo publish) (#27) (9979dbb)
- rebrand: Xbox Remote -> Kite (name, icon, identifier, crate) (#26) (e73b5b8)
- feat(stream): audio-only mode (decline video for real savings) (#25) (eda8a8d)
- feat(input): wire keyboard-as-gamepad into the live input path (#24) (b534092)
- docs(rtc): handoff — Phase 6 merged, PR #20 viewport fix, PAUSED present-gap (#21) (6ca1953)
- ci(release): build nightly from dev; master becomes release-only (#23) (702e0d1)
- chore(deps): bump rustls-webpki from 0.103.8 to 0.103.13 (#2) (906a2c3)
- chore(deps): bump openssl from 0.10.75 to 0.10.81 (#1) (118ba47)
- fix(auth): surface sign-in failures instead of silently hanging (#22) (70acbb6)
- fix(rtc): set GL viewport each render so native video isn't black until resize (#20) (1756a28)
- feat(rtc): Phase 6 live-validation hardening — reparent, perf, volume (6aa5626)
- fix(rtc): harden Phase 6 native renderer per PR review (bc68446)
- fix(rtc): wire body.native-render + transparent native stage backgrounds (Phase 6 final-review) (b7df9fb)
- feat(rtc): Stream.svelte native branch + window-close engine teardown (6c.10) (178ad9d)
- feat(rtc): rtc_connect lifecycle + RtcEvent forwarding to the webview (6c.9) (9170682)
- feat(rtc): native clip path via rtc_save_clip (6c.8) (c9a8a66)
- fix(rtc): init() falls back to browser path if the native probe throws (6c.7 fix) (e57729f)
- feat(rtc): deterministic native/browser backend selection (6c.7) (491cdfa)
- feat(rtc): NativeConnection adapter (event mapping + input + clip) — TDD (6c.6) (747313f)
- test(rtc): cover the InputEmit→bytes dispatch via encodeInputEmit (6c.5 fix) (1b66ed2)
- refactor(rtc): GamepadPoller emits tagged input intent (browser byte-identical) — TDD (6c.5) (2c707e8)
- feat(rtc): native stats mapping (mapStats + completeSnapshot) — TDD (6c.4) (df616f3)
- refactor(rtc): extract ConnectionBackend interface; ConnectionManager implements it (6c.3) (2458261)
- feat(rtc): typed rtc_* ipc wrappers + rtc_event subscription (6c.2) (bb9cfa8)
- feat(rtc): rtc_* command surface + AppState handle field (6c.1) (d736ac9)
- docs(rtc): Phase 6c detailed plan (IPC + frontend, 10 tasks) (286fcc1)
- spike(rtc): render-mount on the Tauri window (GtkOverlay+GLArea, transparent) — Linux-validate (6b.B2/B3) (617c10c)
- feat(rtc): extract reusable GtkGlRenderer from render_live (6b.B1) (87a6218)
- feat(rtc): thread play_path through spawn + signaling.create_session (6a.6) (ac4a919)
- feat(rtc): Disconnected is terminal-only; transient drops emit Reconnecting (6a.5) (0b8a3ae)
- feat(rtc): RequestKeyframe command + RtcHandle::request_keyframe (6a.4) (0d98584)
- feat(rtc): send client-metadata when the input channel opens (6a.3) (556e294)
- refactor(rtc): RtcHandle::take_events splits the event stream from the handle (6a.2) (c7816d1)
- build(rtc): feature-gate GTK/render deps as optional linux deps (Phase 6 6a.1) (b506646)
- docs(rtc): Phase 6 implementation plan (6a detailed, 6b spike, 6c interfaces) (00b8ce8)
- docs(rtc): Phase 6 design (rev.2) — Tauri integration, post-critique re-sequencing (6854e1e)
- test(rtc): assert nonzero-bitrate stats + a muxable clip in live E2E (999f3fb)
- test(clip): cover non-keyframe-first guard for mux_opus; mkdir before mux (e9d16fb)
- feat(clip): Opus-direct MP4 mux + save_assembled_clip (TDD) (43af4fa)
- feat(rtc): feed clip ring from live AUs + Clip command/handle (ca83fdc)
- feat(rtc): log idle-warning pulse + keepalive-stop via tracing (c07e105)
- fix(rtc): answer idle warning with stick micro-pulse, not a reconnect (2535580)
- feat(rtc): API keepalive timer + pure stop-condition helper (TDD) (405276f)
- feat(rtc): drive real stats + media watchdog from the engine loop (fe713a3)
- feat(rtc): pure MediaWatchdog (keyframe-nudge → reconnect) — TDD (4697ba2)
- feat(rtc): pure StatsAccumulator (bitrate/fps/freeze) — TDD (f4b63e3)
- docs(rtc): Phase 5 implementation plan (stats, keepalive, idle pulse, clip) (3818c02)
- docs(rtc): Phase 4 ✅ complete + live-validated (native GL render of the live game) (47bfac5)
- feat(rtc): render_live — GL I420→YUV→RGB render of the live Xbox dashboard under a HUD (8c336e7)
- feat(rtc): engine publishes decoded frames to an optional SharedFrame (c7eb08f)
- feat(rtc): SharedFrame cross-thread render seam (TDD); retire placeholder VideoRenderer (7d56a6d)
- docs(rtc): Phase 4 implementation plan (Linux GL render of decoded frames) (14d6f60)
- spike(rtc): Phase 4 render de-risk — GTK GLArea video under transparent HUD, flicker-free (07ce379)
- test(rtc): add XBOX_E2E_HOLD_SECS hold knob; Phase 3 audio confirmed by ear on real box (425c06f)
- feat(ui): auto-hide stream controls during active streaming (#17) (48a5d03)
- docs(rtc): note the WaitingForServerToRegister live-run console gotcha (d1730ca)
- chore(rtc): add wsl_login helper; mark Phase 3 live-validated on WSL (de5542a)
- docs(rtc): Phase 3 code-complete (live run pending); handoff notes for cross-OS continuation (0dbf79c)
- test(rtc): live decode+audio E2E (decoded frames + cpal playback) (115da02)
- feat(rtc): wire FfmpegDecoder + OpusDecoder + cpal sink into the engine (15c037a)
- feat(rtc): audio sink — pure AudioRing (TDD) + cpal playback stream (12e2496)
- feat(rtc): OpusDecoder — Opus → 48k stereo PCM (round-trip TDD) (d84afb9)
- feat(rtc): FfmpegDecoder — software H.264 → I420 CPU frames (fixture TDD) (8afdbb5)
- docs(rtc): Phase 3 implementation plan (decode pipeline + audio) (172e07e)
- docs(rtc): mark Phase 2 complete (live-validated); next is Phase 3 (fa09d60)
- refactor(rtc): address final review — encapsulate RtcHandle events, wire Reconnecting attempt, note gsToken refresh gap (a54dfa2)
- test(rtc): live XBOX_E2E engine integration test (connect→handshake→receive) (0b2d255)
- feat(rtc): str0m engine — sans-IO loop on the seams, handshake, reconnect, input send (6ae9610)
- feat(rtc): pure connection state machine + 3/6/9s reconnect backoff (TDD) (69f7d53)
- docs(rtc): Phase 2 plan — rename ChannelLabel::from_str → from_label (e9ba70d)
- feat(rtc): pure data-channel handshake sequencer (TDD) (72d623d)
- feat(rtc): XHomeSignaling adapter + pure SessionInfo/ICE mappers (TDD) (5b4f2bb)
- refactor(rtc): make Transport seam async (tokio UdpTransport) for the sans-IO loop (943fe84)
- docs(rtc): Phase 2 implementation plan (str0m engine + signaling) (865d526)
- chore(rtc): phase 0 live de-risk — DTLS-SRTP confirmed; str0m receive→decode spike (c15b93b)
- refactor: split crate into lib + thin bin so examples/tests can reuse modules (978d1da)
- docs(rtc): plan status block — Phase 1 complete, next steps on Linux (09770ee)
- docs(rtc): fix module header to match un-gated default-build compilation (c7cb752)
- test(rtc): strengthen clip_tap alignment/eviction tests + audio-only case (1294888)
- feat(rtc): native clip ring + keyframe-aligned assemble (TDD) (2a6f037)
- feat(rtc): data-channel protocol messages + parser (TDD) (24a7f09)
- docs(rtc): clarify Y-axis fields are negated by encoder, not the caller (15a1e3a)
- feat(rtc): byte-exact 38-byte input packet encoder (TDD) (a6e384b)
- refactor(rtc): compile pure protocol modules without native-webrtc feature (4fc173d)
- style: apply cargo fmt to previously-unformatted modules (d599069)
- fix(auth): switch to authorization-code (+PKCE) flow; use owned client ID (121dda3)
- fix(auth): open sign-in via sanitized backend launcher (AppImage) (0ef9b79)
- feat(rtc): phase 0 — native WebRTC architecture skeleton + SRTP gate resolved (dc62a06)
- fix(logging): write panics synchronously so crash capture survives abort (c9b82ed)
- feat(logging): LogViewer panel in DiagnosticsHud (3cc2899)
- refactor(logging): route ConnectionManager through logger; drop dead store log ring (235c130)
- feat(logging): start logger flush timer + global handlers at app launch (5d78010)
- feat(logging): persisted verbose setting + Diagnostics settings row (d0fc558)
- feat(logging): logger facade + global JS error capture (5063420)
- feat(logging): log store with pure filterRecords + tests (d176d87)
- feat(logging): typed IPC wrappers for log commands (36bf7df)
- feat(logging): frontend log batching queue with tests (0801572)
- feat(logging): tauri commands (log_event/get_recent_logs/export/verbosity/open_dir) + init wiring (ce47a5c)
- feat(logging): unified tracing sink (file + ring), reload handle, panic hook (75fd88a)
- feat(logging): FrontendLogRecord wire type with serde test (c24e62c)
- feat(logging): bounded LogRecord ring buffer with tests (8ffd423)
- fix(logging): harden redact against JSON-quoted/opaque tokens + bound SDP (be1cb61)
- feat(logging): secret redaction (bearer/JWT/token/SDP) with tests (a0b69f8)
- build(logging): add tracing-appender + regex; widen tracing-subscriber features (08df583)
- docs(plan): observability & logging foundation implementation plan (652a8b5)
- docs(spec): observability & logging foundation design (893858c)
- fix(consoles): allow connecting to ConnectedStandby consoles (edfdddb)
- fix(ui): make sign-in URL hand-selectable as a clipboard fallback (f1636f3)
- fix(linux): run WebRTC under XWayland so video renders on Wayland (63e9451)
- fix(auth): grant opener URL scope so the sign-in browser actually opens (63795a1)
- fix(auth): open sign-in page in real browser via opener plugin (422d12f)
- ci: refresh release body each run and add commit changelog (1dc167c)
- fix: disable WebKitGTK DMA-BUF renderer on Linux to prevent Wayland Error 71 (79487df)
- feat(ui): persist settings through tauri-plugin-store adapter (56447db)
- feat: register tauri-plugin-store (backend, capability, dep) (cab040e)
- feat(ui): durable settings adapter over tauri-plugin-store (c457ce3)
- docs: implementation plan for durable settings persistence (7fd58fe)
- docs: design spec for durable settings via tauri-plugin-store (bcf7422)
- fix(ci): drop sudo apt step — deps come from the runner provisioner (a8de4aa)
- docs: runner runs as unprivileged ghrunner (479c4fb)
- chore: force LF on *.sh via .gitattributes (CI runs on Linux) (e1c7d84)
- ci(runner): provision runner as unprivileged ghrunner (not root) (a5ac868)
- docs(plan): non-root CI runner (ghrunner) implementation plan (629464a)
- docs(spec): non-root CI runner (ghrunner) on CT 106 (3c74a3e)
- docs(releases): document the Gitea->GitHub install cutover (reinstall once) (f12b0b9)
- chore: stop tracking generated gen/schemas (build regenerates them) (4212e9a)
- docs: runner provisioning script + node 22 (86d2739)
- build(ui): move to pnpm 11 + node 22 (runner now on node 22) (8d2a56e)
- docs(runner): how to provision + register CT 106 (78053db)
- ci(runner): idempotent CT 106 provisioning script (node 22) (e4fbc2b)
- docs(plan): codify CI runner + node 22 + pnpm 11 implementation plan (7e0927d)
- docs(spec): codify CI runner (CT 106) + Node 22 / pnpm 11 (0c91fdf)
- fix(ci): pin pnpm 10.34.3 (node-20 compatible) + run frontend from ui/ (ab4e8aa)
- docs: pnpm commands for the frontend (npm --prefix ui -> pnpm --dir ui) (4e00893)
- ci(ui): frozen pnpm install for reproducible frontend builds (d05861a)
- build(ui): adopt pnpm lockfile; drop package-lock.json (fe9c9b2)
- build(ui): pin devDeps + declare pnpm/node via packageManager+engines (b8e1561)
- docs(plan): UI build reproducibility via pnpm implementation plan (992d973)
- docs(spec): UI build reproducibility via pnpm (6e464ed)
- chore(release): bump dev target to 0.6.0; document gh runner prereq (5d971f7)