32 KiB
32 KiB
v0.1.0 (2026-04-21)
First public release of Notify Bridge — a self-hosted bridge that turns events from home-lab services into rich, localized notifications and accepts chat commands in return.
Highlights
- Six service providers out of the box: Immich, Google Photos, Planka, Gitea, NUT (Network UPS Tools), plus a generic JSONPath webhook provider and a built-in Scheduler.
- Multi-channel delivery: Telegram, Discord, Slack, ntfy, Matrix, Email, and a broadcast target that fans out to multiple receivers.
- Provider-agnostic bot command system with rich, locale-aware command templates (Telegram + Matrix + Email bots).
- Jinja2 slot-based template system with autocomplete, live preview, locale switching, and a sandbox with timeout protection.
- Actions engine for scheduled mutations on external services (e.g. timed Immich operations).
- Dashboard with filtered charts, grouped navigation tree with badges, Ctrl+K search palette, cross-entity crosslinks, card-highlight navigation, and a global provider filter.
- Docker deployment with a Gitea CI/CD pipeline, full backup & restore, webhook payload history, person excludes for auto-organize rules, and SSRF-hardened outgoing requests.
Features
Service providers
- Phase 3 — Immich service provider (cc02558)
- Google Photos provider backend + API hardening (307871c)
- Planka service provider with full notification and command support (0fde3c6)
- Gitea as webhook-based service provider (6d28cfb)
- NUT (Network UPS Tools) service provider + provider-agnostic UI (68ac13b)
- Generic webhook provider with JSONPath payload extraction (616b221)
- Scheduler provider + multi-provider UX fixes (0562f78)
Notification targets & delivery
- Discord / Slack / ntfy / Matrix targets, command templates, delete protection, email/matrix bots (3e3a6f0)
- Broadcast notification target + UX improvements (d8ecb60)
- Provider-strict configs, slot-based templates, broadcast targets, email bots, command templates (846d480)
- Receiver OOP hierarchy with per-receiver locale resolution (1cfa728)
- Rewrite asset URLs to internal provider URL for LAN fetching (ad2fd33)
Bots & commands
- Telegram commands, app settings, bot polling, webhook handling, UI improvements (03ec9b3)
- Per-chat command toggle, listener name + toggle in bot tab (b3b6c31)
- Rich command templates with public links + media text-first flow (d0bc767)
- Locale-aware command templates, debounced auto-sync, entity pickers (1167d13)
- Remove hardcoded command templates, enforce template system exclusively (ddcbfda)
Template system
- Phase 4 — template system (f36f070)
- Locale-aware notification templates + UX improvements (37388c4)
- Collapsible accordion slots for template editing UX (b1ab5b8)
- Smart video size warnings + Jinja2 template autocomplete (39bac82)
- Collapsible chart, paginator controls, localized template slots (3372761)
- Fix template preview links, default chat action, update default templates (371ea70)
Entities, targets & rules
- Port full CRUD API routes and frontend pages from Immich Watcher (9eec21a)
- Entity relationship refactor — notification trackers, command system, chat actions (1d445f3)
- Person excludes for auto-organize rules, backup & restore system (6b22113)
- Actions system — scheduled mutations on external services (6a559bf)
- Default tracker configs, email validation, expandable target links (6e35926)
- Webhook payload history — store and display recent incoming payloads (6113a00)
- Test menu dropdown, split text/media messages, target settings, provider URL links (5015e37)
UI / navigation / UX
- Phase 7 — frontend restructuring (9dfd1b7)
- Port original frontend UI to Notify Bridge (c9cab93)
- Grouped nav tree with badges, dashboard events section with filtered chart (2c740ff)
- Entity cache system, nav UX improvements, split CLAUDE.md (563716f)
- IconGridSelect, CrossLink, SearchPalette components + entity crosslinks (06b2463)
- Card highlight system for cross-entity navigation (f0f49db)
- Search button in sidebar with Ctrl+K shortcut hint (637a467)
- EntitySelect palette-style entity picker, replace select dropdowns (a3a1fe3)
- Provider type selector for tracking-configs, use IconGridSelect everywhere (9d3abd9)
- Replace all select dropdowns with IconGridSelect, fix EN template seed (a9bb912)
- Filter search to IconGridSelect when item count > 4 (a7829c4)
- Consistent IconGridSelect sizing + descriptions + filter upgrades (31584c5)
- Filtering on all entity list pages (7cbba9d)
- Filter entity selectors by global provider filter (c451f3d)
- Chat language display, disabled EntitySelect items, dev scripts (82e400d)
- API docs link button in sidebar footer (f90cc36)
- UX & notification improvements — icons, events, chat names, link validation, templates (03c5c66)
- UX improvements — secure webhooks, locale fixes, dynamic languages, UI polish (734e5c9)
Security & hardening
- Security hardening — SSRF guard, template sandbox timeout, webhook log prune, auth & backup polish (f0739ca)
- Comprehensive code review fixes — security, performance, quality (e0bae39)
- Comprehensive code review fixes + receivers-only architecture (751097b)
Deployment
- Docker deployment + Gitea CI/CD workflow (1ac6a17)
Foundation
- Phase 9 — HAOS integration planning (786fe5e)
- Phase 8 — integration and wiring (08814e9)
- Phase 6 — database models and server API (7f99c89)
- Phase 5 — notification system (16a41ef)
- Phase 2 — core abstractions (3ed0d8c)
- Phase 1 — project scaffolding (b724447)
Bug Fixes
- Simplify add-target UX — single EntitySelect click to add (21d8ef7)
- Provider-aware collection count labels in tracker list (c6bb2b5)
- NUT template preview + tracking config event checkboxes (2cc4bf6)
- Dashboard provider card shows filtered count, fix provider update 400 (0702ec7)
- UI polish — overflow, placeholders, dashboard provider card (4049efe)
- Pass chat_action from target config to Telegram client (e90c128)
- Remove all transform from stagger/fade animations (d8a1af0)
- Stagger animation breaking position:fixed overlays (f9a4ccf)
- Remove Card hover transform that breaks fixed-position overlays (bd254de)
- Clipboard copy fallback for non-HTTPS contexts (c26b71d)
- Nav active state — plain path link not highlighted when sibling query-param link matches (f64ada5)
- Re-create missing EN default template, provider type as IconGridSelect (db7aac5)
- Search palette triggers highlight, restore CSS keyframe blink (86115f5)
- Switch highlight to global store instead of URL params (88e21e4)
- Replace CSS keyframe highlight with direct style pulse for reliability (f47df93)
- Card highlight animation — kill stagger before highlight, keep animation:none on cleanup (4b59f40)
- Prevent stagger animation replay after card highlight ends (4c1d5a8)
- Rename bots → telegramBots in targets page to fix undefined reference (227b9c2)
- Comprehensive API/UI review — 26 bug fixes and improvements (91e5cd5)
- Remove auto-redirect from API client on 401 (e43c2ed)
- Add auth guard to root layout with setup/login redirects (7d01ae6)
- Local fonts via @fontsource, favicon, autocomplete attrs (f9c41fa)
Performance
- Rewrite asset URLs to internal provider URL for LAN fetching (ad2fd33)
- Lazy-load @mdi/js to reduce Vite dev server memory usage (826be4c)
Refactoring
- Comprehensive consistency review — UI/UX, code quality, functional parity (6e51164)
- Comprehensive codebase review — security, performance, quality, UX (b803d00)
- Provider descriptor registry — eliminate provider-specific hardcoding (8cb836e)
- Provider-agnostic bot command system + Gitea commands (63437c1)
- Unify test dispatch with real NotificationDispatcher (d4cb388)
- Replace favorites checkbox with toggle switch in grid layout (1a8c95e)
- Rename /telegram-bots route to /bots (b525e3e)
Development / Internal
CI/Build
- Consolidate release tokens to single DEPLOY_TOKEN, rename redeploy step (eecc9e2)
- Sync release workflow with CI/CD docs, add manual build (c41182f)
Chores
All Commits
| Hash | Message | Author |
|---|---|---|
| 90bc3cc | chore: pre-release cleanup | alexei.dolgolyov |
| eecc9e2 | ci: consolidate release tokens to single DEPLOY_TOKEN, rename redeploy step | alexei.dolgolyov |
| f0739ca | feat: security hardening — SSRF guard, template sandbox timeout, webhook log prune, auth & backup polish | alexei.dolgolyov |
| 734e5c9 | feat: UX improvements — secure webhooks, locale fixes, dynamic languages, UI polish | alexei.dolgolyov |
| 6b22113 | feat: person excludes for auto-organize rules, backup & restore system | alexei.dolgolyov |
| 6e51164 | refactor: comprehensive consistency review — UI/UX, code quality, functional parity | alexei.dolgolyov |
| 6113a00 | feat: webhook payload history — store and display recent incoming payloads | alexei.dolgolyov |
| c41182f | ci: sync release workflow with CI/CD docs, add manual build | alexei.dolgolyov |
| b803d00 | refactor: comprehensive codebase review — security, performance, quality, UX | alexei.dolgolyov |
| 616b221 | feat: generic webhook provider with JSONPath payload extraction | alexei.dolgolyov |
| 307871c | feat: Google Photos provider backend + API hardening | alexei.dolgolyov |
| 3372761 | feat: collapsible chart, paginator controls, localized template slots | alexei.dolgolyov |
| 21d8ef7 | fix: simplify add-target UX — single EntitySelect click to add | alexei.dolgolyov |
| 6e35926 | feat: default tracker configs, email validation, expandable target links | alexei.dolgolyov |
| d4cb388 | refactor: unify test dispatch with real NotificationDispatcher | alexei.dolgolyov |
| 1a8c95e | refactor: replace favorites checkbox with toggle switch in grid layout | alexei.dolgolyov |
| b1ab5b8 | feat: collapsible accordion slots for template editing UX | alexei.dolgolyov |
| d0bc767 | feat: rich command templates with public links + media text-first flow | alexei.dolgolyov |
| f90cc36 | feat: add API docs link button in sidebar footer | alexei.dolgolyov |
| ad2fd33 | perf: rewrite asset URLs to internal provider URL for LAN fetching | alexei.dolgolyov |
| d8ecb60 | feat: broadcast notification target + UX improvements | alexei.dolgolyov |
| 8cb836e | refactor: provider descriptor registry — eliminate provider-specific hardcoding | alexei.dolgolyov |
| c6bb2b5 | fix: provider-aware collection count labels in tracker list | alexei.dolgolyov |
| 2cc4bf6 | fix: NUT template preview + tracking config event checkboxes | alexei.dolgolyov |
| 68ac13b | feat: NUT (Network UPS Tools) service provider + provider-agnostic UI | alexei.dolgolyov |
| c451f3d | feat: filter entity selectors by global provider filter | alexei.dolgolyov |
| 0702ec7 | fix: dashboard provider card shows filtered count, fix provider update 400 | alexei.dolgolyov |
| 4049efe | fix: UI polish — overflow, placeholders, dashboard provider card | alexei.dolgolyov |
| 1cfa728 | feat: Receiver OOP hierarchy with per-receiver locale resolution | alexei.dolgolyov |
| b3b6c31 | feat: per-chat command toggle, listener name + toggle in bot tab | alexei.dolgolyov |
| 37388c4 | feat: locale-aware notification templates + UX improvements | alexei.dolgolyov |
| 6a559bf | feat: Actions system — scheduled mutations on external services | alexei.dolgolyov |
| 0fde3c6 | feat: add Planka service provider with full notification and command support | alexei.dolgolyov |
| 39bac82 | feat: smart video size warnings + Jinja2 template autocomplete | alexei.dolgolyov |
| 1ac6a17 | feat: Docker deployment + Gitea CI/CD workflow | alexei.dolgolyov |
| e0bae39 | feat: comprehensive code review fixes — security, performance, quality | alexei.dolgolyov |
| 31584c5 | feat: consistent IconGridSelect sizing + descriptions + filter upgrades | alexei.dolgolyov |
| 82e400d | feat: chat language display, disabled EntitySelect items, dev scripts | alexei.dolgolyov |
| e90c128 | fix: pass chat_action from target config to Telegram client | alexei.dolgolyov |
| d8a1af0 | fix: remove all transform from stagger/fade animations | alexei.dolgolyov |
| f9a4ccf | fix: stagger animation breaking position:fixed overlays | alexei.dolgolyov |
| bd254de | fix: remove Card hover transform that breaks fixed-position overlays | alexei.dolgolyov |
| c26b71d | fix: clipboard copy fallback for non-HTTPS contexts | alexei.dolgolyov |
| 7cbba9d | feat: add filtering to all entity list pages | alexei.dolgolyov |
| 63437c1 | refactor: provider-agnostic bot command system + Gitea commands | alexei.dolgolyov |
| 0562f78 | feat: add Scheduler provider + multi-provider UX fixes | alexei.dolgolyov |
| 6d28cfb | feat: add Gitea as webhook-based service provider | alexei.dolgolyov |
| 1167d13 | feat: locale-aware command templates, debounced auto-sync, entity pickers | alexei.dolgolyov |
| 751097b | feat: comprehensive code review fixes + receivers-only architecture | alexei.dolgolyov |
| b525e3e | refactor: rename /telegram-bots route to /bots | alexei.dolgolyov |
| f64ada5 | fix: nav active state — plain path link not highlighted when sibling query-param link matches | alexei.dolgolyov |
| 826be4c | perf: lazy-load @mdi/js to reduce Vite dev server memory usage | alexei.dolgolyov |
| a7829c4 | feat: add filter search to IconGridSelect when item count > 4 | alexei.dolgolyov |
| a9bb912 | feat: replace all select dropdowns with IconGridSelect, fix EN template seed | alexei.dolgolyov |
| db7aac5 | fix: re-create missing EN default template, provider type as IconGridSelect | alexei.dolgolyov |
| 9d3abd9 | feat: add provider type selector to tracking-configs, use IconGridSelect everywhere | alexei.dolgolyov |
| a3a1fe3 | feat: EntitySelect palette-style entity picker, replace select dropdowns | alexei.dolgolyov |
| 86115f5 | fix: search palette triggers highlight, restore CSS keyframe blink | alexei.dolgolyov |
| 88e21e4 | fix: switch highlight to global store instead of URL params | alexei.dolgolyov |
| f47df93 | fix: replace CSS keyframe highlight with direct style pulse for reliability | alexei.dolgolyov |
| 4b59f40 | fix: card highlight animation — kill stagger before highlight, keep animation:none on cleanup | alexei.dolgolyov |
| 637a467 | feat: add search button to sidebar with Ctrl+K shortcut hint | alexei.dolgolyov |
| 4c1d5a8 | fix: prevent stagger animation replay after card highlight ends | alexei.dolgolyov |
| f0f49db | feat: card highlight system for cross-entity navigation | alexei.dolgolyov |
| 227b9c2 | fix: rename bots → telegramBots in targets page to fix undefined reference | alexei.dolgolyov |
| 06b2463 | feat: IconGridSelect, CrossLink, SearchPalette components + entity crosslinks | alexei.dolgolyov |
| 563716f | feat: entity cache system, nav UX improvements, split CLAUDE.md | alexei.dolgolyov |
| 2c740ff | feat: grouped nav tree with badges, dashboard events section with filtered chart | alexei.dolgolyov |
| ddcbfda | feat: remove hardcoded command templates, enforce template system exclusively | alexei.dolgolyov |
| 3e3a6f0 | feat: Discord/Slack/ntfy/Matrix targets, command templates, delete protection, email/matrix bots | alexei.dolgolyov |
| 846d480 | feat: provider-strict configs, slot-based templates, broadcast targets, email bots, command templates | alexei.dolgolyov |
| 371ea70 | feat: fix template preview links, default chat action, update default templates | alexei.dolgolyov |
| 1d445f3 | feat: entity relationship refactor — notification trackers, command system, chat actions | alexei.dolgolyov |
| 0dcca2f | chore: remove accidentally committed pycache | alexei.dolgolyov |
| 03ec9b3 | feat: telegram commands, app settings, bot polling, webhook handling, UI improvements | alexei.dolgolyov |
| 5015e37 | feat: test menu dropdown, split text/media messages, target settings, provider URL links | alexei.dolgolyov |
| 03c5c66 | feat: UX & notification improvements — icons, events, chat names, link validation, templates | alexei.dolgolyov |
| 91e5cd5 | fix: comprehensive API/UI review — 26 bug fixes and improvements | alexei.dolgolyov |
| 9eec21a | feat: port full CRUD API routes and frontend pages from Immich Watcher | alexei.dolgolyov |
| c9cab93 | feat: port original frontend UI to Notify Bridge | alexei.dolgolyov |
| e43c2ed | fix: remove auto-redirect from API client on 401 | alexei.dolgolyov |
| 7d01ae6 | fix: add auth guard to root layout with setup/login redirects | alexei.dolgolyov |
| f9c41fa | fix: local fonts via @fontsource, favicon, autocomplete attrs | alexei.dolgolyov |
| 786fe5e | feat(notify-bridge): phase 9 - HAOS integration planning | alexei.dolgolyov |
| 08814e9 | feat(notify-bridge): phase 8 - integration and wiring | alexei.dolgolyov |
| 9dfd1b7 | feat(notify-bridge): phase 7 - frontend restructuring | alexei.dolgolyov |
| 7f99c89 | feat(notify-bridge): phase 6 - database models and server API | alexei.dolgolyov |
| 16a41ef | feat(notify-bridge): phase 5 - notification system | alexei.dolgolyov |
| f36f070 | feat(notify-bridge): phase 4 - template system | alexei.dolgolyov |
| cc02558 | feat(notify-bridge): phase 3 - Immich service provider | alexei.dolgolyov |
| 3ed0d8c | feat(notify-bridge): phase 2 - core abstractions | alexei.dolgolyov |
| b724447 | feat(notify-bridge): phase 1 - project scaffolding | alexei.dolgolyov |