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
⚠️ 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 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
- Database seeding and reset:
ddev start --seed-snapshot=<name-or-path>fills a new database from any snapshot, andddev start --reset-databasedeletes 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 ofbitnamilegacy/mysql, which gets no updates - Env files:
.env.localfor 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-snapshotfills 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 namedseedis used automatically, with no flag. Works for MariaDB, MySQL, and PostgreSQLddev start --reset-databasedeletes 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 changeddatabase:in your config.ddev config --database=now warns instead of failing, andddev deleteno longer refuses to work on a project whose data came from a different database serverddev snapshot restore --forcerestores a snapshot made by a different version of the same database serverddev snapshot --listshows each snapshot's size and database versionddev snapshot restoreandddev snapshot --listalso 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. Thebase_dbseed also reads zstd now, not only gzip, which is much faster for a customdbimagewith 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/.envand~/.ddev/.env.<service>set variables for every project. This is the only way to set a variable globally for a container other thanweb, sinceweb_environmentonly reachesweb. If a project sets the same variable, the project value is used. Write these files withddev dotenv global set - Add-on install actions now see
.ddev/.envand the global~/.ddev/.env*files, not only.ddev/.env.<addon>. If you set aDDEV_*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-cliin the web image, plusddev admin-watchandddev storefront-watchwith the ports they need, so the ddev-shopware-cli add-on isn't needed, thanks to @vanWittlaer - New
ddev add-on updatechecks installed add-ons against their latest GitHub release and updates the outdated ones, with--dry-runto see what would change - New
ddev utility download-ddevfetches theddevandddev-hostnamebinaries for a PR, branch, commit, release tag, latest stable, ormainHEAD, without touching your installed DDEV - New
ddev utility delete-volumeremoves 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-urlandDDEV_LAUNCH_PRINT_URL=true ddev launchprint the URL instead of opening a browser, for SSH, containers, and CI, thanks to @steffenmaechtel- New
ddev tableprohost command for the TablePro database client on macOS, thanks to @datlechin - New
nodejs_rootletsnodejs_version: auto/engineread the version file from a subdirectory such asweb/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
dbimageconfig option works again after a long absence, mirroringwebimage, along withddev config --db-image/--db-image-default - If you pin a custom
webimageordbimage,ddev startwarns 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 sshandddev execpass yourTERMandCOLORTERMinto interactive sessions, so you get more than 16 colors, thanks to @wazumddev startwarns when DDEV itself is an unreleased build from a PR or a local branch, andddev versionshows where it came from- Drupal
settings.ddev.phpconfiguressymfony_mailer_litethe way it already configuredsymfony_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/logcan do that again, after the directory was locked down to root only - A site that generates
/robots.txtitself works again, including Drupal's RobotsTxt module. An nginx rule was answering/robots.txtbefore your site could, and it is now removed - Projects that pin the web service to a specific platform, like
platform: linux/amd64on an Apple Silicon Mac, start again - Orphan containers get removed again, so Docker Compose stops warning about them
Bug Fixes
ddev wpuses the path from your project's ownwp-cli.ymlagain, 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
ddevin 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 startthere 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 withgetaddrinfo 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 acquiahandles long application names, where the Acquia CLI breaks the database filename across several lines, thanks to @danepowell- Your
pre-/post-import-dbandpre-/post-import-fileshooks now run when a provider does its own importing withdb_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-routerremembers 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.phpfor thedrupal11anddrupal12project types is refreshed from upstream, and drupal11'ssettings.ddev.phpgets the garbage-collection threshold that drupal12 already had, thanks to @rpkoller
Breaking Changes
xdebug_enabledis gone fromddev describe -j. It reported project config, not live Xdebug status, so useddev xdebug statusfor 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 getandddev 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
docrootorupload_dirsvalue in.ddev/config.yaml, or a path you pass toddev dotenv, now gives a clear error when it points outside the project, instead of DDEV silently reading and writing files there
Internal Changes
ddev-webserverexplains the 403s and 404s it generates itself instead of serving a bare error page, since those usually mean a wrongdocrootor a project that isn't installed yet, andddev-routerdoes 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 onddev start, which you couldn't see in a browser and which warned wrongly when.htaccessrewrites into a subdirectoryddev-php-baseis consolidated intoddev-webserveras local build stages, so a new base image no longer has to be pushed to Docker Hub beforeddev-webservercan reference it.ddev/ddev-php-baseandddev/ddev-php-prodare no longer published and stay at their last-pushed tag; theddev-webserverimage 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.localSAN is also gone from the global default certificate - Under rootless Docker or Podman, the host's
usr.sbin.mysqldAppArmor profile attaches to the container's mysqld and left it unable to read/etc/my.cnf. That profile is loaded on any Linux machine withmysql-serverinstalled, and the newdhi.io/mysqlbase puts mysqld at the path it matches. MySQL 8.0, 8.4, and 9.7 now load their config with an explicit--defaults-fileinstead - 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-rootCI dropped DDEV_DOCKER_ORGpoints a binary at a different Docker Hub organization, so a release built outsideddev/ddevcan be pull-tested end to endlast_started_versionis recorded by every command that starts containers, not onlyddev start/ddev restart, so you stop being asked for addev poweroffthat isn't needed.ddev start -yrecords it too- Three fixes toward Apple Container and socktainer support (#7372): bound host ports fall back to
NetworkSettings.PortswhenHostConfig.PortBindingscomes back empty, a running project's database version is read by exec instead of a second mount of an already-attached volume, andddev startsurvives achownfailure on/mnt/ddev-global-cachewhere 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
- test(shopware): remove pin for Twig, for #8557 (#8568) [skip ci] by @stasadev in #8568
- test(php): remove skip for php8.5-solr, for #7697 (#8569) [skip ci] by @stasadev in #8569
- ci(linkspector): remove skip for 429 error, for #7270 (#8570) [skip ci] by @stasadev in #8570
- chore: remove unused "default" provider (#8571) [skip ci] by @stasadev in #8571
- fix(mysql): build mysql 8.0/8.4 from Docker Hardened Images, fixes #7962 by @rfay in #8535
- fix(mysql): bump webserver mysql client to 8.0.46/8.4.10 by @rfay in #8576
- ci(github): update dependabot.yml (#8565) [skip ci] by @stasadev in #8565
- docs(commands): add precision about
launchwhich start project, fixes #8583 by @MrYamous in #8585 - fix(router): stop sharing wildcard SANs across per-project certs, fixes #8562 by @stasadev in #8563
- fix(router): remove obsolete *.ddev.local from generated certs, fixes #8586 by @rfay in #8589
- docs(diagnostics): document all opt-in instrumentation events (#8592) [skip ci] by @stasadev in #8592
- feat(commands): add
ddev tableproglobal host command by @datlechin in #8580 - fix(build): honor service platform override when building images, fixes #8578 by @rfay in #8579
- feat(router): serve informative message for unmatched routes, fixes #8587 by @rfay in #8591
- chore: Updates to the settings.php for the drupal11 and drupal12 project types by @rpkoller in #8581
- docs(quickstart): update Shopware 6 references to up-to-date information by @vanWittlaer in #8593
- fix(buildkite): run orb start/stop synchronously so orbstack reliably ends up running (#8605) [skip ci] by @rfay in #8605
- feat(webserver): explain webserver-level 404s, fixes #8588 by @rfay in #8590
- chore: replace github.com/sponsors/ddev with ddev.com/sponsor by @stasadev in #8615
- docs: expand CLAUDE.md language rules to curb AI-nonsense words and ego-stroking [skip ci] by @rfay in #8619
- docs(quickstart): work around Drush/Guzzle 8 conflict in Drupal 12 install (#8618) [skip buildkite] by @rfay in #8618
- docs(shopware): fix quickstart for php-http/discovery no longer prompting by @rfay in #8620
- docs(quickstart): revert Drush/Guzzle 8 workaround for Drupal 12 by @rfay in #8621
- docs: add details on changing from Homebrew to a specific version (#8459) [skip ci] by @joachim-n in #8459
- feat: add support for global Dockerfiles, fixes #8406 (#8405) [skip ci] by @rmott-littler in #8405
- fix(nodejs): stop recursively chgrp/chmod'ing /usr/local/n on every project build, fixes #8600 by @rfay in #8603
- test(silverstripe): update fixture to test-silverstripe 6.2.2 (#8626) [skip ci] by @rfay in #8626
- fix(describe): omit xdebug_enabled from describe output, fixes #8159 (#8360) [skip ci] by @jonesrussell in #8360
- fix: don't write CMS db connection settings when db container is omitted or another driver is configured, for #8582 (#8594) [skip ci] by @rfay in #8594
- feat(maho): add Maho project type by @fballiano in #8606
- docs(quickstart): pin quickstart to Symfony LTS, fixes symfony.bats failures [skip ci] by @rfay in #8628
- fix: reject symlinks with rooted/absolute targets in Untar, for #8213 (#8625) [skip ci] by @rfay in #8625
- perf(router): update network aliases in place instead of recreating on start, for #8132 (#8561) [skip ci] by @stasadev in #8561
- build(docker): consolidate ddev-php-base into ddev-webserver, fixes #8012 by @rfay in #8604
- ci(podman): force k8s-file log driver to avoid conmon journald crash (#8630) [skip ci] by @rfay in #8630
- ci(podman): force nftables firewall backend to avoid intermittent netavark failure [skip ci] by @rfay in #8633
- test(macos-docker-desktop): skip tests hitting a Docker Desktop connection reset by @rfay in #8627
- feat: add MySQL 9.7 LTS support, fixes #8514 by @rfay in #8629
- feat(config): re-implement dbimage config option, mirroring webimage by @rfay in #8610
- test(router): make TestUseEphemeralPort resilient to host port races, fixes #8293 (#8638) [skip ci] by @rfay in #8638
- fix(settings): close file handles in TYPO3/Drupal settings writers (Traditional Windows test failures), for #8582 (#8632) [skip ci] by @rfay in #8632
- fix(webserver): tolerate a stale non-FIFO /var/tmp/logpipe on container start (#8635) [skip ci] by @rfay in #8635
- fix(compose): remove BuildKit snapshot race retry logic, for #8136 by @rfay in #8637
- fix(docker): quiet per-layer image pull progress in non-interactive output, fixes #8624 by @rfay in #8636
- docs: Remove obsolete Lullabot nodejs link (#8645) [skip ci] by @rfay in #8645
- build: bump actions/setup-go from 6 to 7 in the actions group (#8646) [skip ci] by @dependabot[bot] in #8646
- fix(docker): restore /usr/local/n and make /var/log group-0-writable, fixes #8640, fixes #8574 by @rfay in #8647
- fix(router): skip TestRouterNotRebuiltOnHostnameChange on Windows, fixes #8644 (#8649) [skip ci] by @rfay in #8649
- docs(webserver): condense the 404 explanation comments, for #8590 (#8639) [skip ci] by @stasadev in #8639
- feat(webserver): explain webserver-level 403s, fixes #8595, fixes #7345 (#8641) [skip ci] by @stasadev in #8641
- feat(apptypes): add MODX Revolution (2.x/3.x) as a project type by @casparml in #8560
- docs: explain how to avoid hard line breaks in gh issue/PR/comment bodies (#8662) [skip ci] by @rfay in #8662
- fix(webserver): don't let a failing global-cache chown kill the container by @rfay in #8659
- feat(dbserver): support zstd-compressed base_db for faster first-boot restore by @weitzman in #8608
- test(db): fix filepath formatting in test [skip github] by @rfay in #8666
- ci(github): pin setup-homebrew, drop dead setup-sandbox input (#8667) [skip ci] by @rfay in #8667
- ci(podman): add rootless Podman setup and diagnostic script, fix dockercheck buildx test (#8650) [skip ci] by @rfay in #8650
- feat(perf): add nightly performance benchmark harness by @rfay in #8622
- fix(perf): fix bugs found validating the nightly benchmark harness end-to-end (#8668) [skip ci] by @rfay in #8668
- fix(perf): make the nightly collector resilient to one bad leg [skip ci] by @rfay in #8670
- fix(perf): install drush in the nightly Linux perf project by @rfay in #8673
- docs: update config.md for minor typo (#8674) [skip ci] by @brookemahoney in #8674
- test(quickstart): statamic output changed, fix assertion by @rfay in #8675
- build: bump the actions group with 4 updates by @dependabot[bot] in #8678
- docs: update config.md for minor typos, for #8674 (#8689) [skip ci] by @stasadev in #8689
- fix(modx): add missing 403 in nginx, use
ddev php, for #8560 by @stasadev in #8687 - docs: note that base_db/initializer seeding doesn't support PostgreSQL (#8690) [skip ci] by @rfay in #8690
- test(quickstart): derive URLs from
ddev describe -jinstead of hardcoding ddev.site [skip buildkite] by @rfay in #8676 - feat(snapshot): show size and DB version in
ddev snapshot --listby @rfay in #8642 - fix(dockerutil): fall back to NetworkSettings.Ports in GetBoundHostPorts (#8657) [skip ci] by @rfay in #8657
- fix(dev-tools): put installed tools on PATH and verify they work (#8651) [skip ci] by @rfay in #8651
- feat: forward TERM and COLORTERM to ddev ssh/exec sessions, fixes #6174 (#8669) [skip ci] by @wazum in #8669
- fix: record last_started_version from every command that starts containers, fixes #8520 by @rfay in #8677
- fix(ddevapp): read db version from a running container via exec, not a second volume mount (#8658) [skip ci] by @rfay in #8658
- ci(podman): rework the rootless setup script and docs, drop podman-root CI by @rfay in #8688
- docs: reorganize README to put getting started first (#8693) [skip ci] by @rfay in #8693
- fix(nginx): remove robots.txt location block, fixes #8607 (#8663) [skip ci] by @rfay in #8663
- test(windows): use forward slashes for paths fed to the db-version bash script on Windows [skip github] (#8701) [skip ci] by @rfay in #8701
- fix(ddevapp): attach command output to failing provider and hook commands (#8672) [skip ci] by @rfay in #8672
- fix(provider): run import hooks for custom db/files import commands (#8671) [skip ci] by @rfay in #8671
- feat(images): record image tag in a com.ddev.image-tag label and warn when a pinned image is stale by @rfay in #8682
- docs(readme): add in-kind sponsors section (#8700) [skip ci] by @stasadev in #8700
- docs: sharpen CLAUDE.md guidance on Windows pitfalls and comment length, improve templates, fixes #8255 (#8702) [skip ci] by @rfay in #8702
- fix(router): record ephemeral port substitutions on the ddev-router container, fixes #8644 by @rfay in #8653
- feat(containers): auto-detect content changes and tag/rebuild docker base images locally, for #8609 (#8612) [skip ci] by @rfay in #8612
- fix(acquia): broken db import with long application names by @danepowell in #8643
- ci: add placeholder image-build/image-push workflows for #8609 (#8706) [skip ci] by @rfay in #8706
- fix(ci): quote placeholder workflow strings so #8609 isn't parsed as a YAML comment (#8708) [skip ci] by @rfay in #8708
- build: bump 1password/load-secrets-action from 4 to 5 by @dependabot[bot] in #8709
- build(public-variables): Add DOCKER_ORG [skip ci] by @rfay in #8711
- feat(images): Automatically push and then test new images when changes made, fixes #8609 by @rfay in #8707
- feat(shopware6): bundle shopware-cli and hot-reload watchers by @vanWittlaer in #8597
- build(hash-paths): fix hash-paths.sh portability problem on windows (#8714) [skip ci] by @rfay in #8714
- docs(comments): Clean up comments missed in #8653 [skip ci] (#8710) [skip ci] by @rfay in #8710
- feat: publish apt/rpm packages to Cloudsmith to replace (gradually) Gemfury, fixes #3997 by @rfay in #8698
- fix(ci): wait for pushed images reliably, fixes #8609 by @rfay in #8712
- test(mutagen): Minor test cleaup [skip ci] by @rfay in #8719
- fix(images): gate fork image builds on approval earlier, skip it for authorized authors (#8715) [skip buildkite] by @rfay in #8715
- build(go): modernize for go 1.27, latest golangci-lint (#8722) [skip ci] by @rfay in #8722
- fix(addon): tolerate numeric default_branch in add-on registry JSON (#8723) [skip buildkite] by @rfay in #8723
- test(gob-decode): regenerate stale test-addon-data.gob fixture (#8724) [skip ci] by @rfay in #8724
- feat(amplitude): report add-on repository to Amplitude, fixes #8599 by @rfay in #8716
- feat(snapshot): support uncompressed mariabackup/xtrabackup snapshots and seeds by @rfay in #8704
- docs(claude): convince claude to use simpler language (#8729) [skip ci] by @rfay in #8729
- ci(perf): track total CI runtime per test type across GitHub Actions and Buildkite (#8728) [skip ci] by @rfay in #8728
- feat(add-on): add
ddev add-on updateto update all installed add-ons, fixes #4979 (#8717) [skip ci] by @rfay in #8717 - test: skip tests that don't need to repeat across every CI wrapper workflow, for #8696 (#8725) [skip ci] by @rfay in #8725
- feat(database): add --seed-snapshot and --reset-database, rename 'initializer' to 'seed', fixes #8661, fixes #8322 by @rfay in #8705
- docs(claude): extend description-length discipline to issues, cap section length (#8732) [skip ci] by @rfay in #8732
- test(mutagen): we don't need some mutagen testing [skip buildkite] (#8735) [skip ci] by @rfay in #8735
- fix(nginx): Increase FastCGI buffer sizes (for Drupal CMS tests) by @phenaproxima in #8734
- fix(config): warn about unreleased DDEV builds, fixes #8739 by @rfay in #8740
- ci: comment on PRs included in a release (#8558) [skip ci] by @rfay in #8558
- feat: add
ddev utility download-ddevto download CI and release builds by @stasadev in #8611 - chore: remove version-history.md, fixes #8744 (#8752) [skip ci] by @rfay in #8752
- fix: perf dashboard legs checkbox shows "undefined" (#8755) [skip ci] by @rfay in #8755
- fix(wordpress): let wp-cli.yml override the docroot, fixes #7881 by @stasadev in #8745
- feat(docker): resolve released image tags to vX.Y.Z instead of content hash, fixes #8751 (#8754) [skip ci] by @rfay in #8754
- fix: show image branch hint inline in ddev version, drop it from JSON (#8747) [skip ci] by @rfay in #8747
- fix: reject path traversal in docroot, upload_dirs, and dotenv path validation by @rfay in #8749
- build(go): bump all go.mod dependencies (#8758) [skip ci] by @stasadev in #8758
- feat(snapshot): offer snapshots from sibling Git worktrees, by name, latest, or --list (#8733) [skip ci] by @rfay in #8733
- fix(compose): always use RemoveOrphans option, fixes #8757 by @stasadev in #8759
- chore(compose): remove unused COMPOSE_REMOVE_ORPHANS, for #8759 by @stasadev in #8761
- fix(buildx): skip sha verification on macOS for versions before v0.36.0, for #8758 by @stasadev in #8762
- feat: add
ddev utility delete-volumeto remove a project's Docker volume, fixes #6961 by @rfay in #8756 - build: bump actions/upload-artifact from 4 to 7 in the actions group (#8770) [skip ci] by @dependabot[bot] in #8770
- build(deps): pin docker/buildx past the policy-dependency fix, fixes #8764 (#8767) [skip ci] by @rfay in #8767
- feat(docker): allow overriding the image org with DDEV_DOCKER_ORG, fixes #8753 (#8765) [skip ci] by @rfay in #8765
- fix: float wsl2-setup.sh's default Go install to latest stable (#8775) [skip ci] by @rfay in #8775
- feat: add gitignored .env.local, labeled, and global .env files, fixes #7235, fixes #7309 by @stasadev in #8738
- feat: add ddev launch --print-url flag and DDEV_LAUNCH_PRINT_URL env var, fixes #8771 (#8772) [skip ci] by @steffenmaechtel in #8772
- feat(drupal): support symfony_mailer_lite in settings.ddev.php, fixes #8776 (#8778) [skip ci] by @mxr576 in #8778
- fix: don't use nested project unless it's registered, fixes #8321 by @stasadev in #8327
- fix: resolve TestGetVersionInfo failure and duplicate tag in
ddev versionoutput (#8781) [skip ci] by @rfay in #8781 - feat: add nodejs_root so Node.js version auto-detection can read a subdirectory, fixes #8730 (#8760) [skip ci] by @dpacassi in #8760
- fix(dbserver): pin secure_file_priv for mysql 8.0, 8.4, and 9.7 by @rfay in #8783
- ci(debug): replace tmate with upterm [skip ci] by @stasadev in #8789
- fix: update TestCmdVersion for release-tag image resolution (#8787) [skip ci] by @rfay in #8787
- fix(dbserver): survive host AppArmor mysqld confinement on rootless Docker/Podman CI by @rfay in #8788
- docs(quickstart): Fix fragile drupal cms test; expectation changed by @rfay in #8792
- build(docker): bump images to v1.25.4 for release, fixes #8703 by @stasadev in #8780
New Contributors
- @MrYamous made their first contribution in #8585
- @datlechin made their first contribution in #8580
- @rmott-littler made their first contribution in #8405
- @fballiano made their first contribution in #8606
- @casparml made their first contribution in #8560
- @steffenmaechtel made their first contribution in #8772
- @dpacassi made their first contribution in #8760
Full Changelog: v1.25.3...v1.25.4
SOCIAL SHARE CARD GENERATOR