Files
notify-bridge/RELEASE_NOTES.md
alexei.dolgolyov 6877c4d272
Release / test-backend (push) Successful in 2m17s
Release / release (push) Successful in 1m0s
chore: release v0.10.0
2026-06-05 21:04:37 +03:00

4.2 KiB

v0.10.0 (2026-06-05)

Multi-time-point scheduling for Immich. The single comma-separated "times" text box is replaced with an add/remove list of native HH:MM pickers for the scheduled assets, periodic summary, and memory slots — entering several fire times per day is now discoverable, and the read/write path is hardened end to end. This release also pins aiohttp<3.14 in the backend test environment so the suite stays green against the current aioresponses. No breaking changes; no migrations required.

User-facing changes

Features

  • Immich multi-time scheduling UI. A new TimeListEditor replaces the comma-separated text box with an add/remove list of native HH:MM pickers for the scheduled-assets, periodic-summary, and memory slots. It dedupes and sorts on save, enforces a per-day cap, collapses on-screen duplicates, and gives each row an aria-label. Keyboard entry is no longer clobbered mid-edit — it syncs from the value prop only on external changes via an untrack guard (8065e6e)
  • Per-section save guard. An enabled feature section (scheduled / periodic / memory) must now have at least one time before it can be saved, enforced in the provider descriptor (8065e6e)
  • Refreshed copy. New en/ru i18n keys and updated help text for the editor; the dead invalidTimeList string was removed (8065e6e)

Bug Fixes

  • Server-side *_times normalization. The tracking_configs API now normalizes scheduled_times / periodic_times / memory_times on every write (validate, dedup, sort, cap at 24), returns 422 on malformed input, and refuses to enable a slot whose times list is empty (8065e6e)
  • Restored scheduler observability. The scheduler now warns when an enabled slot has zero or dropped fire times, restoring the visibility that was lost when the old per-call warning was removed (8065e6e)

Development / Internal

CI/Build

  • Pin aiohttp<3.14 in the backend test install. aioresponses 0.7.8 (latest) does not pass the stream_writer keyword argument that aiohttp 3.14 made required on ClientResponse, so every aioresponses-mocked HTTP test failed to construct a response. notify-bridge-core declares aiohttp>=3.9 with no upper bound, so CI floated to 3.14.0 — the pin keeps the test environment reproducible in both build.yml and release.yml until aioresponses ships an aiohttp-3.14-compatible release (11593ea)

Refactoring

  • Shared time-list service. A new services/time_list.py exposes normalize_time_list (raising TimeListError) and a lenient parse_hhmm_list; the scheduler drops its private parser copy in favour of the shared one (8065e6e)

Tests

  • Time-list coverage. New tests for time-list normalization and parsing (including non-ASCII and odd-shaped input) and for the "enabled implies at least one time" validation (8065e6e)

Chores

  • Checked-in vex config. A .vex.toml enabling semantic embeddings, call-graph, BM25, and auto-update for the vex code-search index (d01e519)

All Commits
  • 8065e6efeat(immich): multi-time-point scheduling for scheduled/periodic/memory (alexei.dolgolyov)
  • 11593eafix(ci): pin aiohttp<3.14 in backend test deps (alexei.dolgolyov)
  • d01e519chore: add vex semantic-search config (alexei.dolgolyov)