Download Latest Version ddev_windows_amd64_installer.v1.25.4.exe (38.1 MB)
Email in envelope

Get an email when there's a new version of DDEV

Home / v1.25.4
Name Modified Size InfoDownloads / Week
Parent folder
checksums.txt 2026-09-02 1.7 kB
ddev-wsl2_1.25.4_linux_amd64.deb 2026-09-02 4.6 MB
ddev-wsl2_1.25.4_linux_arm64.deb 2026-09-02 4.2 MB
ddev-wsl2_1.25.4_linux_amd64.rpm 2026-09-02 4.6 MB
ddev-wsl2_1.25.4_linux_arm64.rpm 2026-09-02 4.2 MB
ddev_1.25.4_linux_amd64.deb 2026-09-02 18.9 MB
ddev_1.25.4_linux_amd64.rpm 2026-09-02 18.9 MB
ddev_1.25.4_linux_arm64.deb 2026-09-02 17.2 MB
ddev_1.25.4_linux_arm64.rpm 2026-09-02 17.2 MB
ddev_linux-arm64.v1.25.4.tar.gz 2026-09-02 17.2 MB
ddev_linux-amd64.v1.25.4.tar.gz 2026-09-02 18.9 MB
ddev_windows-amd64.v1.25.4.zip 2026-09-02 19.5 MB
ddev_windows_arm64_installer.v1.25.4.exe 2026-09-02 34.4 MB
ddev_windows_amd64_installer.v1.25.4.exe 2026-09-02 38.1 MB
ddev_macos-amd64.v1.25.4.tar.gz 2026-09-02 19.9 MB
ddev_macos-arm64.v1.25.4.tar.gz 2026-09-02 18.0 MB
ddev_shell_completion_scripts.v1.25.4.tar.gz 2026-09-02 20.5 kB
ddev_windows-arm64.v1.25.4.zip 2026-09-02 17.5 MB
README.md 2026-09-02 35.6 kB
v1.25.4 source code.tar.gz 2026-09-02 24.7 MB
v1.25.4 source code.zip 2026-09-02 28.7 MB
Totals: 21 Items   327.0 MB 1

Installation

See the installation instructions for details, but it's easy:

  • macOS: brew install ddev/ddev/ddev or just brew upgrade ddev.
  • Linux: Use sudo apt-get update && sudo apt-get install ddev, see apt/yum installation ⚠️ Linux apt/yum users: packages are now served from Cloudsmith (packages.ddev.com). Your existing Gemfury (pkg.ddev.com) setup keeps working, but please re-run the Linux installation steps to switch over.
  • Windows and WSL2: Download the Windows Installer; you can run it for install or upgrade. ⚠️ Traditional Windows users (not WSL2): If needed, the installer will prompt you to uninstall the previous system-wide installation to avoid conflicts with the new per-user installation.
  • Consider ddev delete images or ddev delete images --all after upgrading to free up disk space used by previous Docker image versions. This does no harm.
  • Consider ddev config --auto to update your projects to current configuration.

Highlights

  • Database seeding and reset: ddev start --seed-snapshot=<name-or-path> fills a new database from any snapshot, and ddev start --reset-database deletes the current database and starts fresh, see Snapshots and Database Seeding below
  • MySQL 9.7 LTS support, and MySQL 8.0/8.4 now build from Docker Hardened Images (dhi.io/mysql) instead of bitnamilegacy/mysql, which gets no updates
  • Env files: .env.local for values you don't want in Git, several files per service separated by a label, and global files that apply to every project, see Environment Variables
  • Set things once for every project: global Dockerfiles in ~/.ddev/web-build/ and ~/.ddev/db-build/, and global env files in ~/.ddev/.env*, see Global Configuration below
  • apt/rpm packages are now published to Cloudsmith (packages.ddev.com) as well as Gemfury, and the yum repo now verifies package signatures, which the Gemfury one never did. Gemfury (pkg.ddev.com) is still supported but will be retired eventually; see the Linux note above to switch over

Snapshots and Database Seeding

  • ddev start --seed-snapshot fills a new database from a snapshot in .ddev/db_snapshots, or from a path to one anywhere else on your machine. A snapshot outside the project is read where it is instead of being copied, so a multi-GB file is not duplicated. A snapshot named seed is used automatically, with no flag. Works for MariaDB, MySQL, and PostgreSQL
  • ddev start --reset-database deletes the database and starts fresh. It takes a snapshot first, using the database version that created the data, so this also works when you already changed database: in your config. ddev config --database= now warns instead of failing, and ddev delete no longer refuses to work on a project whose data came from a different database server
  • ddev snapshot restore --force restores a snapshot made by a different version of the same database server
  • ddev snapshot --list shows each snapshot's size and database version
  • ddev snapshot restore and ddev snapshot --list also see snapshots from other Git worktrees of the same repository, so a database doesn't have to be copied between worktrees by hand
  • Snapshots and the database seed can skip compression with --uncompressed: more disk space, faster restore. The base_db seed also reads zstd now, not only gzip, which is much faster for a custom dbimage with a large database built into it, thanks to @weitzman

