Installation
See the installation instructions for details, but it's easy:
- macOS:
brew install ddev/ddev/ddevor justbrew 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.
- Consider
ddev delete imagesorddev delete images --allafter upgrading to free up disk space used by previous Docker image versions. This does no harm. - Consider
ddev config --autoto update your projects to current configuration.
Highlights
Blog announcement: https://ddev.com/blog/release-v1-25-5/
- Initial PHP 8.6 support (8.6.0 RC3, some extensions not available yet)
- A rebuilt
ddev tuiwith a new layout, clickable links, and more project actions - Use your existing SSH agent (e.g. macOS, 1Password,
ssh -A) withssh_agent_upstream ddev restart -s <service>restarts only the services you name- QR codes for
ddev shareandddev launch --qr - zstd for
ddev import-db,ddev import-files, andddev export-db - Global hooks, and
global_config.*.yamlfiles that extendglobal_config.yaml
PHP Security Fixes
See PHP2Shell: What DDEV Users Need to Know for who is affected and how to update PHP without upgrading DDEV.
ddev-webserverships PHP 8.5.12, 8.4.27, 8.3.36, and 8.2.35, which fix CVE-2026-109618 and CVE-2026-109619, see the PHP announcement. deb.sury.org also patched PHP 5.6 through 8.1, and upgrading DDEV rebuilds those projects' web images with the fixed packages- PHP 8.6 is still 8.6.0 RC3, which has neither fix, because deb.sury.org hasn't packaged RC4 yet. DDEV applies the php.net mitigations for CVE-2026-109619 (
session.upload_progress.enabled = 0andfatal_error_backtraces = 0), but CVE-2026-109618 stays open, so don't expose a PHP 8.6 project - PHP 8.4.27 and 8.5.12 have an upstream SimpleXML regression that can crash with
zend_mm_heap corrupted, see php-src#24488
⚠️ Breaking Changes
session.upload_progress.enabledis0in every PHP version, as php.net recommends, andfatal_error_backtracesis0in PHP 8.6. Few applications use session upload progress, and the PECLuploadprogressextension that Drupal uses isn't affected. To turn either back on, add it under[PHP]in.ddev/php/overrides.ini, see Custom PHP Configuration, and runddev restart- The default nginx configurations for Drupal, Backdrop, Magento 1/2, Maho, and Silverstripe changed slightly, and now deny PHP in upload directories. If you removed
#ddev-generatedfrom.ddev/nginx_full/nginx-site.conf, merge the changes from the new template into your copy - WP-CLI, Drush 8, the Backdrop Drush extension, magerun, magerun2, and Symfony CLI are installed only in the project types that use them. To use one in another project type, add it in a
web-buildDockerfile, see Project-Specific Utilities ddev export-db --file=x.sqlwrites plain SQL. Before, it wrote gzip data to a file named.sql- A custom service or add-on whose
container_nameisn'tddev-<project>-<service>is renamed, with a warning. Anything that reached it by its old name should use the service name - DDEV assigns host ports itself instead of leaving it to Docker or Podman. Unconfigured db, web, and Mailpit host ports move to 20000-29999 the next time their containers are created, and the router's fallback ports ("Port 443 is not available, using ... instead") move to 30000-32000. Configured
host_*_portvalues don't change --profilesreplacesCOMPOSE_PROFILES, as in Compose, so on a stopped projectddev start --profiles=xno longer starts the profiles inCOMPOSE_PROFILESas well, see Optional Servicesddev deleteexits with an error and keeps the project listed when it can't remove a volume. Before, it reported success- Any
global_config.*.yamlfile in~/.ddev, such as a leftoverglobal_config.old.yaml, is now merged into the global configuration. Rename or remove files you don't want applied - In
ddev tui,Rrestarts andrrefreshes, swapped from before, and onlyenteropens the project view DDEV_DEBUGno longer shows image download progress per layer or routine start messages. UseDDEV_VERBOSEto see them
Features
- PHP 8.6 can be selected. deb.sury.org doesn't package every extension for it yet, and enabling Xdebug, XHProf, or Blackfire on 8.6 gives a clear error
ddev tuihas a new layout that fits any window size, shows the project list before Docker responds, and adds database addresses, snapshots, published ports, and available add-on updates to the project viewddev tuishows paths and URLs as clickable links, ando,v, andpopen a project in the file manager, VS Code, or PhpStorm. URLs printed by other commands are clickable tooDinddev tuideletes a project, thanks to @MitraKumar- Up and down wrap around the
ddev tuiproject list, so the last project is one key away from the first ssh_agent_upstreamlets containers use an SSH agent running on the host or forwarded to it, so keys that exist only in an agent work withoutddev auth sshkey files. See Using an Existing SSH Agent. It also follows a symlinked agent socket, such as VS Code Remote's/tmp/vscode-ssh-auth-sock-*, andddev auth sshreports an agent socket that's gone after a reconnect in a single messageddev restart -s solr,redisrecreates only those services and leaves the rest running.ddev restart --profiles=xreplacesddev restart && ddev start --profiles=x, andddev utility rebuild -saccepts several services- Ctrl-C, SIGTERM, or closing the terminal no longer leaves temporary containers like
start-chown-*holding project volumes. Interruptingddev import-db,ddev export-db, orddev snapshotleaves no partial dump, snapshot, or temporary directory, and Ctrl-C stops a shell loop that runsddev ddev shareprints a QR code for the tunnel URL, andddev launch --qrprints the project URL with its QR code. This replaces the ddev-qr add-on, whichddev startnow removes. thanks to @tyler36, who started this in ddev-qrddev import-dbandddev import-filesaccept zstd files.ddev export-db --compressionchooses gzip, bzip2, xz, zstd, or none, and without the flag the format comes from the file extension, as inddev export-db -f db.sql.zst- Global hooks in
global_config.yamlrun for every project, before the project's own hooks.global_config.*.yamlfiles in~/.ddevare merged overglobal_config.yaml, asconfig.*.yamlfiles are in a project ddev config globalwith flags prints only the settings you changed, instead of the whole global configuration- New
pre-deleteandpost-deletehooks can remove files a project created, without doing it on everyddev stop, thanks to @wazum ddev startin a directory that looks like a web project but has no.ddevconfiguration shows whatddev config --autowould create, and lets you accept it, change it, or cancelddev list,ddev describe, andddev tuirespond faster, and the difference grows with the number of running projectsddev startshows each step's time on that step's line, and pushing configuration to a router that's already running is about 1.4s fasterddev startwarns when the router is running but its ports don't respond on the host, which happens with Lima or Colima on Linux for ports below 1024. See Router Ports Not Reachable- Web image builds can use your GitHub token through the
github_tokenbuild secret. The docs explain how to install PHP extensions with PIE, or with PECL on older PHP versions ddev utility download-ddev,ddev utility diagnose,ddev describe,ddev list,ddev dotenv, and shell completion work when Docker is unavailable- Shopware 6 projects have the
ddev consolecommand, thanks to @ntzrbtr ddev exec,ddev ssh, and custom commands receive the variables AI coding agents set to identify themselves, thanks to @AkibaATddev sshandddev execpassTERM_PROGRAMand similar terminal variables, so tools in the container can print clickable links, thanks to @wazumx-ddev.container-usersets the default user forddev ssh -s,ddev exec -s, and custom commands in that service- DDEV sets
container_nameandhostnamefor every compose service, so custom services and add-ons no longer need to - Add-ons can tag a build service's image as
-${DDEV_SITENAME}-<service>-builtor list images to pull inx-ddev.pull-images.ddev startwarns when two services build different images with the same tag - With
CI=true,ddev startprints the logs of a container that exits or remains unhealthy, as it already did withDDEV_DEBUG=true
Bug Fixes for Regressions
- Directory listing works again. v1.25.4's 403 explanation page had disabled it for every project
ddev composer create-projectagain passes flags like--no-devand-vvvto the Composer scripts it runs after creating the project, which v1.25.3 stopped doing- Magento, Magento 2, and Maho show their own 404 pages again, instead of DDEV's explanation page, thanks to @gunnie-agency
Bug Fixes
- nginx passes
PATH_INFOto PHP, so URLs like/index.php/foo/barwork as they do with Apache ddev startno longer fails because of a stopped container from an earlier session that it wasn't asked to start- Running
ddev startorddev poweroffin several terminals at once no longer breaks the shared router or Docker network, or loses hosts file entries. A command that has to wait shows which process it is waiting for - Fixed a startup race that could stop the web container, and another that could delete files DDEV had just copied into a Docker volume
- DDEV recovers from an empty or corrupt
~/.ddev/.state.yamlorproject_list.yamlinstead of failing on every command ddev deleteremoves leftover utility containers that kept the database volume in use, thanks to @wazum- When the project directory is itself a symlink, Mutagen syncs it instead of leaving the docroot in the container empty, thanks to @dave-agilepixel
ddev export-dbalways uses--single-transaction, and on MySQL 9.5+ it no longer writes GTID statements or fails on tablespace privileges. Snapshots callmariadb-backupinstead of the deprecatedmariabackupcomposerin the web container runs the system Composer from every shell, so PHP'sexec(), Symfony Process, andsh -cno longer pick upvendor/bin/composerddev add-on getandddev add-on updateinstall the release GitHub marks as latest, not whichever release GitHub lists first- When you're offline and a project image can't be rebuilt,
ddev startuses the images from the last successful build instead of failing ddev start --profiles=xbuilds that profile's images, and--no-cachealso rebuilds profile images built earlierddev startno longer panics when a compose service usesnetwork_mode, such asnetwork_mode: service:web- MODX friendly URLs show the right page instead of the start page, thanks to @casparml
ddev utility download-imageshonors each service'splatform:, so amd64-only images download on Apple Siliconddev startis faster with rootless Podman- A pinned
webimageordbimagebuilt from the current release image is no longer reported as outdated, thanks to @weitzman ddev utility download-ddev--headfinds the latestmainbuild reliably, and--commitaccepts a short SHA
Security Changes
- With
nginx-fpm, PHP files in CMS upload directories no longer run. Drupal, Backdrop, Magento 1/2, Maho, and Silverstripe block them only with an.htaccessfile, which nginx ignores, so the nginx templates now deny them, as the WordPress template already did foruploads /phpstatusreturns 403 to requests from outside the web container, so they no longer reach PHP-FPM through it, which matters for bugs like PHP2Shell. If you removed#ddev-generatedfrom.ddev/apache/apache-site.conf, addRequire ip 127.0.0.1to its<Location "/phpstatus">
Internal Changes
- The database server uses a 256M redo log where the version supports resizing it, a 512M buffer pool, a connection collation that matches the server's, and a separate slow query log. The redo log is resized on the first start after upgrading, which adds about 160-210M to each project's database volume
- The web container logs to
/proc/1/fd/1instead of the/var/tmp/logpipeFIFO. Supervisor configs that log to/var/tmp/logpipekeep working through a symlink - With Mutagen, the project volume is mounted only at
/var/www, and ownership changes skip the bind mounts below it - Docs: 6GB of memory for the Podman machine on macOS, the SvelteKit quickstart updated for SvelteKit 3, keeping changes made inside the web container across restarts, separate pages for custom compose files and custom services, and replacing the router's page for unknown hostnames with a maintenance page
- docs.ddev.com pages have social preview cards and a "Copy as Markdown" button, and the site publishes
llms.txtandllms-full.txtfor AI tools
Minor Updates
- PHP 8.5.12, 8.4.27, 8.3.36, and 8.2.35
- Node.js 24.22.1, npm 11.19.1
- Docker Compose v5.6.1, recommended buildx 0.38.1
What's Changed
- ci(textlint): fail on errors instead of only annotating (#8800) [skip ci] by @stasadev in #8800
- docs: add subtle sponsorship callouts to GitHub templates and release notes (#8796) [skip ci] by @rfay in #8796
- fix(zensical): drop strict-build retry workaround, require 0.0.58 (#8795) [skip ci] by @stasadev in #8795
- test: update the drupal 12 bats test minding the 403 by @rpkoller in #8810
- build: bump 1password/load-secrets-action from 4 to 5 by @dependabot[bot] in #8807
- chore(claude): consolidate agent guidance, correct stale claims by @stasadev in #8805
- fix(dbserver): prefer mariadb-backup over deprecated mariabackup name by @rfay in #8803
- feat(docker): support prerelease tags for images, so vX.Y.Z-rc1 can be released by @rfay in #8766
- ci: consolidate per-image container push comments into one PR comment by @rfay in #8791
- fix: stale-pin check should compare against the resolved release tag, not the raw hash by @weitzman in #8801
- test(auth-ssh): fix test-ssh-server image by @stasadev in #8813
- feat: forward TERM_PROGRAM and other terminal variables to ddev ssh/exec, fixes #8808 by @wazum in #8809
- docs(quickstart): fix Maho redirect, take install URLs from
ddev execby @stasadev in #8814 - ci(github): remove setup-homebrew pin (#8815) [skip ci] by @stasadev in #8815
- ci: build Windows on Linux and use the signer only for signtool by @rfay in #8769
- test(export-db): cover mysql in TestDdevExportDB and trim redundant per-engine checks by @rfay in #8798
- fix: reduce init() usage and redundant NewApp()/app-root calls in cmd package, fixes #7472 by @rfay in #8774
- ci: fix release workflow broken by windows signing change #8769 by @rfay in #8818
- fix(dbserver): add --single-transaction and MySQL 9.5+ dump flags to export-db by @rfay in #8797
- build(compose): update compose to current, revert #8767, fixes #8768 by @rfay in #8819
- test(buildkite): fix WSL2 agent tagging and remove orphaned NAT pipelines (#8822) [skip ci] by @rfay in #8822
- chore(claude): fix fallout from doc-lint and manual-testing guidance (#8823) [skip ci] by @rfay in #8823
- docs(buildkite): document git-mirrors-path best practice for testbots by @rfay in #8799
- build(images): skip fork release-marker check once marker's tag is published, fixes #8804 by @rfay in #8827
- test(perf-collector): drop retired pipelines and improve failure message by @rfay in #8839
- feat: add console commands to Shopware 6 projects by @ntzrbtr in #8845
- fix(nginx): stop intercepting app-level 404s in the magento, magento2 and maho templates, fixes #8837 by @gunnie-agency in #8838
- docs: merge CLAUDE.md into AGENTS.md (#8852) [skip ci] by @rfay in #8852
- fix(webserver): use an isolated volume in the webserver image test suite, fixes #8849 (#8851) [skip ci] by @rfay in #8851
- docs(extend): split overlapping custom-service pages and fix ports/expose examples (#8841) [skip ci] by @rfay in #8841
- feat: add x-ddev.container-user, fixes #8806 (#8829) [skip ci] by @rfay in #8829
- fix: don't fail ddev start on unused containers, fixes #8830 by @rfay in #8843
- fix(images): exclude test dirs, README, and LICENSE from image hash, fixes #8850 by @rfay in #8853
- fix(webserver): stop the 403 explanation from disabling directory listing by @stasadev in #8821
- fix: pass PATH_INFO to php-fpm from nginx, fixes #3854, fixes #4001 by @rfay in #8844
- fix: install project-type-specific web image utilities only when needed, fixes #8824 by @rfay in #8828
- fix(add-ons): install the latest release, not the first one GitHub lists, fixes #8854 by @stasadev in #8855
- fix(ci): handle stray
|, line endings and'in embargo variables by @stasadev in #8864 - ci: consolidate test eligibility checks by @rfay in #8863
- ci: load macOS signing identity from 1Password, fixes #8842, fixes #8869 by @rfay in #8871
- feat: add initial partial php8.6 support, fixes #8779 by @rfay in #8826
- chore(claude): stop denying
sed -iby @stasadev in #8874 - feat: show QR codes in
ddev shareandddev launch --qr, remove ddev-qr add-on, for ddev/ddev-qr#15 by @stasadev in #8870 - fix: stop download progress bar from running
tputon every refresh (#8876) [skip ci] by @stasadev in #8876 - fix(podman): use init in CopyIntoVolume container to avoid stop delay (#8875) [skip ci] by @stasadev in #8875
- fix: show Git Bash PATH instructions in
ddev utility download-ddevon Windows by @rfay in #8873 - fix(download-ddev): look up
--headthrough the GitHub API by @stasadev in #8877 - fix: make
make staticrequiredandmake textlintwork on Windows (#8879) [skip ci] by @rfay in #8879 - fix(github): retry without a token only on 401, not on an API 404, for #8855 by @stasadev in #8881
- feat: let commands that don't use Docker run without it by @stasadev in #8880
- fix: start with the last built images when offline and the build fails, for #8832 by @stasadev in #8860
- fix(list): fit table columns to their contents and wrap router errors by @stasadev in #8878
- feat: add ssh_agent_upstream to use an existing SSH agent, fixes #3878 by @rfay in #8861
- fix(download-images): pull images for the service's platform by @stasadev in #8859
- ci(images): report and delete unused Docker Hub image tags, fixes #8848 by @rfay in #8857
- docs: fix SvelteKit quickstart for SvelteKit 3, which drops svelte.config.js by @rfay in #8892
- docs: explain how to keep changes made inside the web container across restarts (#8894) [skip ci] by @stasadev in #8894
- ci: hide Homebrew's Landlock ABI warning annotation on Linux runners (#8893) [skip ci] by @rfay in #8893
- test: show command output when diagnose, dockercheck and xdebug-diagnose tests fail (#8897) [skip ci] by @rfay in #8897
- fix: build a profile's images when it starts, and refresh built ones on --no-cache, fixes #8817 (#8820)[skip ci] by @rfay in #8820
- build: retry transient network failures in web image builds and tests, fix mariadb wrapper race by @rfay in #8896
- test(buildkite): update homebrew recipe to buildkite-agent@4 [skip github] by @rfay in #8899
- feat: OSC 8 links and open-in-editor keys in the TUI and CLI output, fixes #8882 (#8883) [skip ci] by @rfay in #8883
- fix(dbserver): stop spurious InnoDB and TLS startup warnings, fixes #8831 by @rfay in #8885
- test: log restart output and global-commands volume state in TestAutocompletionForCustomCmds by @rfay in #8905
- chore(claude): deny unsetting GOTEST_SHORT, predict the PR number (#8902) [skip ci] by @stasadev in #8902
- ci(images): stop treating registry errors as a missing image tag (#8910) [skip ci] by @stasadev in #8910
- fix(webserver): always resolve composer to /usr/local/bin/composer in every shell, fixes #8907 (#8908) [skip ci] by @stasadev in #8908
- feat: add
ddev restart --serviceand--profiles, fixes #7904 by @stasadev in #8906 - fix: run all-project-types in full and fix the bugs it found (#8903) [skip ci] by @stasadev in #8903
- feat: forward AI agent variables and bare web_environment names on exec, fixes #8378 by @AkibaAT in #8380
- chore(claude): update the PR body when adding commits to an open PR (#8917) [skip ci] by @stasadev in #8917
- fix(modx): pass the request path to index.php as
qin the nginx config by @casparml in #8915 - fix(dockerutil): prepare the CopyIntoVolume target with Exec instead of the container command, for #8912 by @rfay in #8913
- fix: DDEV should choose host ports instead of leaving it to docker/compose, fixes #8293 (#8887) [skip ci] by @rfay in #8887
- feat: add global hooks in global_config.yaml, fixes #3200 (#8889) [skip ci] by @rfay in #8889
- test: wait for the host port to be released in TestExistingContainerHostPortStopped by @rfay in #8918
- fix: pull the base image of build services tagged per service, fixes #8832 by @stasadev in #8900
- feat: show failed container logs when CI=true by @stasadev in #8920
- test: skip SkipUnlessDefaultEnvironment tests when Mutagen is the global default, fixes #8919 by @rfay in #8921
- fix(webserver): log to /proc/1/fd/1 instead of the /var/tmp/logpipe FIFO, fixes #8911, fixes #8912 (#8914) [skip ci] by @rfay in #8914
- fix: serialize shared router and network setup with a global lock, fixes #5527 (#8891) [skip ci] by @rfay in #8891
- refactor: rename router "ephemeral" ports to substitute ports, fixes #8898 by @rfay in #8923
- test(mutagen): make TestMutagenSimple diagnosable, cheaper and default-environment only by @rfay in #8930
- fix(dockerutil): half-close the exec stream when no stdin is attached, for #7372 by @rfay in #8928
- test: fix share test timing races and log router state on URL failures, minor
ddev shareadjustments by @rfay in #8922 - test: require drupal_cms_helper before drush si in the Drupal CMS quickstart test by @rfay in #8933
- docs: refresh CONTRIBUTING.md and defer shared rules to ddev/.github, fixes #8699 [skip ci] (#8932) [skip ci] by @rfay in #8932
- feat: add global_config.*.yaml overrides, for #3200 by @rfay in #8888
- feat(tui): delete projects with
Dkey, fixes #8782 by @MitraKumar in #8786 - test: authenticate bee download-core and make quickstart failures readable by @rfay in #8942
- chore(claude): link the Read the Docs preview in docs PRs (#8949) [skip ci] by @stasadev in #8949
- refactor(mutagen): mount project_mutagen once, chown around bind mounts, for #8895 by @rfay in #8944
- feat(tui): rebuild
ddev tuilayout, keys and help, fixes #8916 by @stasadev in #8940 - feat: support zstd in import-db, import-files, and export-db, add
export-db --compression, fixes #8856 (#8939) [skip ci] by @rfay in #8939 - fix: recover from empty or unparseable .state.yaml and project_list.yaml, fixes #8935 by @rfay in #8936
- feat(start): offer to configure a web project that has no DDEV config, fixes #7976 by @rfay in #8890
- fix: serialize hosts-file edits with the global lock, fixes #8937 by @rfay in #8938
- fix(dbserver): raise redo log, halve buffer pool, align init_connect, split slow log, fixes #8884 by @rfay in #8929
- feat: pass GitHub token to web builds as a secret, document PIE, fixes #7929, fixes #8549 (#8948) [skip ci] by @stasadev in #8948
- feat: add pre-delete and post-delete hooks, fixes #2988 by @wazum in #8946
- test: show npm stderr and debug log when TestNpmGlobalInstall fails (#8952) [skip ci] by @rfay in #8952
- ci: mask systemd-binfmt in WSL2 tests and require systemd running by @rfay in #8957
- fix: remove stale containers holding project volumes on
ddev delete, fixes #8777 by @wazum in #8950 - test: cover corepack npm fallback on Node.js 26, for #8965 (#8966) [skip ci] by @rfay in #8966
- docs: create the macOS Podman machine with 6GB of memory (#8970) [skip ci] by @rfay in #8970
- refactor: remove unreachable returns after infinite loops in dockerutil by @rfay in #8967
- test: retry TestCmdLogs HTTP check and trim its failure output (#8969) [skip ci] by @rfay in #8969
- perf: list containers once for
ddev list,describeandtui, for #8941 by @stasadev in #8955 - test(quickstart): retry upstream downloads and authenticate Composer to GitHub by @rfay in #8978
- fix: stop repeating settings messages on
ddev startfor Backdrop, WordPress, and TYPO3 (#8971) [skip ci] by @rfay in #8971 - refactor(router): remove the unused ddev-router-letsencrypt volume (#8977) [skip ci] by @rfay in #8977
- test(webserver): retry the FPM log tail check, and use
run -0in php_webserver.bats (#8982) [skip ci] by @rfay in #8982 - ci: download mkcert only for packaging, and retry it longer (#8980) [skip ci] by @rfay in #8980
- fix(nginx): never execute PHP from CMS user-generated files directories (#8962) [skip ci] by @rfay in #8962
- feat: show only changed settings after
ddev config globalwith flags by @rfay in #8968 - fix: don't panic on compose services that use network_mode (#8984) [skip ci] by @rfay in #8984
- perf: report
ddev startstep timings inline and speed up router config push (#8972) [skip ci] by @rfay in #8972 - fix(updatecheck): make TestAvailableUpdates reliable by using the latest-release endpoint (#8988) [skip ci] by @rfay in #8988
- ci: run GitHub workflows on Ubuntu 26.04 and install latest docker-ce from Docker's repo by @rfay in #8985
- chore(claude): drop the commit hook, inline the formatting hooks by @stasadev in #8989
- fix: keep host variables out of the daemons'
ddev startlaunches, for #8380 by @stasadev in #8976 - chore: stop requesting reviews from the empty documentation team by @rfay in #8992
- feat: set container_name and hostname on all compose services by @rfay in #8983
- fix: keep DDEV_DEBUG output readable by quieting compose progress and router port messages by @rfay in #8953
- build(containers): load locally built images with Docker media types on Podman, so
make testworks there by @rfay in #8981 - build(deps): bump go.mod by @stasadev in #8994
- fix: hide Compose's "No services to build" warning in
ddev restart -sby @stasadev in #8996 - test(docs): fail quickstart downloads at the step that broke by @rfay in #8997
- fix: resolve symlinked SSH agent sockets for ssh_agent_upstream, fixes #8961 by @rfay in #8963
- feat: warn when ddev-router's ports don't answer on the host by @rfay in #8990
- fix: signal handling - remove in-flight temporary containers when ddev is interrupted, fixes #8951 by @rfay in #8954
- perf: render only what is on screen in
ddev tui, for #8941 by @stasadev in #8979 - feat(tui): wrap around the project list by @stasadev in #8999
- fix: resolve a symlinked project root for Mutagen, for #8924 by @dave-agilepixel in #8987
- docs(router): add custom maintenance page by @stasadev in #9007
- build: always run go build from
makeso embedded assets and version stay current [skip buildkite] by @rfay in #9003 - feat(docs): add social cards and llms.txt, fix zensical 0.0.72 privacy error by @stasadev in #9009
- build(deps): bump zod and puppeteer in /perf/metrics/03-drupal-install by @dependabot[bot] in #9010
- fix: allow /phpstatus only from inside the web container, fixes #9005 by @rfay in #9006
- fix(webserver): apply php.net mitigations for session upload progress and PHP 8.6 by @rfay in #9012
- build: Create v1.25.5 images, fixes #8993 by @rfay in #9016
New Contributors
- @ntzrbtr made their first contribution in #8845
- @gunnie-agency made their first contribution in #8838
- @MitraKumar made their first contribution in #8786
- @dave-agilepixel made their first contribution in #8987
Full Changelog: v1.25.4...v1.25.5
Changelog
- d2d47af build: Create v1.25.5 images, fixes #8993 (#9016)
- 2e66b75 fix(webserver): apply php.net mitigations for session upload progress and PHP 8.6 (#9012)
- fab900b fix: allow /phpstatus only from inside the web container, fixes #9005 (#9006)
- b8e119c build(deps): bump zod and puppeteer in /perf/metrics/03-drupal-install (#9010) [skip ci]
- c017916 feat(docs): add social cards and llms.txt, fix zensical 0.0.72 privacy error (#9009)
- a8fdb9c build: always run go build from
makeso embedded assets and version stay current [skip buildkite] (#9003) [skip ci] - 3e8c3cc docs(router): add custom maintenance page (#9007) [skip ci]
- 32a60f1 fix: resolve a symlinked project root for Mutagen, for #8924 (#8987)
- cc2cfe9 feat(tui): wrap around the project list (#8999) [skip ci]
- 8d73e9f perf: render only what is on screen in
ddev tui, for #8941 (#8979) [skip ci] - 677a140 fix: signal handling - remove in-flight temporary containers when ddev is interrupted, fixes #8951 (#8954)
- 18c58bf feat: warn when ddev-router's ports don't answer on the host (#8990) [skip ci]
- 0b87317 fix: resolve symlinked SSH agent sockets for ssh_agent_upstream, fixes #8961 (#8963) [skip ci]
- b3b546c test(docs): fail quickstart downloads at the step that broke (#8997) [skip ci]
- 62838ef fix: hide Compose's "No services to build" warning in
ddev restart -s(#8996) [skip ci] - b2cb738 build(deps): bump go.mod (#8994) [skip ci]
- 6818847 build(containers): load locally built images with Docker media types on Podman, so
make testworks there (#8981) - eea391d fix: keep DDEV_DEBUG output readable by quieting compose progress and router port messages (#8953) [skip ci]
- e6d5b8d feat: set container_name and hostname on all compose services (#8983) [skip ci]
- f0fa6f5 chore: stop requesting reviews from the empty documentation team (#8992) [skip ci]
- a7f3f33 fix: keep host variables out of the daemons'
ddev startlaunches, for #8380 (#8976) [skip ci] - 95c5633 chore(claude): drop the commit hook, inline the formatting hooks (#8989) [skip ci]
- 8afc985 ci: run GitHub workflows on Ubuntu 26.04 and install latest docker-ce from Docker's repo (#8985) [skip ci]
- 2f5d9f2 fix(updatecheck): make TestAvailableUpdates reliable by using the latest-release endpoint (#8988) [skip ci]
- a9bd9d3 perf: report
ddev startstep timings inline and speed up router config push (#8972) [skip ci] - 469f9b7 fix: don't panic on compose services that use network_mode (#8984) [skip ci]
- 36af2e2 feat: show only changed settings after
ddev config globalwith flags (#8968) - e5cdbfe fix(nginx): never execute PHP from CMS user-generated files directories (#8962) [skip ci]
- 2f234ec ci: download mkcert only for packaging, and retry it longer (#8980) [skip ci]
- 9b6e2b8 test(webserver): retry the FPM log tail check, and use
run -0in php_webserver.bats (#8982) [skip ci] - d1814ff refactor(router): remove the unused ddev-router-letsencrypt volume (#8977) [skip ci]
- 3c6ac83 fix: stop repeating settings messages on
ddev startfor Backdrop, WordPress, and TYPO3 (#8971) [skip ci] - 0e9ab54 test(quickstart): retry upstream downloads and authenticate Composer to GitHub (#8978)
- cec563d perf: list containers once for
ddev list,describeandtui, for #8941 (#8955) - 6f953f3 test: retry TestCmdLogs HTTP check and trim its failure output (#8969) [skip ci]
- 26f9387 refactor: remove unreachable returns after infinite loops in dockerutil (#8967) [skip ci]
- f114646 docs: create the macOS Podman machine with 6GB of memory (#8970) [skip ci]
- d9d83e4 test: cover corepack npm fallback on Node.js 26, for #8965 (#8966) [skip ci]
- 3d9c472 fix: remove stale containers holding project volumes on
ddev delete, fixes #8777 (#8950) - d9e691f ci: mask systemd-binfmt in WSL2 tests and require systemd running (#8957)
- c4750c9 test: show npm stderr and debug log when TestNpmGlobalInstall fails (#8952) [skip ci]
- 2d1d017 feat: add pre-delete and post-delete hooks, fixes #2988 (#8946)
- f71e0a7 feat: pass GitHub token to web builds as a secret, document PIE, fixes #7929, fixes #8549 (#8948) [skip ci]
- 85c3a5b fix(dbserver): raise redo log, halve buffer pool, align init_connect, split slow log, fixes #8884 (#8929)
- e5e8052 fix: serialize hosts-file edits with the global lock, fixes #8937 (#8938) [skip ci]
- 2546c4f feat(start): offer to configure a web project that has no DDEV config, fixes #7976 (#8890) [skip ci]
- 6fd1c15 fix: recover from empty or unparseable .state.yaml and project_list.yaml, fixes #8935 (#8936) [skip ci]
- 3e70ce1 feat: support zstd in import-db, import-files, and export-db, add
export-db --compression, fixes #8856 (#8939) [skip ci] - 2b41b97 feat(tui): rebuild
ddev tuilayout, keys and help, fixes #8916 (#8940) [skip ci] - c86501a refactor(mutagen): mount project_mutagen once, chown around bind mounts, for #8895 (#8944) [skip ci]
- b49d155 chore(claude): link the Read the Docs preview in docs PRs (#8949) [skip ci]
- 9e38f30 test: authenticate bee download-core and make quickstart failures readable (#8942)
- 733ea39 feat(tui): delete projects with
Dkey, fixes #8782 (#8786) [skip ci] - 63b0149 feat: add global_config.*.yaml overrides, for #3200 (#8888)
- f2834f4 docs: refresh CONTRIBUTING.md and defer shared rules to ddev/.github, fixes #8699 [skip ci] (#8932) [skip ci]
- 4c560c1 test: require drupal_cms_helper before drush si in the Drupal CMS quickstart test (#8933) [skip ci]
- 35478c2 test: fix share test timing races and log router state on URL failures, minor
ddev shareadjustments (#8922) - 1d3921c fix(dockerutil): half-close the exec stream when no stdin is attached, for #7372 (#8928) [skip ci]
- d4065df test(mutagen): make TestMutagenSimple diagnosable, cheaper and default-environment only (#8930)
- 3e9373b refactor: rename router "ephemeral" ports to substitute ports, fixes #8898 (#8923)
- ce5c19a fix: serialize shared router and network setup with a global lock, fixes #5527 (#8891) [skip ci]
- 7148e60 fix(webserver): log to /proc/1/fd/1 instead of the /var/tmp/logpipe FIFO, fixes #8911, fixes #8912 (#8914) [skip ci]
- 1ca8b89 test: skip SkipUnlessDefaultEnvironment tests when Mutagen is the global default, fixes #8919 (#8921)
- 2eeb549 feat: show failed container logs when CI=true (#8920) [skip ci]
- 6036eb3 fix: pull the base image of build services tagged per service, fixes #8832 (#8900)
- 34a1f85 test: wait for the host port to be released in TestExistingContainerHostPortStopped (#8918) [skip ci]
- 15426f8 feat: add global hooks in global_config.yaml, fixes #3200 (#8889) [skip ci]
- b315e5f fix: DDEV should choose host ports instead of leaving it to docker/compose, fixes #8293 (#8887) [skip ci]
- 56212a1 fix(dockerutil): prepare the CopyIntoVolume target with Exec instead of the container command, for #8912 (#8913) [skip ci]
- b8e4fdf fix(modx): pass the request path to index.php as
qin the nginx config (#8915) [skip ci] - cc190e0 chore(claude): update the PR body when adding commits to an open PR (#8917) [skip ci]
- e978222 feat: forward AI agent variables and bare web_environment names on exec, fixes #8378 (#8380)
- 5fdde42 fix: run all-project-types in full and fix the bugs it found (#8903) [skip ci]
- 94c92c9 feat: add
ddev restart --serviceand--profiles, fixes #7904 (#8906) - 5213923 fix(webserver): always resolve composer to /usr/local/bin/composer in every shell, fixes #8907 (#8908) [skip ci]
- ab91f54 ci(images): stop treating registry errors as a missing image tag (#8910) [skip ci]
- 0669aef chore(claude): deny unsetting GOTEST_SHORT, predict the PR number (#8902) [skip ci]
- 598e255 test: log restart output and global-commands volume state in TestAutocompletionForCustomCmds (#8905)
- 0bbc99d fix(dbserver): stop spurious InnoDB and TLS startup warnings, fixes #8831 (#8885)
- 5d80819 feat: OSC 8 links and open-in-editor keys in the TUI and CLI output, fixes #8882 (#8883) [skip ci]
- a11c85e test(buildkite): update homebrew recipe to buildkite-agent@4 [skip github] (#8899)
- a8f22d4 build: retry transient network failures in web image builds and tests, fix mariadb wrapper race (#8896)
- d8e2143 fix: build a profile's images when it starts, and refresh built ones on --no-cache, fixes #8817 (#8820)[skip ci]
- b3ed160 test: show command output when diagnose, dockercheck and xdebug-diagnose tests fail (#8897) [skip ci]
- a57266f ci: hide Homebrew's Landlock ABI warning annotation on Linux runners (#8893) [skip ci]
- 15084bf docs: explain how to keep changes made inside the web container across restarts (#8894) [skip ci]
- 5bf1e0f docs: fix SvelteKit quickstart for SvelteKit 3, which drops svelte.config.js (#8892)
- 81ce907 ci(images): report and delete unused Docker Hub image tags, fixes #8848 (#8857) [skip ci]
- 4466def fix(download-images): pull images for the service's platform (#8859)
- b65a22e feat: add ssh_agent_upstream to use an existing SSH agent, fixes #3878 (#8861)
- 01b6033 fix(list): fit table columns to their contents and wrap router errors (#8878)
- bfe9365 fix: start with the last built images when offline and the build fails, for #8832 (#8860) [skip ci]
- d0af353 feat: let commands that don't use Docker run without it (#8880) [skip ci]
- e05e3a6 fix(github): retry without a token only on 401, not on an API 404, for #8855 (#8881) [skip ci]
- d4b0042 fix: make
make staticrequiredandmake textlintwork on Windows (#8879) [skip ci] - 42cf1ae fix(download-ddev): look up
--headthrough the GitHub API (#8877) - 5f10b39 fix: show Git Bash PATH instructions in
ddev utility download-ddevon Windows (#8873) - c69f458 fix(podman): use init in CopyIntoVolume container to avoid stop delay (#8875) [skip ci]
- 92ec634 fix: stop download progress bar from running
tputon every refresh (#8876) [skip ci] - daedbf4 feat: show QR codes in
ddev shareandddev launch --qr, remove ddev-qr add-on, for ddev/ddev-qr#15 (#8870) - e0eb3d1 chore(claude): stop denying
sed -i(#8874) [skip ci] - 8f8ac2f feat: add initial partial php8.6 support, fixes #8779 (#8826)
- c733ccb ci: load macOS signing identity from 1Password, fixes #8842, fixes #8869 (#8871)
- ed76ebe ci: consolidate test eligibility checks (#8863) [skip ci]
- a71005d fix(ci): handle stray
|, line endings and'in embargo variables (#8864) [skip ci] - b5c78cc fix(add-ons): install the latest release, not the first one GitHub lists, fixes #8854 (#8855)
- ef0ea52 fix: install project-type-specific web image utilities only when needed, fixes #8824 (#8828)
- 60e251f fix: pass PATH_INFO to php-fpm from nginx, fixes #3854, fixes #4001 (#8844)
- 18ecfec fix(webserver): stop the 403 explanation from disabling directory listing (#8821)
- a75ec19 fix(images): exclude test dirs, README, and LICENSE from image hash, fixes #8850 (#8853)
- d1576fd fix: don't fail ddev start on unused containers, fixes #8830 (#8843)
- a8d9369 feat: add x-ddev.container-user, fixes #8806 (#8829) [skip ci]
- 46ce2bd docs(extend): split overlapping custom-service pages and fix ports/expose examples (#8841) [skip ci]
- ac1835a fix(webserver): use an isolated volume in the webserver image test suite, fixes #8849 (#8851) [skip ci]
- 9c8b75c docs: merge CLAUDE.md into AGENTS.md (#8852) [skip ci]
- 35b5204 fix(nginx): stop intercepting app-level 404s in the magento, magento2 and maho templates, fixes #8837 (#8838)
- ee9b64c feat: add console commands to Shopware 6 projects (#8845)
- 2a06644 test(perf-collector): drop retired pipelines and improve failure message (#8839)
- f9d959f build(images): skip fork release-marker check once marker's tag is published, fixes #8804 (#8827)
- bd98eeb docs(buildkite): document git-mirrors-path best practice for testbots (#8799) [skip ci]
- ca6023f chore(claude): fix fallout from doc-lint and manual-testing guidance (#8823) [skip ci]
- 464d23d test(buildkite): fix WSL2 agent tagging and remove orphaned NAT pipelines (#8822) [skip ci]
- 83cf649 build(compose): update compose to current, revert #8767, fixes #8768 (#8819)
- accbe7f fix(dbserver): add --single-transaction and MySQL 9.5+ dump flags to export-db (#8797)
- 82b2f55 ci: fix release workflow broken by windows signing change #8769 (#8818)
- 55c2043 fix: reduce init() usage and redundant NewApp()/app-root calls in cmd package, fixes #7472 (#8774)
- 8cde811 test(export-db): cover mysql in TestDdevExportDB and trim redundant per-engine checks (#8798) [skip ci]
- 95c5bca ci: build Windows on Linux and use the signer only for signtool (#8769) [skip ci]
- d59e729 ci(github): remove setup-homebrew pin (#8815) [skip ci]
- c0299f5 docs(quickstart): fix Maho redirect, take install URLs from
ddev exec(#8814) - 48cf35d feat: forward TERM_PROGRAM and other terminal variables to ddev ssh/exec, fixes #8808 (#8809) [skip ci]
- 1228d0a test(auth-ssh): fix test-ssh-server image (#8813) [skip ci]
- ece124c fix: stale-pin check should compare against the resolved release tag, not the raw hash (#8801) [skip ci]
- 35a2ab1 ci: consolidate per-image container push comments into one PR comment (#8791)
- e1f5555 feat(docker): support prerelease tags for images, so vX.Y.Z-rc1 can be released (#8766) [skip ci]
- 2d3f835 fix(dbserver): prefer mariadb-backup over deprecated mariabackup name (#8803) [skip ci]
- b9c8d4b chore(claude): consolidate agent guidance, correct stale claims (#8805) [skip ci]
- 6883fe3 build: bump 1password/load-secrets-action from 4 to 5 (#8807) [skip ci]
- 2f96a57 test: update the drupal 12 bats test minding the 403 (#8810) [skip ci]
- 13a50dc fix(zensical): drop strict-build retry workaround, require 0.0.58 (#8795) [skip ci]
- 7952fd2 docs: add subtle sponsorship callouts to GitHub templates and release notes (#8796) [skip ci]
- 21c8600 ci(textlint): fail on errors instead of only annotating (#8800) [skip ci]
💙 DDEV is free and open source, maintained by the nonprofit DDEV Foundation.
If this release saves you time, consider sponsoring DDEV.