## [1.4.4]

- Improve event trace
- Minor bugfixes and improvements

## [1.4.3]

- The event trace can be opened at a specific time. Needs the matching camera.ui update.
- Minor bugfixes and improvements

## [1.4.2]

- Recordings and Recent Events list activity by when it last happened. An event that keeps running for hours sat at its start time, so a person walking in later was buried hours down the list, and Recordings did not show the event at all until it ended. Now the event moves up whenever someone new is seen, and it appears in Recordings as soon as it has something to show. Needs the matching camera.ui update.
- Event lists and timeline windows load about three times faster and stay quick however long the history grows. Loading a page used to read and sort every event of the cameras up to that point and decode face data it never showed, and finding the trace moment for an episode picture sorted every tick of a long event. The face data moves to its own place in the background after the update; the plugin keeps working while that runs.
- The recording bar on the timeline no longer runs on when nothing is recording. After switching a camera to ad hoc recording, or while its stream was down, opening the camera showed a bar growing to the live edge as if it recorded around the clock.
- Rarely used assistant tools (faces, plates, favorites, text alerts, clips, heatmap, recording gaps) load on demand instead of going along with every question. Saves tokens on every model call, local models answer faster.

## [1.4.1]

- Recent Events on the home screen can leave out chosen detection types per camera, for example cars on a camera facing the street, while those events are still recorded. Needs the matching camera.ui update.
- Saving and deleting events stays fast on a long history. Every saved event used to get slower the more events were stored, and cleaning up old recordings slowed down with it. The first start after the update takes a moment longer while the database is prepared.
- Long activity stays visible on the timeline. An event that started before the part of the timeline you are looking at was left out, so continuous activity lasting hours showed nothing at all while it was running. The camera's running event is now part of every view it covers.
- Events are recorded again after a restart during ongoing motion. If the plugin restarted while something was still moving, every detection of that activity was dropped until the motion stopped, which on a windy day can be hours: no events on the timeline, no notifications, and a warning after each detection. A running event is now picked up again and continues where it left off.
- A clip the assistant sends as push shows the moment of its picture. It covered the event from its start, where the person was often not in view yet, and now plays the seconds around the picture, like the moment pushes do.
- Event descriptions can use Italian, French and other languages again. Pick the language under Settings, Assistant, Answer language in camera.ui.

## [1.4.0]

- The camera.ui assistant works with your recordings. Ask what happened on a day or over a whole week, who was at the door, when someone was last seen, or search events by description, and it answers from your events, episodes and faces. It also lists the license plates of a period, tells when a camera is busiest and where in the picture the activity sits, and shows the stretches without footage.
- The assistant hands out clips and tidies faces. "Send me the video of the delivery" builds a clip of that moment with a download button in the chat, and on request as a video push to the phone. The faces the recognition could not name show up as pictures and can be named, ignored or corrected right there. Everything that changes something (favorites, faces, text alerts) needs an admin and asks you first.
- Tell the assistant "let me know when a delivery person comes" and from then on every new event that looks like it sends a push with the picture. Any short scene description works, per camera or for all. The picture match calibrates itself on your recordings, and with Moments AI configured the model double-checks every hit on the pictures before the push goes out. An alert can also end by itself ("watch the driveway for the next two hours"): every hit then lands in that conversation with the picture and a button to the recording, and a short summary follows at the end. Needs a CLIP plugin.
- Event descriptions run through the assistant of camera.ui and the GenAI tab is gone. The plugin never sees a key: under Settings, Assistant in camera.ui, allow the NVR plugin and pick one of your models, descriptions start right away. They follow the answer language set there, use the floor plan whenever one is drawn and send up to four pictures per event.
- Space cleanup treats every camera fairly. When the quota forced deletion, cameras were cleaned one after another, so the camera with the smallest footprint could lose days of history while a busier one kept everything. Now all cameras lose the same oldest hours, cleanup stops as soon as enough space is free, and fully cleaned days no longer leave empty folders behind.
- The network-share storage warning knows local pools now. Unraid shares, mergerfs pools and NTFS disks arrived as user-space mounts and were wrongly flagged as network storage; the warning now only fires for actual remote filesystems.
- Recordings survive a camera codec switch. Footage recorded before a change between H.264 and H.265 plays and exports correctly again: playback and export now follow the codec each recording was made with, and reaching the switch point on the timeline reopens the stream cleanly instead of failing. The same holds for a changed audio format; an export that spans the switch ends cleanly at it.
- Face tiles on event cards stay truthful. A face upgraded from unknown to a name mid-event no longer leaves a stale unknown tile behind, corrections made while the event is still running stick instead of reverting, and old leftover tiles are cleaned up on the next correction.
- Deleting or ignoring faces updates the Faces page in place instead of reloading the whole gallery, and the face groups keep their order.

