Features
Network Management
Docker networks now have a full management UI instead of only being reachable through the CLI. From the Networks tab in the Docker dashboard you can create, inspect, and delete bridge or overlay networks per server, with MTU, internal/attachable flags, IPv4/IPv6, and custom IPAM (subnet/gateway/IP range) exposed in the creation form.
Networks also attach per-service now. Every application and compose service joins the shared dokploy-network by default — you can detach it and attach only the networks that service actually needs, applied on the next deploy. This is also why Isolated Deployment is deprecated: it's still available in Compose's advanced settings, but attaching/detaching networks per service covers the same use case declaratively, without breaking on restarts.
DNS Provider Integration
You can now connect Cloudflare or AWS Route53 and let Dokploy manage DNS records for your domains directly. When you add a domain, Dokploy creates the record for you instead of making you switch tabs and wait for propagation to find out whether you typed it correctly. Apex domains are handled too — @ resolves to the zone's apex automatically.
Vault Providers for Environment Secrets
Environment variables can now be resolved at deploy time from an external secret manager, using a unified reference syntax: DATABASE_PASSWORD=${{vault.production.db_password}}. The value is never stored in Dokploy — it's fetched from your provider when the deployment runs, so rotating a secret in the vault takes effect on the next deploy with no changes on the Dokploy side. Supported providers: HashiCorp Vault/OpenBao, Infisical, AWS Secrets Manager, Doppler, and Scaleway Secret Manager.
Concurrent Builds
For the first two years, Dokploy used a single global build queue across every server. Each server now has its own dedicated queue.
Unified Docker Dashboard
Docker management used to be spread across separate pages. /dashboard/docker is now a single hub: Containers, Volumes, Networks, Events, Images, Disk Usage, Health, and Swarm, all under one set of tabs.
Volumes now has a built-in file explorer, so you can browse volume contents without SSH-ing into the server.
Images shows every image on the host with size and age, so you can spot the ones worth pruning before reaching for docker system prune.
Events streams what the Docker daemon reports in real time — container starts/stops, image pulls, network connects — filterable and paginated.
Disk Usage breaks down images, containers, volumes, and build cache with reclaimable space called out for each.
Health runs a read-only diagnostic over SSH — inotify limits, disk, memory/CPU reservations, per-network IP usage — the same checks we used to walk people through manually when a deploy mysteriously stalled.
Overview Dashboard
Projects now open to an overview page that summarizes Services, Backups, and Domains at a glance, with Deployments moved into its own tab.
SCIM 2.0 Provisioning (Enterprise)
Users and groups now sync automatically from your identity provider, so deprovisioning in Okta or Entra deprovisions in Dokploy. SCIM-provisioned users also link correctly through SSO now, and sign-in errors surface instead of failing silently.
Session Management
A new page lists your active sessions and lets you revoke them individually — useful if you've logged in from a machine you no longer control.
Passkey Support
You can now sign in without a password using your device's biometrics, security key, or password manager. Add a passkey from Settings → Profile, and it shows up right on the login screen as a "Sign in with Passkey" option alongside email/password and SSO.
Default Organization Role
Admins can set a default role that's applied automatically to new members joining an organization, instead of remembering to downgrade every invite after the fact.
Domain Enable/Disable Toggle
Domains can now be disabled without deleting them. The route comes out of Traefik but the configuration stays intact, so you can pull a domain temporarily and bring it back without re-entering certificates, paths, and middleware.
Bug Fixes
A few fixes worth calling out on their own:
- Command injection via compose domain
serviceName— a crafted service name could escape into the host shell. - SSRF via Route53 endpoint override — the endpoint override has been removed.
- Traefik updated from v3.6.7 to v3.6.25, pulling in upstream security patches.
- Postgres 100-argument limit was breaking rollback, schedule, port, and volume backup lookups on instances with enough rows — fixed.
- Backups ran the database dump twice per backup and could leave partial uploads behind on failure — now runs once and cleans up after itself.
- MySQL/MariaDB restores could target the wrong database because
USE/CREATE DATABASEstatements in the dump overrode the selected one — now stripped. - Docker cleanup could hang silently on a false-positive busy-wait match.
This is in addition to the security batch shipped in v0.29.13 (~16 command-injection and cross-org IDOR fixes) and v0.29.14 (20 backported fixes) — if you're upgrading straight from v0.29.0 or skipped those patch releases, v0.30.0 covers all of it.
What's Changed
- fix(ui): add cursor pointer style for buttons by @SteadEXE in #4890
- fix: prevent environment form from resetting while editing by @veksen in #4626
- Feat/add network management by @Siumauricio in #3774
- fix(ui): make interactive icons inside badges clickable again by @narcisonunez in #4929
- chore: remove leftover Redis infrastructure code by @Siumauricio in #4930
- fix: avoid postgres 100-argument limit in findRollbackById by @dmtrTm in #4924
- fix: avoid postgres 100-argument limit in schedule, volume backup and port queries by @Siumauricio in #4931
- feat(icon): enhance icon management for services by @Siumauricio in #4932
- fix(domains): don't render CDN info message as an error in DNS tooltip by @AbiRaditya in #4911
- fix(ui): persist trigger type selection in GitHub provider forms by @narcisonunez in #4937
- fix(ui): resolve unclickable watch path removal button by @imrja8 in #4782
- fix(ui): prevent collapsed avatar clipping by @azizbecha in #4948
- fix(ui): scope deployment delete loading by @azizbecha in #4947
- fix(ui): keep dropdown menus open on window blur by @Siumauricio in #4953
- fix(ui): show real status code on error page by @Siumauricio in #4954
- fix(preview-deployment): refetch github provider before authenticating by @CyrilBIENNE in #4933
- fix(schedule): return deployment metadata from runManually and fail early on missing container by @Siumauricio in #4955
- feat(auth): add passkey support by @Siumauricio in #4957
- fix(application): remove preview deployments when deleting an application by @Siumauricio in #4959
- fix: invalidate railpack build cache when env changes by @rnkp755 in #4557
- feat(networks): add MTU option to network creation by @Siumauricio in #4960
- fix: resolve environment variables on application rollback by @dmtrTm in #4923
- fix(requests): guard RequestHost before filtering to avoid crash on malformed logs by @narcisonunez in #4966
- fix(ui): widen restore backup dialog to match other backup dialogs by @Siumauricio in #4971
- feat: add baseUrl to github provider to support github enterprise urls by @narcisonunez in #4944
- fix(webhook): include added and removed files in watchPaths validation by @rifatdinc in #4772
- feat(ci): add hotfix cherry-pick and release workflows by @Siumauricio in #4977
- Hotfix v0.29.14: backport 20 bug fixes by @Siumauricio in #4978
- fix(domain): allow single-label hostnames without a TLD by @narcisonunez in #4972
- fix(ci): push hotfix cherry-picks with PAT to satisfy branch rules by @Siumauricio in #4982
- fix(ci): create release tags on the pushed commit instead of default branch by @Siumauricio in #4983
- fix: preserve special characters in Compose-generated .env values by @narcisonunez in #4962
- fix(ci): pin pnpm and strip v prefix in sync-version job by @Siumauricio in #4984
- fix: add unzip to arch server set up by @daniel-abramov in #4176
- fix: preserve server schedule failures through tee pipeline by @Gabrielgvl in #4122
- fix: use lazy initializer for useState with function calls by @karyanayandi in #3867
- fix(ui): expose isStaticSpa toggle for nixpacks + publish directory by @elisiumm in #4994
- fix(logs): don't classify explicit non-error key/values as error by @Siumauricio in #4824
- fix(logs): respect log level explicitly declared by structured loggers by @fcsouza in #4624
- fix: Block I/O and Network I/O monitoring charts not populating by @Siumauricio in #4998
- fix: pin Traefik routing to the isolated network on isolated deployments by @Siumauricio in #5004
- fix: allow docker compose command chaining by @ews-pgasser in #4997
- fix: invalid docker host while using docker desktop by @rpoetrap in #4171
- fix: add createEnvFile toggle to Compose, mirroring Application by @narcisonunez in #5008
- fix: warn on postgres image change when the implied data directory mismatches the mounted volume by @Siumauricio in #5005
- fix: allow Option/Alt composed characters in terminals on macOS by @Siumauricio in #5017
- fix: compose preview not reflecting patches by @Siumauricio in #5018
- fix(ui): update favicon dynamically based on app theme by @GuillaumeLecomte1 in #4225
- fix: disable recharts animation on monitoring charts by @Siumauricio in #5019
- fix: show stack containers running on worker nodes by @Siumauricio in #5024
- fix: run database dump once per backup and clean up partial uploads on failure by @Siumauricio in #5025
- feat: unified Docker dashboard with volumes section and file explorer by @Siumauricio in #5027
- feat: third-party vault providers for environment secrets (HashiCorp Vault/OpenBao, Infisical, AWS, Doppler, Azure) by @Siumauricio in #5037
- fix: exclude node_modules/.next from biome scanner, bump to 2.5.7 by @alsmadi99 in #5035
- fix(notifications): send server threshold alerts through email, resend, gotify and ntfy by @Siumauricio in #4969
- fix(restore): drop USE/CREATE DATABASE statements so mysql/mariadb restores target the selected database by @Siumauricio in #4967
- fix(ci): generate OpenAPI spec from the release commit in sync-version by @Siumauricio in #4985
- fix(notifications): use real server name in remote threshold alerts by @PixelPerfector in #4791
- fix(security): command injection via compose domain serviceName (host escape) by @Siumauricio in #4872
- fix(editor): consistent YAML auto-indent on newline by @Siumauricio in #4828
- MariaDB svg color updated: in Dark theme its not visible properly by @techdawnarea in #4820
- feat: upgrade to TypeScript 7 and Next.js 16.3 by @Siumauricio in #5040
- refactor: move cluster nodes into Docker dashboard as a Swarm sub-tab by @Siumauricio in #5041
- feat(organization): default role for new members by @Siumauricio in #5042
- feat(domains): add toggle to enable/disable domains by @gentslava in #4697
- fix(security): update Traefik from v3.6.7 to v3.6.25 by @andershermansen in #4584
- feat(vault): add Scaleway Secret Manager provider by @Quentin-Gillet in #5046
- fix: invalid replacement placeholder in redirect form by @Siumauricio in #5050
- fix: docker cleanup hangs silently on false-positive busy-wait match by @Siumauricio in #5051
- feat: make organization selector larger and searchable by @Siumauricio in #5052
- fix: don't cancel schedule deployments running outside the panel process on restart by @Siumauricio in #5053
- fix: deploy monitoring as a swarm service instead of a standalone container by @Siumauricio in #5055
- ci: update pull request actions for node 24 by @agentHits in #4773
- chore: enforce 3-day minimum release age for dependencies (supply-chain hardening) by @vikyw89 in #4679
- feat: add DNS provider integration (Cloudflare, AWS Route53) by @Siumauricio in #5057
- fix: remove Route53 endpoint override (SSRF) and fix CI build by @Siumauricio in #5058
- feat: add Docker events tab to docker dashboard by @Siumauricio in #5059
- fix: disable minimumReleaseAge, it broke the Docker build on unrelated AWS SDK deps by @Siumauricio in #5060
- feat: add Images and Disk Usage tabs to docker dashboard by @Siumauricio in #5061
- fix(compose): preserve raw remote mounts by @yusoofsh in #4795
- fix: add sourceType to apiCreateCompose and apiCreateApplication by @elijahdev0 in #4710
- fix: tooltip incorrectly lists volumes among Daily Cleanup targets by @teoobarca in #4328
- FIX: replicaSets default to false after updating mongo due to default by @linkthai in #4543
- fix: add clipboard addon to docker container terminal by @Souvik-Cyclic in #5066
- fix: lock sidebar-inset scroll while a modal is open by @Siumauricio in #5069
- feat: add session management page (list active sessions + revoke) by @daniloneto in #4841
- fix(auth): link SCIM-provisioned users through SSO and surface sign-in errors by @Siumauricio in #5071
- fix: open deployments tab when opening a service from the deployments list by @TpmyCT in #4583
- fix(ui): prevent layout shift in log counter using tabular-nums by @difagume in #4317
- fix(gitlab): handle missing expires_in in OAuth token response by @Siumauricio in #5075
- feat: add Docker Health diagnostics tab by @narcisonunez in #5072
- feat: add Overview dashboard (Services, Backups & Domains tabs) by @narcisonunez in #5076
- feat: enable Google Tag Manager on cloud version only by @Siumauricio in #5083
- feat: track cloud sign_up event in dataLayer by @Siumauricio in #5084
- feat: interactive feature showcase on the signup panel by @Siumauricio in #5085
- 🚀 Release v0.30.0 by @github-actions[bot] in #4979
New Contributors
- @veksen made their first contribution in #4626
- @narcisonunez made their first contribution in #4929
- @dmtrTm made their first contribution in #4924
- @AbiRaditya made their first contribution in #4911
- @CyrilBIENNE made their first contribution in #4933
- @rnkp755 made their first contribution in #4557
- @rifatdinc made their first contribution in #4772
- @daniel-abramov made their first contribution in #4176
- @Gabrielgvl made their first contribution in #4122
- @elisiumm made their first contribution in #4994
- @fcsouza made their first contribution in #4624
- @ews-pgasser made their first contribution in #4997
- @rpoetrap made their first contribution in #4171
- @PixelPerfector made their first contribution in #4791
- @techdawnarea made their first contribution in #4820
- @andershermansen made their first contribution in #4584
- @Quentin-Gillet made their first contribution in #5046
- @teoobarca made their first contribution in #4328
- @linkthai made their first contribution in #4543
- @Souvik-Cyclic made their first contribution in #5066
- @daniloneto made their first contribution in #4841
- @TpmyCT made their first contribution in #4583
Full Changelog: v0.29.13...v0.30.0

















