Version 9.x
Release history and details for the WUD 9.x series.
9.0.0 ยท September 11, 2026โ
-
๐ [STORE] Migrate persistence layer from LokiJS to SQL (SQLite) with Drizzle ORM, automatic schema migrations, and transparent legacy data migration
-
๐ [AUTH] Add Role-Based Access Control (RBAC) with 3 roles: Administrator (
admin), Read/Write (rw), and Read-Only (ro) -
๐ [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 -
๐ [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
-
๐ [LOG] Migrate logger from unmaintained Bunyan to Pino with Pino-pretty formatting
-
๐ [UI] Add live logs viewer via Server-Sent Events (SSE)
-
๐ [DOCS] Add interactive UI live demo simulator with homelab mock data
-
๐ [TESTS] Add end-to-end Cucumber API scenarios and Playwright UI tests covering user management, personal API tokens, and full RBAC enforcement
-
๐ [CI] Add automated UI screenshot capture pipeline with Playwright and dark mode support
-
๐ [UI] Add demo mode with mock services for static deployment
-
๐ [REGISTRY] Enable anonymous access by default for Gitlab public registry
-
๐ [API] Refactor REST API to a Design-First architecture:
- Establish
openapi.yamlas the authoritative single source of truth for the entire API contract - Standardize API error payload format (
{ error, message }) across all endpoints
- Establish
-
๐ [DOCS] Integrate interactive OpenAPI API Reference in Docusaurus with "Try it out" explorer, request/response schema inspector, and code samples
-
๐ [REGISTRY] Support direct bearer-token authentication for custom registries
-
๐ [REGISTRY] Add support for Docker Hardened Images (dhi.io) (fixes #875)
-
๐ [UI] Display Docker Compose stack / project name with filtering chip and drawer details (fixes #1205)
-
๐ [TRIGGER] Add support for tags and icon in NTFY trigger (fixes #1216)
-
๐ [TRIGGER] Support real container selection and labels in Trigger Test dialog (fixes #1216)
-
๐ [TRIGGER] Overhaul Home Assistant MQTT integration with update entity, install actions, per-watcher devices, and storm prevention (fixes #1148, #649, #381, #216)
-
๐ง [DOCS] Refresh OpenID Connect (OIDC) and container registry documentation with modern Vue 3 UI screenshots and fix relative asset paths
-
โ ๏ธ [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, legacyWUD_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 viaWUD_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] 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 readmessage. - 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.
- Structured Error Payloads: All error responses now consistently return
-
๐ [WATCHER] Fix docker watcher crashing on startup when
watchdigestdefaultis configured by restoring the property and passing it to registries (fixes #1150) -
๐ [REGISTRY] Fix Gitlab registry provider ignoring configuration defaults (fixes Gitlab registry integration)
-
๐ [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.includeis used (fixes #1164) -
๐ [WATCHER] Fix WUD_WATCHER_LOCAL_WATCHATSTART=false being ignored on empty store (fixes #1184)
-
๐ [TAG] Fix tag comparison when coerced semver versions are equal by falling back to string comparison (fixes #1183)
-
๐ [UI] Fix group by label in containers table (fixes #1182)
-
๐ [WATCHER] Fix Docker events container ID extraction to support Docker 29.8.0+ by reading Actor.ID with fallback to id (fixes #1208)
-
๐ [UI] Persist items-per-page setting in localStorage across page reloads (fixes #1181)
-
๐ [TRIGGER] Fix inverted TLS_VERIFY option in SMTP trigger (fixes #837)
-
๐ [UI] Fix asset loading when navigating between nested configuration routes (fixes #1127)