BladeWatch — Web UI rebuild, native in-app screens & ConnectRPC
Changes since 20260525-security-ui-updates (2026-05-25).
This is a large release that rebuilds the remote/browser experience, moves every
in-app screen to native, and replaces the ad-hoc REST surface with a typed API.
Highlights
- New hosted web app (Angular 19 + Vite + ConnectRPC). The browser/tunnel UI
is now a full single-page app — Dashboard, Live, Recording, Surveillance,
Events, Trips, Vehicle, Location, Diagnostics, Notifications, Performance,
Settings, About, Login — in 17 languages. - All in-app screens are now native. The WebView-backed screens were migrated
to native Kotlin fragments (Live view with native H.264/WebSocket streaming,
Recordings, Location, Vehicle, Trips, Performance, Recording/Surveillance
settings). The WebView host remains only for the remote browser path. - Material 3 (Material You) design language across the native shell — color
roles, type scale, shape/elevation, motion, navigation rail, and Material
Symbols iconography (Phase 1 + Phase 2 refactor). - Typed ConnectRPC/gRPC API with 1:1 REST parity. 12 services
(bladewatch.v1.*) consumed by the web client and the app, served on the same
127.0.0.1:8080port with shared auth.
Vehicle
- Native vehicle screen with Climate (power / max-cool / temp / fan), Seats
(heat + ventilation), and Windows (per-window + all) controls via the local
BYD SDK. - Interactive 3D vehicle hero (Three.js) with a tyre-pressure overlay and
user-selectable model + paint color. (A native Filament hero was trialed and
reverted — the head unit's Adreno 610 driver crashes under sustained gltfio.) - Charge-cap control, AC/seat diagnostics, and richer command routing/response
details.
Location & Trips
- New Location experience: native OSMDroid map and a Leaflet web map with a
heading-rotated car marker, follow/recenter, and Auto/Light/Dark theming. - Trip detail + telemetry, GPS traces, similar-trip lookup, driving DNA, and
personalized range; trip + media catalogs synced to embedded H2 databases.
Storage
- Automatic SD-card / USB discovery and selection at startup, dynamic storage
limits, and a new Format Storage API to wipe/remount a removable drive.
Surveillance & camera
- Deferred YOLO model init and persistent TFLite GPU kernel cache (faster, more
stable daemon startup).
Security & reliability
- IPC token bootstrap securing the loopback command/secret channels, plus a
caller-UID gate on both IPC servers. - Reworked auth + daemon-readiness handling (readiness probe, connection retry,
self-healing token refresh) fixing auth loops, duplicate daemons, and stale
daemon cleanup. - Package id finalized as
net.bladewatch.app. - Persistent debug logging with full log-call stripping in production builds.
Bug fixes (this release)
- Trips: trip-detail route map now renders fully (no more half-loaded map
with black gaps). - Notifications: "Subscribe" no longer hangs on "Subscribing…" — the web app
now registers its service worker, requests permission, and completes Web Push
subscription (works beyond Chrome). - Status overlay: Camera/recording and Trip indicator toggles in
Settings → Status overlay now apply to the head unit (previously remembered
only in the browser). - About / status: App Version and Device ID display correctly again; also
restores live Dashboard/Diagnostics status that shared the same failing
response parse.
Notes
- arm64-v8a only; BYD DiLink v3 (Android 10+).
- After installing, hard-reboot the head unit to finalize (see README).