| fix(website): drop the duplicate notarization note from the hero | Dami | | +1 | -2 | |
| Merge pull request #133 from FelineStateMachine/fix/release-build-and-order | FelineStateMachine | | +17 | -10 | |
| fix(release): make the Portal release build run, and correct the runbook order | Dami | | +17 | -10 | |
| Merge pull request #132 from FelineStateMachine/fix/website-download-wiring | FelineStateMachine | | +1 | -1 | |
| fix(website): restore the download status element and the notarization gate | Dami | | +1 | -1 | |
| Merge pull request #131 from FelineStateMachine/release/v0.1.0-pins | FelineStateMachine | | +4 | -3 | |
| nit: remove terrible ui warning | Dami | | +1 | -2 | |
| release: open the Sigil bootstrap channel for v0.1.0 | Dami | | +4 | -3 | |
| Merge pull request #130 from FelineStateMachine/fix/release-manifest-language | FelineStateMachine | | +1 | -1 | |
| docs(website): stop blaming notarization for the missing Portal download | Dami | | +1 | -1 | |
| Merge pull request #129 from FelineStateMachine/release/portal-packaging | FelineStateMachine | | +17825 | -809 | |
| docs: align release language with the bounded multi-viewer session | Dami | | +43 | -17 | |
| Merge pull request #128 from FelineStateMachine/1-n-sigls | FelineStateMachine | | +16813 | -527 | |
| fix(ci): let the Windows Portal compile guard actually run | Dami | | +5 | -0 | |
| fix(proof): stop rejecting ffmpeg builds that do have libx264 | Dami | | +7 | -1 | |
| test(proof): cover enrolled control-v2 admission and per-viewer revisions | Dami | | +78 | -1 | |
| docs: state the bounded multi-viewer product boundary | Dami | | +19 | -6 | |
| test(proof): make the replacement and focus-handoff gates deterministic | Dami | | +34 | -3 | |
| fix: bind authenticated media to the advertised authorization revision | Dami | | +348 | -21 | |
| fix(host): close the legacy/multi-viewer admission race and reclaim focus state | Dami | | +259 | -9 | |
| merge: integrate release/portal-packaging into multi-viewer branch | Dami | | +979 | -274 | |
| feat(host): default to the in-process encoder and expose shadow mode | Dami | | +186 | -9 | |
| docs(website): correct signing claims and refresh the roadmap | Dami | | +13 | -11 | |
| feat: enforce multi-viewer acceptance bounds | Dami | | +1555 | -185 | |
| feat: aggregate viewer feedback and isolate stalls | Dami | | +1677 | -14 | |
| build: package Portal across the os/arch matrix without Apple notarization | Dami | | +779 | -254 | |
| feat: complete exclusive focus handoff | Dami | | +1861 | -321 | |
| feat: admit bounded concurrent viewers | Dami | | +1537 | -359 | |
| feat: share host-owned media generations | Dami | | +1549 | -138 | |
| feat: administer multiple enrolled viewers | Dami | | +1897 | -141 | |
| feat: authenticate relay-ready media objects | Dami | | +3009 | -112 | |
| feat: establish explicit v2 single-viewer sessions | Dami | | +3893 | -132 | |
| Merge pull request #127 from FelineStateMachine/fix/architecture-review-findings | FelineStateMachine | | +2905 | -5743 | |
| nit: ui changes from UAT | Dami | | +85 | -27 | |
| test: follow the input module split in the compatibility identifier gate | Dami | | +6 | -6 | |
| refactor: split input.rs so keymap edits stay clear of ACL security code | Dami | | +1980 | -1963 | |
| fix: surface the root cause of a Decky readiness timeout | Dami | | +99 | -5 | |
| perf: hold media payloads behind Arc to drop per-client frame copies | Dami | | +23 | -8 | |
| fix: close architecture review follow-up gaps | Dami | | +183 | -118 | |
| build: assemble portal-dist in build.rs instead of a bash hook | Dami | | +79 | -55 | |
| ci: assemble portal-dist before plain-cargo builds in demo gate | Dami | | +7 | -0 | |
| docs: name the Sigil release target contract in the README | Dami | | +9 | -5 | |
| fix: report degraded appliance status from every fallible serve step | Dami | | +61 | -61 | |
| refactor: single-source the MoQ catalog document in sigil-protocol | Dami | | +63 | -101 | |
| refactor: retire legacy v0/v1/v2 media tiers and the base64 JPEG fallback | Dami | | +304 | -3474 | |
| fix: bundle Portal webview payload from an explicit runtime allowlist | Dami | | +49 | -1 | |
| fix: align frame-channel flag bits with sigil-protocol wire flags | Dami | | +45 | -7 | |
| Merge pull request #126 from FelineStateMachine/docs/readme-and-repo-hygiene | FelineStateMachine | | +162 | -316 | |
| chore: remove personal absolute paths from public docs | Dami | | +9 | -6 | |
| docs: rewrite readme as a public project description | Dami | | +153 | -310 | |
| Merge pull request #124 from FelineStateMachine/feat/freeze-compatibility-identifiers | FelineStateMachine | | +241 | -31 | |
| Merge pull request #125 from FelineStateMachine/feat/preserve-portal-window-size | FelineStateMachine | | +93 | -590 | |
| Merge remote-tracking branch 'origin/main' into feat/preserve-portal-window-size | Dami | | +447 | -114 | |
| Merge remote-tracking branch 'origin/main' into feat/freeze-compatibility-identifiers | Dami | | +374 | -117 | |
| Merge pull request #123 from FelineStateMachine/feat/handle-hmac-secret-errors | FelineStateMachine | | +75 | -6 | |
| docs: preserve user-owned Portal geometry | Dami | | +3 | -2 | |
| Merge pull request #121 from FelineStateMachine/feat/bounded-authorization-writer | FelineStateMachine | | +372 | -108 | |
| fix(portal): preserve user window geometry | Dami | | +90 | -588 | |
| Merge branch 'feat/handle-hmac-secret-errors' into feat/freeze-compatibility-identifiers | Dami | | +75 | -6 | |
| Merge remote-tracking branch 'origin/main' into feat/freeze-compatibility-identifiers | Dami | | +4467 | -570 | |
| docs: use software auth hardware proof | Dami | | +11 | -2 | |
| Merge remote-tracking branch 'origin/main' into feat/handle-hmac-secret-errors | Dami | | +4467 | -570 | |
| Merge remote-tracking branch 'origin/main' into feat/bounded-authorization-writer | Dami | | +4306 | -567 | |
| Merge pull request #120 from FelineStateMachine/feat/portable-pointer-feedback | FelineStateMachine | | +317 | -80 | |
| Merge pull request #119 from FelineStateMachine/feat/target-contract-release-assets | FelineStateMachine | | +206 | -44 | |
| Merge pull request #118 from FelineStateMachine/feat/decouple-adaptive-commit-awaiting | FelineStateMachine | | +1107 | -280 | |
| Merge pull request #117 from FelineStateMachine/feat/forward-extended-keyboard-input | FelineStateMachine | | +492 | -61 | |
| Merge pull request #116 from FelineStateMachine/feat/jpeg-latest-frame-wins | FelineStateMachine | | +523 | -33 | |
| Merge pull request #113 from FelineStateMachine/feat/ci-glibc-cross-build | FelineStateMachine | | +1126 | -16 | |
| Merge pull request #115 from FelineStateMachine/feat/linear-annexb-parser | FelineStateMachine | | +179 | -10 | |
| fix(host): reconcile adaptive control cadence | Dami | | +494 | -123 | |
| docs(input): clarify physical keyboard contract | Dami | | +25 | -12 | |
| fix(input): forward extended physical keyboard codes | Dami | | +474 | -56 | |
| Merge pull request #114 from FelineStateMachine/feat/gate-non-macos-pointer-capture | FelineStateMachine | | +356 | -43 | |
| test(ci): isolate cross-build fixtures from ambient mode | Dami | | +3 | -0 | |
| fix(portal): bound JPEG fallback decoding | Dami | | +205 | -89 | |
| fix(host): retain coalesced adaptive recovery barrier | Dami | | +82 | -41 | |
| perf(source): scan Annex-B input incrementally | Dami | | +179 | -10 | |
| test: issue invitation with live authorization writer | Dami | | +6 | -6 | |
| test(host): stress adaptive commit coordination | Dami | | +233 | -0 | |
| feat(portal): force JPEG in debug hardware tests | Dami | | +187 | -13 | |
| refactor(host): decouple adaptive commit acknowledgements | Dami | | +379 | -197 | |
| fix: bound authorization writer ownership | Dami | | +355 | -100 | |
| fix(portal): report JPEG presenter queue exactly | Dami | | +51 | -3 | |
| fix(portal): make JPEG fallback latest-frame-wins | Dami | | +165 | -13 | |
| fix(ci): enforce exact demo-gate contract | Dami | | +200 | -7 | |
| test(ci): prove required cross-build execution | Dami | | +182 | -89 | |
| refactor(release): name Sigil assets by target contract | Dami | | +206 | -44 | |
| test(ci): reject semantic cross-build bypasses | Dami | | +246 | -24 | |
| test(ci): reject cross-build gate bypasses | Dami | | +553 | -86 | |
| ci(gate): require the glibc cross build in PRs | Dami | | +132 | -0 | |
| Merge pull request #112 from FelineStateMachine/feat/fail-closed-shell-test-discovery | FelineStateMachine | | +161 | -3 | |
| test(auth): cover representable hmac-secret responses | Dami | | +44 | -21 | |
| fix(auth): reject malformed hmac-secret responses | Dami | | +51 | -5 | |
| docs(test): require real bypass connections | Dami | | +15 | -11 | |
| docs(pointer): describe bounded motion visibility recovery | Dami | | +15 | -12 | |
| fix(pointer): add portable Gamescope feedback fallbacks | Dami | | +315 | -81 | |
| fix(test): fail closed on shell test discovery | Dami | | +161 | -3 | |
| feat(portal): gate non-macOS relative pointer capture | Dami | | +356 | -43 | |
| docs: require authenticated identity hardware proof | Dami | | +7 | -0 | |
| test(compat): bind frozen identifiers across consumers | Dami | | +95 | -6 | |
| fix(compat): expose frozen input tuple to linux backend | Dami | | +2 | -2 | |
| docs(compat): freeze identity and appliance identifiers | Dami | | +145 | -28 | |
| docs(uat): require a minimal hardware proof matrix (#111) | FelineStateMachine | | +845 | -16 | |
| fix(uat): support display-manager-independent autologin (#110) | FelineStateMachine | | +134 | -31 | |
| fix(input): neutralize cancelled and panicked sessions (#109) | FelineStateMachine | | +222 | -14 | |
| feat(input): support one-user uinput ACLs (#108) | FelineStateMachine | | +341 | -11 | |
| test(input): verify Gamescope pointer synchronization (#107) | FelineStateMachine | | +271 | -38 | |
| fix(streaming): admit live damage-driven startup (#106) | FelineStateMachine | | +53 | -4 | |
| fix(sigil): probe GStreamer properties programmatically (#105) | FelineStateMachine | | +552 | -237 | |
| fix(sigil): probe VA-API capability across drivers (#104) | FelineStateMachine | | +147 | -117 | |
| fix(portal): enforce H.264-only media contract (#103) | FelineStateMachine | | +83 | -279 | |
| fix(portal): probe H.264 decoder support (#102) | FelineStateMachine | | +146 | -5 | |
| Merge pull request #101 from FelineStateMachine/feat/dev-auth-bypass | FelineStateMachine | | +320 | -57 | |
| fix(test): isolate appliance hardware preflight | Dami | | +9 | -12 | |
| fix(test): make appliance shutdown deterministic | Dami | | +10 | -2 | |
| fix(test): pin invitation preflight time | Dami | | +80 | -26 | |
| fix(test): require explicit host bypass feature | Dami | | +14 | -7 | |
| docs(test): show bounded bypass launch | Dami | | +3 | -2 | |
| feat(test): add bounded host auth bypass | Dami | | +213 | -17 | |
| Merge pull request #99 from FelineStateMachine/feat/portal-iroh-moq-diagnostics | FelineStateMachine | | +6 | -4 | |
| fix(portal): report iroh-moq transport | Dami | | +6 | -4 | |
| Merge pull request #98 from FelineStateMachine/feat/portable-installer-gates | FelineStateMachine | | +500 | -19 | |
| fix(install): harden activation instructions | Dami | | +59 | -9 | |
| fix(install): ship portable host activation | Dami | | +450 | -19 | |
| Merge pull request #97 from FelineStateMachine/feat/uat-native-panel-support | FelineStateMachine | | +83 | -6 | |
| fix(uat): accept native 1280x800 panels | Dami | | +83 | -6 | |
| Merge pull request #96 from FelineStateMachine/feat/uat-va-capability-probe | FelineStateMachine | | +540 | -8 | |
| fix(uat): bound VA capability inspection | Dami | | +77 | -12 | |
| fix(uat): discover the exact AMD VA encoder | Dami | | +475 | -8 | |
| Merge pull request #95 from FelineStateMachine/feat/gamescope-pointer-reconnect | FelineStateMachine | | +413 | -68 | |
| fix(test): tolerate asynchronous pointer feedback | Dami | | +64 | -14 | |
| test(input): gate Gamescope pointer recovery | Dami | | +94 | -9 | |
| test(input): probe compositor pointer feedback | Dami | | +39 | -2 | |
| fix(input): reconnect Gamescope pointer feedback | Dami | | +217 | -44 | |
| Merge pull request #94 from FelineStateMachine/feat/gamescope-capture-lock | FelineStateMachine | | +393 | -98 | |
| fix(capture): close teardown edge cases | Dami | | +41 | -13 | |
| fix(capture): serialize Gamescope consumers | Dami | | +356 | -89 | |
| Merge pull request #93 from FelineStateMachine/feat/private-config-directory | FelineStateMachine | | +214 | -13 | |
| fix(config): align managed directory security | Dami | | +214 | -13 | |
| Merge pull request #92 from FelineStateMachine/feat/offline-management-runtime | FelineStateMachine | | +376 | -31 | |
| fix(appliance): support offline management runtime | Dami | | +376 | -31 | |
| Merge pull request #91 from FelineStateMachine/feat/client-media-module-tree | FelineStateMachine | | +6360 | -5898 | |
| refactor(portal): delegate frame acknowledgements | Dami | | +24 | -15 | |
| refactor(portal): extract client connection lifecycle | Dami | | +536 | -495 | |
| refactor(portal): extract video delivery | Dami | | +694 | -624 | |
| refactor(portal): extract media control | Dami | | +114 | -89 | |
| refactor(portal): extract grouped media receiver | Dami | | +434 | -423 | |
| refactor(portal): extract input delivery | Dami | | +975 | -886 | |
| refactor(portal): extract adaptive feedback | Dami | | +591 | -557 | |
| refactor(portal): extract upstream MoQ receiver | Dami | | +705 | -677 | |
| refactor(portal): extract v2 object receiver | Dami | | +440 | -418 | |
| refactor(portal): extract audio delivery | Dami | | +569 | -531 | |
| refactor(portal): extract media transport | Dami | | +357 | -307 | |
| refactor(portal): extract client media metrics | Dami | | +586 | -568 | |
| refactor(portal): extract frame channel | Dami | | +498 | -472 | |
| refactor(portal): move media support modules | Dami | | +15 | -14 | |
| Merge pull request #90 from FelineStateMachine/feat/server-module-tree | FelineStateMachine | | +7906 | -7785 | |
| refactor(server): extract protocol handlers | Dami | | +472 | -453 | |
| refactor(server): extract moq transport | Dami | | +729 | -719 | |
| refactor(server): extract media v3 | Dami | | +1406 | -1393 | |
| refactor(server): extract media v2 | Dami | | +835 | -825 | |
| refactor(server): extract startup selection | Dami | | +334 | -321 | |
| refactor(server): extract adaptive control | Dami | | +2354 | -2337 | |
| refactor(server): extract session lifecycle | Dami | | +1110 | -1071 | |
| Merge pull request #89 from FelineStateMachine/feat/portal-module-tree | FelineStateMachine | | +5711 | -2140 | |
| test(portal): pin moved codec branches | Dami | | +83 | -0 | |
| refactor(portal): extract window runtime | Dami | | +454 | -120 | |
| refactor(portal): extract pointer feedback runtime | Dami | | +298 | -44 | |
| refactor(portal): extract controller runtime | Dami | | +385 | -90 | |
| refactor(portal): extract control runtime | Dami | | +704 | -251 | |
| refactor(portal): extract input runtime | Dami | | +574 | -213 | |
| refactor(portal): extract stream runtime | Dami | | +752 | -276 | |
| refactor(portal): extract audio pipeline | Dami | | +911 | -445 | |
| refactor(portal): consolidate session state | Dami | | +301 | -211 | |
| refactor(portal): extract connection state | Dami | | +704 | -314 | |
| refactor(portal): extract video pipeline | Dami | | +818 | -487 | |
| refactor(portal): extract keyboard mapping | Dami | | +53 | -15 | |
| Merge pull request #88 from FelineStateMachine/feat/source-module-tree | FelineStateMachine | | +3067 | -2972 | |
| refactor(source): finish module tree | Dami | | +7 | -5 | |
| refactor(source): extract in-process encoder | Dami | | +1201 | -1166 | |
| refactor(source): extract external capture pipeline | Dami | | +363 | -336 | |
| refactor(source): extract capture preflight | Dami | | +289 | -270 | |
| refactor(source): extract Annex-B parser | Dami | | +78 | -66 | |
| Merge pull request #87 from FelineStateMachine/feat/session-native-dimensions | FelineStateMachine | | +124 | -27 | |
| fix(streaming): resolve native dimensions per session | Dami | | +124 | -27 | |
| Merge pull request #84 from FelineStateMachine/feat/cqp-feedback-shadow | FelineStateMachine | | +201 | -28 | |
| test(streaming): add a bounded feedback smoke probe | Dami | | +128 | -21 | |
| fix(streaming): keep feedback available for cqp hosts | Dami | | +73 | -7 | |
| Merge pull request #83 from FelineStateMachine/feat/damage-stall-resolution-guard | FelineStateMachine | | +644 | -7 | |
| test(streaming): gate a Gamescope stall proof | Dami | | +566 | -6 | |
| fix(streaming): require frame progress for resolution recovery | Dami | | +78 | -1 | |
| Merge pull request #38 from FelineStateMachine/feat/moq-relay-proof | FelineStateMachine | | +88 | -14 | |
| test(moq): prove forced relay recovery | Dami | | +88 | -14 | |
| Merge pull request #37 from FelineStateMachine/feat/moq-slow-consumer-proof | FelineStateMachine | | +268 | -16 | |
| test(moq): prove bounded slow-consumer recovery | Dami | | +268 | -16 | |
| test: preserve Bazzite hardware acceptance (#36) | FelineStateMachine | | +796 | -0 | |
| fix: retain GStreamer paths for Zig release links (#35) | FelineStateMachine | | +15 | -5 | |
| ci: build commit-pinned Sigil hardware UAT candidates (#34) | FelineStateMachine | | +138 | -0 | |
| test: authenticate persistent hardware probes (#33) | FelineStateMachine | | +621 | -12 | |
| Force bounded recovery IDRs without blocking media (#32) | FelineStateMachine | | +436 | -9 | |
| feat: make Sigil bootstrap self-contained (#31) | FelineStateMachine | | +320 | -25 | |
| feat: add controller-first Decky management for Sigil (#30) | FelineStateMachine | | +3612 | -0 | |
| feat: add transactional Sigil configuration (#29) | FelineStateMachine | | +2520 | -185 | |
| feat: add offline Sigil enrollment reset (#28) | FelineStateMachine | | +250 | -15 | |
| feat: add Sigil appliance status foundation (#27) | FelineStateMachine | | +1661 | -72 | |
| feat: add bounded Portal network diagnostics (#26) | FelineStateMachine | | +1510 | -119 | |
| test: bind Sigil bootstrap trust contract (#25) | FelineStateMachine | | +600 | -2 | |
| feat: add versioned Goq MoQ catalog discovery (#24) | FelineStateMachine | | +987 | -34 | |
| test: pin upstream Gamescope capture contract (#22) | FelineStateMachine | | +166 | -6 | |
| feat: package in-process GStreamer host (#21) | FelineStateMachine | | +42 | -23 | |
| feat: resolve native Gamescope dimensions (#20) | FelineStateMachine | | +386 | -120 | |
| Harden invitation acceptance evidence (#19) | FelineStateMachine | | +303 | -38 | |
| Adapt stream resolution to motion and pressure (#18) | FelineStateMachine | | +1659 | -124 | |
| Apply bounded adaptive bitrate decisions (#17) | FelineStateMachine | | +3952 | -54 | |
| Add opt-in in-process GStreamer control foundation (#16) | FelineStateMachine | | +1558 | -146 | |
| Use upstream Iroh/MoQ for authenticated media (#15) | FelineStateMachine | | +2705 | -128 | |
| Add grouped-media recovery groundwork (#14) | FelineStateMachine | | +4164 | -230 | |
| Harden public-alpha enrollment and release delivery (#13) | FelineStateMachine | | +7895 | -195 | |
| refactor: name Portal frontend directory (#12) | FelineStateMachine | | +4 | -4 | |
| Merge pull request #11 from FelineStateMachine/feat/worker-site-deploy | FelineStateMachine | | +93 | -65 | |
| fix: deploy website as Cloudflare Worker | Dami | | +93 | -65 | |
| Merge pull request #1 from FelineStateMachine/feat/gamescope-appliance | FelineStateMachine | | +28693 | -32078 | |
| docs: replace inherited agent guide | Dami | | +181 | -55 | |
| feat: reveal sections with a Bayer dither dissolve | Dami | | +37 | -8 | |
| fix: shorten Sigil install command | Dami | | +3 | -2 | |
| feat: add fail-closed Portal platform matrix | Dami | | +151 | -13 | |
| feat: define public release delivery | Dami | | +214 | -18 | |
| fix: raise the wordmark g to cap height | Dami | | +133 | -22 | |
| fix: set the wordmark g in lowercase | Dami | | +3 | -3 | |
| ci: prepare goq.sh Cloudflare Pages publishing | Dami | | +162 | -1 | |
| fix: describe the streamed session as SteamOS | Dami | | +5 | -5 | |
| fix: keep landing page chrome text unselectable | Dami | | +18 | -0 | |
| fix: finish website wave interaction | Dami | | +32 | -18 | |
| feat: refresh Portal and goq.sh presentation | Dami | | +327 | -68 | |
| refactor: establish Portal and Sigil product names | Dami | | +848 | -192 | |
| fix: restore WebKit mouse button delivery | Dami | | +27 | -14 | |
| Merge remote-tracking branch 'origin/main' into feat/gamescope-appliance | Dami | | +1203 | -0 | |
| Merge pull request #2 from FelineStateMachine/website | FelineStateMachine | | +1203 | -0 | |
| feat: add goq.sh landing page | Dami | | +1203 | -0 | |
| fix: adopt identical legacy package assets | Dami | | +205 | -11 | |
| fix: reorder independent media completions | Dami | | +398 | -8 | |
| fix: drain Gamescope encoder without sink pacing | Dami | | +57 | -26 | |
| fix: restart Gamescope capture without overlap | Dami | | +104 | -90 | |
| fix: canonicalize Bazzite release roots | Dami | | +53 | -3 | |
| feat: make video transport drop-aware | Dami | | +1593 | -137 | |
| fix: provision loopback media dependency | Dami | | +3 | -7 | |
| fix: support CI ShellCheck version | Dami | | +4 | -1 | |
| fix: compile cursor grab on Linux | Dami | | +5 | -5 | |
| feat: harden streaming release validation | Dami | | +1024 | -74 | |
| feat: scale client window to stream aspect | Dami | | +337 | -1 | |
| feat: build Gamescope streaming appliance | Dami | | +23382 | -31909 | |
| docs: specify package name in cargo install | Dami | | +1 | -1 | |
| fix: add workspace root to isolate sigil from spike crates | Dami | | +3 | -0 | |
| split the frontend out of 1 html file. | Dami | | +1442 | -1554 | |
| docs: add cargo install, drop github releases | Dami | | +5 | -18 | |
| cleanup folder structure a bit | Dami | | +2 | -2 | |
| move spikes under docs folder | Dami | | +8 | -8 | |
| remove stale specs | Dami | | +0 | -337 | |
| readme language updates | Dami | | +11 | -11 | |
| fix: disable text selection on non-copyable UI elements | Dami | | +31 | -24 | |
| official branding | Dami | | +68 | -68 | |
| feat: config screen before hosting — codec/backend/bitrate/framerate/gop | dami etoile | | +136 | -4 | |
| docs: rewrite README — what/why/install, docs TOC, stable up to 60fps | dami etoile | | +89 | -62 | |
| fix: fido device info for non-whitelisted keys (Titan); degrade gracefully on CTAP open failure | Dami | | +40 | -37 | |
| style: tui-inspired intro overlay — solid bordered box, no grid texture | Dami | | +4 | -6 | |
| style: grid bg on overlays, larger intro heading, bracket shortcut hints | Dami | | +19 | -5 | |
| fix: headless daemon mode; persist encoder config across launches | Dami | | +12 | -1 | |
| fix: port xcap !Send fixes to streaming module | Dami | | +58 | -27 | |
| refactor: split commands.rs into modules + fix input/AV1/config/FIDO/relay | Dami | | +1755 | -1695 | |
| fix: xcap !Send via dedicated thread+channel, CI: add libgbm-dev | dami etoile | | +49 | -23 | |
| fix: xcap Send issue (spawn_blocking), CI: ubuntu-24.04, libxdo-dev | dami etoile | | +14 | -10 | |
| ci: add libpipewire-0.3-dev (xcap dep) | dami etoile | | +2 | -1 | |
| ci: cross-platform release workflow (linux x86/arm64, macOS x86/arm64, Windows) | dami etoile | | +64 | -0 | |
| feat: custom key+home icon, PIN keyboard shortcuts (c/r/h), auto-focus PIN on load | dami etoile | | +37 | -2 | |
| docs: sync with current codebase (ffmpeg, codecs, wire protocol, conn tracking) | dami etoile | | +39 | -5 | |
| fix: reliable disconnect detection via conn.closed() + tokio::select! | dami etoile | | +32 | -10 | |
| fix: hvcC buffer overflow + inline unregister confirmation | dami etoile | | +22 | -4 | |
| fix: detect client disconnect — recv.read() error was swallowed | dami etoile | | +2 | -2 | |
| fix: HEVC frame delimiter detection — NAL type extraction was wrong | dami etoile | | +20 | -11 | |
| feat: client-side stream stats + codec in wire protocol | dami etoile | | +94 | -28 | |
| feat: multi-codec WebCodecs decode — H.264, H.265, AV1 | dami etoile | | +284 | -52 | |
| feat: configurable codec + backend, Windows support, multi-codec NAL parsing | dami etoile | | +386 | -87 | |
| docs: add ffmpeg to setup instructions | dami etoile | | +9 | -2 | |
| feat: ffmpeg subprocess for capture+encode — replaces xcap+openh264 | dami etoile | | +291 | -5 | |
| feat: encode performance metrics + sparkline in info panel | dami etoile | | +82 | -4 | |
| chore: clean up for public visibility | dami etoile | | +214 | -142 | |
| fix: add .hidden CSS rule for bottombar elements | dami etoile | | +1 | -0 | |
| ux: remove bottom-left keyhome label, remove stop button, unify disconnect | dami etoile | | +17 | -6 | |
| fix: Annex B → AVCC conversion for WebCodecs decoder | dami etoile | | +108 | -32 | |
| fix: WebCodecs decoder failure — wrong codec level + missing keyframe flag | dami etoile | | +37 | -11 | |
| feat: backend dual-path — raw H.264 pass-through when WebCodecs available | dami etoile | | +66 | -44 | |
| feat: WebCodecs detection + dual-path decode + codec info pane | dami etoile | | +93 | -10 | |
| perf: remove 33ms sleep throttle — encode as fast as possible | dami etoile | | +2 | -1 | |
| revert: WebCodecs not supported in Tauri WebView — back to JPEG | dami etoile | | +57 | -79 | |
| perf: WebCodecs — browser-native H.264 hardware decode | dami etoile | | +82 | -62 | |
| perf: skip JPEG re-encode — direct RGBA putImageData | dami etoile | | +26 | -32 | |
| fix: clear status text on disconnect — no stale 'disconnected' message | dami etoile | | +3 | -2 | |
| feat: hosting view, disconnect, daemon mode, UI fixes | dami etoile | | +312 | -151 | |
| fix: header size mismatch — host sent 16 bytes, client read 13 | dami etoile | | +3 | -3 | |
| ui: tap titan overlay — fullscreen prompt when waiting for key tap | dami etoile | | +35 | -14 | |
| ui: show 'tap titan when it blinks' on intro screen | dami etoile | | +2 | -2 | |
| fix: NAL unit splitting for H.264 decode + adaptive intro screen | dami etoile | | +110 | -50 | |
| ui: add 'or connect' on setup screen — skip registration for client-only | dami etoile | | +7 | -0 | |
| feat: H.264 codec — replace JPEG with openh264 encode/decode | dami etoile | | +145 | -33 | |
| ui: gitdot-inspired redesign — monochromatic, monospace, minimal chrome | dami etoile | | +551 | -319 | |
| fix: enable platform-native keyring backends (was using mock) | dami etoile | | +106 | -4 | |
| feat: keyring persistence — register host once, start without Titan | dami etoile | | +189 | -12 | |
| Wire Titan derivation into Tauri app — no address copy/paste | dami etoile | | +202 | -123 | |
| Spike 007: no-copy/paste Titan-derived Iroh identity | dami etoile | | +9 | -0 | |
| test | dami etoile | | +55 | -27 | |
| test | dami etoile | | +4709 | -0 | |
| Fix: register iroh_client_send_input in main.rs | dami etoile | | +1 | -0 | |
| Fix macOS compile: Enigo not Send, missing Button variants | dami etoile | | +21 | -8 | |
| Wire input injection into Tauri app | dami etoile | | +731 | -85 | |
| Spike 006: Input injection over Iroh via enigo | dami etoile | | +6100 | -0 | |
| Fix Tauri frontend: enable withGlobalTauri, lazy invoke/listen | dami etoile | | +9 | -7 | |
| Wire up real Iroh streaming + frame rendering in Tauri UI | dami etoile | | +1593 | -152 | |
| Update OpenSpec: mark task 1.2 (Tauri UI scaffold) done | dami etoile | | +1 | -1 | |
| Initial keyhome: FIDO2-secured remote desktop via Iroh | dami etoile | | +24907 | -0 | |