v0.3.8-rc2
Pre-release
Pre-release
Builds on the React SPA web console and closes most of the gap with the desktop head. Everything here is server-side + SPA only — no change to the video pipeline, the desktop UI, or the mobile heads.
Live grid
- Stills mode — periodic snapshots instead of live streams, refresh interval
2–60 s. A 25-cell wall costs one HTTP GET per camera per interval instead of an
ffmpeg session each; the camera encodes the JPEG itself when it runs Majestic. - Digital zoom in a tile: mouse wheel, drag to pan, buttons for touch. The
transform lives on the tile's slot, never on the pooled<video>, so zoom
can't follow a camera into another cell. - Kiosk mode — chrome-free full-viewport wall with optional page cycling.
Uses the Fullscreen API when granted and falls back to a fixed overlay when it
isn't (embedded/iframed pages refuse it outright). - Wall preferences live in the browser, not the install: the same layout is
watched from a control-room screen and from someone's laptop.
Archive
- Recording start/stop from the browser, written into the same folder and table
the desktop head uses (-c copy, segmented,qon stdin so the MP4 trailer is
written). - Calendar + date filtering, paging, and clip export (fast
-c copyor precise
re-encode), streamed as a download without leaving a copy on the server. - Playback is a ranged file response, so seeking is the browser's own.
Snapshot library
- Stills taken from the browser can be kept: same folder layout, same
.thumbs/<id>.jpgnaming and the same table as the desktop's
SnapshotService, so a still taken from a phone shows up in the desktop
gallery and vice versa. - Thumbnails are produced with ffmpeg — already a dependency of this head —
rather than pulling the Video layer's Skia thumbnailer into the server. - Pixel dimensions are read from the JPEG frame header; no imaging library
needed to record what the desktop records. - Gallery page with lightbox, download and delete, under the Archive tab.
Camera settings (Majestic)
- Read the live
config.json, edit fields, post raw JSON, set day/night, read
/metrics. Schema-driven like the desktop editor (IMajesticConfigSchema), so
it renders whatever knobs the firmware actually exposes instead of a fixed form
that drifts between builds. - ISP fields get their own panel: Majestic re-reads those live, so tuning the
picture does not restart the encoder. Fields that do restart it are flagged. - Edits travel as
(path, value)and are applied against a freshly read copy of
the camera's config, so a stale tab can't revert someone else's change.
Two-way audio
- Listen: audio rides in the existing live stream (transcoded to AAC, ~1% of
the video bitrate) rather than a second session, so nobody's picture restarts
when they unmute. - Push-to-talk: the browser sends 16-bit PCM over a WebSocket; G.711
encoding and RTP packetizing happen server-side in the same Core code the
desktop talks with. One talker per camera — a speaker is exclusive. - Held, not toggled, and the camera is released when the route changes.
Permissions
- New
Talkflag, separate fromPtz/Manage: it is the one action that
reaches people standing in front of the camera. ViewArchivenow gates the archive and the snapshot library;Exportgates
clip export. Both flags previously existed without gating anything.- Camera settings are
Manage-only including reads —config.jsoncarries
the camera's own logins and, on many builds, the Wi-Fi PSK.
Fixes
- The live WebSocket was write-only, so a viewer's close frame went unnoticed and
the shared ffmpeg process outlived its last viewer. Verified: 8 streams → 0
after the last tile releases. - A camera that never answered a Majestic call was reported as success (204): our
own call deadline surfaced as the same cancellation as an abandoned request.
Now 504. - Player: a viewer joining an already-running stream got a buffer starting at
t=90s withcurrentTime=0and sat paused forever. A watchdog now jumps to the
live edge. ViewArchivewas missing from the users page, which quietly made the archive
ungrantable to anyone created from the web console.- Recording a camera that delivered nothing left a 0-byte file and an archive row.
What's Changed
- Web console: archive, snapshots, camera settings and two-way audio by @keyldev in #60
- web: OpenIPC logo in the console by @keyldev in #61
Full Changelog: v0.3.8-rc1...v0.3.8-rc2