Commit graph

133 commits

Author SHA1 Message Date
Mitchell R
877596fc15 fix: add comprehensive pipeline logging for debugging 2026-05-10 20:49:00 +02:00
Mitchell R
30eb85e6b1 fix: use property_from_str for queue leaky enum 2026-05-10 20:14:58 +02:00
Mitchell R
527a62d2e5 fix: drop HANDLES_COMMAND_LINE flag 2026-05-10 20:13:01 +02:00
Mitchell R
f6dec4bf39 fix: import ApplicationExt for set_flags 2026-05-10 20:12:14 +02:00
Mitchell R
e7237d077f fix: suppress GTK file-open warning, read server URL from env 2026-05-10 20:11:31 +02:00
Mitchell R
76af07de61 fix: use std::sync::mpsc + timeout_add_local for thread→UI messaging 2026-05-10 20:10:23 +02:00
Mitchell R
df231344a8 fix: use glib channel for thread→UI communication (Send safety) 2026-05-10 20:09:06 +02:00
Mitchell R
c4315917d8 fix: resolve all Rust compile errors in kiosk app 2026-05-10 20:04:43 +02:00
Mitchell R
e3bb5ae048 feat: RTSP field split, coordinator-ws stub, CLAUDE.md update
- Camera add/edit: split RTSP URL into host/port/path/user/pass fields
- Camera edit updates stream URI when RTSP URL changes
- service-coordinator-ws: HTTP health stub (WS upgrade deferred)
- Repository: added updateCameraStream
- CLAUDE.md: full rewrite reflecting current architecture
2026-05-10 15:35:47 +02:00
Mitchell R
371c023c81
feat: Rust kiosk app — GTK4 + GStreamer multi-camera display
- Server discovery (localhost → betterframe.local → cloud)
- Pairing flow with fullscreen code display
- Bundle fetch and layout rendering
- GTK4 Grid layout matching template regions
- GStreamer pipelines per camera cell via gtk4paintablesink
- Heartbeat loop in background thread
- Placeholder widgets for web/html cells
2026-05-10 04:18:40 +02:00
Mitchell R
f5a2645ffc
fix: force sw decode for H265 — Pi5 hw decoder rejects 960x1080 2026-05-10 04:11:43 +02:00
Mitchell R
8422fdce90
feat: auto-detect codec — try H264, H265, then uridecodebin fallback 2026-05-10 04:11:18 +02:00
Mitchell R
888dc4a4e5
fix: use uridecodebin with video caps filter for codec-agnostic RTSP 2026-05-10 04:10:33 +02:00
Mitchell R
2588611501
fix: depay h264 before decodebin to avoid audio pad linking failure 2026-05-10 04:09:01 +02:00
Mitchell R
9827e456b3
fix: URL-encode RTSP credentials to handle special chars like @ 2026-05-10 04:03:23 +02:00
Mitchell R
a88e3f5c72
fix: use waylandsink with fullscreen for RTSP display 2026-05-10 03:58:40 +02:00
Mitchell R
bcaca8fdc7
fix: default stream_selector to 'auto' for non-camera cells 2026-05-10 03:48:23 +02:00
Mitchell R
cc306cec57
feat: layout/template/display CRUD + display-chain bundle routing
Major changes:
- Bundle now follows kiosk → display → layouts → cells → cameras
  (no label filtering for v0.1)
- Setup creates default Fullscreen template + Default layout with
  BetterFrame logo on the primary display
- Pairing auto-assigns kiosk to primary display
- Admin UI: full template CRUD with presets (fullscreen, 2x2, 1+3, 3x3)
- Admin UI: layout CRUD with cell management (assign cameras/web/html
  to template regions)
- Admin UI: display editing (default layout, idle/sleep timeouts)
- Repository: added createLayoutTemplate, createLayout, createLayoutCell,
  updateLayout, deleteLayout, layoutsForDisplayId, camerasForLayoutIds,
  updateDisplay, and more
2026-05-10 03:45:53 +02:00
Mitchell R
7b4a11c182
feat: full CRUD for cameras, kiosks, and labels in admin UI
- Camera edit page: rename, update RTSP/ONVIF, enable/disable,
  attach/detach labels, view streams, delete
