Files
notify-bridge/RELEASE_NOTES.md
T

4.4 KiB

v0.2.4 (2026-04-22)

Telegram media cache rebuilt around thumbhash validation — asset cache entries now invalidate when the visual content changes, not after a fixed TTL — plus a settings-page overhaul (cache stats, clear button, timezone / locale pickers) and full mobile-nav parity with the desktop sidebar.

Features

Telegram media cache

  • Thumbhash-validated asset cache — dispatcher builds an asset.id → thumbhash resolver from event.added_assets (Immich already populates thumbhash in extra) and passes it to TelegramClient. Asset-cache entries now invalidate on visual change rather than age. (2be608b)
  • Configurable cache cap & statsTelegramFileCache gets a max_entries LRU cap (applies in both TTL and thumbhash modes), ttl_seconds <= 0 disables TTL entirely, and a stats() method exposes per-bucket counts / sizes / oldest+newest timestamps. New settings: telegram_asset_cache_max_entries (default 5000); telegram_cache_ttl_hours default bumped 48 → 720 (30 days) and is now URL-only. (2be608b)
  • Cache admin endpointsGET /settings/telegram-cache/stats and POST /settings/telegram-cache/clear. PUT /settings now soft-resets the in-memory caches when cache-shaping keys change (on-disk file_ids preserved). (2be608b)

Settings page

  • Cache stats card — per-bucket (URL / asset) counts, cumulative uploaded-to-Telegram byte size, oldest/newest timestamps, and a hint explaining what the size means. Clear-cache button behind a confirm modal. (2be608b)
  • New TimezoneSelector and LocaleSelector components replace the raw inputs with IANA-aware searchable pickers. Max-entries input exposed; TTL range widened to 0..8760 hours (0 = disabled). (2be608b)

Mobile nav

  • Full sidebar parity in the More panel — now mirrors the desktop sidebar tree (groups + subnodes) so every destination is reachable from mobile. Previously the panel carried a hand-picked flat list that drifted behind newly-added routes. (2be608b)
  • Safe-area handling — nav height uses env(safe-area-inset-bottom); panel bottom + z-index fixed so page content can no longer visually overlay the bottom bar. (2be608b)

Bug Fixes

  • Accept numeric values in settings update payload — Svelte's bind:value on <input type="number"> coerces to a JS number, and Pydantic v2 wouldn't auto-coerce int → str, producing a 422 on every save that touched a numeric setting (TTL, max entries) after the v0.2.4 settings rework. Widened numeric fields to int | str | None in SettingsUpdate and normalized to str before persisting. (d7d0a5d)
  • update_settings TypeErrorany(await ... for ...) was an async generator (not an iterator) and raised at runtime; replaced with an explicit loop so settings updates actually commit. (2be608b)

Accessibility

  • Password-manager association on the password-change form — hidden username field + autocomplete hints on all three password inputs so browsers stop warning and password managers fill correctly. (2be608b)
  • Telegram webhook secret wrapped in a no-op form with autocomplete=off to silence DOM/a11y warnings. (2be608b)

All Commits
  • d7d0a5d — fix(settings): accept numeric values in update payload (alexei.dolgolyov)
  • 2be608b — feat(cache): thumbhash-validated asset cache + settings UX overhaul (alexei.dolgolyov)