Global Configuration

These apply to every project on your machine, so you set them once instead of in each project.

  • New global Dockerfiles in ~/.ddev/web-build/ and ~/.ddev/db-build/ add the same image changes to every project - CA certificates, system tools, extra apt packages. If a project has a file with the same name in its own .ddev/web-build/, the project file is used, thanks to @rmott-littler
  • New global env files ~/.ddev/.env and ~/.ddev/.env.<service> set variables for every project. This is the only way to set a variable globally for a container other than web, since web_environment only reaches web. If a project sets the same variable, the project value is used. Write these files with ddev dotenv global set
  • Add-on install actions now see .ddev/.env and the global ~/.ddev/.env* files, not only .ddev/.env.<addon>. If you set a DDEV_* variable in .ddev/.env, that value is used there. A .ddev/.env.<service>.<label> file is also passed into that service's container now; before, it was only used to fill in variables in your docker-compose files

Features

  • Two new project types: MODX Revolution 2.x/3.x, thanks to @casparml, and Maho, thanks to @fballiano
  • Shopware 6 projects get shopware-cli in the web image, plus ddev admin-watch and ddev storefront-watch with the ports they need, so the ddev-shopware-cli add-on isn't needed, thanks to @vanWittlaer
  • New ddev add-on update checks installed add-ons against their latest GitHub release and updates the outdated ones, with --dry-run to see what would change
  • New ddev utility download-ddev fetches the ddev and ddev-hostname binaries for a PR, branch, commit, release tag, latest stable, or main HEAD, without touching your installed DDEV
  • New ddev utility delete-volume removes one of the project's Docker volumes by name or from an interactive list, for add-ons like ddev-solr that create their own
  • ddev launch --print-url and DDEV_LAUNCH_PRINT_URL=true ddev launch print the URL instead of opening a browser, for SSH, containers, and CI, thanks to @steffenmaechtel
  • New ddev tablepro host command for the TablePro database client on macOS, thanks to @datlechin
  • New nodejs_root lets nodejs_version: auto/engine read the version file from a subdirectory such as web/themes/custom/mytheme. Both now require that file to exist; before, if it was missing, DDEV installed its default version without telling you, thanks to @dpacassi
  • The dbimage config option works again after a long absence, mirroring webimage, along with ddev config --db-image/--db-image-default
  • If you pin a custom webimage or dbimage, ddev start warns you when that image was built from an older DDEV image than this version expects, instead of failing later in a way that gives no hint why. Official images now record the DDEV version they were built for, so the warning starts working after you rebuild your own image, thanks to @weitzman
  • ddev ssh and ddev exec pass your TERM and COLORTERM into interactive sessions, so you get more than 16 colors, thanks to @wazum
  • ddev start warns when DDEV itself is an unreleased build from a PR or a local branch, and ddev version shows where it came from
  • Drupal settings.ddev.php configures symfony_mailer_lite the way it already configured symfony_mailer, thanks to @mxr576
  • The FAQ explains how to move from Homebrew to a specific DDEV version, thanks to @joachim-n

Bug Fixes for Regressions from v1.25.3

  • Project image builds are fast again. Permissions on the Node.js directory were being changed recursively on every build, and now they are set once when the image is built
  • Add-ons and apps that write log files straight into /var/log can do that again, after the directory was locked down to root only
  • A site that generates /robots.txt itself works again, including Drupal's RobotsTxt module. An nginx rule was answering /robots.txt before your site could, and it is now removed
  • Projects that pin the web service to a specific platform, like platform: linux/amd64 on an Apple Silicon Mac, start again
  • Orphan containers get removed again, so Docker Compose stops warning about them

