Repository navigation
Releases: raulshma/lenscast
Release list
Release v0.1.6
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
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
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
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
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
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
EncodedStreamHubso 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/systemdiagnostics 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
Features
feat(streaming): add HLS output, remote controls, talkback and client management—d1fd0ade— raulshmafeat: add detection suite, TLS mode, WebCodecs playback and WebDAV backup—5f1b5f59— raulshmafeat: add boot resume, event feed, telegram backup, update integrity—9003692e— raulshmafeat: add MQTT alerting, tamper detection, local alerts and automation—dd7fb29f— raulshmafeat: add H.265 RTSP, ONVIF, ML detection, loop recording, retention—853bae66— raulshmafeat(ml): download verified object detection model on demand—8e249e48— raulshmafeat(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
EventSourceno 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— raulshmarefactor: move listAdapter declaration before events initialization for proper loading—503b3b44— raulshma
Build
Contributors
- raulshma — 12 commits
Full Changelog: release/v0.1.0...release/v0.1.1
Release v0.1.0
Highlights
- Manual white balance color temperature — added
colorTemperatureKelvinsupport throughCameraControlPlan(clamped toCOLOR_TEMPERATURE_MIN..MAX, only populated when WB isMANUAL), with apply-time logging and JVM tests - RTSP reliability — pure-Kotlin
H264NalParser,KEY_LOW_LATENCYcapability 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 —
StreamingManagerlazy init re-entered via direct manager references inStreamWatchdog/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), modularWebApiStackper-domain handlers replacingWebApiController,SettingsAppliersingle-writer,StreamDefaultscentral bounds,RtspOutput,ConnectivityMonitor - Pure-policy extraction with test gates —
MediaCodecEncoderHarness(CodecLike),AudioSubscriberPipe,CameraSessionArbiter,MicGate,ViewerSync,ForegroundNotificationsregistry (fixes interval1002colliding with streaming),UpdateHttp(403 → RateLimited),WatchdogPolicy(nextTick/verificationSpecFor),StreamToggle/RecordingToggleverdicts,QuickSettingCatalog,CameraControlPlan, overlay/masking/pagination policies — ~70 new JVM tests plus vitest coverage - Web client overhaul and contract lockstep —
useAppStaterecomposed overpollLadder.ts(multi-rate visibility-gated scheduler),LiveAudioPlayer.ts(PCM framing/jitter/reconnect), andapi/defaults.ts(API_DEFAULTS); deleted deadStreamingCard.tsx;web/contract/*.jsonfixtures withDtoContractFixtureTest+contract.test.ts, andbuildWebUinow gated ontsc --noEmit+vitest - Toolchain bumps — Gradle
9.3.1 → 9.6.0, AGP9.1.0 → 9.4.0, Kotlin2.1.0 → 2.2.10, web dependency refresh (package-lock.json),vitest+typecheck/testnpm scripts
Features
Fixes
fix(streaming): prevent OOM crash from recursive lazy initialization—f974a83— raulshmafix(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— raulshmarefactor(streaming): consolidate session choreography and centralize defaults—69ddb86— raulshmarefactor(capture): extract recording and photo capture controllers—12108f1— raulshmarefactor: extract pure policy modules and centralize streaming/capture seams—b4cd624— raulshmarefactor: extract RTSP/web/camera policy modules with JVM tests—ed062d6— raulshmarefactor: extract pure policy modules and centralize streaming/capture seams—e127621— raulshmarefactor: consolidate pure policy verdicts and tighten streaming/capture seams—686c930— raulshmarefactor: extract encoder, session, and web-client seams with contract gates—517e59f— raulshma
Chores
⚠️ Breaking Changes
- Web client types:
StreamingSettings.mdnsEnabledandStreamingSettings.authremoved;CaptureModetype andCAPTURE_MODE_LABELSremoved - Interval capture config drops
imageQualityandcaptureModefields - Recording config drops
maxFileSizeBytesfield - DTO defaults now derive from
StreamDefaults/OverlaySettings.DEFAULT/MaskingZone.DEFAULTinstead of per-file literals; plaintext-password-over-wire / hash-at-rest contract documented on the type
Contributors
- raulshma — 12 commits
Full Changelog: release/v0.0.9...release/v0.1.0
Release v0.0.9
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
- @dependabot[bot] made their first contribution in #2
Full Changelog: v0.0.8...v0.0.9
Release v0.0.8
Full Changelog: v0.0.7...v0.0.8
Release v0.0.7
Full Changelog: v0.0.6...v0.0.7