## [1.5.0]

- **Find a person or a vehicle across recordings.** A person or vehicle picked in the player is found in other moments by name, face and clothing, or by plate and look, all at once and each moment once. Needs the matching camera.ui update and an active license.
- **A face that looks about as much like two people gets neither name.** Such a picture used to go to whoever came slightly closer, the most common way someone with few training pictures ended up with another person's name.
- **Unclear faces no longer collect under Unknown Faces.** A new face is checked before it is kept, the ones already there in the background after the update. Training pictures get the same check but are only marked: the Faces view shows unclear ones and pictures filed twice or under two people, and a picture a person already has is not added again. Needs the matching camera.ui update and the ML plugin update.
- **Vehicles get a color and a type** to filter recordings by. Older recordings get theirs in the background after the update.
- **The event trace keeps what each face read matched or came closest to**, the faces and plates your settings dropped and how sure each frame was of an object. Needs the matching camera.ui update.
- **Deleting recordings stays fast however much is recorded.** Removing events, by hand or through the daily cleanup, got slower with every week of AI search history.

## [1.4.7]

- **Every face of a recording can be corrected on its own.** With several people in one moment a face could lose its picture, and a correction also renamed other faces of the event. Now only the face you picked changes, and its own picture trains the person. Needs the matching camera.ui update.

## [1.4.6]

- **A corrected name shows on the recording card right away.** The card kept the old name until a reload, and correcting it again failed with "no face … on event". Needs the matching camera.ui update.
- **A late AI description no longer undoes changes to its event.** A name corrected shortly after the event ended came back, and an event deleted in that time reappeared.

## [1.4.5]

- **Face recognition goes by the training pictures themselves** instead of one averaged face per person, so a look it has seen is recognized again. Two pictures of that person have to agree before a name is given, so one unlucky picture in a profile cannot put its name on someone else.
- **Enrolled faces follow a change of the recognition model by themselves.** The training pictures are embedded again in the background, with progress in the Faces view and a button to start it by hand. Pictures that show no clear face are removed along the way.
- **Strangers no longer get a family name.** A face has to be clearly visible before it is compared, so an unclear one stays without a name and out of the unknown faces.
- **Correcting a name fixes the cause.** The picture that led to the wrong name leaves the profile it was filed under, so the same correction stops coming back.
- **Training images are kept for what they cover.** At the limit, the picture most like another one of the same person makes way, instead of the one the detector was least sure about. The limit starts at 20 per person and goes up to 40.
- **Filtering recordings stays instant.** Filtering by a door lock, a face or any other kind used to get slower with every week of history and could end without a result. It no longer depends on how much is recorded.
- **The recordings page opens fast the first time too.** It took several seconds on the first visit after a start.
- **Recordings and the Apple TV show how many events there are in total**, not just how many have loaded.
- **Episode pictures box the right spot.** When a camera analyses its main stream, the boxes on the pictures of an episode trace sat off to the side. Needs the matching camera.ui update, older episodes show their pictures without boxes.
- **A removed camera no longer keeps a recording slot.** A camera that disappeared while the plugin was down showed up as recording and, on a full plan, took the slot of a camera that is still there.
- **An event no longer runs forever when detections stop in the middle of it.** Snoozing the camera or a crashed detection process left the event open until the next one started.
- **Notifications say "Anna Seen" for a known face** and "Plate ABC Seen" for a plate, instead of "Detected". Unnamed subjects keep "Person Detected".
- **A face picture keeps up with its name after a rescan.** When a rescan named an unknown face, the recording card kept showing the picture as "unknown".
- **A camera that comes back after a dropout no longer shows "recording without high" for good.** When both streams returned at the same moment, the timeline could keep that notice open although everything was recording.
- **AI descriptions are no longer cut off after 30 seconds.** A slow model lost its description. How long one may take is a setting now (Moments, Model Timeout), 60 seconds by default. Needs the matching camera.ui update.
- **The assistant gets as many results as it asked for.** A small number like "the last five events" was ignored and fifty came back, which slowed answers down and overwhelmed small models.
- **The assistant finds the picture of a moment it just summed up.** Small models copied the id of a moment slightly wrong and got no picture back.
- **The assistant counts a busy day completely.** Its summary stopped at 1000 events, so a camera that was active only in the morning could go missing from it.

The first start after this update takes a moment longer while the database is prepared.

## [1.4.4]

- **The event trace shows more of what happened.** Plus minor fixes.

## [1.4.3]

- **The event trace can be opened at a specific time.** Needs the matching camera.ui update.

## [1.4.2]

- **Recordings and Recent Events sort by the latest activity.** An event running for hours sat at its start time, so a person walking in later was buried far down the list, and Recordings did not show the event until it ended. Needs the matching camera.ui update.
- **Event lists and timeline windows load about three times faster** and stay quick however long the history grows. The first start after the update takes a moment longer while the database is prepared.
- **The recording bar no longer runs on when nothing is recording.** It showed on a camera set to ad hoc recording, or while its stream was down.
- **Rarely used assistant tools load on demand.** Faces, plates, favorites, text alerts, clips, heatmap and recording gaps no longer ride along with every question, which saves tokens and makes local models answer faster.

## [1.4.1]

- **Recent Events 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.** Both used to slow down the more events were stored. 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 shown part was left out, so activity lasting hours showed nothing while it was running.
- **Events are recorded again after a restart during ongoing motion.** A restart while something was moving dropped every detection until the motion stopped, which on a windy day can be hours. A running event is picked up again now.
- **A clip the assistant sends as push shows the moment of its picture** instead of starting at the event, where the person was often not in view yet.
- **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 week, who was at the door, when someone was last seen, or search events by description. It also lists license plates of a period, tells when a camera is busiest and where 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 with a download button in the chat, or as a video push. Faces the recognition could not name show up as pictures and can be named, ignored or corrected there. Anything that changes something needs an admin and asks first.
- **Text alerts watch for a scene you describe.** "Let me know when a delivery person comes" sends a push with the picture for every matching event, per camera or for all. An alert can end by itself, and a summary follows. Needs a CLIP plugin.
- **Event descriptions run through the camera.ui assistant** and the GenAI tab is gone. Allow the NVR plugin under Settings, Assistant and pick a model. Descriptions follow the answer language set there and use the floor plan when one is drawn.
- **Space cleanup treats every camera fairly.** Cameras were cleaned one after another, so a quiet camera could lose days while a busy one kept everything. All cameras now lose the same oldest hours, and cleanup stops as soon as enough space is free.
- **The network-share storage warning knows local pools.** Unraid shares, mergerfs pools and NTFS disks were wrongly flagged as network storage.
- **Recordings survive a camera codec switch.** Footage recorded before a change between H.264 and H.265 plays and exports correctly again, the same for a changed audio format. An export spanning the switch ends cleanly at it.
- **Face tiles on event cards stay truthful.** A face that got its name mid-event no longer leaves a stale unknown tile behind, and corrections made while the event runs stick.
- **Deleting or ignoring faces updates the Faces page in place** instead of reloading the whole gallery, and the groups keep their order.

## [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
