Skip to main content
Version: 9.x

Version 9.x

Release history and details for the WUD 9.x series.

9.4.1 ยท October 10, 2026โ€‹

  • ๐Ÿ› [TEST] Update Home Assistant expected version to 2026.10.1 (fixes CI packaging)

9.4.0 ยท October 10, 2026โ€‹

  • ๐Ÿš€ [REGISTRY] Add authenticated registry webhooks to immediately check matching watched images through existing update and trigger policies.
  • ๐Ÿš€ [REGISTRY] Skip non-container OCI artifacts (Helm charts) when resolving update candidates (fixes #1363)
  • ๐Ÿš€ [TRIGGER] Add lifecycle events and failure/rollback hooks for container updates (fixes #1008)
  • ๐Ÿš€ [TRIGGER] Add summary mode for Home Assistant MQTT discovery (fixes #1357)
  • ๐Ÿš€ [TRIGGER] Support extras in Gotify trigger (fixes #960)
  • ๐Ÿš€ [TRIGGER] Support granular per-trigger enable/disable container labels (fixes #691)
  • ๐Ÿš€ [UI] Support HTTP(S) and data image URLs for container display icons (#994)
  • ๐Ÿš€ [WATCHER] Include container name in tag transform error logs (fixes #752)
  • ๐Ÿ› [AUTH] Support multiple pending callback states and serialized redirect session checks in OIDC (fixes #896)
  • ๐Ÿ› [REGISTRY] Fix OCIR Bearer token exchange for private repositories (#1367)
  • ๐Ÿ› [TAG] Fix CalVer upgrade comparison when container is already on CalVer (fixes #1361)
  • ๐Ÿ› [TRIGGER] Exclude wud-self-update helper container from watcher scan (fixes #1356)
  • ๐Ÿ› [TRIGGER] Fix container recreation on Docker 29 with containerd store (fixes #1081)
  • ๐Ÿ› [TRIGGER] Handle pinned image digests when updating compose file (fixes #834)
  • ๐Ÿ› [TRIGGER] Prevent auto-update loop when container has no resolvable new tag (fixes #1007)
  • ๐Ÿ› [TRIGGER] Prevent concurrent transactions and rollback archive deletion on the same compose project (fixes #1368)
  • ๐Ÿ› [UI] Add digest option to update kind filter on containers page (fixes #1364)
  • ๐Ÿ› [UI] Add fallback mechanism for copy to clipboard on non-secure contexts and Wayland (fixes #1359)
  • ๐Ÿ› [UI] Fix Live Watch HUD completion under reverse proxies and unhandled watcher errors (fixes #1360)
  • ๐Ÿ› [UI] Restore version position next to current version in container header (fixes #1068)
  • ๐Ÿ› [WATCHER] Fix image ID treated as digest under Podman (fixes #934)
  • ๐Ÿ› [WATCHER] Fix image name and tag resolution for digest-pinned containers in Docker watcher (fixes #1362)
  • ๐Ÿ› [WATCHER] Improve error handling and logging during container image processing (fixes #989)

9.3.0 ยท October 4, 2026โ€‹

  • ๐Ÿš€ [DEPS] Upgrade project dependencies
  • ๐Ÿš€ [TRIGGER] Add automatic rollback on HEALTHCHECK failure (#1300)
  • ๐Ÿš€ [WATCHER] Add include filter and label-based regex matching for Docker watcher (#1336)
  • ๐Ÿš€ [WATCHER] Support dynamic semver variable interpolation in tag filters (fixes #1156)
  • ๐Ÿ› [CONFIGURATION] Fix __FILE secrets stripping trailing newline characters (fixes #1347)
  • ๐Ÿ› [CORE] Fix HTTP proxy fallback and enable Node env proxy support (#1044)
  • ๐Ÿ› [REGISTRY] Add support for authenticated bearer token challenge for custom registries (fixes #1132)
  • ๐Ÿ› [REGISTRY] Fix cohabitation of default anonymous registries and custom instances (fixes #1316, #1321, closes #673)
  • ๐Ÿ› [TRIGGER] Fix Docker trigger reporting success when image pull fails mid-stream (fixes #1324)
  • ๐Ÿ› [TRIGGER] Fix targeted docker compose update for services sharing identical images (fixes #1323)
  • ๐Ÿ› [WATCHER] Fix Kubernetes watcher keeping the old image version after a workload update (fixes #1338)
  • ๐Ÿ› [WATCHER] Fix registry-level digest watching default for stored containers (fixes #1337)
  • ๐Ÿ› [WATCHER] Nomad watcher refreshes container when task image changes (fixes #1341)
  • ๐Ÿ› [WATCHER] Swarm watcher refreshes container when service image changes (fixes #1340)

9.2.1 ยท September 30, 2026โ€‹

  • ๐Ÿš€ [REGISTRY] Add typed support for Elastic Container Registry (docker.elastic.co)
  • ๐Ÿ› [API] Require authentication on /api/events SSE endpoint (GHSA-hgmw-ffwv-wvm2)
  • ๐Ÿ› [REGISTRY] Custom registries now perform the OCI anonymous Bearer token exchange (following the registry's WWW-Authenticate challenge) when no static credentials are configured, fixing pulls from registries like docker.elastic.co that require it even for public images (fixes #1303)
  • ๐Ÿ› [TRIGGER] Fix MQTT connection error logging and trigger status (fixes #1292)
  • ๐Ÿ› [TRIGGER] Home Assistant Install button can now run command/nomad triggers, not just docker/dockercompose, and honors each container's wud.trigger.include/wud.trigger.exclude scoping (see getwud/wud#649)
  • ๐Ÿ› [UI] Fix container list not updating correctly via SSE events
  • ๐Ÿ› [UI] Fix double vertical scrollbar on containers page (#1299)
  • ๐Ÿ› [UI] Fix drawer triggers refresh on container change and SSE base path (fixes #1305)
  • ๐Ÿ› [WATCHER] Refresh container displayName on rename (Fixes #1298)

9.2.0 ยท September 25, 2026โ€‹

  • ๐Ÿš€ [API/UI] Add Server-Sent Events (SSE) support and asynchronous container watch
  • ๐Ÿš€ [CLI] Add one-shot headless mode (WUD_RUN_MODE=oneshot): run wud watch as a single scan with JSON output on stdout, exit codes for CI, --fail-on-update, --update-available, --format=ndjson, and version/--help commands. No database is created. See One-Shot Headless Mode.
  • ๐Ÿš€ [PROMETHEUS] Add option to disable authentication for metrics endpoint (#878)
  • ๐Ÿš€ [REGISTRY] Add custom User-Agent to registry requests (fixes #685)
  • ๐Ÿš€ [TRIGGER] Add Pre and Post Update Hooks support for Docker and Docker Compose triggers
  • ๐Ÿš€ [UI] Display dedicated provider icons for triggers matching documentation
  • ๐Ÿš€ [WATCHER] Add container name regex exclusion filter for Docker watcher (fixes #897, fixes #985)
  • ๐Ÿš€ [WATCHER] Report the remote version label and build date of a digest update: result.version (from org.opencontainers.image.version) and result.created are now resolved from the remote image config, so the API, Prometheus and triggers can describe a digest update as 2.3.6 -> 2.3.7 instead of sha256:8978d2f5 -> sha256:3eb277ac. Each remote digest is resolved at most once and reused while the update stays pending, and the config digest already known from the manifest is reused where possible, so an up-to-date container costs no extra registry request and a pending one costs a single blob fetch
  • ๐Ÿ› [REGISTRY] Fix HTTPS proxy support for outgoing requests (fixes #982)
  • ๐Ÿ› [TAG] Harden tag candidate filtering and SemVer comparison against exotic variants and pre-releases (fixes #1278)
  • ๐Ÿ› [TRIGGER] Gracefully handle missing watcher in Docker and Docker Compose triggers (fixes #1287)
  • ๐Ÿ› [WATCHER] Fix container temporary name persistence when containers are renamed (fixes #770)
  • ๐Ÿ“š [DOCS] Comprehensive guide for remote Docker hosts and multi-host monitoring (fixes #579)

9.1.0 ยท September 19, 2026โ€‹

  • ๐Ÿš€ [REGISTRY] Add icon configuration option for custom registries (fixes #716)
  • ๐Ÿš€ [TRIGGER] Add auto-detection and templating for Docker Compose file paths (fixes #553, fixes #738)
  • ๐Ÿš€ [TRIGGER] Add ondigest configuration option to filter out digest updates (fixes #756)
  • ๐Ÿš€ [TRIGGER] Add selfupdate option to the docker trigger, delegating the swap of the WUD container to a short-lived helper container with health gating and rollback
  • ๐Ÿš€ [TRIGGER] Add support for Telegram topics / message_thread_id (fixes #506)
  • ๐Ÿš€ [UI] Add manual update button for containers with available updates (fixes #88)
  • ๐Ÿš€ [UI] Add snooze functionality to temporarily or indefinitely ignore container updates (fixes #702)
  • ๐Ÿš€ [WATCHER] Add Docker Swarm watcher provider with automated E2E test suite
  • ๐Ÿš€ [WATCHER] Add HashiCorp Nomad watcher provider with full E2E test suite
  • ๐Ÿš€ [WATCHER] Add Kubernetes watcher provider for Deployments, StatefulSets, DaemonSets, and CronJobs
  • ๐Ÿš€ [WATCHER] Add update delay / cool-down period before triggering updates (fixes #507)
  • ๐Ÿš€ [WATCHER] Standardize Kubernetes annotations and Nomad metadata on canonical getwud.app/ prefix with short aliases and unified workload documentation
  • ๐Ÿ› [LOG] Fix log level filtering dropping debug and trace logs when using multistream (fixes #1265)
  • ๐Ÿ› [REGISTRY] Fix default ecr.public provider matching for public.ecr.aws images (fixes #1251)
  • ๐Ÿ› [TAG] Fix SemVer ordering for 4-part numeric tags (e.g. LinuxServer) and numeric fallback comparison (fixes #1261)
  • ๐Ÿ› [TRIGGER] Fix docker & dockercompose triggers masking new image env/labels with stale container defaults (#1201)
  • ๐Ÿ› [TRIGGER] Fix the docker trigger leaving WUD stopped when it updated its own container; it now refuses by default with an actionable error instead of failing silently (fixes #1241, #484)
  • ๐Ÿ› [TRIGGER] Prevent HTTP 500 error when manually running docker or dockercompose triggers on containers with no available update (fixes #1254)
  • ๐Ÿ› [UI] Fix infinite OIDC redirect loop when user is denied access (fixes #1258)
  • ๐Ÿ› [WATCHER] Respect explicit watch digest label for semver tags (fixes #1247, fixes #1191)
  • ๐Ÿ› ๏ธ [DOCS] Add CSpell and Markdownlint quality gates for documentation
  • ๐Ÿ› ๏ธ [DOCS] Document trigger template variables and multi-host watcher placeholder (fixes #421)

9.0.2 ยท September 12, 2026โ€‹

  • ๐Ÿš€ [AUTH] Add rogroup and defaultrole support to OIDC authentication provider (fixes #1232)
  • ๐Ÿš€ [COMMUNITY] Add GitHub Sponsors integration across repository and documentation
  • ๐Ÿ› [AUTH] Hide basic strategy from login when no local users exist in database
  • ๐Ÿ› [DOCS] Fix live demo chunk loading, footer API link, and duplicate version badges
  • ๐Ÿ› [STORE] Fix container query filtering on updateAvailable and hydrated properties (fixes #1197)
  • ๐Ÿ› [TESTS] Fix getVersion test dynamic package.json assertion and add test gates to release script
  • ๐Ÿ› [UI] Fix application version display in UI, mock data, and store
  • ๐Ÿ“ [DOCS] Clarify OIDC admin group configuration and remove invalid global env var reference (fixes #1226)
  • ๐Ÿ“ [DOCS] Update documentation URLs in registry error logs to point to getwud.app (fixes #1233)
  • ๐Ÿ› ๏ธ [RELEASE] Improve release script for non-major versions and prune unreleased changelog from doc snapshots
  • ๐Ÿงช [TESTS] Add end-to-end MQTT and Home Assistant discovery test suite

9.0.0 ยท September 11, 2026โ€‹

  • โš ๏ธ [API] Standardize REST API contract and error responses:
    • Structured Error Payloads: All error responses now consistently return { "error": "<ErrorType>", "message": "<Details>" }. Custom scripts or integrations parsing legacy flat error strings (e.g. { "error": "Error description..." }) need to be updated to read message.
    • OpenAPI Schema Alignment: Endpoints and payloads are now strictly aligned with the OpenAPI specification (/api/openapi.yaml).
    • Authentication: External REST API requests now use standard HTTP Basic Authentication (basicAuth). Direct cookie-based session authentication is no longer exposed as an external API authentication scheme.
  • โš ๏ธ [AUTH] Anonymous authentication removed: WUD now enforces mandatory authentication. At least one administrator account must be provisioned (via WUD_AUTH_ADMIN_USER/WUD_AUTH_ADMIN_PASSWORD, legacy WUD_AUTH_BASIC_*, or an OIDC provider with an admin group). WUD will fail-fast on startup if no administrator is available.
  • โš ๏ธ [AUTH] Deprecate static Basic Authentication environment variables (WUD_AUTH_BASIC_*): Administrators should be bootstrapped via WUD_AUTH_ADMIN_USER/WUD_AUTH_ADMIN_PASSWORD (or via OIDC admin groups), and local users should be managed dynamically via the Web UI (Configuration > Users).
  • ๐Ÿš€ [API] Refactor REST API to a Design-First architecture:
    • Establish openapi.yaml as the authoritative single source of truth for the entire API contract
    • Standardize API error payload format ({ error, message }) across all endpoints
  • ๐Ÿš€ [AUTH] Add Database-backed User Management in Web UI (Configuration > Users) with role management and secure password resets
  • ๐Ÿš€ [AUTH] Add Personal API Tokens with granular scopes (read, write) and optional expiration dates for programmatic REST API access
  • ๐Ÿš€ [AUTH] Add Role-Based Access Control (RBAC) with 3 roles: Administrator (admin), Read/Write (rw), and Read-Only (ro)
  • ๐Ÿš€ [CI] Add automated UI screenshot capture pipeline with Playwright and dark mode support
  • ๐Ÿš€ [DOCS] Add interactive UI live demo simulator with homelab mock data
  • ๐Ÿš€ [DOCS] Integrate interactive OpenAPI API Reference in Docusaurus with "Try it out" explorer, request/response schema inspector, and code samples
  • ๐Ÿš€ [LOG] Migrate logger from unmaintained Bunyan to Pino with Pino-pretty formatting
  • ๐Ÿš€ [OIDC] Add automatic user onboarding and role synchronization from Identity Provider group claims (admingroup, rwgroup, groupsclaim)
  • ๐Ÿš€ [PROFILE] Add User Profile page with theme preference synchronization (dark/light) across sessions, password change, and API token management
  • ๐Ÿš€ [REGISTRY] Add support for Docker Hardened Images (dhi.io) (fixes #875)
  • ๐Ÿš€ [REGISTRY] Enable anonymous access by default for Gitlab public registry
  • ๐Ÿš€ [REGISTRY] Support direct bearer-token authentication for custom registries
  • ๐Ÿš€ [STORE] Migrate persistence layer from LokiJS to SQL (SQLite) with Drizzle ORM, automatic schema migrations, and transparent legacy data migration
  • ๐Ÿš€ [TESTS] Add end-to-end Cucumber API scenarios and Playwright UI tests covering user management, personal API tokens, and full RBAC enforcement
  • ๐Ÿš€ [TRIGGER] Add support for tags and icon in NTFY trigger (fixes #1216)
  • ๐Ÿš€ [TRIGGER] Overhaul Home Assistant MQTT integration with update entity, install actions, per-watcher devices, and storm prevention (fixes #1148, #649, #381, #216)
  • ๐Ÿš€ [TRIGGER] Support real container selection and labels in Trigger Test dialog (fixes #1216)
  • ๐Ÿš€ [UI] Add demo mode with mock services for static deployment
  • ๐Ÿš€ [UI] Add live logs viewer via Server-Sent Events (SSE)
  • ๐Ÿš€ [UI] Display Docker Compose stack / project name with filtering chip and drawer details (fixes #1205)
  • ๐Ÿ› [REGISTRY] Fix Gitlab registry provider ignoring configuration defaults (fixes Gitlab registry integration)
  • ๐Ÿ› [TAG] Fix tag comparison when coerced semver versions are equal by falling back to string comparison (fixes #1183)
  • ๐Ÿ› [TRIGGER] Fix inverted TLS_VERIFY option in SMTP trigger (fixes #837)
  • ๐Ÿ› [UI] Fix asset loading when navigating between nested configuration routes (fixes #1127)
  • ๐Ÿ› [UI] Fix group by label in containers table (fixes #1182)
  • ๐Ÿ› [UI] Persist items-per-page setting in localStorage across page reloads (fixes #1181)
  • ๐Ÿ› [WATCHER] Fix Docker events container ID extraction to support Docker 29.8.0+ by reading Actor.ID with fallback to id (fixes #1208)
  • ๐Ÿ› [WATCHER] Fix WUD_WATCHER_LOCAL_WATCHATSTART=false being ignored on empty store (fixes #1184)
  • ๐Ÿ› [WATCHER] Fix docker watcher crashing on startup when watchdigestdefault is configured by restoring the property and passing it to registries (fixes #1150)
  • ๐Ÿ› [WATCHER] Fix docker watcher ignoring container labels when registry provider is unknown (fixes #1124)
  • ๐Ÿ› [WATCHER] Fix tag listing exclusion for non-semver tags breaking digest updates when wud.tag.include is used (fixes #1164)
  • ๐Ÿ”ง [DOCS] Refresh OpenID Connect (OIDC) and container registry documentation with modern Vue 3 UI screenshots and fix relative asset paths