Skip to content

Releases: raulshma/lenscast

Release v0.1.6

Choose a tag to compare

@github-actions github-actions released this 08 Oct 23:37

Since 0.1.5:
• Localization: the camera dashboard is now fully translated — the Web/RTSP stream buttons' screen-reader labels, the thermal warning banner, the server status line, the quality badge, and the connection stats panel were still hardcoded in English
• Proper plurals in every language: "2 viewers connected" instead of "2 viewer(s) connected", with correct Russian and Chinese plural forms
• No other changes — this release carries no new permissions, no new network endpoints, and no behavior changes

Full Changelog: v0.1.5...v0.1.6

Release v0.1.5

Choose a tag to compare

@github-actions github-actions released this 04 Oct 15:31

Since 0.1.4:
• Privacy: stripped MediaPipe's usage-stats uploader (Google's datatransport/CCT telemetry) from every build — the object-detection and sound-event gates never contact Google
• Web dashboard: Inter and JetBrains Mono fonts are now bundled — the page renders identically offline and on isolated LANs instead of loading Google Fonts
• Streaming: the STUN server default is blank — WebRTC (WHIP push, WHEP viewing) stays on your local network by default; set a STUN server to push across the internet
• Listing: license corrected to GPL-3.0-or-later, and the optional network services (Telegram backup, Web Push, on-demand model downloads, STUN) are now described in the app listing

Full Changelog: v0.1.4...v0.1.5

Release v0.1.4

Choose a tag to compare

@github-actions github-actions released this 01 Oct 11:43

