Updates
Release update notes and feature highlights, with direct links to current configuration and API docs.
v1.6.0-rc.1 Highlights — July 15, 2026
- Notification rules are now a complete control surface — configure delivery routing, audit-backed in-app bell categories, update severity threshold, and per-provider simple/batch templates in one detail panel; preview drafts before saving. Container-unhealthy events are bell-capable, and agent status changes refresh the bell promptly. Docs: Actions & Notifications, Notification rules API.
- The dashboard uses a custom zero-dependency grid — edit-mode mouse/touch reorder, bounded resize, deterministic packing, hidden widgets, responsive layouts, reset, and local or opt-in cross-device persistence replace
grid-layout-plus. Docs: Dashboard customization, UI preference sync. - v1.6 deprecation removals are enforced — only argon2id Basic hashes, HTTPS OIDC discovery,
DD_*environment variables, anddd.*labels are active at runtime. Removed WUD names remain recognized only by the migration CLI. Trigger-taxonomy aliases stay functional for their final warning release but now log aterrorlevel. Docs: Deprecation schedule, Migrating from WUD. - Polling and log-view hot paths are hardened — per-poll repository tag lists are deduplicated, aggregate endpoints avoid full-collection deep clones, large log collections are virtualized, and the 2,000-row live system-log client buffer rolls forward without freezing newest-first views. Docs: Logs.
- Compose updates resolve the active file chain explicitly — configured label, standard Compose project labels, live inspect fallback, then trigger-level
FILE, with multi-file ordering, working-directory resolution, bind-mount mapping, and optional mount-prefix matching. Docs: Docker Compose auto-detection.
Documentation Refresh — v1.5.2
- Podman and Docker socket security docs refreshed — The watcher docs now cover Podman's Docker-compatible API path (#152), direct socket vs proxy/TCP caveats, rootful/rootless socket paths, SELinux troubleshooting, remote Docker over TLS, and OIDC remote watcher auth. This is documentation and compatibility guidance; native Podman support remains a future roadmap item. Docs: Podman Quick Start, Docker Socket Security, Podman FAQ.
- Config and API reference parity — The current docs were reconciled against runtime config schemas, Express routes, and the OpenAPI spec. Configuration tables now match the implemented env vars and defaults more closely, while the API docs cover canonical
/api/v1routes, authentication component endpoints, registry webhook signature auth, notification outbox actions, bulk container updates, backup listing, and auth status aliases. Docs: Configuration, REST API, OpenAPI spec.
Release Highlights — v1.5.1-rc.4 (June 29, 2026)
- Container Version and Uptime fields —
image.softwareVersionnow powers detail panels and the new Version column, while DockerState.StartedAtpowers detail uptime and the optional Uptime column. Docs: Watcher container runtime details, Tag and Version columns. - Release notes expanded — The release-notes popover includes current, available, and intermediate semver releases. Trigger templates can reference
${currentReleaseNotes}alongside${releaseNotes}. Docs: Release notes popover, Trigger template variables, Container release-notes API. - Docker Compose mount-prefix fallback —
DD_ACTION_DOCKERCOMPOSE_{name}_MOUNTPREFIXFALLBACK=truecan match compose paths by trailing<project-dir>/<file>when bind mounts expose a different prefix inside Drydock. Docs: Docker Compose trigger — Mount-prefix fallback. - Maintenance and maturity gates tightened — Auto-apply now respects maintenance windows on every detection path, Docker Hub/GHCR publish dates can clear mature updates immediately, and a changed pending tag/digest restarts the soak clock. Docs: Update eligibility blockers, Maturity filter configuration.
- Upgrade note for v1.5.1+ stores — Newer
dd.jsonfields are tolerated on later downgrades, but rolling back from v1.5.1 to v1.5.0 still requires removingdetails.startedAtandimage.softwareVersion. Docs: Storage. - One-time mature-update burst — On the first poll after upgrade, Docker Hub or GHCR updates that are already older than
maturityMinAgeDaysmay immediately fire notifications or action triggers. Docs: Maturity policy gate.
Release Highlights — v1.5.0 (June 22, 2026)
- Default watcher cron changed to every 6 hours — The default
DD_WATCHER_{name}_CRONvalue changed from0 * * * *(hourly) to0 */6 * * *(every 6 hours) to stay within anonymous Docker Hub and GHCR rate limits on larger inventories. Deployments that setDD_WATCHER_{name}_CRONexplicitly are unaffected. To keep near-real-time detection, setDD_WATCHER_LOCAL_CRON=0 * * * *. Docs: Watchers configuration. - 17 UI locales — The UI now ships with English plus 16 non-English locales: Simplified Chinese, Traditional Chinese, Italian, Spanish, German, French, Brazilian Portuguese, Dutch, Polish, Turkish, Japanese, Korean, Russian, Vietnamese, Ukrainian, and Arabic. Switch language in Config > Appearance. Docs: UI Customization — Language.
DD_LOG_FORMATdefault is nowtext— The official Docker image defaults to human-readable log output. SetDD_LOG_FORMAT=jsonfor structured output consumed by log aggregators. Docs: Logs, FAQ.- Notification outbox — Failed notification deliveries are persisted and retried with exponential backoff. A new Notification outbox page (under Settings) shows pending, delivered, and dead-letter entries with retry and discard actions. Docs: Triggers.
- Diagnostic debug dump — One-click export from Config > Diagnostics collects a redacted snapshot of recent events.
GET /api/v1/debug/dump?minutes=30. Docs: Configuration > Diagnostics, API.
Release Highlights (March 2026)
- Shared data table sizing — Tables now share one sizing model with stable columns, sticky actions, pointer/keyboard resize, double-click autosize, and persisted per-view widths. Containers also folds lower-priority metadata at narrow widths instead of compressing primary identifiers. Docs: UI customization — Data Tables.
- System log live streaming — The Configuration Logs view now supports live WebSocket system logs with level/component filtering and tail backfill.
Docs: Logs configuration, Log API stream endpoint. - Watcher run-time visibility — Watchers expose
metadata.lastRunAtandmetadata.nextRunAt, and the UI surfaces these in the Watchers and Agents views as Last run and Next run.
Docs: Watcher API. - Container list query enhancements — Container list now supports
order, runtimestatusfilters (running,paused, etc.), and watched-statekindfilters (watched,unwatched,all).
Docs: Container API query parameters. - Digest notification mode — Triggers can accumulate updates and flush on schedule with
MODE=digest+DIGESTCRON.
Docs: Trigger modes. - Signed registry webhooks — Added HMAC-verified registry push webhook endpoint for targeted checks.
Docs: Webhooks. - Podman API compatibility improvements — Watchers now handle Podman API-version differences more reliably (including redirect-prone unversioned API paths).
Docs: Watchers Podman setup, Podman FAQ. - Container-action failure toasts — UI now surfaces update/delete failures as visible toast notifications instead of silent failures.
Docs: Container actions. - Unified update-completion toasts (v1.5.0-rc.19) — Update, rollback, and cancel result toasts now appear the moment the operation completes, and are replayed correctly after a reconnect.
Per-container Update Policy (February 9, 2026)
This update adds skip/snooze controls per container to reduce noisy repeated notifications for known-bad versions.
What changed
- Added container-level update policy in store:
skipTagsskipDigestssnoozeUntil
- Added API endpoint:
PATCH /api/v1/containers/:id/update-policy- Actions:
skip-current,clear-skips,snooze,unsnooze,clear
- Added UI controls on container cards:
- Skip current update
- Snooze for 1/7/30 days
- Clear snooze or all policy
Behavior
updateKindstill reflects the detected remote update.updateAvailableis suppressed while policy applies (skip/snooze), and becomes true again when a new unmatched version/digest is detected or snooze expires.
Trigger Coordination Improvements (February 9, 2026)
This update improves how triggers can be coordinated when they share the same trigger name (for example docker.update and discord.update).
What changed
1. Trigger execution ordering
You can now control trigger execution order with:
DD_ACTION_{trigger_type}_{trigger_name}_ORDER / DD_NOTIFICATION_{trigger_type}_{trigger_name}_ORDER
- Lower values run first
- Default is
100 - If two triggers have the same
ORDER, they are sorted by trigger id
Example:
DD_ACTION_DOCKER_UPDATE_ORDER=10
DD_NOTIFICATION_DISCORD_UPDATE_ORDER=20This ensures the Docker update trigger runs before the Discord notification trigger for the same update event.
2. Trigger name aliases in container labels
Container labels dd.action.include / dd.notification.include (and their .exclude counterparts) now accept either:
- full trigger id (
docker.update) - trigger name alias (
update)
Example:
dd.action.exclude=updateThis applies to every action trigger named update (for example docker.update and dockercompose.update).
Each label filters only its own trigger category. dd.action.include / dd.action.exclude never filter notification triggers, and dd.notification.include / dd.notification.exclude never filter action triggers. To exclude both docker.update and discord.update, set both labels:
dd.action.exclude=update
dd.notification.exclude=updateThe legacy labels dd.trigger.include / dd.trigger.exclude still work as aliases until v1.7.0, and apply to both categories — but only for a category whose own scoped label is absent.
3. Shared threshold by trigger name
Triggers sharing the same trigger name can share THRESHOLD automatically:
- if exactly one threshold value is explicitly set among same-name triggers, that value is inherited by the others
- if multiple different threshold values are set, no inheritance is applied
Example:
DD_ACTION_DOCKER_UPDATE_THRESHOLD=minorWith no explicit Discord threshold, discord.update inherits minor.
Recommended setup for "update then notify"
DD_ACTION_DOCKER_UPDATE_THRESHOLD=minor
DD_ACTION_DOCKER_UPDATE_ORDER=10
DD_ACTION_DOCKER_UPDATE_PRUNE=true
DD_NOTIFICATION_DISCORD_UPDATE_ORDER=20
DD_NOTIFICATION_DISCORD_UPDATE_URL=<discord_webhook_url>
DD_NOTIFICATION_DISCORD_UPDATE_SIMPLETITLE=Updated ${container.name}
DD_NOTIFICATION_DISCORD_UPDATE_SIMPLEBODY=Container ${container.name} has been updated from ${container.updateKind.localValue} to ${container.updateKind.remoteValue}