What's Changed
- fix(release): bump all client versions to 0.1.1 (fixes the never-clearing update banner) by @badbread in #381
- feat(api): admin-only scrubbed diagnostics bundle (server side of #180) by @badbread in #385
- fix(android): keep playback digital zoom across motion-segment gaps by @badbread in #387
- fix(android): use Download glyph for playback wall Export action by @badbread in #389
- fix(desktop): make frame-back work in the LPR plate popup by @badbread in #392
- perf(api,desktop): carry plate bbox in the ab-report by @badbread in #393
- docs: warn about the NVIDIA driver-upgrade trap on GPU hosts by @badbread in #395
- fix(setup): fail early when a bind-mounted config file is missing by @badbread in #397
- fix(clients): stop discovery preferring a TLS URL the app cannot use by @badbread in #403
- fix(android): raise the digital-zoom ceiling from 5x to 10x by @badbread in #405
- fix(android): keep the playhead where the user scrubbed, even in a gap by @badbread in #406
- fix(api): default media-token capability claims instead of rejecting old tokens by @badbread in #407
- fix(ios,desktop): raise digital-zoom ceilings to 30x to match Android by @badbread in #408
- fix(desktop): support trackpad pinch-to-zoom on laptops by @badbread in #410
- fix(recorder): alert when a motion detector is broken from startup by @badbread in #413
- docs(recorder): VAAPI render-node robustness + escalated motion-decode-failure log by @badbread in #414
- feat(api): surface motion-detector-down state in decode-status + admin console by @badbread in #415
- docs(decisions): record no-autoheal-in-default-stack decision (#396) by @badbread in #416
- feat(go2rtc): first-class RTSP restream auth opt-out (GO2RTC_AUTH=off) by @badbread in #417
- feat(lpr): name/label a plate, server-side, shown across reads (#363) by @badbread in #418
- feat(ios): show operator-assigned plate name in LPR reads + watchlist (#363) by @badbread in #419
- feat(android): show operator-assigned plate name in LPR UI (#363) by @badbread in #420
- feat(desktop): show operator-assigned plate name in LPR UI (#363) by @badbread in #421
- feat(android): adaptive live-wall quality (guardrail + thermal/decoder backpressure) (#384) by @badbread in #422
- feat(apple): adaptive live-wall quality (thermalState backpressure + decode guardrail) (#383) by @badbread in #423
- feat(desktop): adaptive live-wall quality, guardrail + backpressure (#382) by @badbread in #424
- feat(api): HA control Phase 2, service-call endpoint + actuators capability (#187) by @badbread in #427
- feat(ios): HA control Phase 2, actuator buttons on the entity detail card (#187) by @badbread in #425
- feat(desktop): HA device controls on the on-video badge card (#187) by @badbread in #426
- feat(desktop): single-click actuates HA badge directly; card only for cover/lock (#428) by @badbread in #429
- feat(ios): HA single-tap actuates simple devices; card only for cover/lock (#428) by @badbread in #430
- feat(android): HA control (single-tap actuate; card for cover/lock) (#187, #428) by @badbread in #431
- docs(map): Home Assistant control parity row (#187/#428) by @badbread in #432
- fix(android): unify HA badge vs entity-sheet icon/color mapping (#437) by @badbread in #447
- feat(ha): widen entity picker to all controllable + numeric-sensor domains (#433, #436) by @badbread in #448
- feat(ha): validate link role vs domain; expose numeric-sensor unit (#434, #449) by @badbread in #452
- feat(ha): editable role/device_class/label on HA links (console + desktop) (#434, #435) by @badbread in #453
- feat(ha): render numeric-sensor units on badge + detail (all clients) (#449) by @badbread in #454
- feat(ha): one closed icon vocabulary, server-enforced + mapped on all clients (#438) by @badbread in #455
- feat(ha): per-link control config — require_confirm + allowed_actions (#440) by @badbread in #456
- feat(admin): HA link icon/style + control config authoring (#439) by @badbread in #457
- feat(admin): unified Home Assistant console area + global links overview by @badbread in #458
- docs(integrations): bring the Home Assistant page up to date with epic #445 by @badbread in #459
- feat(ha): value-setting HA controls (brightness/position/speed), #442 Slice 1 by @badbread in #460
- feat(desktop): HA value-setting slider for #442 Slice 1 by @badbread in #461
- feat(ios): value slider for HA percent controls (#442 Slice 1) by @badbread in #462
- feat(android): HA value slider for brightness/position/speed (#442 Slice 1) by @badbread in #463
- feat(desktop): HA detail card matches badge coloring + shows entity/device-type by @badbread in #466
- fix(android): make the HA value slider usable + popup visuals match the badge (#442 Slice 1 follow-ups) by @badbread in #468
- feat(ios): match HA detail-card icon to the on-video badge color by @badbread in #467
- fix(android): don't render HA entity popup inside the PiP window (#469) by @badbread in #470
- fix(android): restore UTF-8 in a LiveFullscreenScreen comment by @badbread in #471
- fix(ios): hold HA value slider at the committed value until the poll converges (#465) by @badbread in #474
- fix(deps,api,recorder): clear rustls-webpki cert-verify advisories + v0.2.0 backend nits by @badbread in #476
- fix(recorder): default MOTION_HWACCEL to cpu so motion works on GPU-less hosts by @badbread in #478
- chore(release): v0.2.0 version bump + changelog + docs by @badbread in #475
- fix(admin): clarify HA entity-link picker labels + fix stale "Motion tab" copy by @badbread in #481
- fix(api,android): video-only
_subvsub restream repairs H264 fmtp for Media3, scoped to Android by @badbread in #485 - feat(android): render per-state HA badge background color by @badbread in #489
- fix(desktop): keep the maximized pane's right-click menu available while a stream is connecting by @badbread in #484
- feat(ios): global quick-toggle to hide Home Assistant overlays on live video by @badbread in #486
- feat(ios): render per-state HA badge backgrounds by @badbread in #492
- feat(ha): per-state badge background server contract (overlay_bg_color_on) by @badbread in #493
- fix(android): scale HA pill badges like desktop so labels stop overflowing by @badbread in #499
- feat(ha): expand canonical badge-icon vocabulary (grill/smoker/landscape + 20 more) by @badbread in #482
- feat(admin): author per-state HA badge background (bg_color_on) by @badbread in #490
- feat(desktop): render per-state HA badge backgrounds (bg_color_on) by @badbread in #491
- feat(desktop): global quick-toggle to hide all Home Assistant overlays by @badbread in #487
- feat(android): global quick-toggle to hide all on-video Home Assistant overlays by @badbread in #488
- fix(desktop): make the live wall's keyboard shortcuts actually fire by @badbread in #494
- fix(desktop): make Playback's keyboard shortcuts actually fire by @badbread in #496
- feat(desktop): restructure the HA overlay editor around a top bar + badge popover by @badbread in #495
- perf(api): register
_subvonly for the cameras whose sub SDP is actually broken by @badbread in #501 - docs: v0.2.0 media + copy refresh (fresh screenshots, install-doc accuracy pass) by @badbread in #500
- fix(ios): never let the HA value slider assert a value that was not sent by @badbread in #508
- fix(console): serverTz crash outside the wizard, Detection Save dropping zones + grouped-camera edits, dead group UI by @badbread in #510
- docs: TESTING.md tester onboarding + bug-report issue form by @badbread in #512
- fix(db,recorder): make ADD CONSTRAINT migrations re-appliable; default MOTION_HWACCEL to cpu in code by @badbread in #513
- feat(install): preflight storage so an install cannot silently record nothing by @badbread in #514
- fix(recorder): guard the dangling-row pass against an unmounted storage by @badbread in #515
- fix(api): stop the console writing the go2rtc base into the Frigate HTTP base by @badbread in #518
- fix(api): require a full session for stream URLs, drop CORS from /auth by @badbread in #516
- fix(recorder): no false motion_detector_unhealthy alert for a camera with no sub-stream by @badbread in #525
- fix(api): gate the _subv fmtp repair on the video codec by @badbread in #526
- fix(admin): warn on the Motion tab when a camera has no sub-stream by @badbread in #527
- fix(api): surface go2rtc stream rejections instead of swallowing 4xx; stop false camera_offline on newly added cameras by @badbread in #528
- fix(android): fall back to the server H.264 transcode when a camera is H265 all the way down by @badbread in #529
- fix(recorder): MOTION_HWACCEL=auto probes a real cuda device, and a failing hardware decode falls back to CPU by @badbread in #531
- fix(api,recorder): reject mqtts:// instead of silently connecting in plaintext by @badbread in #530
- fix(console,api): first-run error-message quality pass by @badbread in #532
- fix(api): PUT /config/server merges instead of replacing the whole row by @badbread in #533
- feat(ha): pill badge width + text alignment across every renderer by @badbread in #534
- fix(web): blank decode backend stays blank instead of pinning 'auto' by @badbread in #536
- fix(ios): grey HA badge on unavailable/unknown light or switch instead of a confident Off by @badbread in #538
- fix(api): surface a go2rtc rejection when a camera's source URL is edited (not just added) by @badbread in #540
- fix(recorder): write the storage marker only after a committed segment, not at dir creation by @badbread in #542
- harden(api): gate the credential/session/notification surface against scoped media tokens by @badbread in #543
- docs: bring the release documentation current for v0.2.0 by @badbread in #544
- perf(desktop): Engine Benchmark plate crops decode via the engine codec, not pure-Dart by @badbread in #545
- feat(ios): copy a plate number, and name a plate, from the Plates tab by @badbread in #548
- feat(lpr): copy the plate number to the clipboard (web console + Android) by @badbread in #549
- feat(desktop): copy a plate to the clipboard, and name a plate from the Plates tab by @badbread in #551
- fix: correct release-prep copy defects and code/compose config drift by @badbread in #557
- docs(api): pin the HA placement PUT as a whole-object replace, not a merge (#552) by @badbread in #555
- feat(desktop): preview the plate report in-app, and give it real options by @badbread in #554
- fix(frigate): raise the MQTT packet limit so Frigate motion and detection ingest work at all by @badbread in #559
- fix(android): only step down the live fallback ladder on real playback failure (#560) by @badbread in #561
- feat(android): open / save-to-Downloads / share for LPR plate reports by @badbread in #563
- fix(android): list every plate sighting in the report, not just the capped thumbnails by @badbread in #565
- fix(desktop): keep a maximized live camera maximized across minimize/restore by @badbread in #570
- docs(readme): v0.2.0 release audit touch-ups by @badbread in #566
- feat(notify): customizable alert text across all system-alert types by @badbread in #568
- feat(notify): per-channel snapshot mode (plate/vehicle/both), capability-gated per provider by @badbread in #572
- feat(desktop): timeline toggle to solo the selected camera's motion by @badbread in #574
- perf(timeline): bucket motion intensity in SQL instead of scanning every row by @badbread in #576
- docs(install): fix AI-INSTALL.md drift against current compose and scripts by @badbread in #577
- feat(admin): mode-aware HA entity entry rework in the camera editor by @badbread in #579
- fix(desktop): retention days unit, accurate policy-source labels, scrollable Cameras tab by @badbread in #581
- fix(desktop): gate motion-tuner sensitivity for grouped cameras by @badbread in #587
- feat(notifications): redesign the console Notifications pane (channels, alert-text editor, quiet hours) by @badbread in #583
- fix(recorder): path-idempotent storage seeding + name->path lookups by @badbread in #585
- fix(desktop): collapse long Server-dashboard lists by default by @badbread in #589
- fix(android): fast step-down + opt-in HD repair for a main with no fmtp (#590) by @badbread in #591
- fix(api): flag the _mainv repair from the SERVED SDP, not the producer by @badbread in #592
- fix(android): try the repaired main (mainv) before the doomed raw main by @badbread in #594
- docs(cameras): sharpen the Uniview LPR compatibility entry to the precise fmtp root cause by @badbread in #596
- docs: fix v0.2.0 release-audit documentation drift by @badbread in #601
- fix(api): gate filmstrip on the playback capability; scope channel-test to current grants by @badbread in #602
- fix(clients): space the plate-report heading off the date-time line by @badbread in #603
- fix(android): landscape single-camera UI polish (back-arrow, Auto label, camera name) by @badbread in #604
- ci(release): block a release tag whose versions do not match the tag by @badbread in #605
- fix(install): close the four fresh-install-audit findings by @badbread in #606
- fix(android): batch the multi-camera playback-wall timeline intensity (#599) by @badbread in #607
- fix(admin): DOM dropdown fallback so selects work in the desktop webview embed by @badbread in #608
Full Changelog: v0.1.1...v0.2.0