Since 0.1.3:
• Fixed: settings saves from API clients sending partial JSON failed on release builds (missing R8 keep for Moshi's reflective defaults constructors) — the dashboard's API-token toggle could not be enabled; PUT /api/settings now accepts any subset of fields
• Reverse proxy: the dashboard's WebSockets (WebCodecs video, push-to-talk) ride the main web port as same-origin /ws/video and /ws/talkback paths — the port+1 sidecar is gone, so a single forwarded port with WebSocket upgrade passthrough carries everything (https://host/ just works)
• New: output rotation for mounted phones — a 0/90/180/270-degree correction plus a lock-orientation setting, applied before encoding so the M-JPEG stream, snapshots, HLS, RTSP, WebRTC and MP4 recordings all come out upright

Full Changelog: v0.1.3...v0.1.4

Release v0.1.3

Choose a tag to compare

@github-actions github-actions released this 16 Sep 05:46

Since 0.1.2:
• Push outputs: RTMP to YouTube/Twitch/nginx-rtmp (rtmp/rtmps, 443 default, write-only URL, auto-reconnect), WHIP egress RFC 9725 for sub-second remote + dashboard card, SRT push with keepalive/reconnect, WHEP viewer endpoint with per-viewer encoders (web player tries WHEP first)
• HEVC where it fits: HLS PMT flip + WS hvcC config; RTMP/SRT refuse H.265 with a readable error
• Camera pro mode: grids, spirit level, 3s/10s self-timer, histogram, zebras, focus peaking, JPEG 60-100 + max-quality, RAW+JPEG DNG, EXIF artist/comment + opt-in GPS; timelapse auto-assembly (capture screen + interval worker)
• Detection: YAMNet sound labels (opt-in, allow-list, fail-open), mic stays up through eco-idle/headless via arbitration, snapshot fallback with no viewer, eco idle-fps 5fps on battery, recording-session day API, charge diagnostics
• Privacy: opt-in AES-256-GCM encryption at rest (Keystore, coexists with plaintext, readable backups), tamper flush + expedited backups
• Dashboard: NVR day timeline, detection stats card, multi-cam tiles, PWA + light/dark theme, storage forecast, Web Push alerts (VAPID), read-only viewer role, push-to-talk overhaul with HTTP fallback, per-section settings isolation, siren state
• Watch: Wear OS companion (stream toggle, capture, snapshot, settings, tile, alerts)
• Languages: German, Spanish, French, Russian, Simplified Chinese, Brazilian Portuguese
• Hardening/fixes: fuzz-proven wire parsers, track-level SDP fixing VLC/ffmpeg 404, WebRTC SDP race, HLS ring deadlock, MJPEG close, zoom persistence, WHEP orphan cleanup, MQTT combine fix, Node 22

Full Changelog: v0.1.2...v0.1.3

Release v0.1.2

Choose a tag to compare

@github-actions github-actions released this 11 Sep 14:17

Maintenance release for F-Droid inclusion — no user-facing changes:
• Per-ABI version codes are now derived at build time, enabling F-Droid auto-updates
• F-Droid flavor still ships without the in-app self-updater
Everything else identical to 0.1.1.

Full Changelog: v0.1.1...v0.1.2

Release v0.1.1

Choose a tag to compare

@github-actions github-actions released this 10 Sep 23:26

Highlights

  • HLS streaming and talkback — added an HLS output fed from the RTSP encode path with an MJPEG/HLS preview toggle, remote zoom/torch controls, half-duplex talkback uplink, connected-client management, and a QR-based connect sheet
  • Smart detection suite — motion and sound detection with detection zones, arming schedules and cooldowns, on-device ML object detection (EfficientDet-Lite0, downloaded on demand with pinned SHA-256), detection stats with 24h/7d trends, CSV/JSON export, and quiet hours
  • Alerting everywhere — webhook alerts (ntfy/Home Assistant), native MQTT publishing with Home Assistant auto-discovery, local heads-up notifications, power-cut tamper detection, siren/torch deterrence, and Telegram capture backup alongside WebDAV
  • NVR-grade capture — H.265 RTSP streaming, ONVIF Profile S device service with WS-Discovery, continuous loop recording, time-based retention for captures and event logs, timelapse assembly, and motion-triggered auto-photo
  • Security and remote access — HTTPS mode with on-device self-signed certs (fingerprint embedded in the QR payload), read-only API tokens with a POST allow-list, session persistence and remote revocation, an audit log of API mutations and auth events, and SHA-256 + size integrity gating for self-updates
  • Unattended operation — resume streaming on boot, Quick Settings tile, home-screen widget, exported broadcast receiver for automation apps/adb, and a shared EncodedStreamHub so one encode serves RTSP, HLS and WebSocket clients
  • Observability — dashboard event feed over SSE with replay, in-app detection events screen with notification deep-linking, and a /api/system diagnostics panel for device, battery, OS and storage
  • Reliability fixes — coalesced audio config writes to prevent restart storms, unblocked the SSE event stream (NanoHTTPD auto-gzip buffering), WebCodecs → MJPEG → HLS playback ladder when WebSockets are blocked, and graceful web audio autoplay recovery
  • Smaller, compliant APK — migrated ML runtime from frozen TFLite Task Vision to MediaPipe Tasks Vision (16 KB page-size compliant), swapped Moshi reflection for KSP codegen, and dropped kotlin-reflect and the x86 ABI

⚠️ Breaking: ML detection now requires network access on first use to download the detection model (verified, installed atomically into app-private storage).

Features

  • feat(streaming): add HLS output, remote controls, talkback and client management — d1fd0ade — raulshma
  • feat: add detection suite, TLS mode, WebCodecs playback and WebDAV backup — 5f1b5f59 — raulshma
  • feat: add boot resume, event feed, telegram backup, update integrity — 9003692e — raulshma
  • feat: add MQTT alerting, tamper detection, local alerts and automation — dd7fb29f — raulshma
  • feat: add H.265 RTSP, ONVIF, ML detection, loop recording, retention — 853bae66 — raulshma
  • feat(ml): download verified object detection model on demand — 8e249e48 — raulshma
  • feat(streaming): add JvmName annotation to containsKeyframe function for encoder-emitted NAL units — d3907458 — raulshma

Fixes

  • fix(streaming): coalesce audio config writes to prevent restart storms — 0891d0a6 — raulshma
  • SSE event-stream responses exempted from NanoHTTPD auto-gzip so EventSource no longer freezes at load-time status; web audio autoplay-blocked state now recovers on first user gesture — 331be38f — raulshma

Refactors

  • refactor: migrate ML detection to MediaPipe and Moshi to codegen — 331be38f — raulshma
  • refactor: move listAdapter declaration before events initialization for proper loading — 503b3b44 — raulshma

Build

Contributors

Full Changelog: release/v0.1.0...release/v0.1.1

Release v0.1.0

Choose a tag to compare

@github-actions github-actions released this 08 Sep 10:14

Highlights

  • Manual white balance color temperature — added colorTemperatureKelvin support through CameraControlPlan (clamped to COLOR_TEMPERATURE_MIN..MAX, only populated when WB is MANUAL), with apply-time logging and JVM tests
  • RTSP reliability — pure-Kotlin H264NalParser, KEY_LOW_LATENCY capability guard for legacy encoders, black-frame submit to force CSD/SPS-PPS before first DESCRIBE, restart only on audio change when audio is active, plus RTP packet/octet counters
  • Launch OOM crash fix — StreamingManager lazy init re-entered via direct manager references in StreamWatchdog/StreamingSession; fixed with provider lambdas resolved lazily on first use
  • Streaming/capture architecture — new single owners: StreamingSession (wake lock, thermal, battery, keep-alive, watchdog), RecordingController (state + bounded schedule choreography), PhotoCaptureManager (one capture ladder), modular WebApiStack per-domain handlers replacing WebApiController, SettingsApplier single-writer, StreamDefaults central bounds, RtspOutput, ConnectivityMonitor
  • Pure-policy extraction with test gates — MediaCodecEncoderHarness (CodecLike), AudioSubscriberPipe, CameraSessionArbiter, MicGate, ViewerSync, ForegroundNotifications registry (fixes interval 1002 colliding with streaming), UpdateHttp (403 → RateLimited), WatchdogPolicy (nextTick/verificationSpecFor), StreamToggle/RecordingToggle verdicts, QuickSettingCatalog, CameraControlPlan, overlay/masking/pagination policies — ~70 new JVM tests plus vitest coverage
  • Web client overhaul and contract lockstep — useAppState recomposed over pollLadder.ts (multi-rate visibility-gated scheduler), LiveAudioPlayer.ts (PCM framing/jitter/reconnect), and api/defaults.ts (API_DEFAULTS); deleted dead StreamingCard.tsx; web/contract/*.json fixtures with DtoContractFixtureTest + contract.test.ts, and buildWebUi now gated on tsc --noEmit + vitest
  • Toolchain bumps — Gradle 9.3.1 → 9.6.0, AGP 9.1.0 → 9.4.0, Kotlin 2.1.0 → 2.2.10, web dependency refresh (package-lock.json), vitest + typecheck/test npm scripts

Features

  • feat(camera): add manual white balance color temperature support — 2935938 — raulshma

Fixes

  • fix(streaming): prevent OOM crash from recursive lazy initialization — f974a83 — raulshma
  • fix(rtsp): stabilize RTSP streaming with robust encoder config and NAL parsing — c8c2588 — raulshma

Refactors

  • refactor(streaming): centralize settings application and remove redundant runtime calls — bec00db — raulshma
  • refactor(streaming): consolidate session choreography and centralize defaults — 69ddb86 — raulshma
  • refactor(capture): extract recording and photo capture controllers — 12108f1 — raulshma
  • refactor: extract pure policy modules and centralize streaming/capture seams — b4cd624 — raulshma
  • refactor: extract RTSP/web/camera policy modules with JVM tests — ed062d6 — raulshma
  • refactor: extract pure policy modules and centralize streaming/capture seams — e127621 — raulshma
  • refactor: consolidate pure policy verdicts and tighten streaming/capture seams — 686c930 — raulshma
  • refactor: extract encoder, session, and web-client seams with contract gates — 517e59f — raulshma

Chores

  • chore(deps): update dependencies to latest versions in package-lock.json — 3dcc864 — raulshma

⚠️ Breaking Changes

  • Web client types: StreamingSettings.mdnsEnabled and StreamingSettings.auth removed; CaptureMode type and CAPTURE_MODE_LABELS removed
  • Interval capture config drops imageQuality and captureMode fields
  • Recording config drops maxFileSizeBytes field
  • DTO defaults now derive from StreamDefaults / OverlaySettings.DEFAULT / MaskingZone.DEFAULT instead of per-file literals; plaintext-password-over-wire / hash-at-rest contract documented on the type

Contributors

Full Changelog: release/v0.0.9...release/v0.1.0

Release v0.0.9

Choose a tag to compare

@github-actions github-actions released this 07 Apr 15:58
e014fe9

What's Changed

  • build(deps-dev): bump vite from 6.4.1 to 6.4.2 in /web by @dependabot[bot] in #2

New Contributors

Full Changelog: v0.0.8...v0.0.9

Release v0.0.8

Choose a tag to compare

@github-actions github-actions released this 05 Apr 21:28

Full Changelog: v0.0.7...v0.0.8

Release v0.0.7

Choose a tag to compare

@github-actions github-actions released this 05 Apr 18:02

Full Changelog: v0.0.6...v0.0.7