• v0.2.0 fe92b206b7

    Notify Bridge 0.2.0
    Release / release (push) Successful in 1m20s
    Stable

    alexei.dolgolyov released this 2026-04-22 01:35:24 +03:00 | 112 commits to master since this release

    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

    Changelog

    fe92b20 chore: release v0.2.0
    cf4976d fix(telegram): load chats/listeners before expanding to fix slide animation height
    80c034d fix(test-dispatch): fall back to tracker defaults, surface soft errors
    a7a2b4e feat: large polish pass — UX fixes, per-chat scope, restore/backup, action events

    Downloads