- Kiosk edit page: rename, enable/disable, attach/detach labels
  with role (consume/operate), delete
- Labels page: create with color picker, delete
- Camera/kiosk names now link to edit pages
- Repository: added updateCamera, deleteCamera, updateKiosk,
  deleteKiosk, detachCameraLabel, detachKioskLabel, deleteLabel,
  updateLabel, cameraLabelIds
2026-05-10 03:24:04 +02:00
Mitchell R
6dfed8548c
fix: strip null byte from /proc/device-tree/model 2026-05-10 03:17:48 +02:00
Mitchell R
d9a2947001
fix: single curl call for pairing claim to prevent credential wipe 2026-05-10 03:17:35 +02:00
Mitchell R
44e4b7f3af
feat: add shell kiosk prototype for end-to-end testing 2026-05-10 03:13:52 +02:00
Mitchell R
94e316a207
feat: implement kiosk API, pairing flow, and bundle generation
- service-api-http: h3 on :18081 with pairing, bundle, heartbeat,
  and event endpoints
- shared/pairing.ts: 8-char code state machine (initiate → claim →
  confirm)
- shared/bundle.ts: label-scoped bundle with cluster-encrypted ONVIF
  passwords
- Admin kiosks page: POST /admin/kiosks/pair wired to confirmPairing
- sec-config: api-http bound to 0.0.0.0 with auth config
2026-05-10 03:12:07 +02:00
Mitchell R
3f358e5e5e
fix: remove hx-boost causing broken AJAX navigation 2026-05-10 03:05:14 +02:00
Mitchell R
bacf1d2fcb
fix: use deterministic HKDF key for cookie signing
cookieMac was using encryptString which generates a random IV per
call, making the HMAC key non-deterministic. Cookie signed at login
could never verify on subsequent requests. Now uses deriveKey(info)
which uses HKDF — deterministic for same server key.
2026-05-10 02:59:04 +02:00
Mitchell R
fe11519925
fix: drop Secure cookie flag for non-TLS dev access 2026-05-10 02:57:31 +02:00
Mitchell R
cbde4037ff
fix: add cookieName and totpIssuer to sec-config explicitly
BSB config doesn't apply schema defaults for missing keys.
Cookie was being set with name "undefined".
2026-05-10 02:55:21 +02:00
Mitchell R
3c5256bbb4
fix: avoid h3 setCookie, use Set-Cookie header on Response directly
h3 v2's setCookie modifies event response headers but doesn't
carry them when handler returns a raw Response object. Build
Set-Cookie header manually in redirect helpers instead.
2026-05-10 02:53:06 +02:00
Mitchell R
a64363258d
fix: use Response wrapper instead of h3 tagged template html()
h3 v2's html() is a tagged template literal, not a function that
accepts a string. JSX-rendered markup passed directly causes
"first.reduce is not a function". Created htmlPage() helper that
wraps markup in a proper Response with text/html content type.
2026-05-10 02:50:16 +02:00
Mitchell R
56053e2d6a
fix: bind admin-http to 0.0.0.0 for external access
127.0.0.1 rejects connections from other machines on the network.
2026-05-10 02:48:47 +02:00
Mitchell R
a8b0fbb2bc
refactor: collapse 6 non-service plugins into shared modules
BSB plugins should be actual services (own port, lifecycle, resource
ownership). Moved secrets, auth, pairing, bundle, nodered-bridge, and
cec-relay from plugin folders to shared modules under server/src/shared/.

4 BSB plugins remain: service-store, service-admin-http,
service-api-http, service-coordinator-ws.

service-admin-http now initializes secrets + auth as plain modules in
init() using the store repo from the plugin-registry singleton. No
more setSiblings() hack or inter-plugin wiring.

sec-config.yaml updated: secrets/auth config moved into
service-admin-http, pairing config into service-api-http, nodered
config into service-coordinator-ws.
2026-05-10 02:29:25 +02:00
Mitchell R
83f598f187
build fixes for bsb 2026-05-10 01:46:11 +02:00
Mitchell R
2fd2502b85
adding initial project 2026-05-10 01:09:13 +02:00