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
- 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
- Faster ddev start: Reduced fresh-router healthcheck wait
- New project types and quickstarts: 3 new project types (wp-bedrock, asterios, joomla) and 2 new quickstarts (Tempest, October CMS)
- Auto-start on command: DDEV now automatically starts stopped projects when you run ddev exec, ddev ssh, ddev share, ddev xhgui, ddev pull, ddev push, or ddev snapshot restore
- New diagnostic commands: ddev utility port-diagnose to identify port conflicts, ddev utility check-custom-config to detect unexpected configuration, ddev utility tls-diagnose to identify TLS/SSL problems with DDEV projects.
Quickstarts
- Add wp-bedrock project type, thanks to @jonesrussell
- Add asterios project type, thanks to @asteriosphp
- Add joomla project type, thanks to @renekreijveld
- Add Tempest quickstart
- Add October CMS quickstart, thanks to @daftspunk
- Update Contao quickstart to use 5.7 LTS, thanks to @fkaminski
- Update Laravel quickstart to latest version, thanks to @tyler36
- Update Moodle quickstart to set admin email during installation
Features
- Support bare variable names in web_environment for host environment passthrough
- Add project path to the interactive dashboard, thanks to @yanniboi
- Add global omit_snapshot_on_delete setting, thanks to @marklabrecque-ab
- Add --project flag to ddev exec, thanks to @penyaskito
- Use runtime environment variables in wp-config-ddev.php for WordPress, thanks to @jonesrussell
- Add support for symfony_mailer 2.x in Drupal config, thanks to @hchonov
- Display project info (name and environment) when calling ddev pull/ddev push, thanks to @mariano-dagostino
- Support virtioproxy WSL2 networking mode
- Support "1"/"0" for DDEV_* environment variables (e.g. DDEV_DEBUG=1), thanks to @deviantintegral
- Automatically set com.ddev.* labels for Docker images, containers, and networks
- Add aggregate_gc_threshold=0 to Drupal 12 config, thanks to @rpkoller
Bug Fixes
- Detect custom configuration files and show unexpected configuration on ddev start
- Prevent Path Traversal (ZipSlip), thanks to @SnailSploit
- Normalize PHP_IDE_CONFIG (PhpStorm) for uppercase project names
- Reduce file permissions for system directories /usr/bin and /usr/sbin inside the container, thanks to @AkibaAT
- Ensure ddev-ssh-agent and ddev-router are up to date on DDEV upgrade
- Respect webimage for all use cases; don't pull the default web image when it's not in use
- Simplify ddev composer create-project by removing the composer update step
- Add timeout to yarn config set in start.sh for the ddev-webserver Docker image
- Fix malformed WSLENV on Windows install/uninstall
Internal Improvements
- Implement config model using Viper, thanks to @agviu
- Improve testing in GoLand by prebuilding the ddev binary, thanks to @jonesrussell
- Add missing php8.5-memcached for ARM64 to ddev-webserver Docker image
- Use newer deb822 format (*.sources instead of *.list) for Docker and DDEV repositories (Linux and WSL2)
Minor Updates
- PHP 8.4.20 and 8.5.5
- Docker Compose v5.1.3
- Remove obsolete ddev sequelpro command and vestiges in documentation
What's Changed
- fix(commands): use /usr/bin/env bash in web console command by @tyler36 in #8182
- build(deps): bump actions/upload-artifact from 6 to 7 by @dependabot[bot] in #8193
- fix(composer): ddev composer create-project can ignore .devcontainer [skip buildkite] by @rfay in #8192
- docs(buildkite): Minor fixups to WSL2 buildkite setup by @rfay in #8172
- build(deps): bump goreleaser/goreleaser-action from 6 to 7 by @dependabot[bot] in #8175
- docs(quickstart): Use mkdir -p and more descriptive names [skip buildkite] by @rfay in #8200
- docs: suggest trivial project in troubleshooting by @rfay in #8199
- build(deps): bump docker/login-action from 3 to 4 (#8211) [skip ci] by @dependabot[bot] in #8211
- build(deps): bump docker/setup-buildx-action from 3 to 4 by @dependabot[bot] in #8210
- docs: clarify usage for TUI by @stasadev in #8203
- test(quickstart): pause d12 bats test in github actions by @rpkoller in #8217
- chore(docs): remove Plausible [skip ci] by @stasadev in #8228
- fix(quickstart): do not use gunicorn for wagtail by @stasadev in #8229
- feat: support bare variable names in web_environment for host env passthrough by @rfay in #8209
- fix(buildkite): use proper check for skip by @stasadev in #8231
- build: update go deps, vendor docker-compose SDK, for #8234 by @stasadev in #8198
- style: Fix minor typo: skiped → skipped by @penyaskito in #8243
- chore(quickstart): Make quickstart drupal.bats drush launch usage less fragile by @rfay in #8247
- fix: prevent path traversal (ZipSlip) in Untar and Unzip by @rfay in #8213
- fix: lowercase PHP_IDE_CONFIG serverName for uppercase project names, fixes #8225 (#8248) [skip ci] by @rfay in #8248
- docs(sharing): Improve ngrok setup instructions, fixes #8101 (#8205) [skip ci] by @samcrichard in #8205
- refactor: bump Laravel to latest version by @tyler36 in #8238
- chore(go): Use go fix to update golang usage, fixes #7963 by @rfay in #8249
- feat(tui): Added ddev project path to TUI project browser, for #8184 by @yanniboi in #8185
- build: update go deps, vendor viper, for #8181 by @dependabot[bot] in #8237
- fix: reduce world writeable directories and files, fixes #8194 by @AkibaAT in #8195
- feat: add aggregate_gc_threshold of 0 to drupal12 settings.ddev.php (#8215) [skip ci] by @rpkoller in #8215
- build(pecl): add php8.5-memcached for ARM64, fixes ddev/ddev-memcached#20 by @stasadev in #8252
- docs: document Mailpit plus-address auto-tagging and how to disable it (#8222) [skip ci] by @maks-oleksyuk in #8222
- fix: use Lstat in PurgeDirectory to handle symlinks without following them by @rfay in #8254
- build: bump 1password/load-secrets-action from 3 to 4 (#8266) [skip ci] by @dependabot[bot] in #8266
- fix(test): check for GitHub token in TestAddonGetCircularDependencies by @stasadev in #8257
- fix(docker): use ContainerInspect polling instead of ContainerWait to avoid hangs by @stasadev in #8265
- fix: bump action-linkspector from v1.3.5 to v1.4.0 to resolve setup-node@v4 warning [skip ci] by @rfay in #8269
- fix: use deb822 format for DDEV and Docker apt repositories, fixes #8232 (#8233) [skip ci] by @stasadev in #8233
- feat(autostart): automatically start projects on command when project stopped, fixes #8245 by @rfay in #8258
- test(lagoon): use new amazee.io testing environment for Lagoon integration (#8270) [skip ci] by @rocketeerbkw in #8270
- build(arm64): php8.5-memcached from repos, refactor ddev-webserver tests, for #8252 by @stasadev in #8268
- test(webserver): wait for FPM reload to settle after xdebug disable (#8272) [skip ci] by @stasadev in #8272
- refactor: implement config model using viper, fixes #5763 (#8181) [skip ci] by @agviu in #8181
- feat(cmd): ddev exec accepts a --project flag, fixes #8241 by @penyaskito in #8244
- feat(wordpress): use runtime DDEV_PRIMARY_URL for WP_HOME, fixes #8098 by @jonesrussell in #8176
- chore(drupal): add support for symfony_mailer 2.x to drupal settings.ddev.php by @hchonov in #8274
- test(wsl2): add cleanup for ddev/docker apt sources leftovers, for #8233 by @stasadev in #8275
- feat: Display project info (name and environment) when calling ddev pull/push, fixes #8201 by @mariano-dagostino in #8202
- fix(config): detect custom files, add ddev utility check-custom-config by @stasadev in #8218
- fix(docker): use ddev-utilities image for volume/utility RunSimpleContainer calls to fix Lima/Colima 10-30m hangs by @rfay in #8271
- test(traefik): skip TestCustomGlobalConfig on Rancher Desktop, fixes #8167 (#8283) [skip ci] by @rfay in #8283
- fix(docker): use ddev-utilities for remaining RunSimpleContainer calls (#8282) [skip ci] by @rfay in #8282
- fix(mutagen): tolerate transient staging files during volume chown by @rfay in #8281
- refactor: detect custom files in ddev utility diagnose by @stasadev in #8279
- docs: Update Contao Quickstart Recipe (#8278) [skip ci] by @fkaminski in #8278
- docs: improve AI agent instructions and dev workflow guidance [skip ci] (#8284) [skip ci] by @rfay in #8284
- fix(addons): sleep 500ms after creating config files on Lima/Colima/Rancher Desktop (#8288) [skip ci] by @rfay in #8288
- chore: remove obsolete commands, fixes #8291 (#8292) [skip ci] by @stasadev in #8292
- fix: normalize path separators in check-custom-config output on Windows by @rfay in #8286
- docs: add october cms to quickstart instructions (#8285) [skip ci] by @daftspunk in #8285
- test: fail fast when command tests would use PATH ddev by @jonesrussell in #8280
- build(ci): pin textlint@15.5.2 by @stasadev in #8300
- refactor(wordpress): make wp-config-ddev.php a static asset, fixes #8098 by @rfay in #8287
- docs: rewrite Windows installation instructions, fixes #7996, fixes #7703 (#8290) [skip ci] by @rfay in #8290
- docs(quickstart): add Tempest (#8299) [skip ci] by @stasadev in #8299
- feat: support "virtioproxy" WSL2 networking mode, fixes #8220 by @rfay in #8262
- build(ci): remove pin for textlint, for #8300 (#8303) [skip ci] by @stasadev in #8303
- fix: ensure up-to-date images for ddev-ssh-agent and ddev-router (#8305) [skip ci] by @stasadev in #8305