## [1.3.25]

- Opening Recordings no longer floods slow connections until requests time out, and the faces gallery loads its pictures progressively instead of as one huge response. Failed picture loads retry on their own after a hiccup.
- A wrongly identified face can be corrected on the event. Assign the right person (or mark it unknown) and the correction also trains recognition, so the next detection gets it right. Only detections of that same face follow the rename: someone else wrongly carrying the name keeps their own, and the card shows the new name right away.
- Uploaded face photos are stored at a sensible size now, and oversized ones from earlier are shrunk once in the background. Face lists open much faster if you ever uploaded large photos.
- The detection heatmap answers instantly, even on cameras with weeks of activity.
- Checking which events have footage no longer rescans the disk on every refresh, so event lists respond quicker on long retentions.

## [1.3.24]

- Star an event or an episode in Recordings and it is kept: retention and low-disk cleanup delete around it, its footage stays playable on the timeline. A filter in Recordings shows only your favorites. Deleting by hand still wins, favorites included.
- Bugfixes and improvements

## [1.3.23]

- Getting signed out of the cloud no longer stops recording on the spot. If the session dies without you asking for it, recording keeps running and a notification asks you to reconnect the cloud account.

## [1.3.22]

- A short stop no longer vanishes from the episode cut. Somebody crossing the yard for three seconds on the way to the door lost that moment: the cut folded it away as a glitch because the yard came up again later. Real sightings stay in the cut now, however short.
- The episode opens where the story does. When people stood waiting at the door while one of them already crossed the yard, the cut opened with the yard and the door scene joined late. A sighting now knows how long its subject was already standing there, so the waiting scene opens the episode. Needs camera.ui 2.1.14; older events keep their cut.

## [1.3.21]

- Episode stories are told in the order it happened. When the cut led with a later camera, the AI got the events in that order and could tell the story backwards, someone leaving the house read as arriving.
- Update deps

## [1.3.20]

- A recording session that stays connected but never delivers a picture is reconnected after 30 seconds instead of recording nothing until the next restart. One resolution could silently stop this way while the other kept going, and scrubbing then said "No recording"

## [1.3.19]

- Recording rides through a camera that pauses for a few seconds. The recorder used to drop its session after 5 seconds without video and start over, which cost the pre-buffer and the next keyframe on top of the pause. It keeps the session now; the recording gets a hole as long as the pause, and the timeline marks the outage from the last picture on, like before. Needs camera.ui 2.1.13.
- Events/Episodes keep a detection trace: the frames the detector saw during the event and what it found on each of them. camera.ui shows it per event/episode and can export it for a bug report. Needs the matching camera.ui update.
- The episode cut favours the camera that was closest. Two cameras on one room used to count as two angles of the same picture, and the shorter sighting was left out of the cut even when that camera stood right where it happened and the other one saw nothing of it. The cut now compares how large the subject was in each picture: the closer camera plays its stretch, the other one continues around it.
- No more twin episodes. A sighting that stayed in view a while after its last detection could close its episode early, and its end then started a second, one-second episode of the same cameras. An episode now stays open while any of its sightings is still running, and a late end joins it instead of starting the next one.
- Opening the episodes with none recorded yet no longer fails. The empty list came back as nothing at all and the app logged an error instead of showing the empty state.

## [1.3.18]

- How much disk stays free is now a setting. On disks shared with other data, the automatic reserve could pause recording long before the quota was reached, even in overwrite mode. The new "Min Free Space" in the storage settings sets your own line: cleanup keeps that much available, recording only pauses at half of it; 0 keeps the automatic reserve.
- Episodes follow the floor plan. Unrelated activity at the same moment becomes separate episodes, a quick change of rooms stays one visit, and the title names the places involved. The camera groups setting is gone; every camera takes part. Needs the matching camera.ui update.
- Episodes end with the action. A standing object no longer stretches an episode, its clip or its push minutes past the last real activity.
- The episode cut is calmer. Very short camera switches fold into their neighbours, two views of one room play as one with the second angle offered in the player, and player, export and push clip all follow the same cut.
- AI descriptions know the property. With a floor plan drawn, descriptions and episode stories get the layout, walking times and what nearby sensors read at the time; a GenAI setting keeps that out if you prefer.
- Long outages stay visible on the timeline. A disruption band that began hours ago vanished from the view near live and flickered in and out while scrolling; it now shows wherever it covers. An outage interrupted by a crash keeps its span instead of collapsing to a moment.
- Events left open by a crash or restart are closed. An interrupted event could keep drawing on the timeline as if it were still running, for days. Old leftovers are cleaned up on the next start, and a new event on the same camera now closes any stuck predecessor right away.