Bug Fixes

  • ddev wp uses the path from your project's own wp-cli.yml again, and only falls back to the docroot when that file doesn't set one, which is what the docs always said. Since v1.24.5 it always added --path=$DDEV_DOCROOT, which broke Bedrock and any layout where WordPress isn't in the docroot
  • Running ddev in a subdirectory that has its own .ddev/config.yaml, like a Drupal contrib module or a Git submodule, keeps using the outer project and tells you which one it chose. Before, it switched to the nested project silently, and the outer project's custom commands stopped working. ddev start there asks whether you want the nested project
  • DDEV stops writing database connection settings into your CMS config when there's no db container or you configured a different database. That fixes TYPO3 projects using omit_containers: [db], which failed to install with getaddrinfo for db failed, and a TYPO3 SQLite setup that got switched back to MySQL on every restart. thanks to @staatzstreich for the diagnosis and the original fix, made general here so Drupal and Backdrop get it too
  • ddev pull acquia handles long application names, where the Acquia CLI breaks the database filename across several lines, thanks to @danepowell
  • Your pre-/post-import-db and pre-/post-import-files hooks now run when a provider does its own importing with db_import_command/files_import_command, and those pulls no longer print a "skipping database pull" warning that wasn't true
  • When port 80 or 443 is already taken and DDEV uses a different port instead, ddev-router remembers that. Before, after the program using that port stopped, starting another project rebuilt the router for no reason
  • Drupal 10, 11, and 12 projects handle a page with unusually large HTTP headers instead of failing with a 502 error. Drupal test runs hit this, since they report deprecation notices in the response headers, thanks to @phenaproxima
  • The bundled settings.php for the drupal11 and drupal12 project types is refreshed from upstream, and drupal11's settings.ddev.php gets the garbage-collection threshold that drupal12 already had, thanks to @rpkoller

Breaking Changes

  • xdebug_enabled is gone from ddev describe -j. It reported project config, not live Xdebug status, so use ddev xdebug status for that. This only affects a custom GUI or script that read the field, thanks to @jonesrussell

Security Changes

  • A malicious archive can no longer create an absolute symlink that a later file in the same archive follows, to write files outside the folder being extracted - your shell startup files, for example. This was reachable through ddev add-on get and ddev import-db/import-files, and it completes the fix for CVE-2026-32885. thanks to @arpitjain099 for the report, see GHSA-9hq4-hm3j-jmph
  • A docroot or upload_dirs value in .ddev/config.yaml, or a path you pass to ddev dotenv, now gives a clear error when it points outside the project, instead of DDEV silently reading and writing files there

Internal Changes

  • ddev-webserver explains the 403s and 404s it generates itself instead of serving a bare error page, since those usually mean a wrong docroot or a project that isn't installed yet, and ddev-router does the same for a hostname that matches no project. A 403 or 404 from your own application is passed through unchanged. This replaces the "docroot may be wrong" warning on ddev start, which you couldn't see in a browser and which warned wrongly when .htaccess rewrites into a subdirectory
  • ddev-php-base is consolidated into ddev-webserver as local build stages, so a new base image no longer has to be pushed to Docker Hub before ddev-webserver can reference it. ddev/ddev-php-base and ddev/ddev-php-prod are no longer published and stay at their last-pushed tag; the ddev-webserver image itself behaves the same
  • Per-project certificates no longer carry a shared *.<TLD> wildcard SAN, which Traefik 3.7.6+ would use to serve one project's certificate for every hostname on a shared custom TLD. v1.25.3 shipped Traefik 3.6.13, which isn't affected. The obsolete *.ddev.local SAN is also gone from the global default certificate
  • Under rootless Docker or Podman, the host's usr.sbin.mysqld AppArmor profile attaches to the container's mysqld and left it unable to read /etc/my.cnf. That profile is loaded on any Linux machine with mysql-server installed, and the new dhi.io/mysql base puts mysqld at the path it matches. MySQL 8.0, 8.4, and 9.7 now load their config with an explicit --defaults-file instead
  • A nightly performance benchmark harness feeding a performance history dashboard, plus CI test runtime tracking per test type across GitHub Actions and Buildkite
  • Rootless Podman CI setup reworked, podman-root CI dropped
  • DDEV_DOCKER_ORG points a binary at a different Docker Hub organization, so a release built outside ddev/ddev can be pull-tested end to end
  • last_started_version is recorded by every command that starts containers, not only ddev start/ddev restart, so you stop being asked for a ddev poweroff that isn't needed. ddev start -y records it too
  • Three fixes toward Apple Container and socktainer support (#7372): bound host ports fall back to NetworkSettings.Ports when HostConfig.PortBindings comes back empty, a running project's database version is read by exec instead of a second mount of an already-attached volume, and ddev start survives a chown failure on /mnt/ddev-global-cache where the filesystem rejects it even though ownership is already correct

Minor Updates

  • PHP 8.5.9, 8.4.24, 8.3.33, and 8.2.33
  • Composer 2.10.3, Node.js 24.20.0, npm 11.19.0
  • MariaDB client 11.8.9; bundled MySQL clients 9.7 (new), 8.4.10, and 8.0.46

What's Changed

New Contributors

Full Changelog: https://github.com/ddev/ddev/compare/v1.25.3...v1.25.4

Source: README.md, updated 2026-09-02