Files
notify-bridge/RELEASE_NOTES.md
T
alexei.dolgolyov fe92b206b7
Release / release (push) Successful in 1m20s
chore: release v0.2.0
2026-04-22 01:35:24 +03:00

7.5 KiB

v0.2.0 (2026-04-22)

First feature release since the initial v0.1.0 cut: a broad polish pass across the backend, frontend, and schema, plus two fixes landed on top.

Features

Immich commands & tracking

  • Per-chat album scope for Immich commands (/search, /latest, /memory, etc.) with a new Edit album scope modal on command-tracker listeners (inherit or explicit multiselect) (a7a2b4e)
  • /search and /find accept a trailing page number; Immich client search_smart / search_metadata take a page param (a7a2b4e)
  • Auto-organize rules now set the target album's thumbnail to the first added image (falls back to any asset type) when the album has none (a7a2b4e)

Dashboard & status

  • Action events (action_success / action_partial / action_failed) are emitted on every non-dry-run and surfaced on the dashboard with icons, filters, and colors (a7a2b4e)
  • Clear-events button + confirm modal on the dashboard (DELETE /api/status/events, scoped to the current user) (a7a2b4e)
  • Event rows render live tracker/provider/action names via FK join, with snapshot fallback when an entity has been deleted (a7a2b4e)

Backup & restore

  • Full backup restore flow: prepare-restore writes a pending marker, a restart banner offers Apply-now / Apply-later, and the lifespan hook applies on next startup and archives under data/applied_restores/ (a7a2b4e)
  • Manual Create backup button on the Backup page (POST /api/backup/files, same format as scheduled) (a7a2b4e)
  • apply-restart sends SIGTERM so the lifespan shutdown runs; NOTIFY_BRIDGE_SUPERVISED env var gates the button (a7a2b4e)

Users & deletion protection

  • PATCH /api/users/{id} for username and role changes with a last-admin guard, plus an Edit user modal on the Users page (a7a2b4e)
  • Deletion protection now returns structured {message, entity, blocked_by}; ApiError carries .blockedBy and the new BlockedByModal is wired into 8 deletion flows (a7a2b4e)

Telegram

  • Per-receiver locale for Telegram test messages (resolves TelegramChat.language_override per chat instead of applying the first receiver's locale to everyone) (a7a2b4e)
  • Telegram poller detects the "webhook is active" 409 and auto-calls deleteWebhook for bots whose DB update_mode is polling (throttled per bot) (a7a2b4e)
  • New TelegramClient.get_chat and set_album_thumbnail helpers (CLAUDE.md rule 6 — all Bot API calls go through TelegramClient) (a7a2b4e)

Form UX

  • Auto-select first available tracking / template / command / config + bot on create forms (trackers, command-trackers, targets, template/command configs) (a7a2b4e)
  • Global provider selector is visible even when there is only one provider (a7a2b4e)
  • Telegram target disable_url_preview defaults to true (a7a2b4e)

Bug Fixes

  • Telegram target list: load chats/listeners before expanding so the slide animation computes the right height (cf4976d)
  • Test dispatch falls back to tracker defaults for tracking/template config (matching load_link_data), distinguishes "no template config linked" vs. "slot missing in linked config", and the frontend testTrackerTarget now treats {success:false,error:...} in a 2xx body as a failure instead of flashing a success snack (80c034d)
  • Immich person-asset lookup switched from the removed GET /api/people/{id}/assets to POST /api/search/metadata with personIds — fixes /person and auto-organize rules silently returning zero candidates on Immich 1.106+ (a7a2b4e)
  • add_assets_to_album now surfaces the Immich error body on non-2xx responses (a7a2b4e)
  • Immich tracker "Checking links" parallelised (concurrency cap 6) (a7a2b4e)

Development / Internal

Schema / Migrations

  • event_log: add user_id, action_id, action_name (+ defensive migration and backfill of user_id from notification_tracker) (a7a2b4e)
  • command_tracker_listener: add allowed_album_ids (a7a2b4e)

Refactors & Internals

  • Bounded concurrency (semaphores) in NotificationDispatcher._preload_asset_data and _refresh_telegram_chat_titles; chat-title sweep extended to 24h since save_chat_from_webhook covers active chats opportunistically (a7a2b4e)
  • Periodic-summary test path reuses the shared collect_scheduled_assets primitive (limit=0) so test and production go through one path (a7a2b4e)
  • New fetchAuth helper for multipart/binary calls (reuses api()'s refresh + ApiError mapping) (a7a2b4e)
  • parseDate helper for consistent UTC date rendering (a7a2b4e)

Seeds

  • Rename "Default Commands" → "Default Immich Commands"; track_assets_removed now defaults to False (a7a2b4e)

All Commits
Hash Message Author
cf4976d fix(telegram): load chats/listeners before expanding to fix slide animation height alexei.dolgolyov
80c034d fix(test-dispatch): fall back to tracker defaults, surface soft errors alexei.dolgolyov
a7a2b4e feat: large polish pass — UX fixes, per-chat scope, restore/backup, action events alexei.dolgolyov