## [1.3.17]

- The semantic-search index can be rebuilt after a CLIP model change. A reindex button in the recordings view re-embeds stored events in the background; current events are skipped.
- Semantic-search percentages are meaningful for every CLIP model. Scores are scaled per model, so a strong match reads high and the filter no longer hides good matches after a model switch.
- Playback picks the best available quality by itself. On Auto, a hole in the high recording serves the next quality that has footage. Needs the matching camera.ui update.
- The timeline tells partial outages apart. A failing high stream shows "recording without high" instead of offline. Phases shorter than a second, left behind when the second stream recovers moments after the first, are no longer recorded.
- Playback opens with its timeline data. Bars, events and bands arrive together with the first frame.
- Damaged frames from a lossy camera link no longer freeze or bounce playback. The recorder skips them and resumes on the next clean keyframe; already-recorded damage stays as is.
- Critical AI alerts are reserved for behavior, not presence. The threat levels carry concrete anchors (trying doors, checking car handles), so a person merely walking through no longer risks a critical push.
- "Unknown faces" alert rules stop pushing for people you know. A failed read that matches a face recognized in the same event now counts as that person.
- AI descriptions work again for cameras that use the camera's own detection. Those events now describe the scene pictures taken over the event.
- Pushes from smart-camera detection carry a picture again. Without a detection plugin the push falls back to the scene instead of going out text-only.

## [1.3.16]

- Notification settings moved to the camera. Push notifications, video in push, sounds, sensors, cooldown and speed now live in the camera settings next to the recording options instead of in the plugin, so they are translated and in one place. They start on the defaults, so check them once after the update. Needs the matching camera.ui update.
- Alert zones decide which faces and plates notify. "Known faces only" is gone; a zone can now name the people or plates it pushes for, with entries for unknown and for anyone enrolled. Nothing selected keeps notifying for everyone.
- People on the ignore list stay silent. Their face still arrived as unrecognized in the push path, so an ignored person could have triggered the new "unknown faces" rule.
- The face match threshold moved to the camera. Every camera sets its own now, in its detection settings below the face confidence, so the street camera can be stricter than the front door. The plugin setting is gone; if you had raised or lowered it there, set it again on the cameras that need it. Needs the matching camera.ui update.
- The AI no longer invents names and license plates. It read them straight off the picture, so a description could carry a plate the plate recognition never confirmed, and an episode could tie two cameras together on a misread. Names and plates now come only from what was actually recognized.
- Opening the live view no longer interrupts a running recording. The first time a camera was watched live after a restart, its recording stopped and started again, which left a short gap in the timeline right when something was happening.

## [1.3.15]

- The picture in a push has the same shape as the clip frames next to it instead of a narrow square.
- Bugfixes and improvements
- Bump camera.ui engine to v2.1.8

## [1.3.14]

- Bugfixes and improvements

## [1.3.13]

- One AI push instead of a push flood. With Moments on, a camera no longer stacks the instant detection push, the name update, the picture refresh and the AI summary; the AI description itself is now the camera's push. A new setting picks the timing: one push per moment (default), or one per event. If the AI does not answer in time, the classic detection push goes out instead. Doorbell, alarm and audio pushes still arrive immediately, and cameras without Moments keep the instant pushes as before.
- The AI camera tab is called GenAI now and holds the moment push settings.
- A doorbell or alarm no longer delays the push after it. Critical pushes don't count toward the notification cooldown anymore, so the detection push following a ring, like the AI moment naming the visitor, is not swallowed.
- Pushes play video now. The new per-camera setting "Video in Push" attaches a short clip of the recording: iPhone plays it right in the notification, the in-app notification opens with a player, Android keeps the picture. With Moments the AI push carries its clip; without, the detection push updates silently once the moment finished. An episode push plays the whole story, switching cameras like the episode player; the episode settings pick when (off, following the camera settings, or always). The clip streams from your own server and stays end-to-end encrypted like the rest of the push. Lowest recorded quality, off by default, needs the mobile app update.
- Minor bugfixes and improvements

## [1.3.12]

- A selected stretch of recording can be deleted from the timeline, footage and events together. Needs the matching camera.ui update.
- Minor bugfixes and improvements
- Bump camera.ui engine to v2.1.5

## [1.3.11]

