v1.7.0
Full Changelog: v1.7.0-rc.24...v1.7.0
[1.7.0] — 2026-10-19
Consolidates the 1.7.0-rc.1 … 1.7.0-rc.24 prereleases. Users upgrading from
1.6.x get everything below; users already on 1.7.0-rc.24 receive no additional
runtime changes.
Added
- Container dependency ordering (discussion #219).
dd.depends_onanddd.depends_on.actionlabels, plus Compose-deriveddepends_ondetection (including when drydock runs in a container), feed a dependency graph. Accepted bulk updates run wave by wave, restart-only dependents are marked, and a dependency-group bulk update needs destructive-action confirmation and binds to its own preview. The container list carriesdependencyCountanddependentCountfor the UI badges. - Action-policy resolution on the API and UI.
GET /api/v1/containersand the SSE container payloads include anactionPolicyobject (blocked,manualorauto), shown as a localized badge with tooltips. - Installable PWA, clickable port links, container uptime and keyboard shortcuts.
/focuses search,Escapecloses it and?opens a shortcut reference. - Debounced container discovery. Docker's transient rename aliases during a recreate are no longer registered as containers (#156).
- Portwing improvements.
DD_PORTWING_POLL_INTERVALsets the Edge refresh interval (#688), edge tunnels carry non-JSON Docker response bodies, and edge exec completion reasons reach the controller (#635). release-cut.ymlcan cut a maintenance patch from a retired dev branch through the optionalsource_refinput, without touching the cosign signing identity.
Changed
- BREAKING: Home Assistant MQTT topics include an
agent/<name>segment by default for agent-owned containers. Announced in v1.5.x. SetDD_NOTIFICATION_MQTT_<name>_HASS_AGENTTOPICSEGMENT=falseto keep the old layout temporarily. Old retained discovery entities are not cleaned up and need removing by hand. - BREAKING:
trigger-excludedandtrigger-not-includedare hard blockers. This ends the v1.5.0 to v1.6.x soft-severity grace period (seeDEPRECATIONS.md). - A stable release shows its own version. A GA image is the last release candidate promoted unchanged, so it now reports the base version in the UI, the API and Home Assistant, and keeps the full build identity in
build. Release-gated store migrations compare against the base version. - Faster login screen. The oversized logo asset is no longer inlined into the entry chunk.
- Turning on security scanning no longer disconnects open browser tabs each scan cycle. The container SSE events no longer carry the per-CVE arrays.
- Release and CI hardening. The cut checks base image pins and published image architecture before signing, DAST and workflow-lint gates fail closed, ZAP alerts are keyed per scanned site, the weekly DAST scans can finish, and README badges read live. None of this changes the shipped image.
- Dropped the trivy qlty plugin in favor of Grype, and documented the container SBOM attestation in the release-verification guide.
Removed
- BREAKING: the
DD_TRIGGER_*environment prefix and thedd.trigger.includeanddd.trigger.excludelabels. Deprecated in v1.5.0, they now fail startup. UseDD_ACTION_*,DD_NOTIFICATION_*and thedd.action.*anddd.notification.*labels. curlis gone from the image. The image healthcheck has used the compiled/bin/healthcheckbinary since v1.5.0, so only user-defined HEALTHCHECK overrides that callcurlare affected.- The unversioned
GET /api/auth/methodsalias. It returns 410 like the rest of the unversioned/api/*surface. UseGET /api/v1/auth/status.
Fixed
- Update checks and registry lookups report their real result. A failed digest check surfaces as unknown instead of "Up to date", nested OCI image indexes resolve to the real manifest, bare build-number tags no longer outrank real versions, and digest watching is re-derived every scan so older rows stop sitting at Current. Tag family matching requires the variant suffix to match, older LinuxServer builds are no longer offered, and repositories with more than 1000 tags page correctly, including on AWS ECR Public.
- Notifications fire once per update. Cron scans are single-flight, a
once=truetrigger no longer re-fires when a rate-limited digest lookup changes the history hash, a manual check during a scan can't double-notify, and an unsettled reservation no longer holds its key for the life of the process (#972). Monthly and longer schedules no longer expire scans after 1 ms. - Updates and rollbacks deploy what was verified. Docker and Compose updates pin the pulled image by digest for verification, scanning and the replacement create. Compose runs its security gate before it stops anything, rollbacks restore the recorded digest or backup image, and a rolled-back container no longer picks up an entrypoint or command from the newer image.
- A same-tag update no longer leaves the old image's defaults on the new container, and an entrypoint or command the image left unchanged is no longer pinned as explicit (#1351). A disabled healthcheck no longer health-gates an update (#1284).
- Update policy survives agent and controller handoffs, recreation and self-update. Pruning clears policy only when it should, policy is stashed by Docker id when a container moves to an agent, and one failing local watcher no longer deletes another's records (#1280, #565).
- Agents and Portwing. A healthy agent with a large inventory can reconnect, one malformed container no longer zeroes an inventory sync, a disconnected agent's in-flight setup can't replace its reconnected owner, and duplicate agent keys return 409 instead of a server error.
- Store and startup. The session store no longer shares
/store/dd.jsonwith the main store and erases its data, startup no longer crashes withEPERMwhen the volume forbidschmod, andDD_AGENT_ALLOW_INSECURE_SECRETis no longer parsed as an agent namedallow. - Self-update and recovery. A self-update no longer restarts the controller mid-update of another container, a health-verified replacement is no longer rolled back or destroyed, and startup recovery no longer marks an untouched container as updated.
- Bulk vulnerability scans finish and report accurately, including large fleets, a failing notification, and a large Trivy report (
DD_SECURITY_TRIVY_MAXOUTPUTBYTES, default 64 MB) (#1356). - WebSocket and proxy. Log-stream upgrades behind a TLS-terminating proxy no longer 403 when
X-Forwarded-Protois absent, andwsorwssis accepted. OIDC login no longer bounces back to the login page. - Home Assistant. Agent entities receive state when MQTT agent topic segmentation is on (#1139).
- Images. The arm64 image published for rc.4 through rc.10 was an x86-64 image with an arm64 label. The base pins now name multi-platform indexes and the cut checks each platform's binaries (#1021). The shipped image carries the correct source revision.
- UI. Row selection highlights in seven views, status indicators have accessible names, the notification outbox shows the selected tab, removing a container from its full-page view no longer blanks the screen, the dashboard no longer shows a Local Docker host when none is configured, and the 16 non-English locales are properly translated.
- Input validation. Non-numeric or empty
tailandsinceon the log endpoints and numeric-prefixlimitandoffseton the audit endpoint are rejected instead of misread. - Website and demo. Docs pages that returned 500 render again, docs search no longer returns every archived version at once, and the Get Started snippets deploy an instance that becomes healthy.
Security
- Agent ownership is enforced everywhere. Bulk and incremental ingestion, the prune ahead of it, update and removal all verify that the reporting agent owns the container id it names (#922, #904).
- Image lifecycle hook labels are not run or carried over.
dd.hook.*labels only take effect when set on the container itself, and a recreated container leaves out hook labels that match its image. - Credential exposure closed. The debug dump, container action responses, error responses, the HTTP trigger log and preview errors redact secrets, including
*_PATvalues and credentials in URLs. The dump requires audit and a rate limit and no longer serves raw environment variables. Registries no longer match lookalike hostnames, thirteen registries use their configuredauthfor pulls, and the compose action can't be pointed at another repository'simage:. - Login and sessions. Lockout keys on the credentials presented, concurrent password verification is capped, and basic-auth requests without a cookie no longer persist unreaped 30-day session rows.
- Command trigger and input limits. The env sanitizer blocks argument injection, bulk scan requests are capped, and a slow SSE client can't make drydock retain unbounded bytes.
- Image and package patches. Alpine zlib is patched for CVE-2026-85091, libexpat is 2.8.5-r0 for CVE-2026-93990, OpenSSL is 3.5.9-r0, and the base images are rolled to clear six HIGH OpenSSL CVEs.
- Dependency and website updates. Undici, Nodemailer 10, gRPC, Moment, Joi, compression, fast-uri, ip-address, brace-expansion, DOMPurify and
fflateare updated for published advisories, and the website moves to Next.js 16.3.8. The demo site sends a full Content-Security-Policy and security-header set.
Accessibility
- Dark themes meet the WCAG 2.2 contrast minimum for normal text. Secondary text, tone colors, accents, toasts, update-status rows and primary button labels were raised to at least 4.5:1 (#850, #865).
Documentation
- Docs audited against the code. README,
DEPRECATIONS.md, configuration, API, monitoring and agents pages were corrected, the feature comparison was refreshed, and the agents page now covers per-agent registry configuration and TLS examples.
Retained-line GA: release metadata comes from dev/v1.7; the signed candidate artifacts and their original build-provenance attestation are verified and reused without rebuilding.