- No more episode floods during long activity. Activity running past the maximum episode length produced a burst of nearly identical episodes with the same pictures once it ended. Follow-up chapters now start where the previous one stopped.
- Episodes wrap up instead of cutting off. The former maximum duration is now the point where an episode stops taking in new activity; whatever is still happening plays out and closes the episode, so a story never ends mid-scene. New activity from then on starts the next episode. The setting is called "Wrap up after" now.

## [1.3.10]

- The AI summary is final when it arrives. If an AI answer is still being written when the quiet time runs out, the summary now waits for it briefly instead of going out incomplete and updating afterwards. Once sent it stays as it is; activity resuming later still gets its normal moment pushes.

## [1.3.9]

- AI descriptions come back after the update. The 1.3.8 update could silently switch the new Moments toggle off even though AI descriptions were enabled before, which also stopped episodes from forming. The old setting now carries over correctly, affected installs repair themselves on start.
- The AI summary arrives once per event. A description finishing after the summary went out sent a second, nearly identical push; it now updates the existing one quietly.
- Episodes work without Moments. With Moments off and Episodes on, the AI descriptions episodes are built from are still generated internally; they just stay off the event cards and send no pushes. Turning Moments on shares the same descriptions with both.

## [1.3.8]

- One AI summary push per event instead of one per moment. The descriptions collect and go out together once the event stays calm for a while after its last moment (delay configurable under Moments), or when the event ends. Motion that keeps an event alive, like insects at night, no longer delays it. Tapping the push opens the start of the event.
- AI settings are split into three groups. GenAI holds the provider and credentials, the new Moments group switches AI descriptions for event moments on and off, Episodes keeps its own switch. The old master switch carries its value over to Moments on update.
- Custom AI instructions per feature. Moments and Episodes each take an own free-text field whose content is added to the built-in prompt, e.g. what to pay attention to or how to phrase things.
- Faces can be permanently ignored. New sightings of an ignored person are dropped right away instead of piling up as unknown faces again; restoring lets the person back in. Needs the matching camera.ui update.
- Camera offline and online notifications link to that camera's log in the app.
- Related sightings on several cameras around the same time are grouped into an episode with one AI-written story. The AI first checks whether the sightings really belong together and drops the rest. Needs the matching camera.ui update to show and play episodes.
- The picture in a notification comes from the moment the text describes, so what you see on the lock screen matches what you find in the app. Before, the picture could be one that appeared nowhere else.
- With "send as fast as possible" on, a push waits up to one and a half seconds for the image, otherwise up to three, and goes out either way after that. Before, it either left without a picture or sat there until the next update brought one.

## [1.3.7]

- The plugin removes selected events with their thumbnails and search index entries and tells every open client to drop them live. Recorded video stays until retention cleans it up.
- Discarding a selection or removing it from a group runs as a single call and one database transaction instead of one request per face.

## [1.3.6]

- Alarm sensors push like the doorbell. Smoke, gas, carbon monoxide, heat and leak sensors that trigger a camera event now send their own critical push, bypassing the notification cooldown; cold, vibration, tamper and problem send a regular one. Each can be turned off per camera in the notification settings.

## [1.3.5]

- Doorbell and other sensor events no longer hide behind the confidence filter. Events without visual detections (a ring, a triggered siren or contact) have no confidence score, and the default 50% filter in the recordings view silently dropped them. The confidence filter now only rates events that actually carry detections.
- Doorbell pushes arrive when the doorbell rings. A press while a motion event was already running (someone walking up, then ringing) only sent its push after that event ended, up to a minute late. The push now goes out the moment the ring joins the event. Needs the matching camera.ui update for the ring to also show in the timeline immediately.
- Recording no longer crowds the rest of the system out of memory. Written segments are flushed from the OS file cache right away; before, days of recordings piled up as cache, and on memory-capped setups (Docker, Proxmox containers) the kernel started swapping out the live processes instead. The recorder also releases each minute of video from memory as soon as it is written.
- The retention cleanup reads far less from disk. While an old day is deleted piece by piece, the timeline manifest is now trimmed in place instead of rebuilt from a full rescan of all remaining files every minute. With weeks of recordings that rescan caused gigabytes of disk reads and could stall the whole server for an hour around the retention window.
- Recordings from cameras like eufy play again. These cameras flag a scaling matrix in their video parameters, which tripped a parser bug: playback sent broken stream headers with wrong dimensions, and every recording failed with a decode error while other cameras on the same server played fine.
- Face recognition is stricter about who counts as a match. The default match threshold moves from 0.5 to 0.85, which cuts the strangers that got greeted by name. Existing installs keep their configured value; the slider now goes up to 0.95 if you want it even stricter.

## [1.3.4]

- A recording that exists but can't be read no longer reports "no recording" while scrubbing. Real read errors now reach the client as errors, so the player can retry and show what actually happened; only a genuine gap still counts as no data.

## [1.3.3]

- Minor bugfixes and improvements

## [1.3.2]

- Minor bugfixes and improvements

## [1.3.1]

- Update camera.ui SDK

## [1.3.0]

- Bump camera.ui SDK, requires camera.ui 2.0.23 or newer

## [1.2.9]

- Fixed GenAI descriptions failing with "cannot unmarshal string" on some local models. Models that return the threat level as text instead of a number are now accepted

## [1.2.8]

- GenAI works with any OpenAI-compatible endpoint (LM Studio, oMLX, vLLM, ...). The API Base URL field now shows for every provider, so the OpenAI provider can point at a local server. The API key field is also available for Ollama for setups behind an authenticating proxy

## [1.2.7]

- Fixed event recordings showing "No recording" when opened. With a pre-buffer the recording starts before the event, and everything from the event onwards ended up in a file the player never looked in. New recordings are stored correctly, and existing ones are found again
- Fixed recordings being lost when events follow each other closely. With a pre-buffer, a new event started by re-recording the seconds the previous one had just saved, and that overwrote it. Busy cameras were losing large parts of their recordings, with "failed to merge with existing segment" in the log
- Bugfixes and improvements

## [1.2.6]

- Recording settings (enable, mode, pre-buffer, recorded streams) moved into the camera settings of camera.ui. The plugin now follows the camera record; existing values are carried over by the server
- Fixed retention cleanup on Windows failing on recently watched recordings. Segments a viewer had scrubbed through stayed open internally, Windows then refused to delete them and the log filled with "failed to delete ... file is used by another process" on every cleanup cycle. Cleanup now closes those handles before deleting

## [1.2.5]

- Bugfixes and improvements

## [1.2.4]

- Fixed recordings being destroyed when recording resumed within the same minute (plugin restart, camera outage): the new part overwrote the earlier part of that minute on disk while the timeline still showed the full bar. Both parts are now merged
- Recording exports that result in a single video now download as a plain MP4 instead of a ZIP
- Exporting a range with no recordings now fails with a clear message instead of producing an empty ZIP
- Fixed the storage overview showing default quota and retention after changing storage settings, until camera.ui was restarted

## [1.2.3]

- Fixed GenAI "Test Connection" failing with OpenAI (`'messages' must contain the word 'json'…`) — the test prompt now requests a JSON object as OpenAI requires when JSON output mode is enforced
- Bump camera.ui engine and SDK

## [1.2.2]

- Update camera.ui SDK

## [1.2.1]

- Bugfixes and improvements
- Update camera.ui SDK
- Bump camera.ui engine to v2.0.6

## [1.2.0]

- Reclaim disk from orphaned recordings — footage left behind by deleted or unassigned cameras is now swept by retention, quota, and disk-pressure cleanup instead of leaking forever
- Uninstall data protection — a `.cameraui-keep` marker in the recordings folder makes the NVR leave that footage untouched (never counted, aged, or deleted), so a host "delete stored data" uninstall can spare recordings
- Recording resumes sooner after you free up disk space — paused cameras no longer stay paused until an app restart
- Quota cleanup no longer deletes real recordings after manual or host-side deletes — the on-disk index is rebuilt before acting on an overage
- Small-storage-volume warning — when recordings land on a volume too small to hold much (often a larger storage mount that never mounted, leaving footage on the OS disk), the NVR now flags it in the UI and logs the storage path and free space at startup, so frequent rotation isn't mistaken for a fault
- More accurate camera offline detection — no more false "offline" flapping in event mode (between events) or during deliberate stops (config change, disable, shutdown)
- More robust recording pipeline — idempotent stop (fixes a double-stop crash), start/stop race fixes, reconnect backoff resets after a stable session, quieter reconnect logs
- Faster, deadlock-free shutdown — pipelines stop in parallel within a bounded grace period
- Fixed settings handlers applying the wrong value on change — affected storage path, quota, retention, face recognition, GenAI, and camera enable/sources/mode/preBuffer
- Persistence failures in license, OAuth, and mobile-device storage are now logged instead of silently dropped
- Update camera.ui SDK
- Bump camera.ui engine to v2.0.5

## [1.1.0]

- Bump camera.ui engine to v2

## [1.0.6]

- Bump camera.ui engine

## [1.0.5]

- Bugfix & Improvements

## [1.0.4]

- Bugfix & Improvements

## [1.0.3]

- Bugfix & Improvements

## [1.0.2]

- Bugfix & Improvements

## [1.0.2]

- Bugfix

## [1.0.1]

- Bugfix

## [1.0.0]

- Initial Release
