{"success":true,"result":{"version":"https://jsonfeed.org/version/1.1","title":"DDEV Blog","description":"Posts about DDEV, Docker, and local development.","home_page_url":"https://ddev.com/blog","feed_url":"https://ddev.com/blog/feed.json","items":[{"id":"https://ddev.com/blog/coder-ddev-com-announcement","url":"https://ddev.com/blog/coder-ddev-com-announcement","title":"Introducing coder.ddev.com: DDEV in the Cloud","content_html":"<h2>What is coder.ddev.com?</h2>\n<p><a href=\"https://coder.ddev.com\">coder.ddev.com</a> is a free, experimental cloud DDEV service. You log in with GitHub, create a workspace, and get a full DDEV environment in the cloud — no local Docker, no local installation needed.</p>\n<p>:::warning[Experimental Service]\nThis is an experimental service with no guarantees of data retention, uptime, or long-term availability. The future of its maintenance and sustainability is uncertain. Do not store irreplaceable work here without pushing it to Git. Treat it as a convenience, not a platform to depend on.\n:::</p>\n<p>Want a quick overview? Watch the 6-minute intro video starting from the very beginning:</p>\n<div>\n\n</div>\n\n<h2>Table of Contents</h2>\n<h2>How It Works</h2>\n<p>coder.ddev.com runs on <a href=\"https://coder.com\">Coder</a>, an open-source platform for remote development environments. Each workspace is an isolated container (using the <a href=\"https://github.com/nestybox/sysbox\">Sysbox</a> runtime for secure Docker-in-Docker) with DDEV, Docker, and VS Code pre-installed.</p>\n<p>Your files persist on a remote volume across workspace restarts. When you delete a workspace, the data is gone — so push your work to Git before deleting. But until you delete the workspace, or it's garbage-collected (not yet implemented), your work persists..</p>\n<p>The source code for the templates and Docker image is at <a href=\"https://github.com/ddev/coder-ddev\">github.com/ddev/coder-ddev</a>. Other projects can use this and deploy their own fully-DDEV-capable Coder instances.</p>\n<h2>Getting Started</h2>\n<h3>1. Log In with GitHub</h3>\n<p>Go to <a href=\"https://coder.ddev.com\">coder.ddev.com</a> and click <strong>Login with GitHub</strong>. No separate account needed. <code>coder.ddev.com</code> receives read-only access to your email addresses, public profile, and GitHub organization membership — no code access, no write access.</p>\n<h3>2. Create a Workspace</h3>\n<p>From the dashboard, click <strong>Create Workspace</strong> and choose a template:</p>\n<ul>\n<li><strong>drupal-core</strong> — automated Drupal core development environment</li>\n<li><strong>user-defined-web</strong> — general-purpose DDEV for any project</li>\n<li><strong>freeform</strong> — DDEV with Traefik routing integration for stable URLs</li>\n</ul>\n<p>Give your workspace a name and click <strong>Create Workspace</strong>. Most workspaces start in under a minute. The drupal-core template (with seed cache) is ready in about 30 seconds.</p>\n<h3>3. Access Your Workspace</h3>\n<p>Once running, you have several options to use your workspace:</p>\n<ul>\n<li><strong>Web Browser</strong>: From <code>coder.ddev.com</code>, use the many options, including web-based terminal, VS Code for Web, and VS Code Desktop.</li>\n<li><strong>SSH with <code>coder</code> CLI</strong>: Install the Coder CLI, then <code>coder login https://coder.ddev.com</code> and <code>coder ssh &lt;workspace-name&gt;</code>.</li>\n</ul>\n<h2>Template Overview</h2>\n<h3>drupal-core</h3>\n<p>The drupal-core template sets up a complete Drupal core contribution environment automatically using <a href=\"https://github.com/joachim-n/drupal-core-development-project\">joachim-n/drupal-core-development-project</a>. Drupal core is cloned, Composer dependencies are installed, and a demo site is installed — all in about 30 seconds when a seed cache is available.</p>\n<p>Choose your Drupal version when creating the workspace:</p>\n<ul>\n<li><strong>main (12.x / HEAD)</strong> — latest development (default)</li>\n<li><strong>11.x</strong> — current stable branch</li>\n<li><strong>10.x</strong> — previous stable branch</li>\n</ul>\n<p>The template automatically selects the correct PHP version and DDEV project type for the chosen branch.</p>\n<p>Log in to the site with <code>admin</code> / <code>admin</code>.</p>\n<p>This takes less than 4 minutes, try it out:</p>\n<div>\n\n</div>\n\n<h3>freeform</h3>\n<p>The freeform template adds Traefik routing integration so your DDEV project and services like Mailpit get stable subdomain URLs (no port numbers). After creating a workspace, run <code>ddev coder-setup</code> once in your project directory, then <code>ddev start</code>. Routing updates automatically on every start.</p>\n<h2>The Drupal Issue Picker</h2>\n<p>One of the most useful features for Drupal contributors is the <strong>Drupal Issue Picker</strong> at <a href=\"https://start.coder.ddev.com/drupal-issue\">start.coder.ddev.com/drupal-issue</a>.</p>\n<p></p>\n<p>Paste any drupal.org issue URL (for example, <code>https://www.drupal.org/project/drupal/issues/3568144</code>) and the picker launches a drupal-core workspace with:</p>\n<ul>\n<li>The correct Drupal version (10.x, 11.x, or main) detected from the issue</li>\n<li>The issue fork branch already checked out</li>\n<li>Composer dependencies resolved</li>\n</ul>\n<p>This replaces the workflow that DrupalPod (Gitpod-based) provided for contribution days. You can hand someone an issue URL, they paste it into the picker, and within 30 seconds they have a working environment with the issue branch ready.</p>\n<p>Demonstrating this from start to finish in about 6 minutes:</p>\n<div>\n\n</div>\n\n<h2>Development Tools</h2>\n<h3>VS Code Web</h3>\n<p>\"VS Code Web\" runs in the browser and supports most extensions. You can install extensions from the marketplace, configure settings, and use the integrated terminal — all without installing anything locally.</p>\n<h3>VS Code Desktop</h3>\n<p>Clicking on \"VS Code Desktop\" opens up your local installation of VS Code and then automatically uses the <a href=\"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh\"><strong>Remote-SSH</strong> extension</a> to connect to your Coder workspace. It's nice, I used it a lot in preparing this blog and even in some recent work on Coder.ddev.com itself. All VS Code features work.</p>\n<h3>Xdebug</h3>\n<p>Xdebug works in Coder workspaces the same way as local DDEV with the DDEV VS Code Extension.</p>\n<h3>Coder CLI</h3>\n<p>The Coder CLI provides SSH access, port forwarding, file transfer, and workspace management. It's a completely different way of interacting with your workspace. Install with <code>brew install coder</code> or <a href=\"https://coder.com/docs/install\">other options</a>.</p>\n<pre><code># Login\ncoder login https://coder.ddev.com\n\n# List workspaces\ncoder list\n\n# SSH into workspace\ncoder ssh my-workspace\n\n# Forward a port locally\ncoder port-forward my-workspace --tcp 8080:80\n\n# Stop workspace (preserves data)\ncoder stop my-workspace\n</code></pre>\n<h2>Accessing Your Project</h2>\n<p>Because DDEV runs inside a cloud container, the usual <code>*.ddev.site</code> URLs don't work. Instead, access your project via the <strong>DDEV Web</strong> app link in the Coder dashboard, or use port forwarding, and <code>ddev start</code>, <code>ddev launch</code> and <code>ddev describe</code> also give URL information.</p>\n<p>The freeform template handles this automatically with Traefik routing — you get stable subdomain URLs like <code>https://&lt;workspace&gt;--&lt;workspace&gt;--&lt;owner&gt;.coder.ddev.com/</code>.</p>\n<h2>Stopping and Deleting Workspaces</h2>\n<p><strong>Stop</strong>: Stops the container and frees compute resources. All files in <code>/home/coder</code> are preserved. Use this when you are done for the day.</p>\n<p><strong>Delete</strong>: Permanently removes the workspace and all data. Always push your code to Git before deleting.</p>\n<p>This can also be done from the command-line on your local machine (after <code>coder login https://coder.ddev.com</code>):</p>\n<pre><code>coder list\ncoder stop my-workspace   # Stop (data preserved)\ncoder delete my-workspace # Delete (data lost permanently)\n</code></pre>\n<h2>FAQ</h2>\n<ul>\n<li><strong>How do I pull/push to GitHub/GitLab/Drupalcode? (or use SSH)?</strong></li>\n</ul>\n<p>Use the <code>coder publickey</code> command to get the publickey associated with your coder.ddev.com projects (it's the same for all projects). You can then add that to GitHub/GitLab/Drupalcode/Remote SSH to allow you to access those resources.</p>\n<ul>\n<li><strong>How do I set this up myself for my own initiative?</strong></li>\n</ul>\n<p>The full details are in the repository at <a href=\"https://github.com/ddev/coder-ddev\">github.com/ddev/coder-ddev</a>.</p>\n<ul>\n<li><strong>Where is this running?</strong></li>\n</ul>\n<p>This is running on a 64GB Hetzner bare-metal Ubuntu 24.04 machine in Helsinki, Finland. It has lots of disk and costs about $50/month.</p>\n<h2>Thanks to Coder.com</h2>\n<p>The world of open source is amazing. Coder.com is a shockingly mature project, and so many of these things worked just great out of the box.</p>\n<h2>What's Next</h2>\n<p>The templates and image are open source at <a href=\"https://github.com/ddev/coder-ddev\">github.com/ddev/coder-ddev</a>. Contributions, bug reports, and feature requests are welcome.</p>\n<h2>Getting Help</h2>\n<ul>\n<li><strong>Documentation</strong>: <a href=\"https://github.com/ddev/coder-ddev/tree/main/docs\">github.com/ddev/coder-ddev/docs</a></li>\n<li><strong>DDEV Discord</strong>: <a href=\"https://ddev.com/s/discord\">Discord</a> — <code>#support-and-discussion</code> channel</li>\n<li><strong>Issues</strong>: <a href=\"https://github.com/ddev/coder-ddev/issues\">github.com/ddev/coder-ddev/issues</a></li>\n<li><strong>DDEV Docs</strong>: <a href=\"https://docs.ddev.com\">docs.ddev.com</a></li>\n<li><strong>Coder.com</strong>: <a href=\"https://coder.com\">coder.com</a> or <a href=\"https://github.com/coder/coder\">github.com/coder/coder</a></li>\n</ul>\n"},{"id":"https://ddev.com/blog/docker-buildx-requirement-v1-25-1","url":"https://ddev.com/blog/docker-buildx-requirement-v1-25-1","title":"DDEV v1.25.1 Docker Buildx Requirement","content_html":"<p>DDEV v1.25.1 introduced validation that checks for Docker Buildx, and you may encounter an error when running <code>ddev start</code> if your system isn't configured correctly. This post explains why this dependency exists, who's affected, and how to resolve it. Note that DDEV v1.25.2 will bundle a private Docker Buildx to eliminate this configuration requirement.</p>\n<h2>Table of Contents</h2>\n<h2>Who's Affected</h2>\n<p>Most users won't need to do anything. Docker Desktop, OrbStack, and Rancher Desktop bundle Docker Buildx automatically.</p>\n<p>You may need to take action if you're using:</p>\n<ul>\n<li><strong>macOS with Lima or Colima</strong> - requires manual installation via Homebrew</li>\n<li><strong>Ubuntu or Debian with Docker from Ubuntu/Debian repositories</strong> instead of Docker's repositories - older versions don't meet requirements</li>\n<li><strong>NixOS</strong> - requires package update</li>\n</ul>\n<p>If you're running Docker Desktop, OrbStack, or Rancher Desktop, you can skip this article.</p>\n<h2>The Error</h2>\n<p>When running <code>ddev start</code> on DDEV v1.25.1 without a compatible Buildx version, you'll see:</p>\n<pre><code>$ ddev start\nDocker buildx check failed: compose build requires buildx 0.17.0 or later: docker CLI plugin \"buildx\" not found.\nPlease install buildx: https://github.com/docker/buildx#installing\n</code></pre>\n<p>Or if Buildx is installed but doesn't match the required version:</p>\n<pre><code>$ ddev start\nDocker buildx check failed: compose build requires buildx 0.17.0 or later.\nInstalled docker buildx: 0.13.1 (plugin path: /usr/lib/docker/cli-plugins/docker-buildx)\nPlease update buildx: https://github.com/docker/buildx#installing\n</code></pre>\n<h2>Why This Requirement Exists</h2>\n<p>This is an upstream dependency from Docker Compose, not a DDEV-specific choice.</p>\n<p>Here's how we got here:</p>\n<ol>\n<li><strong>Docker Compose v2.37.0</strong> (released June 2025) made the <a href=\"https://github.com/docker/compose/releases/tag/v2.37.0\">bake builder</a> the default build backend</li>\n<li><strong>Docker Compose v2.40.2</strong> (released October 2025) <a href=\"https://github.com/docker/compose/pull/13295\">introduced a minimum version requirement</a> for Docker Buildx (≥0.17.0)</li>\n<li><strong>DDEV v1.24.8</strong> (released September 2025) <a href=\"https://github.com/ddev/ddev/releases/tag/v1.24.8\">updated to Docker Compose v2.39.3</a>, which uses the bake builder by default</li>\n<li><strong>DDEV v1.25.1</strong> (released February 2026) <a href=\"https://github.com/ddev/ddev/releases/tag/v1.25.1\">added validation to catch this configuration issue early</a> and provide clear guidance</li>\n</ol>\n<p>The requirement comes from Docker Compose itself. DDEV now validates your system configuration to prevent confusing build failures.</p>\n<h2>Solutions by Platform</h2>\n<h3>macOS with Lima or Colima (or if you have this problem for any reason)</h3>\n<p>Install Docker Buildx via Homebrew:</p>\n<pre><code>brew install docker-buildx\n</code></pre>\n<p>After installation, configure Docker to find the plugin. Add <code>cliPluginsExtraDirs</code> to <code>$HOME/.docker/config.json</code>:</p>\n<pre><code>{\n  \"cliPluginsExtraDirs\": [\"/opt/homebrew/lib/docker/cli-plugins\"]\n}\n</code></pre>\n<p>You can see this information anytime with:</p>\n<pre><code>brew info docker-buildx\n</code></pre>\n<p>The post-install messages from Homebrew will show you the exact path for your system.</p>\n<h3>Debian</h3>\n<p>Debian 13 (Trixie) includes Docker Buildx v0.13.1 from the Debian repositories, which doesn't meet the ≥0.17.0 requirement.</p>\n<p><strong>Solution</strong>: Switch to Docker from the official Docker repositories.</p>\n<ol>\n<li><a href=\"ddev-backups.md\">Backup your DDEV projects</a> with <code>ddev snapshot -a</code>.</li>\n<li>Uninstall Docker packages from Debian repositories</li>\n<li>Follow the <a href=\"https://docs.ddev.com/en/stable/users/install/docker-installation/#docker-for-linux\">Docker installation instructions in our documentation</a></li>\n</ol>\n<p>The official Docker repositories provide current versions of all Docker components including Docker Buildx ≥0.17.0.</p>\n<h3>NixOS</h3>\n<p>NixOS users should track <a href=\"https://github.com/ddev/ddev/issues/8183\">DDEV issue #8183</a>. A <a href=\"https://github.com/NixOS/nixpkgs/pull/494539\">NixOS patch</a> is available - once merged, you'll get the fix through normal system updates without manual intervention.</p>\n<h3>Generic Solution</h3>\n<p>If the platform-specific solutions above don't work, you can manually place the <code>docker-buildx</code> binary in one of Docker's expected plugin directories:</p>\n<p><strong>Linux/macOS:</strong></p>\n<ul>\n<li><code>$HOME/.docker/cli-plugins/</code></li>\n<li><code>/usr/local/lib/docker/cli-plugins/</code></li>\n<li><code>/usr/local/libexec/docker/cli-plugins/</code></li>\n<li><code>/usr/lib/docker/cli-plugins/</code></li>\n<li><code>/usr/libexec/docker/cli-plugins/</code></li>\n</ul>\n<p><strong>Traditional Windows (not needed for WSL2):</strong></p>\n<ul>\n<li><code>%USERPROFILE%\\.docker\\cli-plugins\\</code></li>\n<li><code>%ProgramFiles%\\Docker\\cli-plugins\\</code></li>\n</ul>\n<p>See Docker's plugin manager source for <a href=\"https://github.com/docker/cli/blob/master/cli-plugins/manager/manager_unix.go\">Linux/macOS</a> and <a href=\"https://github.com/docker/cli/blob/master/cli-plugins/manager/manager_windows.go\">Windows</a> for the complete list.</p>\n<p>Alternatively, place the binary anywhere and configure Docker to find it by adding <code>cliPluginsExtraDirs</code> to <code>$HOME/.docker/config.json</code> (or <code>%USERPROFILE%\\.docker\\config.json</code> on Windows):</p>\n<pre><code>{\n  \"cliPluginsExtraDirs\": [\"/path/to/your/custom/plugin/directory\"]\n}\n</code></pre>\n<h2>What's Next for DDEV</h2>\n<p>We're working to make this smoother in upcoming releases:</p>\n<p><strong>DDEV v1.25.2</strong> (upcoming) will likely bundle a private Docker Buildx that DDEV uses exclusively. This eliminates the system configuration requirement for most users. I'm working on this in <a href=\"https://github.com/ddev/ddev/pull/8198\">PR #8198</a>.</p>\n<p><strong>Future releases</strong> will transition from our private Docker Compose binary to the Docker Compose SDK. This gives DDEV more control over upstream dependencies and reduces configuration complexity.</p>\n<h2>Need Help?</h2>\n<p>If you're still seeing issues after following these steps, reach out in any of the <a href=\"https://docs.ddev.com/en/stable/users/support/\">support channels</a>.</p>\n<hr />\n<p><em>This article was edited and refined with assistance from Claude Code.</em></p>\n"},{"id":"https://ddev.com/blog/ddev-ci-warpbuild","url":"https://ddev.com/blog/ddev-ci-warpbuild","title":"Using WarpBuild to speed up DDEV in CI","content_html":"<p>For most developers, DDEV solves a common challenge: making sure that each developer has a consistent, stable local environment for building their web application. We had more and more success with DDEV at Lullabot, but another related issue kept coming up: how do we grow and develop our use of continuous integration and automated testing while avoiding the same challenges DDEV solved for us?</p>\n<p>A typical CI/CD pipeline is implemented using the tools and systems provided by the CI service itself. For example, at a basic level you can place shell commands inside configuration files to run tests and tools. Running those commands locally in DDEV is possible, but it's a painful copy/paste process. If you're a back-end or DevOps engineer, odds are high you've wasted hours trying to figure out why a test you wrote locally isn't passing in CI – or vice versa!</p>\n<p>As a first step, we used <a href=\"https://taskfile.dev/\">Task</a> to improve our velocity. Having a unified task runner that works outside PHP lets us standardize CI tasks more easily. However, this still left a big surface area for differences between local and CI environments. For example, in GitHub, the <code>shivammathur/setup-php</code> action is used to install PHP and extensions, but the action is not identical to DDEV. Underlying system libraries and packages installed with <code>apt-get</code> could also be different, causing unexpected issues. Finally, there was often a lag in detecting when local test environments broke because those changes weren't tested in CI.</p>\n<p>This brought us to using DDEV for CI. It's a great solution! Running all of our builds and tasks in CI solved nearly every \"it works on my machine\" problem we had. However, it introduced a new challenge: <strong>CI startup performance</strong>.</p>\n<p>Unlike using a CI-provider's built-in tooling, DDEV is not typically cached or included in CI runners. Just running the <a href=\"https://github.com/ddev/github-action-setup-ddev\">setup-ddev</a> action can take up to a minute on a bad day. That doesn't include any additional packages or Dockerfile customizations a project may include. At Lullabot, we use <a href=\"https://github.com/Lullabot/ddev-playwright\">ddev-playwright</a> to run end-to-end tests. Browser engines and their dependencies are heavy! System dependencies can be north of 1GB of compressed packages (that then have to be installed), and browsers themselves can be several hundred MB. This was adding several minutes of setup time just to run a single test.</p>\n<p>Luckily, based on our experience building <a href=\"https://tugboatqa.com/\">Tugboat</a>, we knew that the technology to improve startup performance existed. When <a href=\"https://www.warpbuild.com/\">WarpBuild</a> was announced with Snapshot support in 2024, we immediately started testing it out. We theorized that the performance improvement of snapshots would result in significant startup time improvement. Here's how we set it up!</p>\n<p>We had three parallel jobs that all required DDEV:</p>\n<ol>\n<li><strong>Playwright Functional Tests</strong> - these were using 8 \"large\" runners from GitHub to complete our test suite fast. Before WarpBuild, each runner took between 15 and 20 minutes to run tests.</li>\n<li><strong>Static tests</strong> running PHPStan, PHPUnit, and so on.</li>\n<li><a href=\"https://www.zaproxy.org/\">ZAP</a> for security scanning.</li>\n</ol>\n<p>Note that our Playwright tests themselves run in parallel on a single worker as well, using <a href=\"https://github.com/lullabot/playwright-drupal\">lullabot/playwright-drupal</a>. This allows us to optimize the additional startup time for installing Drupal itself (which can't be cached in a snapshot) across many tests.</p>\n<p>After linking WarpBuild to our GitHub repository, we had to update our workflows. For the full combined example, see the repository at <a href=\"https://github.com/ddev/ddev-ci-warpbuild-example\">ddev/ddev-ci-warpbuild-example</a>.</p>\n<p>Here is an example representing the changes we made to our workflow <a href=\"https://docs.warpbuild.com/ci/snapshot-runners\">after enabling Snapshots</a> in the WarpBuild UI. At a high level, here's the flow we want to create with our GitHub jobs:</p>\n<pre><code>flowchart TD\n    A[determine-snapshot: &lt;br&gt;Hash key files] --&gt; B[Request WarpBuild runner&lt;br&gt;with snapshot key]\n    B --&gt; C{Snapshot exists?}\n    C --&gt;|\"Yes (fast path)\"| D[Restore snapshot&lt;br&gt;DDEV pre-installed]\n    C --&gt;|\"No (first run)\"| E[Install DDEV, browsers,&lt;br&gt;and dependencies]\n    D --&gt; F[Start DDEV &amp; run tests]\n    E --&gt; F\n    F --&gt; G{First run?}\n    G --&gt;|Yes| H[Clean up &amp; save snapshot]\n    G --&gt;|No| I[Done!]\n    H --&gt; I\n</code></pre>\n<p>Start with a basic workflow to trigger on pull requests and on merges to <code>main</code>.</p>\n<pre><code>name: \"WarpBuild Snapshot Example\"\n\non:\n  push:\n    branches: [main]\n  pull_request:\n</code></pre>\n<p>Before running our real work, we need to know what snapshot we could restore from. We start by creating a hash of key files that affect what gets saved in the snapshot. For example, if Playwright (and its browser and system dependencies) are upgraded by Renovate, we want a new snapshot to be created. Extend or modify these files to match your own project setup.</p>\n<pre><code>jobs:\n  determine-snapshot:\n    # This could be a WarpBuild runner too!\n    runs-on: ubuntu-24.04\n    outputs:\n      snapshot: ${{ steps.snapshot-base.outputs.snapshot }}\n    steps:\n      - uses: actions/checkout@v6\n\n      - name: Determine Snapshot Base\n        id: snapshot-base\n        run: |\n          set -x\n          hash=$(cat .github/workflows/test.yml test/playwright/.yarnrc.yml test/playwright/yarn.lock | md5sum | cut -c 1-8)\n          echo \"snapshot=$hash\" &gt;&gt; $GITHUB_OUTPUT\n        shell: bash\n</code></pre>\n<p>WarpBuild needs some additional configuration to tell GitHub Actions to use it as a runner. This could be as simple as <code>runs-on: 'warp-&lt;runner-type&gt;'</code> if you aren't using snapshots. WarpBuild has <em>many</em> runner options available, including ARM and spot instances to reduce costs further.</p>\n<p>The runs-on statement:</p>\n<ol>\n<li><a href=\"https://github.com/WarpBuilds/snapshot-save#conditional-snapshot-usage\">Skips snapshots via commit messages</a>.</li>\n<li>Uses a \"16x\" sized runner so we can run tests in parallel.</li>\n<li>Creates a snapshot key with the project name, the ddev version, a manual version number, and the short hash of the files from above.</li>\n</ol>\n<p>We also switch to the WarpBuild cache (so it's local to the runner) and check out the project. Update the cache paths as appropriate for your project.</p>\n<pre><code>jobs:\n  # other jobs...\n  build-and-test:\n    needs: [determine-snapshot]\n    runs-on:\n      \"${{ contains(github.event.head_commit.message, '[warp-no-snapshot]') &amp;&amp;\n      'warp-ubuntu-2404-x64-16x' ||\n      format('warp-ubuntu-2404-x64-16x;snapshot.key=my-project-ddev-1.25.1-v1-{0}', needs.determine-snapshot.outputs.snapshot) }}\"\n\n    steps:\n      - uses: WarpBuilds/cache@v1\n        with:\n          path: |\n            ${{ github.workspace }}/.ddev/.drainpipe-composer-cache\n            ${{ github.workspace }}/vendor\n            ${{ github.workspace }}/web/core\n            ${{ github.workspace }}/web/modules/contrib\n          key: ${{ runner.os }}-composer-full-${{ hashFiles('**/composer.lock') }}\n\n      - uses: actions/checkout@v6\n</code></pre>\n<p>We need to add logic to either start from scratch and install everything or restore from a snapshot. Since DDEV isn't installed by default in runners, we can use its presence to easily determine if we're running from inside a snapshot or not. We save these values for later use.</p>\n<pre><code>jobs:\n  # other jobs...\n  build-and-test:\n    steps:\n      # ... previous steps ...\n      - name: Find ddev\n        id: find-ddev\n        run: |\n          DDEV_PATH=$(which ddev) || DDEV_PATH=''\n          echo \"ddev-path=$DDEV_PATH\" &gt;&gt; \"$GITHUB_OUTPUT\"\n          if [ -n \"$DDEV_PATH\" ]; then\n            echo \"ddev found at: $DDEV_PATH (restored from snapshot)\"\n          else\n            echo \"ddev not found (fresh runner, will install)\"\n          fi\n</code></pre>\n<p>If ddev exists, we can skip installing it:</p>\n<pre><code>jobs:\n  # other jobs...\n  build-and-test:\n    steps:\n      # ... previous steps ...\n      - name: Install ddev\n        uses: ddev/github-action-setup-ddev@v1\n        if: ${{ steps.find-ddev.outputs.ddev-path != '/usr/bin/ddev' }}\n        with:\n          autostart: false\n          # When updating this version, also update the snapshot key above\n          version: 1.25.1\n</code></pre>\n<p>At this point, we've got DDEV ready to go, so we can start it and run tests or anything else.</p>\n<pre><code>jobs:\n  # other jobs...\n  build-and-test:\n    steps:\n      # ... previous steps ...\n      - name: Start ddev\n        run: |\n          # Playwright users may want to run `ddev install-playwright` here.\n          ddev start\n          ddev describe\n\n      - name: Run tests\n        run: |\n          ddev exec echo \"Running tests...\"\n          # Replace this with one or more test commands for your project.\n          ddev task test:playwright\n</code></pre>\n<p>Now, tests have passed and we can create a snapshot if needed. If tests fail, we never create a snapshot so that we don't accidentally commit a broken environment.</p>\n<p>We shut down DDEV since we're going to clean up generated files. This keeps our snapshot a bit smaller and gives us an opportunity to clean up any credentials that might be used as a part of the job. While we don't typically need a Pantheon token for tests, we do need it for some other jobs we run with DDEV.</p>\n<pre><code>jobs:\n  # other jobs...\n  build-and-test:\n    steps:\n      # ... previous steps ...\n      - name: Clean up for snapshot\n        if: ${{ steps.find-ddev.outputs.ddev-path != '/usr/bin/ddev' }}\n        run: |\n          # Stop ddev to ensure clean state\n          ddev poweroff\n          # Remove any cached credentials or tokens\n          rm -f ~/.terminus/cache/session\n          # Clean git state and temporary files\n          git clean -ffdx\n</code></pre>\n<p>Now we can actually save the snapshot. We skip this if we can since it takes a bit of time to save and upload. There's no point in rewriting our snapshot if it hasn't changed! The <code>wait-timeout-minutes</code> is set very high, but in practice this step only takes a minute or two. We just don't want this step to fail if Amazon is slow.</p>\n<pre><code>jobs:\n  # other jobs...\n  build-and-test:\n    steps:\n      # ... previous steps ...\n      - name: Save WarpBuild snapshot\n        uses: WarpBuilds/snapshot-save@v1\n        if: ${{ steps.find-ddev.outputs.ddev-path != '/usr/bin/ddev' }}\n        # Using a matrix build? Avoid thrashing snapshots by only saving from one shard.\n        # if: ${{ matrix.shard == 1 &amp;&amp; steps.find-ddev.outputs.ddev-path != '/usr/bin/ddev'}}\n        with:\n          # Must match the snapshot.key in runs-on above\n          alias: \"my-project-ddev-1.25.1-v1-${{ needs.determine-snapshot.outputs.snapshot }}\"\n          fail-on-error: true\n          wait-timeout-minutes: 30\n</code></pre>\n<p>To test, once you have jobs passing, you can rerun them from the GitHub Actions UI. If everything is working, you will see all steps related to installing DDEV skipped.</p>\n<p>Note: We don't pin actions to hashes in these examples for easy copypaste, but for security we always <a href=\"https://docs.renovatebot.com/modules/manager/github-actions/#digest-pinning-and-updating\">use Renovate to pin hashes for us</a>. We would also like to use <a href=\"https://docs.renovatebot.com/modules/manager/regex/\">Renovate Custom Managers</a> to automatically offer DDEV upgrades and keep the version number in sync across all files and locations.</p>\n<h2>The Results?</h2>\n<ul>\n<li>The time to start Playwright tests was reduced from <strong>4 to 5 minutes</strong> to <strong>1 to 2 minutes</strong>. Now, the longest time in the workflow is the <code>ddev start</code> command.<ul>\n<li>This project uses eight parallel runners, so we're saving about 24 minutes of CI costs <em>per commit</em>.</li>\n</ul>\n</li>\n<li>We thought costs would go down, but we ended up writing many more tests! CI costs with WarpBuild stayed roughly similar to our previous GitHub costs but with greater test coverage and faster reports.</li>\n<li>While ZAP tests needed browsers like Playwright, static tests didn't. However, restoring snapshots was fast enough creating separate snapshots without browsers wasn't worth the complexity.</li>\n<li>Snapshot storage costs are inexpensive enough to not matter compared to the CI runner cost.</li>\n</ul>\n<p>While this seems like a lot of work, it was only about half a day to set up and test – and that was when WarpBuild was in beta, had minimal documentation and some rough edges. We haven't really had to touch this code since. Setting up new projects is an hour, at most.</p>\n<p>Do you have other optimizations for DDEV in CI to share? Post in the comments, we'd love to hear them!</p>\n"},{"id":"https://ddev.com/blog/ddev-february-2026-newsletter","url":"https://ddev.com/blog/ddev-february-2026-newsletter","title":"DDEV February 2026: v1.25.0 Ships, 72% Market Share, and New Training Posts","content_html":"<p>DDEV v1.25.0 is here, and the community response has been strong. This month also brought three new training blog posts and a survey result that speaks for itself.</p>\n<h2>What's New</h2>\n<ul>\n<li><strong>DDEV v1.25.0 Released</strong> → Improved Windows installer (no admin required), XHGui as default profiler, updated defaults (PHP 8.4, Node.js 24, MariaDB 11.8), faster snapshots with zstd compression, and experimental rootless container support. <a href=\"release-v1.25.0.md\">Read the release post↗</a></li>\n<li><strong>New <code>ddev share</code> Provider System</strong> → Free Cloudflare Tunnel support, no login or token required. A modular provider system with hooks and CMS-specific configuration. <a href=\"share-providers.md\">Read more↗</a></li>\n<li><strong>Mutagen in DDEV: Functionality, Issues, and Debugging</strong> → Based on the January training session, this post covers how Mutagen works, common issues, and the new <code>ddev utility mutagen-diagnose</code> command. <a href=\"mutagen-functionality-issues-debugging.md\">Read more↗</a></li>\n<li><strong>Xdebug in DDEV: Understanding and Troubleshooting Step Debugging</strong> → How the reverse connection model works, IDE setup for PhpStorm and VS Code, common issues, and the new <code>ddev utility xdebug-diagnose</code> command. <a href=\"xdebug-step-debugging-understanding-and-troubleshooting.md\">Read more↗</a></li>\n</ul>\n<h2>CraftQuest Survey: DDEV at 72%</h2>\n<p>The <a href=\"https://craftquest.io/community-survey/2026\">2026 CraftQuest Community Survey↗</a> collected responses from 253 Craft CMS developers and found DDEV at 72% market share for local development environments. The report notes: \"This near-standardization simplifies onboarding for newcomers, reduces support burden for plugin developers, and means the ecosystem can optimize tooling around a single local dev workflow.\"</p>\n<h2>Conference Time!</h2>\n<p>I'll be at Florida Drupalcamp this week, and will speak on how to <a href=\"https://www.fldrupal.camp/session/use-git-worktree-ddev-run-multiple-versions-same-site\">use <code>git worktree</code> to run multiple versions of the same site</a>. I'd love to see you and sit down and hear your experience with DDEV and ways you think it could be better.</p>\n<p>Then in March I'll be at <a href=\"https://events.drupal.org/chicago2026\">DrupalCon Chicago</a> and as usual will do lots of Birds-of-a-Feather sessions about DDEV and related topics. Catch me in the hall, or <a href=\"https://cal.com/randyfay/30min\">let's sit down and have a coffee</a>.</p>\n<h2>Community Highlights</h2>\n<ul>\n<li><strong>ddev-mngr</strong> → A Go-based command-line tool with an interactive terminal UI for managing multiple DDEV projects at once — start, stop, check status, and open URLs across projects. With this add-on <a href=\"https://github.com/dkd-dobberkau\">Olivier Dobberkau</a> inspired a new TUI approach for DDEV core as well! <a href=\"https://github.com/dkd-dobberkau/ddev-mngr\">View on GitHub↗</a></li>\n<li><strong>TYPO3 DDEV Agent Skill</strong> → Netresearch built an Agent Skill (compatible with Claude Code, Cursor, Windsurf, and GitHub Copilot) that automates DDEV environment setup for TYPO3 extension development, including multi-version testing environments for TYPO3 11.5, 12.4, and 13.4 LTS. <a href=\"https://github.com/netresearch/typo3-ddev-skill\">View on GitHub↗</a></li>\n<li><strong>Using Laravel Boost with DDEV</strong> → Russell Jones explains how to integrate Laravel Boost (an official MCP server) with DDEV, giving AI coding agents contextual access to routes, database schema, logs, and configuration. <a href=\"https://dev.to/jonesrussell/using-laravel-boost-with-ddev-1kc6\">Read on Dev.to↗</a></li>\n<li><strong>Laravel VS Code Extension v1.4.2</strong> → Now includes Docker integration support and a fix for Pint functionality within DDEV environments. <a href=\"https://news.extly.com/more-news/2030-dev-news/24693-docker-support-in-laravel-vs-code-extension-v1-4-2.html\">Read more↗</a></li>\n</ul>\n<h2>Community Tutorials from Around the World</h2>\n<ul>\n<li><strong>Getting Started with DDEV for Drupal Development</strong> → Ivan Zugec at WebWash published a guide covering installation, daily commands, database import/export, Xdebug setup, and add-ons. <a href=\"https://www.webwash.net/getting-started-ddev-drupal-development/\">Read on WebWash↗</a></li>\n<li><strong>Environnement de développement WordPress avec DDEV</strong> → Stéphane Arrami shares a practical review of adopting DDEV for WordPress development, covering client projects, personal sites, and training (in French). <a href=\"https://stephane-arrami.com/articles/environnement-developpement-wordpress-ddev/\">Read more↗</a></li>\n</ul>\n<h2>What People Are Saying</h2>\n<blockquote>\n<p>\"I was today years old when I found out that DDEV exists. Now I am busy migrating all projects to Docker containers.\" — <a href=\"https://bsky.app/profile/themuellerman.bsky.social/post/3mdq22hu3uc2c\">@themuellerman.bsky.social↗</a></p>\n</blockquote>\n<blockquote>\n<p>\"ddev is the reason I don't throw my laptop out of the window during local setup wars. one command to run the stack and forget the rest. simple as that.\" — <a href=\"https://x.com/OMascatinho/status/2017005770944971031\">@OMascatinho on X↗</a></p>\n</blockquote>\n<h2>v1.25.0 Upgrade Notes and Known Issues</h2>\n<p>Every major release brings some friction, and v1.25.0 is no exception. These will generally be solved in v1.25.1, which will be out soon. Here's what to watch for:</p>\n<ul>\n<li><strong>deb.sury.org certificate expiration on v1.24.x</strong> → The GPG key for the PHP package repository expired on February 4, breaking <code>ddev start</code> for users still on v1.24.10 who needed to rebuild containers. We pushed updated images for v1.24.10, so you can either <code>ddev poweroff &amp;&amp; ddev utility download-images</code> or just go ahead and upgrade to v1.25.0, which shipped with the updated key. <a href=\"https://github.com/ddev/ddev/issues/8106\">Details↗</a></li>\n<li><strong>MariaDB 11.8 client and SSL</strong> → DDEV v1.25.0 ships with MariaDB 11.8 client (required for Debian Trixie), which defaults to requiring SSL. This can break <code>drush sql-cli</code> and similar tools on MariaDB versions below 10.11. Workaround: add <code>extra: \"--skip-ssl\"</code> to your <code>drush/drush.yml</code> under <code>command.sql.options</code>, or upgrade your database to MariaDB 10.11+. <a href=\"https://github.com/ddev/ddev/issues/8119\">Details↗</a></li>\n</ul>\n<ul>\n<li><strong>MySQL collation issues</strong> → Importing databases can silently change collations, leading to \"Illegal mix of collations\" errors when joining imported tables with newly created ones. Separately, overriding MySQL server collation via <code>.ddev/mysql/*.cnf</code> doesn't work as expected. <a href=\"https://github.com/ddev/ddev/issues/8130\">#8130↗</a> <a href=\"https://github.com/ddev/ddev/issues/8129\">#8129↗</a></li>\n<li><strong>Inter-container HTTP(S) communication</strong> → The ddev-router doesn't always update network aliases when projects start or stop, which can break container-to-container requests for <code>*.ddev.site</code> hostnames. <a href=\"https://github.com/ddev/ddev/issues/8110\">Details↗</a></li>\n<li><strong>Downgrading to v1.24.10</strong> → If you need to go back to v1.24.10, you'll need to clean up <code>~/.ddev/traefik/config</code> — leftover v1.25.0 Traefik configuration breaks the older version. <a href=\"https://github.com/ddev/ddev/issues/8120\">Details↗</a></li>\n<li><strong>Traefik debug logging noise</strong> → Enabling Traefik debug logging surfaces warning-level messages as \"router configuration problems\" during <code>ddev start</code> and <code>ddev list</code>, which looks alarming but is harmless. <a href=\"https://github.com/ddev/ddev/issues/8102\">Details↗</a></li>\n<li><strong><code>ddev npm</code> and <code>working_dir</code></strong> → <code>ddev npm</code> doesn't currently respect the <code>working_dir</code> web setting, a difference from v1.24.10. <a href=\"https://github.com/ddev/ddev/issues/8148\">Details↗</a></li>\n</ul>\n<p>As always, please <a href=\"https://github.com/ddev/ddev/issues/new/choose\">open an issue↗</a> if you run into trouble — it helps us fix things faster. You're the reason DDEV works so well!</p>\n<hr />\n<h2>DDEV Training Continues</h2>\n<p>Join us for upcoming training sessions for contributors and users.</p>\n<ul>\n<li><p><strong>February 26, 2026 at 10:00 US ET / 16:00 CET — Git bisect for fun and profit</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Git%20bisect%20for%20fun%20and%20profit&amp;dates=20260226T150000Z/20260226T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-02-26.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>March 26, 2026 at 10:00 US ET / 15:00 CET — Using <code>git worktree</code> with DDEV projects and with DDEV itself</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Using%20git%20worktree%20with%20DDEV%20projects%20and%20with%20DDEV%20itself&amp;dates=20260326T140000Z/20260326T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-03-26.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>April 23, 2026 at 10:00 US ET / 16:00 CEST — Creating, maintaining and testing add-ons</strong>\n2026-updated version of our popular add-on training. <a href=\"https://www.youtube.com/watch?v=TmXqQe48iqE\">Previous session recording↗</a>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Creating%2C%20maintaining%20and%20testing%20add-ons&amp;dates=20260423T140000Z/20260423T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-04-23.ics\">Download .ics</a></p>\n</li>\n</ul>\n<p>Zoom Info:\nLink: <a href=\"https://us02web.zoom.us/j/7315692237?pwd=RHR6NUkwb0g5WXIzS2NOcXRucCthZz09\">Join Zoom Meeting</a>\nPasscode: 12345</p>\n<hr />\n<h2>Sponsorship Update</h2>\n<p>After the community rallied in January, sponsorship has held steady and ticked up slightly. Thank you!</p>\n<p><strong>Previous status (January 2026)</strong>: ~$8,208/month (68% of goal)</p>\n<p><strong>February 2026</strong>: ~$8,422/month (70% of goal)</p>\n<p>If DDEV has helped your team, now is the time to give back. Whether you're an individual developer, an agency, or an organization — your contribution makes a difference. → <a href=\"https://github.com/sponsors/ddev\">Become a sponsor↗</a></p>\n<p><a href=\"/contact\">Contact us</a> to discuss sponsorship options that work for your organization.</p>\n<h2>Stay in the Loop—Follow Us and Join the Conversation</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n<p>Compiled and edited with assistance from Claude Code.</p>\n"},{"id":"https://ddev.com/blog/xdebug-step-debugging-understanding-and-troubleshooting","url":"https://ddev.com/blog/xdebug-step-debugging-understanding-and-troubleshooting","title":"Xdebug in DDEV: Understanding, Debugging, and Troubleshooting Step Debugging","content_html":"<p>For most people, Xdebug step debugging in DDEV just works: <code>ddev xdebug on</code>, set a breakpoint, start your IDE's debug listener, and go. DDEV handles all the Docker networking automatically. If you're having trouble, run <code>ddev utility xdebug-diagnose</code> and <code>ddev utility xdebug-diagnose --interactive</code> — they check your configuration and connectivity and tells you exactly what to fix.</p>\n<p>This post explains how the pieces fit together and what to do if things do go wrong.</p>\n<h2>The Quick Version</h2>\n<ol>\n<li><code>ddev xdebug on</code></li>\n<li>Start listening in your IDE (PhpStorm: click the phone icon; VS Code: press <kbd>F5</kbd>)</li>\n<li>Set a breakpoint in your entry point (<code>index.php</code> or <code>web/index.php</code>)</li>\n<li>Visit your site</li>\n</ol>\n<p>If it doesn't work:</p>\n<pre><code>ddev utility xdebug-diagnose\n</code></pre>\n<p>Or for guided, step-by-step troubleshooting:</p>\n<pre><code>ddev utility xdebug-diagnose --interactive\n</code></pre>\n<p>The diagnostic checks port 9003 listener status, <code>host.docker.internal</code> resolution, WSL2 configuration, <code>xdebug_ide_location</code>, network connectivity, and whether Xdebug is loaded. It gives actionable fix recommendations.</p>\n<h2>How Xdebug Works</h2>\n<p><a href=\"https://xdebug.org/\">Xdebug</a> lets you set breakpoints, step through code, and inspect variables — interactive debugging instead of <code>var_dump()</code>.</p>\n<p>The connection model is a reverse connection: your IDE listens on port 9003 (it's the TCP server), and PHP with Xdebug initiates the connection (it's the TCP client). Your IDE must be listening <em>before</em> PHP tries to connect.</p>\n<p>:::note\nThe <a href=\"https://xdebug.org/docs/step_debug\">Xdebug documentation</a> uses the opposite terminology, calling the IDE the \"client.\" We use standard TCP terminology here.\n:::</p>\n<h2>How DDEV Makes It Work</h2>\n<p>DDEV configures Xdebug to connect to <code>host.docker.internal:9003</code>. This special hostname resolves to the host machine's IP address from inside the container, so PHP can reach your IDE across the Docker boundary.</p>\n<p>The tricky part is that <code>host.docker.internal</code> works differently across platforms. DDEV handles this automatically:</p>\n<ul>\n<li><strong>macOS/Windows</strong>: Docker Desktop and Colima provide <code>host.docker.internal</code> natively</li>\n<li><strong>Linux</strong>: DDEV uses the docker-compose host gateway feature</li>\n<li><strong>WSL2</strong>: DDEV determines the correct IP based on your configuration</li>\n</ul>\n<p>You can verify the resolution with:</p>\n<pre><code>ddev exec getent hosts host.docker.internal\n</code></pre>\n<h3>DDEV Xdebug Commands</h3>\n<ul>\n<li><code>ddev xdebug on</code> / <code>off</code> / <code>toggle</code> — Enable, disable, or toggle Xdebug</li>\n<li><code>ddev xdebug status</code> — Check if Xdebug is enabled</li>\n<li><code>ddev xdebug info</code> — Show configuration and connection details</li>\n</ul>\n<h2>IDE Setup</h2>\n<h3>PhpStorm</h3>\n<p>Zero-configuration debugging works out of the box:</p>\n<ol>\n<li>Run → Start Listening for PHP Debug Connections</li>\n<li>Set a breakpoint</li>\n<li>Visit your site</li>\n</ol>\n<p>PhpStorm auto-detects the server and path mappings. If mappings are wrong, check Settings → PHP → Servers and verify <code>/var/www/html</code> maps to your project root.</p>\n<p>The <a href=\"https://plugins.jetbrains.com/plugin/18813-ddev-integration\">PhpStorm DDEV Integration</a> plugin handles this automatically.</p>\n<h3>VS Code</h3>\n<p>Install the <a href=\"https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug\">PHP Debug extension</a> and create <code>.vscode/launch.json</code>:</p>\n<pre><code>{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \"Listen for Xdebug\",\n      \"type\": \"php\",\n      \"request\": \"launch\",\n      \"port\": 9003,\n      \"hostname\": \"0.0.0.0\",\n      \"pathMappings\": {\n        \"/var/www/html\": \"${workspaceFolder}\"\n      }\n    }\n  ]\n}\n</code></pre>\n<p>The <a href=\"https://marketplace.visualstudio.com/items?itemName=biati.ddev-manager\">VS Code DDEV Manager</a> extension can set this up for you.</p>\n<p><strong>WSL2 + VS Code with WSL extension</strong>: Install the PHP Debug extension in WSL, not Windows.</p>\n<h2>Common Issues</h2>\n<p>Most problems fall into a few categories. The <code>ddev utility xdebug-diagnose</code> tool checks for all of these automatically.</p>\n<p><strong>Breakpoint in code that doesn't execute</strong>: The #1 issue. Start with a breakpoint in your entry point (<code>index.php</code>) to confirm Xdebug works, then move to the code you actually want to debug.</p>\n<p><strong>IDE not listening</strong>: Make sure you've started the debug listener. PhpStorm: click the phone icon. VS Code: press F5.</p>\n<p><strong>Incorrect path mappings</strong>: Xdebug reports container paths (<code>/var/www/html</code>), and your IDE needs to map them to your local project. PhpStorm usually auto-detects this; VS Code needs the <code>pathMappings</code> in <code>launch.json</code>.</p>\n<p><strong>Firewall blocking the connection</strong>: Especially common on WSL2, where Windows Defender Firewall blocks connections from the Docker container. Quick test: temporarily disable your firewall. If debugging works, add a firewall rule for port 9003.</p>\n<h2>WSL2 Notes</h2>\n<p>WSL2 adds networking complexity. The most common problems:</p>\n<ul>\n<li><p><strong>Windows Defender Firewall</strong> blocks connections from WSL2 to Windows. Temporarily disable it to test; if debugging works, add a rule for port 9003.</p>\n</li>\n<li><p><strong>Mirrored mode</strong> requires <code>hostAddressLoopback=true</code> in <code>C:\\Users\\&lt;username&gt;\\.wslconfig</code>:</p>\n<pre><code>[experimental]\nhostAddressLoopback=true\n</code></pre>\n<p>Then <code>wsl --shutdown</code> to apply.</p>\n</li>\n<li><p><strong>IDE in WSL2</strong> (VS Code + WSL extension): Set <code>ddev config global --xdebug-ide-location=wsl2</code></p>\n</li>\n</ul>\n<h2>Special Cases</h2>\n<p><strong>Container-based IDEs</strong> (VS Code Remote Containers, JetBrains Gateway):</p>\n<pre><code>ddev config global --xdebug-ide-location=container\n</code></pre>\n<p><strong>Command-line debugging</strong>: Works the same way — <code>ddev xdebug on</code>, start your IDE listener, then <code>ddev exec php myscript.php</code>. Works for Drush, WP-CLI, Artisan, and any PHP executed in the container.</p>\n<p><strong>Debugging Composer</strong>: Composer disables Xdebug by default. Override with:</p>\n<pre><code>ddev exec COMPOSER_ALLOW_XDEBUG=1 composer install\n</code></pre>\n<p><strong>Custom port</strong>: Create <code>.ddev/php/xdebug_client_port.ini</code> with <code>xdebug.client_port=9000</code> (rarely needed).</p>\n<p><strong>Debugging host.docker.internal resolution</strong>: Run <code>DDEV_DEBUG=true ddev start</code> to see how DDEV determines the IP.</p>\n<h2>Advanced Features</h2>\n<p><strong>xdebugctl</strong>: DDEV includes the <a href=\"https://github.com/xdebug/xdebugctl\"><code>xdebugctl</code> utility</a> for dynamically querying and modifying Xdebug settings, switching modes (debug, profile, trace), and more. Run <code>ddev exec xdebugctl --help</code>. See the <a href=\"https://xdebug.org/docs/xdebugctl\">xdebugctl documentation</a>.</p>\n<p><strong>Xdebug map feature</strong>: Recent Xdebug versions can remap file paths during debugging, useful when container paths don't match local paths in complex ways. This complements IDE path mappings.</p>\n<p><strong>Performance</strong>: Xdebug adds overhead. Use <code>ddev xdebug off</code> or <code>ddev xdebug toggle</code> when you're not actively debugging.</p>\n<h2>More Information</h2>\n<ul>\n<li><a href=\"https://docs.ddev.com/en/stable/users/debugging-profiling/step-debugging/\">DDEV Step Debugging Documentation</a></li>\n<li><a href=\"https://xdebug.org/docs/\">Xdebug Documentation</a></li>\n<li><a href=\"https://xdebug.org/docs/step_debug\">Xdebug Step Debugging Guide</a></li>\n</ul>\n<p>Claude Code was used to create an initial draft for this blog, and for subsequent reviews.</p>\n"},{"id":"https://ddev.com/blog/mutagen-functionality-issues-debugging","url":"https://ddev.com/blog/mutagen-functionality-issues-debugging","title":"Mutagen in DDEV: Functionality, Issues, and Debugging","content_html":"<p><a href=\"https://mutagen.io\">Mutagen</a> has been a part of DDEV for years, providing dramatic performance improvements for macOS and traditional Windows users. It's enabled by default on these platforms, but understanding how it works, what can go wrong, and how to debug issues is key to getting the most out of DDEV.</p>\n<h2>Just Need to Debug Something?</h2>\n<p>If you're here because you just need to debug a Mutagen problem, this will probably help:</p>\n<pre><code>ddev utility mutagen-diagnose\n</code></pre>\n<p>See <a href=\"#debugging-mutagen-issues\">more below</a>.</p>\n<h2>Contributor Training Video</h2>\n<p>This blog is based on the <a href=\"https://www.youtube.com/watch?v=YbTlX63GZrk\">Mutagen Fundamentals and Troubleshooting</a> Contributor Training held on January 22, 2026.</p>\n<div>\n\n</div>\n\n<p>See the <a href=\"https://rfay.github.io/mutagen-fundamentals-and-troubleshooting-presentation/\">slides for the training video</a>.</p>\n<h2>What Mutagen Does</h2>\n<p>Mutagen is an asynchronous file synchronization tool that decouples in-container reads and writes from reads and writes on the host machine. Each filesystem enjoys near-native speed because neither is stuck waiting on the other.</p>\n<p>Traditional Docker bind-mounts check every file access against the file on the host. On macOS and Windows, Docker's implementation of these checks is not performant. Mutagen solves this by maintaining a cached copy of your project files in a Docker volume, syncing changes between host and container asynchronously.</p>\n<h3>Mostly for PHP</h3>\n<p>The primary target of Mutagen syncing is PHP files. These were the fundamental problem with Docker as the number of files in a Docker-hosted PHP website grew into the Composer generation with tens of thousands of files, so <code>php-fpm</code> had to open so very many of them all at once. Now with DDEV on macOS using Mutagen, <code>php-fpm</code> is opening files that are just on its local Linux filesystem, not opening ten thousand files that all have to be verified on the host.</p>\n<h3>Webserving Performance Improvement</h3>\n<p>Mutagen has delighted many developers with its web-serving performance. One dev said \"the first time I tried it I cried.\"</p>\n<h3>Filesystem Notifications</h3>\n<p>Mutagen supports filesystem notifications (<code>inotify</code>/<code>fsnotify</code>), so file-watchers on both the host and inside the container are notified when changes occur. This is a significant advantage for development tools that would otherwise need to poll for changes.</p>\n<h2>How Mutagen Works in DDEV</h2>\n<p>When Mutagen is enabled, DDEV:</p>\n<ol>\n<li>Mounts a Docker volume onto <code>/var/www</code> inside the web container</li>\n<li>A Linux Mutagen daemon is installed inside the web container</li>\n<li>A host-side Mutagen daemon is started by DDEV</li>\n<li>The two daemons keep each other up-to-date with changes on either side</li>\n</ol>\n<h3>Lifecycle</h3>\n<ul>\n<li><strong><code>ddev start</code></strong>: Starts the Mutagen daemon on the host if not running, creates or resumes sync session</li>\n<li><strong><code>ddev stop</code></strong>: Flushes sync session to ensure consistency, then pauses it</li>\n<li><strong><code>ddev composer</code></strong>: Triggers synchronous flush after completion to sync massive filesystem changes</li>\n<li><strong><code>ddev mutagen reset</code></strong>: Removes the Docker volume and the sync session will then be recreated from scratch (from the host-side contents) on <code>ddev start</code>.</li>\n</ul>\n<h3>Upload Directories</h3>\n<p>DDEV automatically excludes user-generated files in <code>upload_dirs</code> from Mutagen syncing, using bind-mounts instead. For most CMS types, this is configured automatically, for example:</p>\n<ul>\n<li>Drupal: <code>sites/default/files</code></li>\n<li>WordPress: <code>wp-content/uploads</code></li>\n<li>TYPO3: <code>fileadmin</code>, <code>uploads</code></li>\n</ul>\n<p>If your project has non-standard locations, override defaults by setting <code>upload_dirs</code> in <code>.ddev/config.yaml</code>.</p>\n<p>We do note that <code>upload_dirs</code> is not an adequate description for this behavior. It was originally intended for user-generated files, but now is used for heavy directories like <code>node_modules</code>, etc.</p>\n<h2>Common Issues and Caveats</h2>\n<h3>Initial Sync Time</h3>\n<p>The first-time Mutagen sync takes 5-60 seconds depending on project size. A Magento 2 site with sample data might take 48 seconds initially, 12 seconds on subsequent starts. If sync takes longer than a minute, you're likely syncing large files or directories unnecessarily.</p>\n<h3>Large <code>node_modules</code> Directories</h3>\n<p>Frontend build tools create massive <code>node_modules</code> directories that slow Mutagen sync significantly. <strong>Solution</strong>: Add <code>node_modules</code> to <code>upload_dirs</code>:</p>\n<pre><code>upload_dirs: #upload_dirs entries are relative to docroot\n  - sites/default/files # Keep existing CMS defaults\n  - ../node_modules # Exclude from Mutagen\n</code></pre>\n<p>Then run <code>ddev restart</code>. The directory remains available in the container via Docker bind-mount.</p>\n<h3>File Changes When DDEV is Stopped</h3>\n<p>If you change files (checking out branches, running <code>git pull</code>, deleting files) while DDEV is stopped, Mutagen has no awareness of these changes. When you start again, it may restore old files from the volume.</p>\n<p><strong>Solution</strong>: Run <code>ddev mutagen reset</code> before restarting if you've made significant changes while stopped. That removes the volume so everything comes first from the host side in a fresh sync.</p>\n<h3>Simultaneous Changes</h3>\n<p>If the same file changes on both host and container while out of sync, conflicts can occur. This is quite rare but possible with:</p>\n<ul>\n<li>Scripts running simultaneously on host and in container</li>\n<li>Massive branch changes</li>\n<li>Large <code>npm install</code> or <code>yarn install</code> operations</li>\n</ul>\n<p><strong>Best practices</strong>:</p>\n<ul>\n<li>Do Git operations on the host, not in the container</li>\n<li>Use <code>ddev composer</code> for most composer operations</li>\n<li>Run <code>ddev mutagen sync</code> after major Git branch changes</li>\n<li>Run <code>ddev mutagen sync</code> after manual Composer operations done inside the container</li>\n</ul>\n<h3>Disk Space Considerations</h3>\n<p>Mutagen increases disk usage because project code exists both on your computer and inside a Docker volume. The <code>upload_dirs</code> directories are excluded to mitigate this.</p>\n<p>Watch for volumes larger than 5GB (warning) or 10GB (critical). Use <code>ddev utility mutagen-diagnose --all</code> to check all projects.</p>\n<h2>Debugging Mutagen Issues</h2>\n<h3>The New <code>ddev utility mutagen-diagnose</code> Command</h3>\n<p>DDEV now includes a diagnostic tool that automatically checks for common issues:</p>\n<pre><code>ddev utility mutagen-diagnose\n</code></pre>\n<p>This command analyzes:</p>\n<ul>\n<li><strong>Volume sizes</strong>: Warns if &gt;5GB, critical if &gt;10GB</li>\n<li><strong>Upload directories configuration</strong>: Checks if properly configured for your CMS</li>\n<li><strong>Sync session status</strong>: Reports problems with the sync session</li>\n<li><strong>Large directories</strong>: Identifies <code>node_modules</code> and other large directories being synced</li>\n<li><strong>Ignore patterns</strong>: Validates Mutagen exclusion configuration</li>\n</ul>\n<p>Use <code>--all</code> flag to analyze all Mutagen volumes system-wide:</p>\n<pre><code>ddev utility mutagen-diagnose --all\n</code></pre>\n<p>The diagnostic provides actionable recommendations like:</p>\n<pre><code>⚠ 3 node_modules directories exist but are not excluded from sync (can cause slow sync)\n  → Add to .ddev/config.yaml:\n    upload_dirs:\n      - sites/default/files\n      - web/themes/custom/mytheme/node_modules\n      - web/themes/contrib/bootstrap/node_modules\n      - app/node_modules\n  → Then run: ddev restart\n</code></pre>\n<h3>Debugging Long Startup Times</h3>\n<p>If <code>ddev start</code> takes longer than a minute and <code>ddev utility mutagen-diagnose</code> doesn't give you clues about why, watch what Mutagen is syncing:</p>\n<pre><code>ddev mutagen reset  # Start from scratch\nddev start\n</code></pre>\n<p>In another terminal:</p>\n<pre><code>while true; do ddev mutagen st -l | grep \"^Current\"; sleep 1; done\n</code></pre>\n<p>This shows which files Mutagen is working on:</p>\n<pre><code>Current file: vendor/bin/large-binary (306 MB/5.2 GB)\nCurrent file: vendor/bin/large-binary (687 MB/5.2 GB)\nCurrent file: vendor/bin/large-binary (1.1 GB/5.2 GB)\n</code></pre>\n<p>Add problem directories to <code>upload_dirs</code> or move them to <code>.tarballs</code> (automatically excluded).</p>\n<h3>Monitoring Sync Activity</h3>\n<p>Watch real-time sync activity:</p>\n<pre><code>ddev mutagen monitor\n</code></pre>\n<p>This shows when Mutagen responds to changes and helps identify sync delays.</p>\n<h3>Manual Sync Control</h3>\n<p>Force an explicit sync:</p>\n<pre><code>ddev mutagen sync\n</code></pre>\n<p>Check sync status:</p>\n<pre><code>ddev mutagen status\n</code></pre>\n<p>View detailed status:</p>\n<pre><code>ddev mutagen status -l\n</code></pre>\n<h3>Troubleshooting Steps</h3>\n<ol>\n<li><p><strong>Verify that your project works without Mutagen</strong>:</p>\n<pre><code>ddev config --performance-mode=none &amp;&amp; ddev restart\n</code></pre>\n</li>\n<li><p><strong>Run diagnostics</strong>:</p>\n<pre><code>ddev utility mutagen-diagnose\n</code></pre>\n</li>\n<li><p><strong>Reset to clean <code>.ddev/mutagen/mutagen.yml</code></strong>:</p>\n<pre><code># Backup customizations first\nmv .ddev/mutagen/mutagen.yml .ddev/mutagen/mutagen.yml.bak\nddev restart\n</code></pre>\n</li>\n<li><p><strong>Reset Mutagen volume and recreate it</strong>:</p>\n<pre><code>ddev mutagen reset\nddev restart\n</code></pre>\n</li>\n<li><p><strong>Enable debug output</strong>:</p>\n<pre><code>DDEV_DEBUG=true ddev start\n</code></pre>\n</li>\n<li><p><strong>View Mutagen logs</strong>:</p>\n<pre><code>ddev mutagen logs\n</code></pre>\n</li>\n<li><p><strong>Restart Mutagen daemon</strong>:</p>\n<pre><code>ddev utility mutagen daemon stop\nddev utility mutagen daemon start\n</code></pre>\n</li>\n</ol>\n<h2>Advanced Configuration</h2>\n<h3>Excluding Directories from Sync</h3>\n<p><strong>Recommended approach</strong>: Use <code>upload_dirs</code> in <code>.ddev/config.yaml</code>:</p>\n<pre><code>upload_dirs:\n  - sites/default/files # CMS uploads\n  - ../node_modules # Build dependencies\n  - ../vendor/bin # Large binaries\n</code></pre>\n<p><strong>Advanced approach</strong>: Edit <code>.ddev/mutagen/mutagen.yml</code> after removing the <code>#ddev-generated</code> line:</p>\n<pre><code>ignore:\n  paths:\n    - \"/web/themes/custom/mytheme/node_modules\"\n    - \"/vendor/large-package\"\n</code></pre>\n<p>Then add corresponding bind-mounts in <code>.ddev/docker-compose.bindmount.yaml</code>:</p>\n<pre><code>services:\n  web:\n    volumes:\n      - \"../web/themes/custom/mytheme/node_modules:/var/www/html/web/themes/custom/mytheme/node_modules\"\n</code></pre>\n<p>Always run <code>ddev mutagen reset</code> after changing <code>mutagen.yml</code>.</p>\n<h3>Git Hooks for Automatic Sync</h3>\n<p>Add <code>.git/hooks/post-checkout</code> and make it executable:</p>\n<pre><code>#!/usr/bin/env bash\nddev mutagen sync || true\n</code></pre>\n<pre><code>chmod +x .git/hooks/post-checkout\n</code></pre>\n<h3>Use Global Configuration for <code>performance_mode</code></h3>\n<p>The standard practice is to use global configuration for <code>performance_mode</code> so that each user does what's normal for them, and the project configuration does not have configuration that might not work for another team member.</p>\n<p>Most people don't have to change this anyway; macOS and traditional Windows default to <code>performance_mode: mutagen</code> and Linux/WSL default to <code>performance_mode: none</code>.</p>\n<h2>When to Disable Mutagen</h2>\n<p>Disable Mutagen if:</p>\n<ul>\n<li>You're on Linux or WSL2 (already has native performance)</li>\n<li>Filesystem consistency is more critical than webserving performance</li>\n<li>You're troubleshooting other DDEV issues</li>\n</ul>\n<p>Disable per-project:</p>\n<pre><code>ddev mutagen reset &amp;&amp; ddev config --performance-mode=none &amp;&amp; ddev restart\n</code></pre>\n<p>Disable globally:</p>\n<pre><code>ddev config global --performance-mode=none\n</code></pre>\n<h2>Mutagen Data and DDEV</h2>\n<p>DDEV uses its own Mutagen installation, normally in <code>~/.ddev</code>, but using $XDG_CONFIG_HOME when that is defined.</p>\n<ul>\n<li><strong>Binary location</strong>: <code>$HOME/.ddev/bin/mutagen</code> or <code>${XDG_CONFIG_HOME}/ddev/bin/mutagen</code></li>\n<li><strong>Data directory</strong>: <code>$HOME/.ddev_mutagen_data_directory</code></li>\n</ul>\n<p>Access Mutagen directly:</p>\n<pre><code>ddev utility mutagen sync list\nddev utility mutagen sync monitor &lt;projectname&gt;\n</code></pre>\n<h2>Summary</h2>\n<p>Mutagen provides dramatic performance improvements for macOS and traditional Windows users, but understanding its asynchronous nature is key to avoiding issues:</p>\n<ul>\n<li>Use <code>ddev utility mutagen-diagnose</code> as your first debugging step</li>\n<li>Configure <code>upload_dirs</code> to exclude large directories like <code>node_modules</code> or heavy user-generated files directories</li>\n<li>Run <code>ddev mutagen reset</code> after file changes when DDEV is stopped</li>\n<li>Do Git operations on the host, not in the container</li>\n<li>Monitor sync activity with <code>ddev mutagen monitor</code> when troubleshooting</li>\n</ul>\n<p>The benefits far outweigh the caveats for most projects, especially with the new diagnostic tools that identify and help resolve common issues automatically.</p>\n<p>For more information, see the <a href=\"https://docs.ddev.com/en/stable/users/install/performance/\">DDEV Performance Documentation</a> and the <a href=\"https://mutagen.io/documentation/\">Mutagen documentation</a>.</p>\n<p>Copilot was used to create an initial draft for this blog, and for subsequent reviews.</p>\n"},{"id":"https://ddev.com/blog/share-providers","url":"https://ddev.com/blog/share-providers","title":"New `ddev share` Provider System: Cloudflare tunnel with no login or token","content_html":"<p>Sharing your local development environment with clients, colleagues, or testing services has always been a valuable DDEV feature. DDEV v1.25.0 makes this easier and more flexible than ever with a complete redesign of <code>ddev share</code>. The biggest news is that you can now share your projects for free using Cloudflare Tunnel—no account signup or token setup required.</p>\n<h2>What Changed in <code>ddev share</code></h2>\n<p>Previous versions of DDEV relied exclusively on ngrok for sharing. While ngrok remains a solid choice with advanced features, v1.25.0 introduces a modular provider system allowing more options and flexibility. DDEV now ships with two built-in providers:</p>\n<ul>\n<li><strong>ngrok</strong>: The traditional option (requires free account and authtoken)</li>\n<li><strong>cloudflared</strong>: A new, cost-free option using Cloudflare Tunnel (requires no account or token)</li>\n</ul>\n<p>You can select providers via command flags, project configuration, or global defaults. Existing projects using ngrok continue working unchanged, and ngrok remains the default provider.</p>\n<h2>Free Sharing with Cloudflare Tunnel</h2>\n<p>Cloudflare Tunnel provides production-grade infrastructure for sharing your local environments at zero cost. After <a href=\"https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/\">installing the <code>cloudflared</code> CLI</a>, getting started is:</p>\n<pre><code>ddev share --provider=cloudflared\n</code></pre>\n<p>No account creation, no authentication setup, no subscription tiers—just immediate access to share your work. This removes barriers for individual developers and teams who need occasional sharing without the overhead of managing service accounts.</p>\n<p>When should you use cloudflared vs ngrok? Use cloudflared for quick, free sharing during development and testing. Choose ngrok if you need stable subdomains, custom domains, or advanced features like IP allowlisting and OAuth protection. (However, if you control a domain registered at Cloudflare you can use that for stable domains. This will be covered in a future blog.)</p>\n<h2>Configuration Flexibility</h2>\n<p>You can set your preferred provider at multiple levels:</p>\n<pre><code># Use a specific provider for this session\nddev share --provider=cloudflared\n\n# Set default provider for the current project\nddev config --share-default-provider=cloudflared\n\n# Set global default for all projects\nddev config global --share-default-provider=cloudflared\n</code></pre>\n<p>This flexibility lets you use different providers for different projects or standardize across your entire development setup.</p>\n<p><strong>Tip</strong>: Your CMS or framework may have \"trusted host patterns\" configuration that denies access to the site when hosted at an unknown URL. You'll need to configure to allow all or specific URLs. For example, in Drupal, <code>$settings['trusted_host_patterns'] = ['.*'];</code> or in TYPO3 <code>'trustedHostsPattern' =&gt; '.*.*'</code>.</p>\n<h2>Automation for difficult CMSs using <code>pre-share</code> hooks and $DDEV_SHARE_URL</h2>\n<p>When you run <code>ddev share</code>, DDEV now exports the tunnel URL as the <code>DDEV_SHARE_URL</code> environment variable. This enables automation through hooks, particularly useful for integration testing, webhooks, or CI workflows that need the public URL.</p>\n<h3>WordPress Example</h3>\n<p>WordPress is always difficult because it embeds the URL right in the database. For sites to use a different URL the <code>wp search-replace</code> tool is the classic way to deal with this, so the hook demonstration below can be used to make <code>ddev share</code> work even when the URL is dynamic.</p>\n<pre><code># .ddev/config.yaml\nhooks:\n  pre-share:\n    # provide DDEV_SHARE_URL in container\n    - exec-host: echo \"${DDEV_SHARE_URL}\" &gt;.ddev/share_url.txt\n    # Save database for restore later\n    - exec-host: ddev export-db --file=/tmp/tmpdump.sql.gz\n    # Change the URL in the database\n    - exec: wp search-replace ${DDEV_PRIMARY_URL} $(cat /mnt/ddev_config/share_url.txt) | grep Success\n    # Fix the wp-config-ddev.php to use the DDEV_SHARE_URL\n    - exec: cp wp-config-ddev.php wp-config-ddev.php.bak\n    - exec: sed -i.bak \"s|${DDEV_PRIMARY_URL}|$(cat /mnt/ddev_config/share_url.txt)|g\" wp-config-ddev.php\n    - exec: wp cache flush\n  post-share:\n    # Put back the things we changed\n    - exec: cp wp-config-ddev.php.bak wp-config-ddev.php\n    - exec-host: ddev import-db --file=/tmp/tmpdump.sql.gz\n</code></pre>\n<p>This approach works for any CMS that stores base URLs in its configuration or database. The pre-share hook updates URLs automatically, and you can use post-share hooks to restore them when sharing ends. This eliminates the manual configuration work that sharing previously required for many CMSs.</p>\n<h3>TYPO3 Example</h3>\n<p>TYPO3 usually puts the site URL into config/sites/*/config.yaml as <code>base: &lt;url&gt;</code>, and then it won't respond to the different URLs in a <code>ddev share</code>. The hooks here temporarily remove the <code>base:</code> element:</p>\n<pre><code>hooks:\n  pre-share:\n    # Make a backup of config/sites\n    - exec: cp -r ${DDEV_APPROOT}/config/sites ${DDEV_APPROOT}/config/sites.bak\n    - exec-host: echo \"removing 'base' from site config for sharing to ${DDEV_SHARE_URL}\"\n    # Remove `base:` from the various site configs\n    - exec: sed -i 's|^base:|#base:|g' ${DDEV_APPROOT}/config/sites/*/config.yaml\n    - exec-host: echo \"shared on ${DDEV_SHARE_URL}\"\n  post-share:\n    # Restore the original configuration\n    - exec: rm -rf ${DDEV_APPROOT}/config/sites\n    - exec: mv ${DDEV_APPROOT}/config/sites.bak ${DDEV_APPROOT}/config/sites\n    - exec-host: ddev mutagen sync\n    - exec-host: echo \"changes to config/sites reverted\"\n</code></pre>\n<h3>Magento 2 Example</h3>\n<p>Magento2 has pretty easy control of the URL, so the hooks are pretty simple:</p>\n<pre><code>hooks:\n  pre-share:\n    # Switch magento to the share URL\n    - exec-host: ddev magento setup:store-config:set --base-url=\"${DDEV_SHARE_URL}\"\n  post-share:\n    # Switch back to the normal local URL\n    - exec-host: ddev magento setup:store-config:set --base-url=\"${DDEV_PRIMARY_URL}\"\n</code></pre>\n<h2>Extensibility: Custom Share Providers</h2>\n<p>The new provider system is script-based, allowing you to create custom providers for internal tunneling solutions or other services. Place Bash scripts in <code>.ddev/share-providers/</code> (project-level) or <code>$HOME/.ddev/share-providers/</code> (global), and DDEV will recognize them as available providers.</p>\n<p>For details on creating custom providers, see the <a href=\"https://docs.ddev.com/en/stable/users/topics/sharing/\">sharing documentation</a>.</p>\n<p>An example of a share provider for <code>localtunnel</code> is provided in <code>.ddev/share-providers/localtunnel.sh.example</code> and you can experiment with it by just copying that to <code>.ddev/share-providers/localtunnel.sh</code>.</p>\n<h2>Questions</h2>\n<dl>\n<dt>Do I need to change anything in existing projects?</dt>\n<dd>No. Ngrok remains the default provider, so existing projects continue working without any changes. Your ngrok authtokens and configurations are fully compatible with v1.25+.</dd>\n\n<dt>When should I use cloudflared vs ngrok?</dt>\n<dd>Use cloudflared for quick, free sharing during development and testing. Use ngrok if you need stable subdomains, custom domains, or advanced features like IP allowlisting and OAuth protection.</dd>\n\n<dt>Can I create my own share provider?</dt>\n<dd>Yes! Place bash scripts in <code>.ddev/share-providers/</code> (project-level) or <code>$HOME/.ddev/share-providers/</code> (global). See the <a href=\"https://docs.ddev.com/en/stable/users/topics/sharing/\">sharing documentation</a> for implementation details.</dd>\n</dl>\n\n<h2>Try It Today</h2>\n<p>DDEV v1.25.0 is now available. Use the techniques above, and try out Cloudflared to see if you like it.</p>\n<p>For complete details on the new sharing system, see the <a href=\"https://docs.ddev.com/en/stable/users/topics/sharing/\">sharing documentation</a>.</p>\n<p>Join us on <a href=\"/s/discord\">Discord</a>, follow us on <a href=\"https://fosstodon.org/@ddev\">Mastodon</a>, <a href=\"https://bsky.app/profile/ddev.com\">Bluesky</a>, or <a href=\"https://www.linkedin.com/company/ddev-foundation/\">LinkedIn</a>, and subscribe to our <a href=\"https://ddev.com/newsletter/\">newsletter</a> for updates.</p>\n<p>This blog was drafted and reviewed by AI including Claude Code.</p>\n"},{"id":"https://ddev.com/blog/podman-and-docker-rootless","url":"https://ddev.com/blog/podman-and-docker-rootless","title":"Podman and Docker Rootless in DDEV","content_html":"<p><strong>TL;DR</strong>: DDEV supports Podman and Docker Rootless as of v1.25.0. Podman and Docker Rootless are a bit more trouble than the <a href=\"https://docs.ddev.com/en/stable/users/install/docker-installation/\">recommended normal traditional Docker providers</a> and have some serious trade-offs. With Podman on macOS you can't use the normal default ports 80 and 443. On Linux Docker Rootless you can't bind-mount directories, so the entire project has to be mutagen-synced. But Podman Rootless on Linux is pretty solid.</p>\n<p>Jump to setup instructions: <a href=\"#key-aim-linux-and-wsl2-users\">Linux/WSL2</a> · <a href=\"#macos\">macOS</a> · <a href=\"#windows\">Windows</a></p>\n<p><strong>Note</strong>: This support is experimental. Report issues on the <a href=\"https://github.com/ddev/ddev/issues\">DDEV issue tracker</a>.</p>\n<h2>Table of Contents</h2>\n<h2>Understanding Docker and Podman</h2>\n<h3>Open Source Alternatives to Docker Desktop</h3>\n<p>A common misconception is that Podman is the only open-source alternative to Docker Desktop. This is not true. There are several fully open-source alternatives available on every platform:</p>\n<ul>\n<li><strong><a href=\"https://docs.docker.com/engine/\">Docker Engine</a></strong> - The original open-source Docker, free to use</li>\n<li><strong><a href=\"https://rancherdesktop.io/\">Rancher Desktop</a></strong> - Open source container management with choice of dockerd or containerd</li>\n<li><strong><a href=\"https://lima-vm.io/\">Lima</a></strong> - Linux virtual machines</li>\n<li><strong><a href=\"https://github.com/abiosoft/colima\">Colima</a></strong> - Container runtime with minimal setup (built on Lima)</li>\n<li><strong><a href=\"https://podman-desktop.io/\">Podman Desktop</a></strong> - GUI for Podman with Docker compatibility</li>\n</ul>\n<p>All of these work with DDEV. The main reason to choose Podman specifically is if your organization forbids Docker entirely or if you want rootless operation by default.</p>\n<h3>Why Choose Podman?</h3>\n<p>Podman is rootless by default, making it the simplest option for secure container environments. Traditional Docker requires root daemons, which can be a security concern in corporate environments with strict policies. (Note that DDEV is targeted at local development, where there are few risks of specialized attacks using this vector anyway.)</p>\n<p>Podman's rootless approach runs the daemon without elevated privileges:</p>\n<ul>\n<li>No root daemon on the system, only a rootless daemon in userspace</li>\n<li>Container processes cannot access root-owned files</li>\n<li>Reduced attack surface if a container is compromised</li>\n</ul>\n<p>While DDEV already runs containers as unprivileged users, Podman eliminates the need for a root daemon entirely.</p>\n<h3>Why Choose Docker Rootless?</h3>\n<p>Docker Rootless provides the same security benefits as Podman Rootless while maintaining full Docker compatibility. It runs the daemon without root privileges, offering:</p>\n<ul>\n<li>No root daemon on the system</li>\n<li>Container processes cannot access root-owned files</li>\n<li>Reduced attack surface if a container is compromised</li>\n</ul>\n<p>Unlike Podman which is rootless by default, Docker Rootless requires special setup to enable. Choose this option if you want to stay with Docker but need rootless security.</p>\n<h2>Key aim: Linux and WSL2 users</h2>\n<p>The primary focus for this article is Linux and WSL2 (we have test coverage for Linux only for now). Most features and configurations are well-tested on these platforms.</p>\n<h3>Do You Need an Alternative to Docker?</h3>\n<p>Before diving into setup, consider whether you need an alternative to traditional Docker:</p>\n<table>\n<thead>\n<tr>\n<th>Runtime</th>\n<th>Why would you do this?</th>\n<th>Key trade-offs</th>\n<th>Performance</th>\n<th>Setup</th>\n<th>Recommendation</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><strong>Traditional Docker</strong></td>\n<td>Standard, widely-used option</td>\n<td>None</td>\n<td>Excellent</td>\n<td>Simple</td>\n<td><strong>Recommended for most users</strong></td>\n</tr>\n<tr>\n<td><strong>Docker Rootless</strong></td>\n<td>Security requirement for rootless daemon</td>\n<td>Must use <code>--no-bind-mounts</code> (everything via Mutagen), can't use default workflow</td>\n<td>Moderate (Mutagen overhead)</td>\n<td>Moderate</td>\n<td>Only if rootless security is required</td>\n</tr>\n<tr>\n<td><strong>Podman Rootful</strong></td>\n<td>Organization forbids Docker</td>\n<td>Slower than Docker, different behavior</td>\n<td>Slower than Docker</td>\n<td>Moderate</td>\n<td>Only if Docker not allowed</td>\n</tr>\n<tr>\n<td><strong>Podman Rootless</strong></td>\n<td>Organization forbids Docker + want rootless security</td>\n<td>May need sysctl changes for ports &lt;1024, slower than Docker</td>\n<td>Slower than Docker</td>\n<td>Moderate</td>\n<td>Only if Docker not allowed and rootless required</td>\n</tr>\n</tbody></table>\n<p><strong>Bottom line</strong>: Stick with traditional Docker unless organizational policy or security requirements force you to use an alternative. The alternatives work, but have significant trade-offs.</p>\n<h3>Installing Podman</h3>\n<p>Install Podman using your distribution's package manager. See the <a href=\"https://podman.io/docs/installation#installing-on-linux\">official Podman installation guide for Linux</a>.</p>\n<pre><code># Ubuntu/Debian\nsudo apt-get update &amp;&amp; sudo apt-get install podman\n# Fedora\nsudo dnf install --refresh podman\n</code></pre>\n<p><strong>Note:</strong> Some distributions may have outdated Podman versions. This is the case with Ubuntu 24.04, which has Podman 4.9.3. We require Podman 5.0 or newer for the best experience, because we didn't have success with Podman 4.x in our automated tests, but you can still use Podman 4.x ignoring the warning on <code>ddev start</code>.</p>\n<p>You can also install <a href=\"https://podman-desktop.io/docs/installation/linux-install\">Podman Desktop</a> if you prefer a GUI.</p>\n<p>For more information, see the <a href=\"https://github.com/containers/podman/tree/main/docs/tutorials#readme\">Podman tutorials</a>.</p>\n<h3>Installing Docker CLI</h3>\n<p>Podman provides a Docker-compatible API, which means you can use the Docker CLI as a frontend for Podman. This approach offers several benefits:</p>\n<ul>\n<li>Use familiar <code>docker</code> commands while Podman handles the actual container operations</li>\n<li>Switch between different container runtimes using Docker contexts</li>\n<li>Maintain compatibility with scripts and tools that expect the <code>docker</code> command</li>\n</ul>\n<ol>\n<li><p><a href=\"https://docs.docker.com/engine/install/\">Set up Docker's repository</a></p>\n</li>\n<li><p>Install only the CLI:</p>\n<pre><code># Ubuntu/Debian\nsudo apt-get update &amp;&amp; sudo apt-get install docker-ce-cli\n# Fedora\nsudo dnf install --refresh docker-ce-cli\n</code></pre>\n<p><strong>Note:</strong> You don't need to install <code>docker-ce</code> (the Docker engine).</p>\n</li>\n</ol>\n<h3>Configuring Podman Rootless</h3>\n<p>This is the recommended configuration for most users.</p>\n<ol>\n<li><p>Prepare the system by configuring subuid and subgid ranges and enabling userns options, see the <a href=\"https://wiki.archlinux.org/title/Podman#Rootless_Podman\">Arch Linux Wiki</a> for details:</p>\n<pre><code># Add subuid and subgid ranges if they don't exist for the current user\ngrep \"^$(id -un):\\|^$(id -u):\" /etc/subuid &gt;/dev/null 2&gt;&amp;1 || sudo usermod --add-subuids 100000-165535 $(whoami)\ngrep \"^$(id -un):\\|^$(id -u):\" /etc/subgid &gt;/dev/null 2&gt;&amp;1 || sudo usermod --add-subgids 100000-165535 $(whoami)\n# Propagate changes to subuid and subgid\npodman system migrate\n# Debian requires setting unprivileged_userns_clone\nif [ -f /proc/sys/kernel/unprivileged_userns_clone ]; then\n  if [ \"1\" != \"$(cat /proc/sys/kernel/unprivileged_userns_clone)\" ]; then\n    echo 'kernel.unprivileged_userns_clone=1' | sudo tee -a /etc/sysctl.d/60-rootless.conf\n    sudo sysctl --system\n  fi\nfi\n# Fedora requires setting max_user_namespaces\nif [ -f /proc/sys/user/max_user_namespaces ]; then\n  if [ \"0\" = \"$(cat /proc/sys/user/max_user_namespaces)\" ]; then\n    echo 'user.max_user_namespaces=28633' | sudo tee -a /etc/sysctl.d/60-rootless.conf\n    sudo sysctl --system\n  fi\nfi\n# Allow privileged port access if needed\nif [ -f /proc/sys/net/ipv4/ip_unprivileged_port_start ]; then\n  if [ \"1024\" = \"$(cat /proc/sys/net/ipv4/ip_unprivileged_port_start)\" ]; then\n    echo 'net.ipv4.ip_unprivileged_port_start=0' | sudo tee -a /etc/sysctl.d/60-rootless.conf\n    sudo sysctl --system\n  fi\nfi\n</code></pre>\n</li>\n<li><p>Enable the Podman socket and verify it's running (<a href=\"https://github.com/containers/podman/blob/main/docs/tutorials/socket_activation.md\">Podman socket activation documentation</a>):</p>\n<pre><code>systemctl --user enable --now podman.socket\n\n# You should see `/run/user/1000/podman/podman.sock` (the number may vary):\nls $XDG_RUNTIME_DIR/podman/podman.sock\n\n# You can also check the socket path with:\npodman info --format '{{.Host.RemoteSocket.Path}}'\n</code></pre>\n</li>\n<li><p>Configure Docker API to use Podman (<a href=\"https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md\">Podman rootless tutorial</a>):</p>\n<pre><code># View existing contexts\ndocker context ls\n\n# Create Podman rootless context\ndocker context create podman-rootless \\\n    --description \"Podman (rootless)\" \\\n    --docker host=\"unix://$XDG_RUNTIME_DIR/podman/podman.sock\"\n\n# Switch to the new context\ndocker context use podman-rootless\n\n# Verify it works\ndocker ps\n</code></pre>\n</li>\n<li><p>Proceed with <a href=\"https://docs.ddev.com/en/stable/users/install/ddev-installation/#ddev-installation-linux\">DDEV installation</a>.</p>\n</li>\n</ol>\n<h3>Podman Rootless Performance Optimization</h3>\n<p>Podman Rootless is significantly slower than Docker. See these resources:</p>\n<ul>\n<li><a href=\"https://github.com/containers/podman/issues/13226\">Podman run/build performance issues</a></li>\n<li><a href=\"https://github.com/containers/podman/blob/main/docs/tutorials/performance.md\">Podman Performance documentation</a></li>\n</ul>\n<p>To improve performance, install <code>fuse-overlayfs</code> and configure the overlay storage driver:</p>\n<p><strong>Install fuse-overlayfs</strong>:</p>\n<pre><code># Ubuntu/Debian\nsudo apt-get update &amp;&amp; sudo apt-get install fuse-overlayfs\n# Fedora\nsudo dnf install --refresh fuse-overlayfs\n</code></pre>\n<p><strong>Configure storage</strong>:</p>\n<pre><code>mkdir -p ~/.config/containers\ncat &lt;&lt; 'EOF' &gt; ~/.config/containers/storage.conf\n[storage]\ndriver = \"overlay\"\n[storage.options.overlay]\nmount_program = \"/usr/bin/fuse-overlayfs\"\nEOF\n</code></pre>\n<p><strong>Warning</strong>: If you already have Podman containers, images, or volumes, you'll need to reset Podman for this change to take effect:</p>\n<pre><code>podman system reset\n</code></pre>\n<p>This removes all existing containers, images, and volumes (similar to <code>docker system prune -a</code>).</p>\n<h3>Configuring Podman Rootful</h3>\n<p>Rootless Podman is recommended. Only use rootful Podman if your setup specifically requires it.</p>\n<p>To configure rootful Podman:</p>\n<ol>\n<li>Create a <code>podman</code> group (<code>sudo groupadd podman</code>) and add your user to it (<code>sudo usermod -aG podman $USER</code>).</li>\n<li>Configure <a href=\"https://github.com/podman-desktop/podman-desktop/issues/2861#issuecomment-1596192247\">group permissions</a> to allow non-root users to access the socket</li>\n<li>Activate the socket with <code>sudo systemctl enable --now podman.socket</code></li>\n<li>Create a Docker context <code>docker context create podman-rootful --description \"Podman (root)\" --docker host=\"unix:///var/run/podman/podman.sock\"</code></li>\n<li>Switch to the new context with <code>docker context use podman-rootful</code></li>\n</ol>\n<h3>Setting Up Docker Rootless</h3>\n<p>Docker Rootless on Linux offers rootless security with full Docker compatibility.</p>\n<ol>\n<li><p>Follow the official <a href=\"https://docs.docker.com/engine/security/rootless/\">Docker Rootless installation guide</a>.</p>\n</li>\n<li><p>Configure system:</p>\n<pre><code># Allow privileged port access if needed\nif [ -f /proc/sys/net/ipv4/ip_unprivileged_port_start ]; then\n  if [ \"1024\" = \"$(cat /proc/sys/net/ipv4/ip_unprivileged_port_start)\" ]; then\n    echo 'net.ipv4.ip_unprivileged_port_start=0' | sudo tee -a /etc/sysctl.d/60-rootless.conf\n    sudo sysctl --system\n  fi\nfi\n# Allow loopback connections (needed for working Xdebug)\n# See https://github.com/moby/moby/issues/47684#issuecomment-2166149845\nmkdir -p ~/.config/systemd/user/docker.service.d\ncat &lt;&lt; 'EOF' &gt; ~/.config/systemd/user/docker.service.d/override.conf\n[Service]\nEnvironment=\"DOCKERD_ROOTLESS_ROOTLESSKIT_DISABLE_HOST_LOOPBACK=false\"\nEOF\n</code></pre>\n</li>\n<li><p>Enable the Docker socket, and verify it's running:</p>\n<pre><code>systemctl --user enable --now docker.socket\n\n# You should see `/run/user/1000/docker.sock` (the number may vary):\nls $XDG_RUNTIME_DIR/docker.sock\n</code></pre>\n</li>\n<li><p>Configure Docker API to use Docker rootless:</p>\n<pre><code># View existing contexts\ndocker context ls\n\n# Create rootless context if it doesn't exist\ndocker context inspect rootless &gt;/dev/null 2&gt;&amp;1 || \\\n    docker context create rootless \\\n        --description \"Rootless runtime socket\" \\\n        --docker host=\"unix://$XDG_RUNTIME_DIR/docker.sock\"\n\n# Switch to the context\ndocker context use rootless\n\n# Verify it works\ndocker ps\n</code></pre>\n</li>\n<li><p>Proceed with <a href=\"https://docs.ddev.com/en/stable/users/install/ddev-installation/#ddev-installation-linux\">DDEV installation</a>.</p>\n</li>\n<li><p>Docker Rootless requires no-bind-mounts mode</p>\n<p>Docker Rootless has a limitation with bind mounts that affects DDEV. You must enable <a href=\"https://docs.ddev.com/en/stable/users/configuration/config/#no_bind_mounts\"><code>no-bind-mounts</code> mode</a>:</p>\n<pre><code>ddev config global --no-bind-mounts=true\n</code></pre>\n<p><strong>Why this is needed</strong>:</p>\n<p>Docker Rootless sets ownership for bind mounts to <code>root</code> inside containers. This is a known issue:</p>\n<ul>\n<li><a href=\"https://github.com/moby/moby/issues/45919\">Mounting a volume with rootless always assigns ownership to root</a></li>\n<li><a href=\"https://github.com/moby/moby/issues/2259\">Add ability to mount volume as user other than root</a></li>\n</ul>\n<p>The <code>root</code> user inside the container maps to your host user, but many services will not run as root:</p>\n<ul>\n<li>nginx runs as root without problems</li>\n<li>MySQL/MariaDB need extra configuration</li>\n<li>Apache and PostgreSQL will not run as root</li>\n</ul>\n<p>Podman Rootless fixes this with the <code>--userns=keep-id</code> option, which keeps user IDs the same. Docker Rootless does not have this option.</p>\n<p>The <code>no-bind-mounts</code> mode fixes this by using Mutagen for the <code>web</code> container.</p>\n</li>\n</ol>\n<h2>macOS</h2>\n<p>macOS users can use Podman and Podman Desktop, but setup has its own challenges. Docker Rootless is not available on macOS.</p>\n<h3>Do You Need an Alternative to Docker?</h3>\n<table>\n<thead>\n<tr>\n<th>Runtime</th>\n<th>Why would you do this?</th>\n<th>Key trade-offs</th>\n<th>Performance</th>\n<th>Setup</th>\n<th>Recommendation</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><strong>Traditional Docker</strong></td>\n<td>Standard, widely-used option</td>\n<td>None</td>\n<td>Excellent</td>\n<td>Simple</td>\n<td><strong>Recommended for most users</strong></td>\n</tr>\n<tr>\n<td><strong>Podman</strong></td>\n<td>Avoid Docker entirely (organizational policy)</td>\n<td>Cannot use ports 80/443 (must use 8080/8443 instead), different behavior</td>\n<td>Slower than Docker</td>\n<td>Moderate</td>\n<td>Only if Docker not allowed</td>\n</tr>\n</tbody></table>\n<p><strong>Bottom line</strong>: Use traditional Docker (OrbStack, Docker Desktop, Lima, Colima, or Rancher Desktop) unless your organization forbids it. The inability to use standard ports 80/443 with Podman creates a significantly different development experience.</p>\n<h3>Installing Podman</h3>\n<p>Install Podman using Homebrew:</p>\n<pre><code>brew install podman\n</code></pre>\n<p>Or install <a href=\"https://podman-desktop.io/docs/installation/macos-install\">Podman Desktop</a> if you prefer a GUI.</p>\n<p>For more information, see the <a href=\"https://podman.io/docs/installation#macos\">official Podman installation guide for macOS</a> and <a href=\"https://github.com/containers/podman/tree/main/docs/tutorials#readme\">Podman tutorials</a>.</p>\n<h3>Installing Docker CLI</h3>\n<p>Podman provides a Docker-compatible API, which means you can use the Docker CLI as a frontend for Podman. This approach offers several benefits:</p>\n<ul>\n<li>Use familiar <code>docker</code> commands while Podman handles the actual container operations</li>\n<li>Switch between different container runtimes using Docker contexts</li>\n<li>Maintain compatibility with scripts and tools that expect the <code>docker</code> command</li>\n</ul>\n<pre><code>brew install docker\n</code></pre>\n<h3>Configuring Podman</h3>\n<ol>\n<li><p>Handle privileged ports (&lt;1024):</p>\n<p><strong>Important</strong>: Podman on macOS cannot bind to privileged ports (80/443). You must configure DDEV to use unprivileged ports:</p>\n<pre><code>ddev config global --router-http-port=8080 \\\n    --router-https-port=8443\n</code></pre>\n<p>This means your DDEV projects will be accessible at <code>https://yourproject.ddev.site:8443</code> instead of the standard <code>https://yourproject.ddev.site</code>.</p>\n<p>Note: switching to rootful mode with <code>podman machine set --rootful --user-mode-networking=false</code> doesn't help with privileged ports because the <code>--user-mode-networking=false</code> flag is <a href=\"https://github.com/containers/podman/issues/26780\">not supported on macOS</a> (it's only available for WSL).</p>\n</li>\n<li><p>Initialize and start the Podman machine:</p>\n<pre><code># check `podman machine init -h` for more options\npodman machine init --memory 8192\npodman machine start\n</code></pre>\n<p>Check for the Podman socket path using <code>podman machine inspect</code>:</p>\n<pre><code>~ % podman machine inspect\n...\n   \"ConnectionInfo\": {\n      \"PodmanSocket\": {\n           \"Path\": \"/var/folders/z5/lhpyjf2n7xj2djl0bw_7kb3m0000gn/T/podman/podman-machine-default-api.sock\"\n      },\n      \"PodmanPipe\": null\n   },\n...\n</code></pre>\n</li>\n<li><p>Configure Docker CLI to use Podman. Choose one of two approaches:</p>\n<p><strong>Option 1: Create a Docker context</strong> (recommended, more flexible):</p>\n<pre><code># Create Podman context (path to socket may vary)\n# Use the socket path from `podman machine inspect` output\ndocker context create podman-rootless \\\n    --description \"Podman (rootless)\" \\\n    --docker host=\"unix:///var/folders/z5/lhpyjf2n7xj2djl0bw_7kb3m0000gn/T/podman/podman-machine-default-api.sock\"\n\n# Switch to the new context\ndocker context use podman-rootless\n\n# Verify it works\ndocker ps\n</code></pre>\n<p>This approach uses Docker contexts to switch between different container runtimes without modifying system sockets. This is more flexible if you want to use multiple Docker providers.</p>\n<p><strong>Option 2: Use the default Docker socket</strong> (simpler, but less flexible):</p>\n<pre><code># Install podman-mac-helper\n# Use the command from `podman machine start` output\nsudo /opt/homebrew/Cellar/podman/5.7.1/bin/podman-mac-helper install\npodman machine stop\npodman machine start\n\n# Verify it works\ndocker ps\n</code></pre>\n</li>\n<li><p>Proceed with <a href=\"https://docs.ddev.com/en/stable/users/install/ddev-installation/\">DDEV installation</a>.</p>\n</li>\n</ol>\n<h2>Windows</h2>\n<p>Windows users can use Podman Desktop, but setup has its own challenges. Docker Rootless is not available on traditional Windows (it works in WSL2, see the <a href=\"#key-aim-linux-and-wsl2-users\">Linux and WSL2</a> section).</p>\n<h3>Do You Need an Alternative to Docker?</h3>\n<table>\n<thead>\n<tr>\n<th>Runtime</th>\n<th>Why would you do this?</th>\n<th>Key trade-offs</th>\n<th>Performance</th>\n<th>Setup</th>\n<th>Recommendation</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><strong>Traditional Docker</strong></td>\n<td>Standard, widely-used option</td>\n<td>None</td>\n<td>Excellent</td>\n<td>Simple</td>\n<td><strong>Recommended for most users</strong></td>\n</tr>\n<tr>\n<td><strong>Podman</strong></td>\n<td>Avoid Docker entirely (organizational policy)</td>\n<td>Different behavior, less mature on Windows</td>\n<td>Slower than Docker</td>\n<td>Moderate</td>\n<td>Only if Docker not allowed</td>\n</tr>\n</tbody></table>\n<p><strong>Bottom line</strong>: Use traditional Docker (Docker Desktop or alternatives) unless your organization forbids it. Podman on Windows works but is less mature than on Linux.</p>\n<h3>Installing Podman</h3>\n<p>Install <a href=\"https://podman-desktop.io/docs/installation/windows-install\">Podman Desktop</a>, which includes Podman.</p>\n<p>Alternatively, install Podman directly following the <a href=\"https://podman.io/docs/installation#windows\">official Podman installation guide for Windows</a>.</p>\n<p>For more information, see the <a href=\"https://github.com/containers/podman/tree/main/docs/tutorials#readme\">Podman tutorials</a>.</p>\n<p>The setup and configuration follow similar patterns to the Linux/WSL2 setup, but with Podman Desktop managing the VM for you. Follow the <a href=\"#key-aim-linux-and-wsl2-users\">Linux and WSL2</a> instructions.</p>\n<h2>Running Multiple Container Runtimes</h2>\n<p>You can run Docker and Podman sockets simultaneously and switch between them using Docker contexts.</p>\n<p>For example, here's a system with four active Docker contexts:</p>\n<pre><code>$ docker context ls\nNAME                DESCRIPTION                               DOCKER ENDPOINT\ndefault             Current DOCKER_HOST based configuration   unix:///var/run/docker.sock\npodman              Podman (rootful)                          unix:///var/run/podman/podman.sock\npodman-rootless *   Podman (rootless)                         unix:///run/user/1000/podman/podman.sock\nrootless            Rootless runtime socket                   unix:///run/user/1000/docker.sock\n</code></pre>\n<p>Switch between them with:</p>\n<pre><code>docker context use \"&lt;context-name&gt;\"\n</code></pre>\n<p><strong>Note</strong>: Running both Docker and Podman in rootful mode at the same time may cause network conflicts. See <a href=\"https://github.com/containers/podman/issues/24486\">Podman and Docker network problem on Fedora 41</a>.</p>\n<h2>Switching Runtimes with DDEV</h2>\n<p>DDEV automatically detects your active container runtime. To switch:</p>\n<ol>\n<li><p>Stop DDEV projects:</p>\n<pre><code>ddev poweroff\n</code></pre>\n</li>\n<li><p>Switch Docker context or change the <code>DOCKER_HOST</code> environment variable</p>\n</li>\n<li><p>Start your project:</p>\n<pre><code>ddev start\n</code></pre>\n</li>\n</ol>\n<h2>Which Runtime Should You Choose?</h2>\n<h3>Runtime Comparison</h3>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Standard Docker</th>\n<th>Docker Rootless</th>\n<th>Podman Rootful</th>\n<th>Podman Rootless</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><strong>Platform Support</strong></td>\n<td>All</td>\n<td>Linux, WSL2</td>\n<td>All</td>\n<td>All</td>\n</tr>\n<tr>\n<td><strong>Rootless Daemon</strong></td>\n<td>❌</td>\n<td>✅</td>\n<td>❌</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><strong>Has automated testing in DDEV</strong></td>\n<td>✅</td>\n<td>✅</td>\n<td>❌</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><strong>Mutagen</strong></td>\n<td>✅</td>\n<td>✅</td>\n<td>✅</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><strong>Bind Mounts</strong></td>\n<td>✅</td>\n<td>❌, requires <code>no-bind-mounts</code></td>\n<td>✅</td>\n<td>✅ (with <code>--userns=keep-id</code>)</td>\n</tr>\n<tr>\n<td><strong>Performance</strong></td>\n<td>Excellent</td>\n<td>Moderate (because of <code>no-bind-mounts</code>)</td>\n<td>Slow compared to Docker</td>\n<td>Slow compared to Docker</td>\n</tr>\n<tr>\n<td><strong>Privileged Ports (&lt;1024)</strong></td>\n<td>Works by default</td>\n<td>Requires <code>sysctl</code> config</td>\n<td>Works by default</td>\n<td>Requires <code>sysctl</code> config or may not work</td>\n</tr>\n<tr>\n<td><strong>Setup Complexity</strong></td>\n<td>Simple</td>\n<td>Moderate</td>\n<td>Moderate</td>\n<td>Moderate</td>\n</tr>\n<tr>\n<td><strong>Maturity</strong></td>\n<td>Most mature</td>\n<td>Experimental</td>\n<td>Experimental</td>\n<td>Experimental</td>\n</tr>\n<tr>\n<td><strong>Recommended For</strong></td>\n<td>Most users</td>\n<td>Docker users needing rootless</td>\n<td>Organizations that forbid Docker</td>\n<td>Organizations that forbid Docker</td>\n</tr>\n</tbody></table>\n<h3>Recommendations</h3>\n<p><strong>Use of the many <a href=\"https://docs.ddev.com/en/stable/users/install/docker-installation/\">standard Docker providers</a> if:</strong></p>\n<ul>\n<li>You're comfortable with the most widely used container runtime</li>\n<li>You don't have rootless security requirements</li>\n</ul>\n<p><em>This is the recommended option for the vast majority of users.</em></p>\n<p><strong>Use Podman Rootless if:</strong></p>\n<ul>\n<li>Your organization forbids Docker</li>\n<li>You want rootless security by default</li>\n</ul>\n<p><strong>Use Podman Rootful if:</strong></p>\n<ul>\n<li>Your organization forbids Docker</li>\n<li>You want traditional container permissions without user namespace mapping overhead</li>\n</ul>\n<p><strong>Use Docker Rootless if:</strong></p>\n<ul>\n<li>You need full Docker compatibility</li>\n<li>You want rootless security without changing runtimes</li>\n</ul>\n<h2>The Journey to Podman Support</h2>\n<p>Supporting Podman and Docker Rootless required major changes to DDEV's Docker integration:</p>\n<ul>\n<li><strong>Switched to official Docker client library</strong> (<a href=\"https://github.com/ddev/ddev/pull/5787\">#5787</a>): DDEV previously used an unofficial library to communicate with the Docker API. We migrated to Docker's official client library for better compatibility and long-term support.</li>\n<li><strong>Replaced direct CLI calls with proper API usage</strong> (<a href=\"https://github.com/ddev/ddev/pull/7189\">#7189</a>): DDEV used to call <code>docker context inspect</code> directly, which doesn't work with Podman. We switched to using the <code>docker/cli</code> library to handle context operations properly.</li>\n<li><strong>Modernized SSH authentication</strong> (<a href=\"https://github.com/ddev/ddev/pull/7511\">#7511</a>): The <code>ddev auth ssh</code> command used to call <code>docker run</code> directly. We rewrote it to use the Docker API, making it compatible with alternative runtimes.</li>\n<li><strong>Optimized API call performance</strong> (<a href=\"https://github.com/ddev/ddev/pull/7587\">#7587</a>): DDEV's Docker API logic was inefficient, making redundant calls without caching. We restructured the code to cache data and reduce unnecessary API requests.</li>\n<li><strong>Removed legacy docker-compose features</strong> (<a href=\"https://github.com/ddev/ddev/pull/7642\">#7642</a>): Podman refuses to work with deprecated <code>links</code> and <code>external_links</code> directives in <code>docker-compose</code> files. We removed these legacy features and modernized DDEV's compose file generation.</li>\n<li><strong>Added Podman and Docker Rootless support</strong> (<a href=\"https://github.com/ddev/ddev/pull/7702\">#7702</a>): DDEV now detects and supports Podman (rootful and rootless) and Docker Rootless. We added handling for Podman-specific limitations and enabled rootless environments to work without root privileges.</li>\n<li><strong>Added support for SELinux environments</strong> (<a href=\"https://github.com/ddev/ddev/pull/7939\">#7939</a>): Podman has SELinux enabled by default on Fedora and some other distributions. We added support for SELinux by configuring volume mounts with the appropriate labels.</li>\n</ul>\n<p>These changes enabled Podman and Docker Rootless support. These features were developed together because Podman's primary use case is rootless operation. Once DDEV could handle rootless runtimes, supporting both became natural. They share the same security model and similar technical constraints.</p>\n<h2>Supporting DDEV Development</h2>\n<p>This Podman and Docker Rootless support was made possible by <a href=\"sustainability-for-ddev.md\">community financial support</a>. The changes required hundreds of hours of development, code reviews, and testing.</p>\n<p>DDEV relies on support from individuals and organizations who use it. With Podman rootless support, DDEV now works in corporate environments where Docker Desktop is not allowed. If you or your organization uses DDEV, please consider <a href=\"https://github.com/sponsors/ddev\">sponsoring the project</a> to help keep DDEV free and open source.</p>\n<h2>Conclusion</h2>\n<p>DDEV now supports Podman and Docker Rootless as experimental features. This opens DDEV to corporate environments where traditional Docker is not allowed.</p>\n<p>DDEV automatically detects your runtime and handles the complexity. Whether you choose Podman for rootless security, Docker Rootless for compatibility, or standard Docker, setup is straightforward.</p>\n<hr />\n<p><em>This article was edited and refined with assistance from Claude Code.</em></p>\n"},{"id":"https://ddev.com/blog/release-v1250","url":"https://ddev.com/blog/release-v1250","title":"DDEV v1.25.0: Improved Windows Support, Faster Debugging, and Modern Defaults","content_html":"<p>We're excited to announce <a href=\"https://github.com/ddev/ddev/releases/tag/v1.25.0\">DDEV v1.25.0</a>, featuring a completely revised Windows installer, XHGui as the default profiler, and updated system defaults including a move to Debian Trixie.</p>\n<p>This release represents contributions from the entire DDEV community, with your suggestions, bug reports, code contributions, and financial support making it possible.</p>\n<h2>What's New and Updated</h2>\n<p><strong>Default versions updated</strong>:</p>\n<p>These updates mostly affect new projects. Existing projects typically continue to work without changes.</p>\n<ul>\n<li><strong>Debian Trixie</strong> replaces Debian Bookworm as the base image for <code>ddev-webserver</code> and <code>ddev-ssh-agent</code></li>\n<li><strong>XHGui</strong> is now the default profiler (replacing prepend mode). See <a href=\"./xhgui-feature.md\">XHGui Feature blog post</a></li>\n<li><strong>PHP 8.4</strong> becomes the default for new projects, and <strong>PHP 8.5.2</strong> is now available with full extension support including Xdebug</li>\n<li><strong>Node.js 24</strong> becomes the default for projects that don't specify another version</li>\n<li><strong>MariaDB 11.8</strong> becomes the default for new projects</li>\n</ul>\n<p><strong>Major new features</strong>:</p>\n<ul>\n<li><strong>Revised Windows installer</strong> now uses per-user installation for WSL2 or traditional Windows (no admin account required). Download from <a href=\"/download/\">ddev.com/download</a></li>\n<li><strong>Reworked <code>ddev share</code> command</strong> with a new cloudflared share provider for free sharing options. See <a href=\"https://docs.ddev.com/en/stable/users/topics/sharing/\">new docs</a> and <a href=\"share-providers.md\">blog</a></li>\n<li><strong>New diagnostic commands</strong>:<ul>\n<li><code>ddev utility xdebug-diagnose</code> helps troubleshoot Xdebug issues. See <a href=\"xdebug-step-debugging-understanding-and-troubleshooting.md\">Xdebug Understanding and Troubleshooting</a></li>\n<li><code>ddev utility mutagen-diagnose</code> helps debug Mutagen issues. See <a href=\"mutagen-functionality-issues-debugging.md\">Mutagen in DDEV: Functionality, Issues, and Debugging</a></li>\n</ul>\n</li>\n<li><strong>Faster snapshots</strong>: <code>ddev snapshot</code> now uses zstd instead of gzip for significantly faster exports and restores, thanks <a href=\"https://github.com/deviantintegral\">@deviantintegral</a></li>\n<li><strong>Experimental Podman and Docker Rootless support</strong>: See <a href=\"podman-and-docker-rootless.md\">Podman and Docker Rootless in DDEV</a></li>\n<li><strong>FrankenPHP as an official add-on</strong>: <a href=\"https://github.com/ddev/ddev-frankenphp\"><code>ddev-frankenphp</code></a> with many improvements. See updated <a href=\"using-frankenphp-with-ddev.md\">Using FrankenPHP with DDEV</a></li>\n<li><strong>Traefik configuration standardization</strong>: Project configuration now uses a single file: <code>.ddev/traefik/config/&lt;projectname&gt;.yaml</code> (all other files are ignored)</li>\n</ul>\n<h2>What You Need to Do After Upgrading</h2>\n<p>After upgrading to v1.25.0, follow these steps:</p>\n<ol>\n<li><strong>Run <code>ddev poweroff</code></strong> (DDEV will prompt you for this)</li>\n<li><strong>Update your projects</strong>: Run <code>ddev config --auto</code> on each project to update to current configuration</li>\n<li><strong>Update installed add-ons</strong>: Run <code>ddev add-on list --installed</code> to see your add-ons, then update them as needed</li>\n<li><strong>Free up disk space</strong>: Run <code>ddev delete images</code> to remove old Docker image versions</li>\n<li><strong>Check compatibility notes</strong> below</li>\n</ol>\n<h2>Compatibility Notes and Things to Check</h2>\n<h3>1. Debian Trixie base image</h3>\n<p><strong>If your project has custom Dockerfiles</strong> or uses <code>webimage_extra_packages</code> and <code>ddev start</code> shows any problems, you may have a little work to do, but most projects are unaffected.</p>\n<p><strong>What to do</strong>: Test your project after upgrading. See <a href=\"https://www.debian.org/releases/trixie/release-notes/issues.html\">Debian Trixie release notes</a> for known issues.</p>\n<p><strong>Note</strong>: DDEV already includes the <code>tzdata-legacy</code> package to handle removed timezones in Debian Trixie, so no action is needed for timezone-related changes.</p>\n<h3>2. Profiler changed to XHGui</h3>\n<p><strong>If you use XHProf profiling</strong>, it now defaults to XHGui mode instead of prepend mode.</p>\n<p><strong>What to do</strong>: If you prefer the previous prepend mode, run:</p>\n<pre><code>ddev config global --xhprof-mode=prepend\n</code></pre>\n<h3>3. Nginx modules now come from Debian repository</h3>\n<p><strong>If you use custom nginx modules</strong>, the package names and module loading have changed. DDEV now uses nginx bundled with Debian Trixie instead of maintaining an extra dependency on the nginx.org repository.</p>\n<p><strong>What to do</strong>: Update your nginx module configuration.</p>\n<p>Example: Adding NJS (JavaScript) support to nginx in DDEV v1.25.0+:</p>\n<pre><code>ddev config --webimage-extra-packages=\"libnginx-mod-http-js,libnginx-mod-stream,libnginx-mod-stream-js\" --ddev-version-constraint='&gt;=v1.25.0'\n\ncat &lt;&lt;'EOF' &gt; .ddev/web-build/Dockerfile.nginx\nRUN sed -i '1i load_module modules/ngx_stream_module.so;\\nload_module modules/ngx_http_js_module.so;\\nload_module modules/ngx_stream_js_module.so;\\n' /etc/nginx/nginx.conf\nEOF\n</code></pre>\n<h3>4. Removed commands and features</h3>\n<p><strong>If you use these commands</strong>, you'll need to switch:</p>\n<ul>\n<li><strong><code>ddev nvm</code></strong>: Switch to <a href=\"https://docs.ddev.com/en/stable/users/configuration/config/#nodejs_version\"><code>nodejs_version</code></a> or install the <a href=\"https://github.com/ddev/ddev-nvm\"><code>ddev-nvm</code></a> add-on</li>\n<li><strong><code>ddev service</code></strong>: Use <a href=\"https://docs.ddev.com/en/stable/users/usage/commands/#add-on\"><code>ddev add-on</code></a> to install/remove services</li>\n<li><strong>NFS performance mode</strong>: Switch to <a href=\"https://docs.ddev.com/en/stable/users/install/performance/#filesystem-performance-mutagen\">Mutagen</a> instead</li>\n</ul>\n<h3>5. Updated <code>ddev config</code> flags</h3>\n<p><strong>If you use these flags in scripts</strong>, update them:</p>\n<ul>\n<li><code>--mutagen-enabled</code> → <code>--performance-mode=mutagen</code></li>\n<li><code>--upload-dir</code> → <code>--upload-dirs</code></li>\n<li><code>--http-port</code> → <code>--router-http-port</code></li>\n<li><code>--https-port</code> → <code>--router-https-port</code></li>\n<li><code>--mailhog-port</code> → <code>--mailpit-http-port</code></li>\n<li><code>--mailhog-https-port</code> → <code>--mailpit-https-port</code></li>\n<li><code>--projectname</code> → <code>--project-name</code></li>\n<li><code>--projecttype</code>, <code>--apptype</code> → <code>--project-type</code></li>\n<li><code>--sitename</code> → <code>--project-name</code></li>\n<li><code>--image-defaults</code> → <code>--web-image-default</code></li>\n</ul>\n<h3>6. Traefik configuration</h3>\n<p><strong>If you have custom Traefik configuration</strong>, note that:</p>\n<ul>\n<li>Only <code>.ddev/traefik/config/&lt;projectname&gt;.yaml</code> is used (other files are ignored)</li>\n<li>Put global Traefik configuration in <code>$HOME/.ddev/traefik/custom-global-config/</code></li>\n<li>Traefik v3 syntax is now required</li>\n</ul>\n<p><strong>What to do if you have extra Traefik files</strong>:</p>\n<ol>\n<li>Merge all your custom configuration into <code>.ddev/traefik/config/&lt;projectname&gt;.yaml</code> and remove the <code>#ddev-generated</code> comment from it</li>\n<li>Track <a href=\"https://github.com/ddev/ddev/issues/8047\">issue #8047</a> for potential future improvements to this workflow</li>\n</ol>\n<p><strong>Note</strong>: <code>ddev-router</code> no longer stops automatically when the last project stops. Use <code>ddev poweroff</code> to stop it manually.</p>\n<h3>7. Windows installation</h3>\n<p><strong>If you're on traditional Windows</strong> (not WSL2): The installer may prompt you to uninstall the previous system-wide installation before installing the new per-user version.</p>\n<h2>Other Improvements</h2>\n<p>This release includes many other improvements:</p>\n<ul>\n<li>New <a href=\"https://docs.ddev.com/en/stable/users/quickstart/#wagtail-python-generic\">Wagtail</a>, <a href=\"https://docs.ddev.com/en/stable/users/quickstart/#codeigniter\">CodeIgniter</a>, and Drupal 12 project types</li>\n<li>Improved <a href=\"https://docs.ddev.com/en/stable/users/providers/pantheon/\">Pantheon integration</a> with new environment variables and option to pull from <a href=\"https://docs.ddev.com/en/stable/users/providers/pantheon/#using-existing-backups-vs-fresh-database-dumps\">existing backups or fresh database dumps</a></li>\n<li>Much faster <code>ddev add-on list</code> and <code>ddev add-on search</code></li>\n<li>Shell autocompletion for <code>ddev add-on get &lt;TAB&gt;</code></li>\n<li>SELinux environment detection with automatic bind mount labels</li>\n<li>More portable database collations for MySQL/MariaDB exports</li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/extend/in-container-configuration/#ssh-configuration\">SSH config support</a> in <code>$HOME/.ddev/homeadditions/.ssh/config.d</code></li>\n<li>DBeaver support for traditional Windows</li>\n</ul>\n<p>See the <a href=\"https://github.com/ddev/ddev/releases/tag/v1.25.0\">full release notes</a> for complete details.</p>\n<p>From the entire team, thanks for using, promoting, contributing, and supporting DDEV!</p>\n<p>If you have questions, reach out in any of the <a href=\"https://docs.ddev.com/en/stable/users/support/\">support channels</a>.</p>\n<p>Follow our <a href=\"https://ddev.com/blog/\">blog</a>, <a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky</a>, <a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn</a>, <a href=\"https://fosstodon.org/@ddev\">Mastodon</a>, and join us on <a href=\"/s/discord\">Discord</a>. Sign up for the <a href=\"/newsletter\">monthly newsletter</a>.</p>\n<hr />\n<p><em>This article was edited and refined with assistance from Claude Code.</em></p>\n"},{"id":"https://ddev.com/blog/ddev-jan-2026-newsletter","url":"https://ddev.com/blog/ddev-jan-2026-newsletter","title":"DDEV January 2026: Year in Review, Looking Ahead, and Community Momentum","content_html":"<p>This is the time of year that many of us look backward and forward to inform our future, and DDEV is no different. We took the time to review last year and put together plans for 2026.</p>\n<ul>\n<li><strong>DDEV 2025 Review</strong> → The numbers tell an impressive story: growth in adoption, features, and community engagement. <a href=\"2025-review.md\">Read more↗</a></li>\n<li><strong>DDEV 2026 Plans</strong> → Our roadmap for sustainability, new features, and expanding the community. <a href=\"2026-plans.md\">Read more↗</a></li>\n<li><strong>Board and Advisory Group Meeting</strong> was last week, and you can read the summary and watch the recording. <a href=\"https://github.com/orgs/ddev/discussions/7863\">See it all↗</a></li>\n</ul>\n<h2>Lots of new DDEV GUI experiments!</h2>\n<p>Many DDEV users love the <a href=\"https://plugins.jetbrains.com/plugin/18813-ddev-integration\">PhpStorm/IntelliJ DDEV Integration Plugin</a> maintained by AkibaAT and the <a href=\"https://marketplace.visualstudio.com/items?itemName=biati.ddev-manager\">VS Code DDEV Manager</a> by Biati Digital, but there are new experimental entries in the GUI manager space:</p>\n<ul>\n<li><strong>DevWorkspacePro</strong> by damms005 is a commercial entry in the wrapper-GUI space that has had lots of energy applied to it. There isn't currently a free trial available, and it's a bit pricey, but see it at <a href=\"https://devworkspacepro.com/\">https://devworkspacepro.com/</a>.</li>\n<li><strong>DDEVBar for macOS</strong> → Klemens Starybrat built a native Mac menu bar app that makes managing DDEV projects simpler. <a href=\"https://klemens.ee/ddevbar/\">Check it out↗</a></li>\n<li><strong>DDEV Manager GUI</strong> → VonLoxx created another DDEV wrapper GUI. <a href=\"https://github.com/DDEV-Manager/ddev-manager\">Try it out↗</a></li>\n<li><strong>DDEV GUI</strong> by ChaosKing (only tested on Linux) is another entry in this category. <a href=\"https://github.com/theChaosCoder/ddev-gui\">Experiment and give feedback↗</a></li>\n</ul>\n<h2>Community Tutorials from Around the World</h2>\n<ul>\n<li><strong>Navigating Local Development Landscapes</strong> → Tag1 explores modern approaches to local development environments, featuring DDEV. <a href=\"https://www.tag1.com/tag1-team-talks/navigating-local-development-landscapes/\">Read on Tag1↗</a></li>\n<li><strong>Configurando um Ambiente de Desenvolvimento WordPress com DDEV (Docker)</strong> → Willian Rodrigues walks through configuring a fast, standardized WordPress development environment (in Portuguese). <a href=\"https://dev.to/williangringo/configurando-um-ambiente-de-desenvolvimento-wordpress-com-ddev-docker-rapido-padronizado-e-sem-1i6i\">Read on Dev.to↗</a></li>\n<li><strong>DDEV and Gotenberg: Using Custom Fonts for Your PDFs</strong> → Jean-David Daviet explains how to integrate Gotenberg with DDEV for PDF generation with custom fonts (in English and French). <a href=\"https://jeandaviddaviet.fr/en/devops/ddev-and-gotenberg-using-custom-fonts-for-your-pdfs\">Read the tutorial↗</a></li>\n<li><strong>Custom Drupal 11 Theme with TailwindCSS 4.1</strong> → Serhii Shevchyk demonstrates setting up a modern Drupal 11 theme using TailwindCSS and DDEV. <a href=\"https://medium.com/@serhii.shevchyk/how-to-set-up-a-custom-drupal-11-theme-with-tailwindcss-4-1-8337e51c4df1\">Read on Medium↗</a></li>\n</ul>\n<h2>Community Video Tutorials</h2>\n<ul>\n<li><strong>CraftQuest: DDEV + Vite + Tailwind Boilerplate from Scratch</strong> → Learn to build a modern development boilerplate combining DDEV, Vite, and Tailwind CSS. <a href=\"https://craftquest.io/courses/ddev-vite-tailwind-boilerplate-from-scratch\">Watch on CraftQuest↗</a></li>\n<li><strong>My CraftQuest DDEV Setup</strong> → Prolific trainer Ryan Irelan shows his setup for Craft CMS <a href=\"https://craftquest.io/lessons/my-craftquest-ddev-setup\">Watch↗</a></li>\n<li><strong>An introduction to Ansible and using ce-deploy in DDEV</strong> → Greg Harvey demonstrates deployment workflows using Ansible and ce-deploy with DDEV. <a href=\"https://www.youtube.com/watch?v=vRWW93X6GN0\">Watch on YouTube↗</a></li>\n</ul>\n<hr />\n<h2>Help Us Out: Use HEAD</h2>\n<p>Want to help DDEV development? Consider testing with the HEAD version of DDEV. This helps us catch issues early. We expect that some advanced users with complex Dockerfiles may have hiccups with upcoming v1.25.0. It's easy, See <a href=\"https://docs.ddev.com/en/stable/developers/building-contributing/#testing-latest-commits-on-head\">the docs↗</a> for instructions.</p>\n<h2>DDEV Training Continues</h2>\n<p>Join us for upcoming training sessions for contributors and users.</p>\n<ul>\n<li><p><strong>January 22, 2026 at 10:00 US ET / 16:00 CET — Mutagen, syncing, problems, upload_dirs for direct bind mounts</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Mutagen%2C%20syncing%2C%20problems%2C%20upload_dirs%20for%20direct%20bind%20mounts&amp;dates=20260122T150000Z/20260122T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-01-22.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>February 26, 2026 at 10:00 US ET / 16:00 CET — Git bisect for fun and profit</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Git%20bisect%20for%20fun%20and%20profit&amp;dates=20260226T150000Z/20260226T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-02-26.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>March 26, 2026 at 10:00 US ET / 15:00 CET — Using <code>git worktree</code> with DDEV projects and with DDEV itself</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Using%20git%20worktree%20with%20DDEV%20projects%20and%20with%20DDEV%20itself&amp;dates=20260326T140000Z/20260326T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-03-26.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>April 23, 2026 at 10:00 US ET / 16:00 CEST — Creating, maintaining and testing add-ons</strong>\n2026-updated version of our popular add-on training. <a href=\"https://www.youtube.com/watch?v=TmXqQe48iqE\">Previous session recording↗</a>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Creating%2C%20maintaining%20and%20testing%20add-ons&amp;dates=20260423T140000Z/20260423T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-04-23.ics\">Download .ics</a></p>\n</li>\n</ul>\n<p>Zoom Info:\nLink: <a href=\"https://us02web.zoom.us/j/7315692237?pwd=RHR6NUkwb0g5WXIzS2NOcXRucCthZz09\">Join Zoom Meeting</a>\nPasscode: 12345</p>\n<hr />\n<h2>Sponsorship Update: You Showed Up</h2>\n<p>When we shared the news about Upsun lowering their sponsorship, the community responded. In just one month, sponsorship jumped from 58% to 68% of our goal—a 10% increase that makes a real difference. Thank you to everyone who stepped up and to those of you who are about to jump on board.</p>\n<p><strong>Previous status (December 2025)</strong>: ~$6,964/month (58% of goal)</p>\n<p><strong>January 19, 2026</strong>: ~$8,208/month (68% of goal)</p>\n<p></p>\n<p>If DDEV has helped your team, now is the time to give back. Whether you're an individual developer, an agency, or an organization — your contribution makes a difference. → <a href=\"https://github.com/sponsors/ddev\">Become a sponsor↗</a></p>\n<p><a href=\"/contact\">Contact us</a> to discuss sponsorship options that work for your organization.</p>\n<h2>Stay in the Loop—Follow Us and Join the Conversation</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n<p>Compiled and edited with assistance from Claude Code.</p>\n"},{"id":"https://ddev.com/blog/2026-plans","url":"https://ddev.com/blog/2026-plans","title":"Planning for another great DDEV year in 2026","content_html":"<h1>2026 Plans and Notes</h1>\n<p>Every year we try to lay out a bit of a plan for the coming year.</p>\n<p>One of DDEV's primary strengths is our connection to a wonderful community, so each year turns out a bit different than expected. As we listen to people's actual experience, we try to adjust. And of course as upstream changes bring new features and bugs, we get lots of fun things to work on that we could never have anticipated. The items listed here are notes about what we think we understand at this point, but the year ahead and user experience and requests will affect what really happens.</p>\n<p>We look forward to your input as the year goes forward.</p>\n<h2>Community</h2>\n<p><strong>Community is core to our strength and growth</strong>. We are committed to maintaining the outstanding support that we offer for free and keeping that communication line open. And we want to continue to grow the amazing corps of contributors who offer improvements to the DDEV ecosystem.</p>\n<h2>Board of Directors</h2>\n<p>In 2025 we established <a href=\"board-of-directors-established.md\">Board of Directors</a>, but now we have to learn what that means. The Board will have to establish itself, begin helping to determine priorities, and find its way to a strong oversight role. Here are a few issues to toss to the board early:</p>\n<ul>\n<li>Governance strategy and technique. Meetings? Voting?</li>\n<li>Overall Marketing/Fundraising strategy, including Fundraising drive</li>\n<li>Consider spending more on AI (Higher level of Claude Code plans)</li>\n<li>Discuss and create AI strategy, including policy, guidelines, tools, etc.</li>\n<li>How many conferences to attend (and what conferences) and spending priorities</li>\n<li>Should we move toward a Freemium model with \"premium\" features? What infrastructure and code would be required?</li>\n</ul>\n<h2>Features and Initiatives</h2>\n<ul>\n<li>Consider a general AI strategy for DDEV users. How can we support the community in its use of AI for web development? Many platforms (<a href=\"https://github.com/ddev/ddev/issues/7556\">like Laravel</a>) have explicit MCPs; people want to know how to use them with DDEV.</li>\n<li>Update macOS install blog + Xdebug usage blog (carried forward from 2025)</li>\n<li>AI Sandboxing as key DDEV feature (from <a href=\"https://github.com/orgs/ddev/discussions/7923\">issue</a>)</li>\n<li>Consider MCP (for projects) as key DDEV feature</li>\n<li>Consider MCP for DDEV (<a href=\"https://github.com/ddev/ddev/pull/7604\">experimental PR</a>)</li>\n<li>Integration of mkcert CA without use of external <code>mkcert</code> tool</li>\n<li>Start a project without <code>ddev config</code>, Consider offering <code>ddev config --auto</code> or <code>ddev config</code> when <code>ddev start</code> in a directory without config (<a href=\"https://github.com/ddev/ddev/issues/7976\">issue</a>)</li>\n<li>Explore using real certificates instead of mkcert CA</li>\n<li>Subdomains for extra ports/services instead of separate ports. (Prereq for some web-based setups like coder). See the <a href=\"ddev-expose-node-app-on-subdomain.md\">blog</a> on this approach.</li>\n<li>Coder support for subdomains. Could codespaces use some proxy/redirect technique to route subdomains to main item, but have a header that determined how traefik would route it?</li>\n<li>Use a DDEV proxy on the host to allow commands like ddev list and ddev describe and ddev launch to work from inside the web container.</li>\n<li>Explore moving Mutagen completely into container (syncing between volume and bind-mount)</li>\n<li>Improved management of <code>.ddev/.env*</code> files, marking DDEV-owned lines, etc.</li>\n<li>More work on web-based setups like Coder and Codespaces and Dev Containers in general.</li>\n<li>Explore environment adjustments that might let users work \"inside the web container\" as if they were on a real host (use <code>composer</code> instead of <code>ddev composer</code>, etc). People can already do this with <code>ddev ssh</code>, but that isn't directly compatible with VS Code or PhpStorm.</li>\n<li>Serialize concurrent runs of <code>ddev start</code> and similar commands.</li>\n<li>Move the DDEV IntelliJ/PhpStorm plugin to the DDEV organization.</li>\n</ul>\n<h2>Procedures</h2>\n<ul>\n<li>Randy and Stas have always done timekeeping and timesheet reporting, but will improve their reporting a bit with categories/projects in 2026. <a href=\"https://github.com/orgs/ddev/discussions/7923#discussioncomment-15172639\">discussion</a>.</li>\n<li>Explore additional benefits of being open source and 501(c)(3) nonprofit. We have a number of benefits already, including GitHub nonprofit status, etc. But we can probably get additional benefits from AWS, etc. (JetBrains and Docker also provide us open source benefits.)</li>\n</ul>\n<h2>2026 Planning Additional Notes</h2>\n<h3>Recognized Risks</h3>\n<p>We are a very small organization, so we try to pay careful attention to the risks as we go forward. In many ways, these are the same as the 2025 noted risks.</p>\n<ul>\n<li>Key maintainer Stas lives in a very volatile situation in Ukraine, and none of us knows how to predict the future. Physical risks, communication risks, and financial transfer risks are always possible.</li>\n<li>Randy is not young and can always face new risks.</li>\n<li>The financial outlook for discretionary funding from agencies and hosting companies (and perhaps individuals) remains horrible.</li>\n<li>Any of our maintainers can become overworked or discouraged or can burn out. We take the risk of burnout and overwork very seriously and are careful to talk about them and try to prevent them.</li>\n<li>Mutagen maintenance and future: Mutagen is a critical part of DDEV, and it's in maintenance-only mode since Jacob went to work for Docker. It's outstanding in quality, so should last, and Jacob has been responsive when there are problems. Its future is not clear.</li>\n<li>Scope expansion could be unsustainable. We support so many different environments, and our testing is so enormous. Without the current expertise, we couldn't maintain the existing scope.</li>\n</ul>\n<h3>Minor Notes</h3>\n<h2>Past Plans and Reviews</h2>\n<p>Previous plans and reviews have obviously framed this year's plans: <a href=\"2025-plans.md\">2025 Plans and 2024 review</a>, <a href=\"2024-plans.md\">2024 plans</a></p>\n<p>In preparing for this, we have been discussing these things in <a href=\"https://github.com/orgs/ddev/discussions/categories/ddev-advisory-group\">regular advisory group meetings</a> and a specific <a href=\"https://github.com/orgs/ddev/discussions/7923\">brainstorming meeting</a>.</p>\n<p>We always want to hear from you about your experiences with DDEV as the year goes along!</p>\n<p>Want to keep up as the month goes along? Follow us on:</p>\n<ul>\n<li><a href=\"/newsletter\">Monthly Newsletter</a></li>\n<li><a href=\"https://ddev.com/blog/\">blog</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky</a></li>\n<li>and join our community on <a href=\"/s/discord\">Discord</a></li>\n</ul>\n"},{"id":"https://ddev.com/blog/2025-review","url":"https://ddev.com/blog/2025-review","title":"DDEV 2025 Year in Review","content_html":"<p>2025 has been a year of significant growth and accomplishment for DDEV. With 579 commits to the main repository and releases from v1.24.0 through v1.24.10, we've made substantial progress on features, infrastructure, and community building. Here's a look back at what we all achieved together.</p>\n<h2>Table of Contents</h2>\n<h2>Organizational Milestones</h2>\n<ul>\n<li><strong>Board of Directors Established</strong>: In December 2025, we formally established a Board of Directors for the DDEV Foundation, enhancing governance and setting the stage for long-term sustainability. We're super proud of this as it's something we've been working toward for years. <a href=\"board-of-directors-established.md\">Read all about it</a>.</li>\n<li><strong>Advisory Group Continues</strong>: Our Advisory Group meetings continued throughout the year, providing valuable input and oversight. It will continue just about the same even though we now have a formal Board.</li>\n<li><strong>\"Almost Everybody Loves DDEV\"</strong>: The <a href=\"https://www.ironstar.io/devsurvey25/#almost-everybody-loves-ddev\">Ironstar Developer Survey 2025</a> confirmed what we suspected - DDEV has strong community support and satisfaction.</li>\n</ul>\n<h2>Community Engagement</h2>\n<p>The DDEV open-source community continues excellent engagement on several fronts.</p>\n<ul>\n<li><a href=\"https://addons.ddev.com\">addons.ddev.com</a> now shows 147 community-contributed add-ons (176 in total).</li>\n<li>Several key features were suggested, initiated, and developed by community members. SO MANY of these are listed below.</li>\n<li>Online Training: We restarted online <a href=\"/blog/category/training/\">contributor and user training</a></li>\n<li>Offline Training: Randy conducted many Birds-of-a-Feature sessions at DrupalCons, spoke at Florida Drupalcamp, attended, spoke, and trained at TYPO3Camp RheinRuhr, etc.</li>\n</ul>\n<h2>Major Features and Improvements</h2>\n<h3>Sponsorship Communication</h3>\n<ul>\n<li>Massively improved reporting, communication, and management of sponsorship information</li>\n<li>Public sponsorship data feed via <a href=\"https://github.com/ddev/sponsorship-data\">sponsorship-data repository</a></li>\n<li>Banners on DDEV web properties and The Drop Times show current funding status</li>\n<li>Daily <code>ddev start</code> notifications keep users informed about sponsorship status</li>\n</ul>\n<h3>Add-on Ecosystem</h3>\n<ul>\n<li><strong>The <a href=\"https://addons.ddev.com\">Add-on Registry</a></strong> launched in January 2025, now displays 176 add-ons, 29 of which are officially maintained by the DDEV team.</li>\n<li><strong>PHP-based add-ons</strong>: Add-ons can now be written in PHP, as the <a href=\"https://github.com/ddev/ddev-upsun\">ddev-upsun</a> add-on shows. The PHP language is far more powerful for complex tasks than shell scripts.</li>\n<li><strong><code>ddev add-on get</code></strong> now downloads add-on dependencies automatically</li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/extend/custom-docker-services/#customizing-ddev-describe-output\"><strong><code>x-ddev</code> extension</strong></a> allows add-ons to add important information to <code>ddev describe</code> output</li>\n<li>Add-on monitoring continues for both official and community add-ons. We monitor the nightly tests of official add-ons, and periodically check in with all the community add-ons, asking people to re-enable or fix tests.</li>\n<li>New official add-ons: <a href=\"https://github.com/ddev/ddev-frankenphp\">FrankenPHP</a> (June), <a href=\"https://github.com/ddev/ddev-redis-insight\">Redis Insight</a> (July), <a href=\"https://github.com/ddev/ddev-upsun\">Upsun</a> (August), <a href=\"https://github.com/ddev/ddev-nvm\">NVM Standalone</a> (November)</li>\n<li>By year's end: 29 official add-ons and 176+ total add-ons.</li>\n<li>Stas continued to document and promote best practices with add-ons, including improved testing and upgrading strategies.</li>\n</ul>\n<h3>Container and Infrastructure</h3>\n<ul>\n<li><strong>Parallel Docker image pulls</strong> for faster project starts</li>\n<li><strong>Docker Compose profiles</strong>: Start projects with specific profiles using <code>ddev start --profiles=list,of,profiles</code></li>\n<li>Refactored Docker API code: no calls to <code>docker</code> binary (switched to <code>github.com/docker/cli</code>) and no fragile YAML map structures (switched to <code>github.com/compose-spec/compose-go/v2</code>)</li>\n</ul>\n<p>Upcoming v1.25.0:</p>\n<ul>\n<li><strong>Podman support</strong>: Podman rootless/rootful environments</li>\n<li><strong>Docker rootless</strong> functionality added for Linux environments</li>\n<li>Base web server image updated to <strong>Debian 13 Trixie</strong></li>\n</ul>\n<h3>Developer Experience</h3>\n<ul>\n<li><strong>XHGui integration</strong> funded by TYPO3 Association, <a href=\"xhgui-feature.md\">read more</a></li>\n<li><strong><code>ddev-upsun</code> add-on</strong> provides new integration with Upsun (formerly Platform.sh) fixed and flex projects.</li>\n<li><strong>New handling of privilege elevation using the <code>ddev-hostname</code> binary</strong>, improving security, <a href=\"ddev-hostname-security-improvements.md\">read more</a></li>\n<li><strong><code>--user</code>/<code>-u</code> flag</strong> for <code>ddev exec</code> and <code>ddev ssh</code></li>\n<li><strong><code>ddev describe</code></strong> now works on stopped projects</li>\n<li><strong><code>ddev utility download-images --all</code></strong> forces pulling all images in use</li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/install/shell-completion/#shell-completion-autocomplete\"><strong>Shell completion</strong></a> added and expanded thanks to community contributions</li>\n<li><strong><code>ddev npx</code></strong> command support</li>\n<li>Improved cleanup for <code>ddev delete</code> and <code>ddev delete images</code></li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/usage/managing-projects/#access-another-project-via-https\">Automatic HTTP/S communication between DDEV projects</a></li>\n<li>Enhanced and simpler Pantheon support</li>\n</ul>\n<p>Upcoming v1.25.0:</p>\n<ul>\n<li><strong>Improved <code>ddev share</code></strong>: More configurable, customizable, with <code>pre-share</code> hooks and <code>DDEV_SHARE_URL</code> environment variable</li>\n<li><strong><code>ddev utility mutagen-diagnose</code></strong>: Automatic study of Mutagen problems or misconfiguration</li>\n<li><strong><code>ddev utility xdebug-diagnose</code></strong>: Automatic study of possible Xdebug configuration problems</li>\n</ul>\n<h3>Language and Database Updates</h3>\n<ul>\n<li><strong>PHP 8.5</strong> support added with a limited set of extensions (in v1.24.10)</li>\n<li><strong>MariaDB 11.8</strong> support added</li>\n<li><strong>PostgreSQL 18</strong> support added</li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/extend/customization-extendibility/#using-nodejs-as-ddevs-primary-web-server\">Node.js as primary web server</a> support</li>\n</ul>\n<p>Upcoming v1.25.0:</p>\n<ul>\n<li><strong>PHP 8.4</strong> is the default for new projects (previously PHP 8.3)</li>\n<li><strong>PHP 8.5</strong> support with all extensions</li>\n<li><strong>Node.js 24</strong> as default for new projects (previously Node.js 22)</li>\n<li><strong>MariaDB 11.8</strong> as default for new projects (previously MariaDB 10.11)</li>\n</ul>\n<h3>Windows Improvements</h3>\n<ul>\n<li><a href=\"./watch-new-windows-installer.md\"><strong>New Windows GUI Installer</strong></a> handling Traditional Windows, WSL2/Docker CE, and Docker/Rancher Desktop</li>\n<li>ARM64 Windows installer support</li>\n</ul>\n<h2>ddev.com Website and Documentation</h2>\n<ul>\n<li><strong><a href=\"/downloads\">Downloads page</a></strong> with improved installer access</li>\n<li><strong>Theme switch button</strong> for light/dark mode</li>\n<li><strong>Copy button</strong> for code blocks thanks to Bernardo Martinez</li>\n<li><strong>Giscus</strong> commenting system for community discussions on blog posts</li>\n<li>AI integration documentation</li>\n<li>Multiple <a href=\"/blog\">blog posts</a> published covering technical guides, platform-specific instructions, and organizational updates</li>\n<li>Monthly newsletters tracking progress <a href=\"/newsletter\">sign up!</a></li>\n</ul>\n<h2>IDE Integration</h2>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev-intellij-plugin\"><strong>IntelliJ IDEA plugin</strong></a> got regular, consistent maintenance thanks to <a href=\"https://github.com/AkibaAT\">@AkibaAT</a> and moved to the DDEV organization on GitHub</li>\n<li><a href=\"https://marketplace.visualstudio.com/items?itemName=biati.ddev-manager\"><strong>The VS Code DDEV Manager extension</strong></a> continued to be well maintained thanks to <a href=\"https://www.biati.com.mx/\">@biati-digital</a></li>\n</ul>\n<h2>DDEV Developer Improvements</h2>\n<ul>\n<li>The new Quickstart tests have proved to be extremely valuable, providing early warning when upstream projects change. They also are a completely new perspective into problems with DDEV. Kudos to <a href=\"https://github.com/rpkoller\">@rpkoller</a> for taking those on and maintaining them!</li>\n<li><a href=\"https://github.com/AkibaAT\">AkibaAT</a> reorganized our Docker image builds so that multi-architecture builds that used to take an hour now take 10 minutes or less.</li>\n<li>Continuous improvements to AGENTS.md and CLAUDE.md to improve our efficiency in using AI.</li>\n</ul>\n<h2>AI in DDEV Development</h2>\n<p>2025 saw significant AI integration in our development workflow:</p>\n<ul>\n<li><strong>Substantial features enabled by AI</strong>: Several features that seemed too daunting to start became achievable with AI assistance</li>\n<li><strong>Increased code volume</strong>: More code, including extensive tests (though test quality varies)</li>\n<li><strong>Tools used</strong>: Claude Code, GitHub Copilot</li>\n<li><strong>Training</strong>: Our use of Claude Code was significantly improved by taking a <a href=\"https://www.coursera.org/learn/claude-code\">Coursera Course</a>.</li>\n</ul>\n<h2>Removals in v1.25.0</h2>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev/blob/v1.24.10/docs/content/users/install/performance.md\">NFS</a> support removed</li>\n<li><a href=\"https://github.com/ddev/ddev/blob/v1.24.10/docs/content/users/usage/commands.md#service\"><code>ddev service</code></a> command removed</li>\n<li><a href=\"https://github.com/ddev/ddev/blob/v1.24.10/docs/content/users/usage/commands.md#nvm\"><code>ddev nvm</code></a> functionality removed, but still supported with <a href=\"https://github.com/ddev/ddev-nvm\">ddev-nvm add-on</a></li>\n<li>Legacy configuration syntax cleanup</li>\n</ul>\n<h2>Challenges and things that could have gone better</h2>\n<ul>\n<li>Market conditions are affecting agency and hosting company funding, and we go into 2026 with limited funding</li>\n<li>We applied to participate in the <a href=\"https://summerofcode.withgoogle.com/\">Google Summer of Code</a> and the <a href=\"https://github.com/open-source/github-secure-open-source-fund\">GitHub Secure Open Source Fund</a> but were not accepted in either.</li>\n<li>Although the TYPO3 Association funded one feature submission (XHGui) later submissions were not accepted, and the nature of their program now seems to exclude DDEV features.</li>\n<li>Key upstream groups like the TYPO3 Association and Drupal Association still are not figuring out how to fund DDEV.</li>\n<li><strong><code>bitnami/mysql</code> issue</strong>: Using <code>bitnami/mysql</code> for MySQL 8.0 and 8.4 backfired with <a href=\"https://github.com/ddev/ddev/issues/7470\">Bitnami ceasing its traditional support of important Docker images</a>. This raises questions about dependency management when upstream projects change direction.</li>\n<li>We continue to struggle with funding for DDEV and went backward this year instead of forward.</li>\n<li>GitHub killed off the best strategy we had for keeping add-on tests running, which means that nightly tests must be manually enabled by their maintainers when they are discontinued automatically.</li>\n<li>We're so interested in solving user problems that it's possible we're too aggressive in Discord and maybe the issue queue in pursuing them. I'm thinking about whether this is an issue with users and will appreciate comment.</li>\n</ul>\n<h2>Comparing Outcomes to 2025 Goals</h2>\n<p>In <a href=\"./2025-plans.md\">2025 Plans</a> we laid out ambitious plans for 2025. Here are the outcomes:</p>\n<ul>\n<li><strong>Continue outstanding user support</strong> Done.</li>\n<li><strong>Begin formal governance for the DDEV Foundation</strong>. Done.</li>\n<li><strong>Improve our Marketing CTA and information</strong>: Significant progress, with much better communication.</li>\n<li><strong>Continue to develop contributors and maintainers</strong>: Great year, as shown below.</li>\n<li><strong>XHGui support</strong>: Done</li>\n<li><a href=\"https://addons.ddev.com/\"><strong>addons.ddev.com</strong></a>: Done</li>\n<li>Feature: Implement mDNS as an alternate name resolution technique. Not funded, not implemented, de-prioritized.</li>\n<li>Allow Add-ons to include other add-ons: Done</li>\n<li>Go-based Upsun Add-on like ddev-platformsh: Done, but with PHP instead of Go.</li>\n<li>Rewrite ddev-platformsh Add-on in Go: Done, but in PHP. <code>ddev-upsun</code> now supports the older Platform.sh \"fixed\" projects.</li>\n<li>Develop a replacement for \"Gitpod Classic\": Gitpod was removed from codebase, and GitHub Codespaces support was improved, but a full replacement remains a goal for 2026.</li>\n<li>Improve self-diagnose capability: Done. Massive improvement with <code>ddev utility diagnose</code>, <code>ddev utility mutagen-diagnose</code>, <code>ddev utility xdebug-diagnose</code>.</li>\n<li>DDEV's Message-of-the-day and ddev.com should show current funding status and need: Done</li>\n<li>DDEV Windows/WSL2 packaging and installation: Done</li>\n<li>Change <code>ddev share</code> to a more configurable custom-command-based option: Done (in v1.25.0)</li>\n<li>Rework configuration system using Viper. Not done and de-prioritized.</li>\n</ul>\n<h2>By the Numbers</h2>\n<ul>\n<li><strong>579 commits</strong> to the main repository</li>\n<li><strong>100+ pull requests</strong> merged</li>\n<li><strong>Releases v1.24.0 through v1.24.10 with v1.25.0 coming in early 2026</strong></li>\n<li><strong>93 repositories</strong> in the DDEV ecosystem</li>\n<li><strong>3,400+ GitHub stars</strong> on the core project</li>\n<li><strong>29 official add-ons</strong></li>\n<li><strong>176+ total add-ons</strong></li>\n</ul>\n<h2>Wow, Community Contributions!</h2>\n<p>As an open-source project we truly value the amazing contributions of the community. There are so many ways these contributions happen, including support requests and issues (we learn so much from those!) but also direct contributions.</p>\n<h3>By Contributor</h3>\n<p>I know this is \"Too Much Information\" but here is a simple and inadequate list of the amazing contributions directly to the main project by contributors other than Randy and Stas. It inspires me so much to see this consolidated list.</p>\n<p><strong>Ralf Koller</strong> - <a href=\"https://github.com/rpkoller\">rpkoller</a> - <a href=\"https://github.com/ddev/ddev/commits?author=rpkoller&amp;since=2025-01-01&amp;until=2025-12-31\">36 contributions</a></p>\n<ul>\n<li>test: add a no-interaction flag to the install command in ibexa bats file (#7479)</li>\n<li>test: adding quickstarts for typo3 v13 and v12 plus bats tests (#7302)</li>\n<li>feat: add success message for xhgui on and off, fixes #7202 (#7205)</li>\n<li>test: make the drupal cms bats test a bit more robust and trustworthy (#7203)</li>\n<li>test: fix for magento2 quickstart and bats test, fixes #7191 (#7192)</li>\n<li>test: adjust openmage bats test assertions to the now available demo content (#7126)</li>\n<li>test: bats test for Statamic Composer quickstart (#7116)</li>\n<li>test: craftcms bats test (#7107)</li>\n<li>test: adding silverstripe quickstart bats test (#7112)</li>\n<li>test: symfony bats tests (#7102)</li>\n<li><em>(and 26 more)</em></li>\n</ul>\n<p><strong>Akiba</strong> - <a href=\"https://github.com/AkibaAT\">AkibaAT</a> - <a href=\"https://github.com/ddev/ddev/commits?author=AkibaAT&amp;since=2025-01-01&amp;until=2025-12-31\">7 contributions</a></p>\n<ul>\n<li>build(image): use native arm builder for building Docker images, fixes #7539 (#7553)</li>\n<li>feat: add <code>ddev add-on search</code> subcommand, fixes #7491 (#7554)</li>\n<li>fix: add missing ephemeral port handling to xhgui service, fixes #7557 (#7560)</li>\n<li>fix: replace broken http and https port lookup, fixes #7246 (#7259)</li>\n<li>feat: add new envs <code>DDEV_PRIMARY_URL_PORT</code>, <code>DDEV_PRIMARY_URL_WITHOUT_PORT</code> and <code>DDEV_SCHEME</code>, fixes #7214 (#7218)</li>\n<li>fix: Use fast checkpoint during PostgreSQL backup, fixes #7098 (#7219)</li>\n<li>fix: disable Xdebug trigger for Xdebug and xhprof status checks, fixes #6191, fixes php-perfect/ddev-intellij-plugin#414 (#7216)</li>\n</ul>\n<p><strong>Ariel Barreiro</strong> - <a href=\"https://github.com/hanoii\">hanoii</a> - <a href=\"https://github.com/ddev/ddev/commits?author=hanoii&amp;since=2025-01-01&amp;until=2025-12-31\">6 contributions</a></p>\n<ul>\n<li>docs: trailing whitespace on template (#7321)</li>\n<li>refactor: improve <code>ddev add-on get</code> output, add warning exit code annotation (#7263)</li>\n<li>fix: add BASE_IMAGE arg before everything else, for #7071 (#7258)</li>\n<li>feat: support prepend.Dockerfile* files for multi-stage builds (#7071)</li>\n<li>feat: show config.<em>.y</em>ml on ddev start (#7089)</li>\n<li>fix: the <code>#ddev-description</code> stanza in add-on install actions not showing if it's the first line (#7022)</li>\n</ul>\n<p><strong>tyler36</strong> - <a href=\"https://github.com/tyler36\">tyler36</a> - <a href=\"https://github.com/ddev/ddev/commits?author=tyler36&amp;since=2025-01-01&amp;until=2025-12-31\">4 contributions</a></p>\n<ul>\n<li>fix(cakephp): do not override APP_DEFAULT_LOCALE (#7653)</li>\n<li>docs: update ngrok link (#7359)</li>\n<li>feat: Add live link to Discord (#7042)</li>\n<li>refactor: remove outdated <code>move-issue</code> config , fixes #6899 (#6906)</li>\n</ul>\n<p><strong>Travis Carden</strong> - <a href=\"https://github.com/TravisCarden\">TravisCarden</a> - <a href=\"https://github.com/ddev/ddev/commits?author=TravisCarden&amp;since=2025-01-01&amp;until=2025-12-31\">3 contributions</a></p>\n<ul>\n<li>docs: fix a little custom command annotations code example (#7711)</li>\n<li>docs: Add missing <code>sequelace</code> command link to <code>database-management.md</code> (#7184)</li>\n<li>docs: Fix niggling code sample inconsistency in <code>troubleshooting.md</code> (#6984)</li>\n</ul>\n<p><strong>Laryn</strong> - <a href=\"https://github.com/laryn\">laryn</a> - <a href=\"https://github.com/ddev/ddev/commits?author=laryn&amp;since=2025-01-01&amp;until=2025-12-31\">3 contributions</a></p>\n<ul>\n<li>feat: backdrop add bee to quickstart (#7053)</li>\n<li>docs: add Backdrop-specific config considerations. (#7037)</li>\n<li>docs: change code refs to include info about Backdrop config storage options, fixes #7013 (#7014)</li>\n</ul>\n<p><strong>Andrew Berry</strong> - <a href=\"https://github.com/deviantintegral\">deviantintegral</a> - <a href=\"https://github.com/ddev/ddev/commits?author=deviantintegral&amp;since=2025-01-01&amp;until=2025-12-31\">2 contributions</a></p>\n<ul>\n<li>feat: support using zstd for snapshots, fix <code>postgres:9</code> snapshot, fixes #7844, fixes #3583 (#7845)</li>\n<li>build: fix getopt detection on macOS (#7846)</li>\n</ul>\n<p><strong>Raphael Portmann</strong> - <a href=\"https://github.com/raphaelportmann\">raphaelportmann</a> - <a href=\"https://github.com/ddev/ddev/commits?author=raphaelportmann&amp;since=2025-01-01&amp;until=2025-12-31\">2 contributions</a></p>\n<ul>\n<li>fix(heidisql): add default <code>--databases=db</code> to postgres, for #7830 (#7847)</li>\n<li>feat(heidisql): allow postgres connections, fixes #7675 (#7677)</li>\n</ul>\n<p><strong>cyppe</strong> - <a href=\"https://github.com/cyppe\">cyppe</a> - <a href=\"https://github.com/ddev/ddev/commits?author=cyppe&amp;since=2025-01-01&amp;until=2025-12-31\">2 contributions</a></p>\n<ul>\n<li>feat(db): remove the hardcoded --server-id=0 parameter from MySQL startup, fixes #6768 (#7608)</li>\n<li>fix(laravel): don't edit database config in <code>.env</code> when there's no database (#7584)</li>\n</ul>\n<p><strong>Peter Bowyer</strong> - <a href=\"https://github.com/pbowyer\">pbowyer</a> - <a href=\"https://github.com/ddev/ddev/commits?author=pbowyer&amp;since=2025-01-01&amp;until=2025-12-31\">2 contributions</a></p>\n<ul>\n<li>docs: clarify instructions for using PhpStorm inside WSL2 (#7333)</li>\n<li>docs: add MySQL 8.4 to supported databases (#6971)</li>\n</ul>\n<p><strong>Shelane French</strong> - <a href=\"https://github.com/shelane\">shelane</a> - <a href=\"https://github.com/ddev/ddev/commits?author=shelane&amp;since=2025-01-01&amp;until=2025-12-31\">2 contributions</a></p>\n<ul>\n<li>feat: add DDEV_APPROOT variable to web container and updates documentation, fixes #7198 (#7199)</li>\n<li>refactor: remove solrtail from installed example commands, fixes #7139 (#7140)</li>\n</ul>\n<p><strong>Pierre Paul Lefebvre</strong> - <a href=\"https://github.com/PierrePaul\">PierrePaul</a> - <a href=\"https://github.com/ddev/ddev/commits?author=PierrePaul&amp;since=2025-01-01&amp;until=2025-12-31\">2 contributions</a></p>\n<ul>\n<li>fix: XHGui launch command support custom ports, fixes #7181 (#7182)</li>\n<li>docs: Add the xhgui container to the building and contributing page. Add more description to the xhprof profiling page. (#7168)</li>\n</ul>\n<p><strong>Sven Reichel</strong> - <a href=\"https://github.com/sreichel\">sreichel</a> - <a href=\"https://github.com/ddev/ddev/commits?author=sreichel&amp;since=2025-01-01&amp;until=2025-12-31\">2 contributions</a></p>\n<ul>\n<li>test: Add OpenMage composer quickstart and tests (#7133)</li>\n<li>test: add OpenMage/Magento 1 quickstart test and split it from Magento 2, for #7094 (#7091)</li>\n</ul>\n<p><strong>lguigo22</strong> - <a href=\"https://github.com/lguigo22\">lguigo22</a> - <a href=\"https://github.com/ddev/ddev/commits?author=lguigo22&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: add Cloudflare warp networking instructions (#7975)</li>\n</ul>\n<p><strong>Justin Vogt</strong> - <a href=\"https://github.com/JUVOJustin\">JUVOJustin</a> - <a href=\"https://github.com/ddev/ddev/commits?author=JUVOJustin&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix(router): ensure Traefik monitor port is always bound to localhost (#7942)</li>\n</ul>\n<p><strong>grummbeer</strong> - <a href=\"https://github.com/grummbeer\">grummbeer</a> - <a href=\"https://github.com/ddev/ddev/commits?author=grummbeer&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix(diagnose): Remove the hardcoded IP \"127.0.0.1\" from the DNS check, since it may be incorrect, fixes #7871 (#7872)</li>\n</ul>\n<p><strong>crowjake</strong> - <a href=\"https://github.com/crowjake\">crowjake</a> - <a href=\"https://github.com/ddev/ddev/commits?author=crowjake&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix(commands): make <code>HostWorkingDir</code> respect <code>WebWorkingDir</code> (#7907)</li>\n</ul>\n<p><strong>Markus Sommer</strong> - <a href=\"https://github.com/BreathCodeFlow\">BreathCodeFlow</a> - <a href=\"https://github.com/ddev/ddev/commits?author=BreathCodeFlow&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix: db port should be integer in generated TYPO3 AdditionalConfiguration.php, fixes #7892 (#7893)</li>\n</ul>\n<p><strong>James Sansbury</strong> - <a href=\"https://github.com/q0rban\">q0rban</a> - <a href=\"https://github.com/ddev/ddev/commits?author=q0rban&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: clarify instructions for disabling Mutagen on a single project (#7861)</li>\n</ul>\n<p><strong>Moshe Weitzman</strong> - <a href=\"https://github.com/weitzman\">weitzman</a> - <a href=\"https://github.com/ddev/ddev/commits?author=weitzman&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: remove community examples link in documentation (#7834)</li>\n</ul>\n<p><strong>Yan Loetzer</strong> - <a href=\"https://github.com/yanniboi\">yanniboi</a> - <a href=\"https://github.com/ddev/ddev/commits?author=yanniboi&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: add missing dot in <code>.ddev/.env.*</code> (#7828)</li>\n</ul>\n<p><strong>Garvin Hicking</strong> - <a href=\"https://github.com/garvinhicking\">garvinhicking</a> - <a href=\"https://github.com/ddev/ddev/commits?author=garvinhicking&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: add crosslink for shortened DDEV env variables to full list, fixes #7781 (#7782)</li>\n</ul>\n<p><strong>Benny Poensgen</strong> - <a href=\"https://github.com/vanWittlaer\">vanWittlaer</a> - <a href=\"https://github.com/ddev/ddev/commits?author=vanWittlaer&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>feat: use composer_root in cakephp, craftcms, laravel, magento2, shopware6, symfony for app type detection (#7558)</li>\n</ul>\n<p><strong>Rob Loach</strong> - <a href=\"https://github.com/RobLoach\">RobLoach</a> - <a href=\"https://github.com/ddev/ddev/commits?author=RobLoach&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>chore(provider): remove trailing whitespace in YAML files (#7770)</li>\n</ul>\n<p><strong>JshGrn</strong> - <a href=\"https://github.com/JshGrn\">JshGrn</a> - <a href=\"https://github.com/ddev/ddev/commits?author=JshGrn&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: explicitly mention setting system managed nvm version, for #6013 (#7733)</li>\n</ul>\n<p><strong>E</strong> - <a href=\"https://github.com/ara303\">ara303</a> - <a href=\"https://github.com/ddev/ddev/commits?author=ara303&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs(faq): remove traefik config when changing project's name, for #7638 (#7639)</li>\n</ul>\n<p><strong>Alan Doucette</strong> - <a href=\"https://github.com/dragonwize\">dragonwize</a> - <a href=\"https://github.com/ddev/ddev/commits?author=dragonwize&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>feat: add <code>ddev npx</code> command (#7599)</li>\n</ul>\n<p><strong>Brooke Mahoney</strong> - <a href=\"https://github.com/brookemahoney\">brookemahoney</a> - <a href=\"https://github.com/ddev/ddev/commits?author=brookemahoney&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: clarify comments in the Drupal 10 and 11 quickstarts, fixes #7619 (#7620)</li>\n</ul>\n<p><strong>gitressa</strong> - <a href=\"https://github.com/gitressa\">gitressa</a> - <a href=\"https://github.com/ddev/ddev/commits?author=gitressa&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: remove Prerequisite section (#7621)</li>\n</ul>\n<p><strong>Eduardo Rocha</strong> - <a href=\"https://github.com/hockdudu\">hockdudu</a> - <a href=\"https://github.com/ddev/ddev/commits?author=hockdudu&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: fix typo in documentation (#7618)</li>\n</ul>\n<p><strong>Dezső BICZÓ</strong> - <a href=\"https://github.com/mxr576\">mxr576</a> - <a href=\"https://github.com/ddev/ddev/commits?author=mxr576&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: Fix blog link in main nav (#7566)</li>\n</ul>\n<p><strong>Tomas Norre Mikkelsen</strong> - <a href=\"https://github.com/tomasnorre\">tomasnorre</a> - <a href=\"https://github.com/ddev/ddev/commits?author=tomasnorre&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>feat: add ddev version to ddev describe command, fixes #7398 (#7541)</li>\n</ul>\n<p><strong>Danny Pfeiffer</strong> - <a href=\"https://github.com/danny2p\">danny2p</a> - <a href=\"https://github.com/ddev/ddev/commits?author=danny2p&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix(pantheon): update Pantheon database pull to get fresh DB and file push to be CMS-agnostic, fixes #5215, fixes #4760 (#7486)</li>\n</ul>\n<p><strong>Popus Razvan Adrian</strong> - <a href=\"https://github.com/punkrock34\">punkrock34</a> - <a href=\"https://github.com/ddev/ddev/commits?author=punkrock34&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>feat: add Linux support for heidisql command (#7399)</li>\n</ul>\n<p><strong>Daniel Huf</strong> - <a href=\"https://github.com/dhuf\">dhuf</a> - <a href=\"https://github.com/ddev/ddev/commits?author=dhuf&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>refactor: add SVG to rewrite rule for TYPO3 (#7482)</li>\n</ul>\n<p><strong>Ayu Adiati</strong> - <a href=\"https://github.com/adiati98\">adiati98</a> - <a href=\"https://github.com/ddev/ddev/commits?author=adiati98&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs(wsl): add <code>wsl --update</code> command for Windows (#7476)</li>\n</ul>\n<p><strong>Peter Philipp</strong> - <a href=\"https://github.com/das-peter\">das-peter</a> - <a href=\"https://github.com/ddev/ddev/commits?author=das-peter&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix: temporarily allow write to <code>/etc/mysql/conf.d/*</code> for <code>db</code> container restart, fixes #7457 (#7458)</li>\n</ul>\n<p><strong>O'Briat</strong> - <a href=\"https://github.com/obriat\">obriat</a> - <a href=\"https://github.com/ddev/ddev/commits?author=obriat&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: How to use Xdebug with Composer for plugin development (#7423)</li>\n</ul>\n<p><strong>Andreas Hager</strong> - <a href=\"https://github.com/andreashager\">andreashager</a> - <a href=\"https://github.com/ddev/ddev/commits?author=andreashager&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>feat: return real exit code from <code>ddev exec</code> and add quiet flag to it, fixes #3518 (#7385)</li>\n</ul>\n<p><strong>Bill Seremetis</strong> - <a href=\"https://github.com/bserem\">bserem</a> - <a href=\"https://github.com/ddev/ddev/commits?author=bserem&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: add Terminus downgrade tips, fixes #7352 (#7353)</li>\n</ul>\n<p><strong>Olivier Mengué</strong> - <a href=\"https://github.com/dolmen\">dolmen</a> - <a href=\"https://github.com/ddev/ddev/commits?author=dolmen&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>build: upgrade mapstructure to v2 (#7396)</li>\n</ul>\n<p><strong>Rui Chen</strong> - <a href=\"https://github.com/chenrui333\">chenrui333</a> - <a href=\"https://github.com/ddev/ddev/commits?author=chenrui333&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>test: use <code>main</code> for setup-homebrew action instead of <code>master</code> (#7395)</li>\n</ul>\n<p><strong>michaellenahan</strong> - <a href=\"https://github.com/michaellenahan\">michaellenahan</a> - <a href=\"https://github.com/ddev/ddev/commits?author=michaellenahan&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: improve xhgui documentation, fixes #7376 (#7377)</li>\n</ul>\n<p><strong>August Miller</strong> - <a href=\"https://github.com/AugustMiller\">AugustMiller</a> - <a href=\"https://github.com/ddev/ddev/commits?author=AugustMiller&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: align Craft CMS quickstart with official documentation (#7323)</li>\n</ul>\n<p><strong>Loz Calver</strong> - <a href=\"https://github.com/lozcalver\">lozcalver</a> - <a href=\"https://github.com/ddev/ddev/commits?author=lozcalver&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>feat: prune orphaned Node.js versions after install, fixes #7325 (#7326)</li>\n</ul>\n<p><strong>Tim Kelty</strong> - <a href=\"https://github.com/timkelty\">timkelty</a> - <a href=\"https://github.com/ddev/ddev/commits?author=timkelty&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: update Craft CMS quickstart, for #7236 (#7274)</li>\n</ul>\n<p><strong>Pedro Antonio Fructuoso Merino</strong> - <a href=\"https://github.com/pfructuoso\">pfructuoso</a> - <a href=\"https://github.com/ddev/ddev/commits?author=pfructuoso&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix: Add path to docroot in wp parameters when not set, fixes #7241 (#7242)</li>\n</ul>\n<p><strong>Bang Dinh</strong> - <a href=\"https://github.com/bangdinhnfq\">bangdinhnfq</a> - <a href=\"https://github.com/ddev/ddev/commits?author=bangdinhnfq&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: Update Shopware quickstart with \"shopware/production\" instead of \"shopware/production:^v6.5\" (#7253)</li>\n</ul>\n<p><strong>nmangold</strong> - <a href=\"https://github.com/nmangold\">nmangold</a> - <a href=\"https://github.com/ddev/ddev/commits?author=nmangold&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: wrap quotes around commands that use the caret symbol (#7237)</li>\n</ul>\n<p><strong>Jeremy Gonyea</strong> - <a href=\"https://github.com/jgonyea\">jgonyea</a> - <a href=\"https://github.com/ddev/ddev/commits?author=jgonyea&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: fix minor typo in the Grav quickstart (#7197)</li>\n</ul>\n<p><strong>Colan Schwartz</strong> - <a href=\"https://github.com/colans\">colans</a> - <a href=\"https://github.com/ddev/ddev/commits?author=colans&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>build: stop installing chocolatey, fixes #6636, fixes #6344 (#7049)</li>\n</ul>\n<p><strong>Mrtn Schndlr</strong> - <a href=\"https://github.com/barbieswimcrew\">barbieswimcrew</a> - <a href=\"https://github.com/ddev/ddev/commits?author=barbieswimcrew&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix: nginx.conf should let index.php handle 404 errors for media files (#7050)</li>\n</ul>\n<p><strong>Marvin Hinz</strong> - <a href=\"https://github.com/marvinhinz\">marvinhinz</a> - <a href=\"https://github.com/ddev/ddev/commits?author=marvinhinz&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix: add timeout for netutil::IsPortActive check for WSL2 with \"mirrored networking mode\" as opposed to default \"NAT mode\", fixes #6245 (#7166)</li>\n</ul>\n<p><strong>RubenColpaert</strong> - <a href=\"https://github.com/RubenColpaert\">RubenColpaert</a> - <a href=\"https://github.com/ddev/ddev/commits?author=RubenColpaert&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix: use <code>charset=utf8mb4</code> in DATABASE_URL for Symfony environment variables, fixes #7068 (#7076)</li>\n</ul>\n<p><strong>Alexey Murz Korepov</strong> - <a href=\"https://github.com/MurzNN\">MurzNN</a> - <a href=\"https://github.com/ddev/ddev/commits?author=MurzNN&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: Add docs about configuring browser for HTTPS certificates (#7075)</li>\n</ul>\n<p><strong>Adam</strong> - <a href=\"https://github.com/phenaproxima\">phenaproxima</a> - <a href=\"https://github.com/ddev/ddev/commits?author=phenaproxima&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: Update quickstart.md to remove Drupal CMS ZIP file instructions (#7119)</li>\n</ul>\n<p><strong>Nick Hope</strong> - <a href=\"https://github.com/Nick-Hope\">Nick-Hope</a> - <a href=\"https://github.com/ddev/ddev/commits?author=Nick-Hope&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: update Windows installation docs to use 'Docker Engine' terminology (#7092)</li>\n</ul>\n<p><strong>Damilola Emmanuel Olowookere</strong> - <a href=\"https://github.com/damms005\">damms005</a> - <a href=\"https://github.com/ddev/ddev/commits?author=damms005&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: add DevDb tip to database management documentation (#7084)</li>\n</ul>\n<p><strong>nickchomey</strong> - <a href=\"https://github.com/nickchomey\">nickchomey</a> - <a href=\"https://github.com/ddev/ddev/commits?author=nickchomey&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: add WordPress special handling info about wp-cli.yml (#7080)</li>\n</ul>\n<p><strong>Andrew Gearhart</strong> - <a href=\"https://github.com/AndrewGearhart\">AndrewGearhart</a> - <a href=\"https://github.com/ddev/ddev/commits?author=AndrewGearhart&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>refactor: improve Docker version checks, set minimum supported Docker API to 1.44, fixes #6916 (#6946)</li>\n</ul>\n<p><strong>Christopher Kaster</strong> - <a href=\"https://github.com/atomicptr\">atomicptr</a> - <a href=\"https://github.com/ddev/ddev/commits?author=atomicptr&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>feat: change php-fpm setting 'decorate_workers_output' to 'no' (#6964)</li>\n</ul>\n<p><strong>Hervé Donner</strong> - <a href=\"https://github.com/vever001\">vever001</a> - <a href=\"https://github.com/ddev/ddev/commits?author=vever001&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>feat: switch apache mpm_prefork to mpm_event, fixes #6966 (#6967)</li>\n</ul>\n<p><strong>Bernhard Baumrock</strong> - <a href=\"https://github.com/BernhardBaumrock\">BernhardBaumrock</a> - <a href=\"https://github.com/ddev/ddev/commits?author=BernhardBaumrock&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>docs: Add ProcessWire to the Quickstart List (#6879)</li>\n</ul>\n<p><strong>Erik Peterson</strong> - <a href=\"https://github.com/eporama\">eporama</a> - <a href=\"https://github.com/ddev/ddev/commits?author=eporama&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix: update Drupal 7 settings.ddev.php and settings.php to match Drupal 7.103 (#6913)</li>\n</ul>\n<p><strong>Tom Yukhayev</strong> - <a href=\"https://github.com/charginghawk\">charginghawk</a> - <a href=\"https://github.com/ddev/ddev/commits?author=charginghawk&amp;since=2025-01-01&amp;until=2025-12-31\">1 contribution</a></p>\n<ul>\n<li>fix: In acquia.yaml, specify default site source for ddev pull acquia. (#6874)</li>\n</ul>\n<h3>Summary by Count</h3>\n<table>\n<thead>\n<tr>\n<th>Contributor</th>\n<th>GitHub</th>\n<th>Count</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Ralf Koller</td>\n<td><a href=\"https://github.com/rpkoller\">rpkoller</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=rpkoller&amp;since=2025-01-01&amp;until=2025-12-31\">36</a></td>\n</tr>\n<tr>\n<td>Akiba</td>\n<td><a href=\"https://github.com/AkibaAT\">AkibaAT</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=AkibaAT&amp;since=2025-01-01&amp;until=2025-12-31\">7</a></td>\n</tr>\n<tr>\n<td>Ariel Barreiro</td>\n<td><a href=\"https://github.com/hanoii\">hanoii</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=hanoii&amp;since=2025-01-01&amp;until=2025-12-31\">6</a></td>\n</tr>\n<tr>\n<td>tyler36</td>\n<td><a href=\"https://github.com/tyler36\">tyler36</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=tyler36&amp;since=2025-01-01&amp;until=2025-12-31\">4</a></td>\n</tr>\n<tr>\n<td>Travis Carden</td>\n<td><a href=\"https://github.com/TravisCarden\">TravisCarden</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=TravisCarden&amp;since=2025-01-01&amp;until=2025-12-31\">3</a></td>\n</tr>\n<tr>\n<td>Laryn</td>\n<td><a href=\"https://github.com/laryn\">laryn</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=laryn&amp;since=2025-01-01&amp;until=2025-12-31\">3</a></td>\n</tr>\n<tr>\n<td>Andrew Berry</td>\n<td><a href=\"https://github.com/deviantintegral\">deviantintegral</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=deviantintegral&amp;since=2025-01-01&amp;until=2025-12-31\">2</a></td>\n</tr>\n<tr>\n<td>Raphael Portmann</td>\n<td><a href=\"https://github.com/raphaelportmann\">raphaelportmann</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=raphaelportmann&amp;since=2025-01-01&amp;until=2025-12-31\">2</a></td>\n</tr>\n<tr>\n<td>cyppe</td>\n<td><a href=\"https://github.com/cyppe\">cyppe</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=cyppe&amp;since=2025-01-01&amp;until=2025-12-31\">2</a></td>\n</tr>\n<tr>\n<td>Peter Bowyer</td>\n<td><a href=\"https://github.com/pbowyer\">pbowyer</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=pbowyer&amp;since=2025-01-01&amp;until=2025-12-31\">2</a></td>\n</tr>\n<tr>\n<td>Shelane French</td>\n<td><a href=\"https://github.com/shelane\">shelane</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=shelane&amp;since=2025-01-01&amp;until=2025-12-31\">2</a></td>\n</tr>\n<tr>\n<td>Pierre Paul Lefebvre</td>\n<td><a href=\"https://github.com/PierrePaul\">PierrePaul</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=PierrePaul&amp;since=2025-01-01&amp;until=2025-12-31\">2</a></td>\n</tr>\n<tr>\n<td>Sven Reichel</td>\n<td><a href=\"https://github.com/sreichel\">sreichel</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=sreichel&amp;since=2025-01-01&amp;until=2025-12-31\">2</a></td>\n</tr>\n<tr>\n<td>lguigo22</td>\n<td><a href=\"https://github.com/lguigo22\">lguigo22</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=lguigo22&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>Justin Vogt</td>\n<td><a href=\"https://github.com/JUVOJustin\">JUVOJustin</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=JUVOJustin&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>grummbeer</td>\n<td><a href=\"https://github.com/grummbeer\">grummbeer</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=grummbeer&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>crowjake</td>\n<td><a href=\"https://github.com/crowjake\">crowjake</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=crowjake&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>Markus Sommer</td>\n<td><a href=\"https://github.com/BreathCodeFlow\">BreathCodeFlow</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=BreathCodeFlow&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>James Sansbury</td>\n<td><a href=\"https://github.com/q0rban\">q0rban</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=q0rban&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>Moshe Weitzman</td>\n<td><a href=\"https://github.com/weitzman\">weitzman</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=weitzman&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>Yan Loetzer</td>\n<td><a href=\"https://github.com/yanniboi\">yanniboi</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=yanniboi&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>Garvin Hicking</td>\n<td><a href=\"https://github.com/garvinhicking\">garvinhicking</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=garvinhicking&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>Benny Poensgen</td>\n<td><a href=\"https://github.com/vanWittlaer\">vanWittlaer</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=vanWittlaer&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>Rob Loach</td>\n<td><a href=\"https://github.com/RobLoach\">RobLoach</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=RobLoach&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>JshGrn</td>\n<td><a href=\"https://github.com/JshGrn\">JshGrn</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=JshGrn&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>E</td>\n<td><a href=\"https://github.com/ara303\">ara303</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=ara303&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>Alan Doucette</td>\n<td><a href=\"https://github.com/dragonwize\">dragonwize</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=dragonwize&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>Brooke Mahoney</td>\n<td><a href=\"https://github.com/brookemahoney\">brookemahoney</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=brookemahoney&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td>gitressa</td>\n<td><a href=\"https://github.com/gitressa\">gitressa</a></td>\n<td><a href=\"https://github.com/ddev/ddev/commits?author=gitressa&amp;since=2025-01-01&amp;until=2025-12-31\">1</a></td>\n</tr>\n<tr>\n<td><em>...and 36 more contributors</em></td>\n<td></td>\n<td></td>\n</tr>\n</tbody></table>\n<h3>Blog Guest Contributors</h3>\n<p>Guest contributions to the blog are <a href=\"https://github.com/ddev/ddev.com#blog-posts-and-guest-blog-posts\">always welcome</a> and key contributors added significant posts this year:</p>\n<p><strong>Ajith Thampi Joseph</strong> - <a href=\"https://github.com/atj4me\">atj4me</a></p>\n<ul>\n<li><a href=\"./tailscale-router-ddev-addon.md\">Tailscale for DDEV: Simple and Secure Project Sharing</a></li>\n</ul>\n<p><strong>Bill Seremetis</strong> - <a href=\"https://github.com/bserem\">bserem</a></p>\n<ul>\n<li><a href=\"./ddev-bundled-tools-using-custom-versions.md\">How to Downgrade Terminus in DDEV's Web Container and Customize Other Bundled Tools</a></li>\n</ul>\n<p><strong>Garvin Hicking</strong> - <a href=\"https://github.com/garvinhicking\">garvinhicking</a></p>\n<ul>\n<li><a href=\"./legacy-projects-with-unsupported-php-and-mysql-using-ddev.md\">Using DDEV to spin up a legacy PHP application</a></li>\n</ul>\n<p><strong>Jeremy Gonyea</strong> - <a href=\"https://github.com/jgonyea\">jgonyea</a></p>\n<ul>\n<li><a href=\"./building-offramp-from-wordpress-with-ddev.md\">Building an Off-Ramp from WordPress with DDEV</a></li>\n</ul>\n<p><strong>ayalon</strong> - <a href=\"https://github.com/ayalon\">ayalon</a></p>\n<ul>\n<li><a href=\"./ddev-expose-node-app-on-subdomain.md\">Exposing a Node.js App Over HTTP / HTTPS on a Subdomain in DDEV</a> (blog author: J. Minder)</li>\n</ul>\n<p>And thanks to all of you who use DDEV, report issues, answer questions in <a href=\"https://ddev.com/s/discord\">Discord</a> and other venues, and spread the word. Your support makes this project possible.</p>\n<h3>Amazing Official Add-on Maintainers</h3>\n<p>There are so many unofficial add-ons being maintained by so many people, but here are the folks that maintained official repositories:</p>\n<ol>\n<li><strong><a href=\"https://github.com/tyler36\">@tyler36</a></strong> - ddev-browsersync, ddev-cron, ddev-cypress, ddev-qr, plus contributions to 20+ other add-ons</li>\n<li><strong><a href=\"https://github.com/weitzman\">@weitzman</a></strong> (Moshe Weitzman) - ddev-drupal-contrib, ddev-selenium-standalone-chrome</li>\n<li><strong><a href=\"https://github.com/cmuench\">@cmuench</a></strong> (Christian Münch) - ddev-opensearch</li>\n<li><strong><a href=\"https://github.com/julienloizelet\">@julienloizelet</a></strong> (Julien Loizelet) - ddev-mongo, ddev-redis-insight</li>\n<li><strong><a href=\"https://github.com/mkalkbrenner\">@mkalkbrenner</a></strong> - ddev-solr</li>\n<li><strong><a href=\"https://github.com/robertoperuzzo\">@robertoperuzzo</a></strong> - ddev-sqlsrv</li>\n<li><strong><a href=\"https://github.com/b13\">@b13</a></strong> (TYPO3 agency) - ddev-typo3-solr, ddev-rabbitmq</li>\n<li><strong><a href=\"https://github.com/jedubois\">@jedubois</a></strong> - ddev-varnish</li>\n<li><strong><a href=\"https://github.com/hussainweb\">@hussainweb</a></strong> - ddev-redis</li>\n<li><strong><a href=\"https://github.com/seebeen\">@seebeen</a></strong> - ddev-ioncube, ddev-minio</li>\n<li><strong><a href=\"https://github.com/bserem\">@bserem</a></strong> (Bill Seremetis) - ddev-adminer</li>\n<li><strong><a href=\"https://github.com/AkibaAT\">@AkibaAT</a></strong> - ddev-intellij-plugin</li>\n<li><strong><a href=\"https://github.com/biati-digital\">@biati-digital</a></strong> - vscode-ddev-manager</li>\n</ol>\n<h2>Looking Ahead to 2026</h2>\n<p>Stay tuned for our 2026 plans post where we'll outline what's next for DDEV. As always, we welcome your input through all our <a href=\"https://docs.ddev.com/en/stable/users/support/\">support venues</a>.</p>\n<p><em>Claude Code and GitHub Copilot were used as assistants in gathering lists and material, and in reviewing this article.</em></p>\n"},{"id":"https://ddev.com/blog/ddev-december-2025-newsletter","url":"https://ddev.com/blog/ddev-december-2025-newsletter","title":"DDEV December 2025 Newsletter","content_html":"<p>As we wrap up 2025, there's much to celebrate and some important news to share. The DDEV Foundation has reached a governance milestone, and we're looking ahead to 2026 with both gratitude and a call to action.</p>\n<h2>What's New</h2>\n<ul>\n<li><strong>DDEV Foundation Board of Directors Established</strong> → The DDEV Foundation now has a formal Board of Directors, including Mike Anello, Jen Lampton, Benni Mack, Andrew Berry, and Randy Fay. <a href=\"board-of-directors-established.md\">Read more↗</a></li>\n<li><strong>Upsun Sponsorship Changes</strong> → Upsun remains a supporter, but is lowering their sponsorship level starting in January, leaving a critical gap we need you to fill. <a href=\"upsun-thank-you-new-sponsors-needed.md\">Read more↗</a></li>\n<li><strong>Power Through Blackouts</strong> → Stas Zhuk shares how DDEV community support helped him continue maintaining DDEV during wartime blackouts in Ukraine. <a href=\"power-through-blackouts-ddev-community-support.md\">Read more↗</a></li>\n<li><strong>Fritz!Box Routers and DDEV</strong> → Solving DNS Rebinding issues with Fritz!Box routers. <a href=\"fritzbox-routers-and-ddev.md\">Read more↗</a></li>\n</ul>\n<h2>Coming Soon: v1.25.0</h2>\n<p>We're preparing for the upcoming v1.25.0 major release in January. Here are some things to know:</p>\n<ul>\n<li><strong>New defaults for new projects</strong> — New projects will get updated default settings. PHP 8.4, Node.js 24, MariaDB 11.8 become defaults for new projects (existing projects are not affected).</li>\n<li><strong>Some exotic Dockerfiles may need adjustments</strong> — If you have custom Dockerfiles with unusual configurations there may be complications because of the new base image. We'll be happy to help solve them.</li>\n</ul>\n<p>Watch for announcements everywhere.</p>\n<h2>New Add-ons</h2>\n<p>Several new official add-ons have been added to the registry:</p>\n<ul>\n<li><strong><a href=\"https://github.com/ddev/ddev-nvm\">ddev-nvm</a></strong> — NVM (Node Version Manager) integration for DDEV (replaces the native <code>ddev nvm</code>, which has been removed from upcoming v1.25.0)</li>\n<li><strong><a href=\"https://github.com/ddev/ddev-frankenphp\">ddev-frankenphp</a></strong> — FrankenPHP server for PHP built on top of Caddy</li>\n<li><strong><a href=\"https://github.com/ddev/ddev-redis-insight\">ddev-redis-insight</a></strong> — Redis Insight Web UI for use with DDEV Redis service</li>\n<li><strong><a href=\"https://github.com/ddev/ddev-python2\">ddev-python2</a></strong> — Python 2 for npm builds and similar that still require it</li>\n</ul>\n<h2>Community Highlights</h2>\n<ul>\n<li><strong>OpenCode DDEV Plugin</strong>: Justin Vogt created a plugin for OpenCode AI that automatically detects DDEV and wraps commands to execute inside containers <a href=\"https://github.com/JUVOJustin/opencode-ddev-plugin\">View on GitHub↗</a></li>\n<li><strong>ddev-deploy by Code Enigma</strong>: New add-on for deployment workflows <a href=\"https://gitlab.com/code-enigma/ddev-deploy\">View on GitLab↗</a> • <a href=\"https://www.linkedin.com/feed/update/urn:li:share:7401924604065296384/\">LinkedIn post↗</a></li>\n<li><strong>Setting Up WeeklyDrupal.com with DDEV</strong>: Saroj Kunwar shares the journey of setting up a local dev environment for a Drupal 10 platform <a href=\"https://www.linkedin.com/pulse/how-i-set-up-local-dev-environment-weeklydrupalcom-all-saroj-kunwar-f0mwc/\">Read on LinkedIn↗</a></li>\n</ul>\n<h2>Community Video Tutorials</h2>\n<ul>\n<li><strong>DrupalEasy Show &amp; Tell: DDEV Q&amp;A with Randy Fay</strong>: Covers Solr integration, custom commands, ngrok/Cloudflared sharing, and more <a href=\"https://www.drupaleasy.com/video/2025/11/drupaleasy-show-tell-ddev-qa-randy-fay\">Watch on DrupalEasy↗</a></li>\n<li><strong>DrupalEasy Show &amp; Tell: DDEV + Ubuntu + Visual Studio Code debugging with Randy Fay</strong>: This Show &amp; Tell is a tour-de-force of DDEV Xdebug debugging and will likely be useful for anyone having issues getting DDEV + Xdebug + Visual Studio Code working. During the Show &amp; Tell, Randy stressed the importance of debugging from a known, standard state. <a href=\"https://www.drupaleasy.com/video/2025/11/drupaleasy-show-tell-ddev-ubuntu-visual-studio-code-debugging-randy-fay\">Watch on DrupalEasy↗</a></li>\n<li><strong>WebWash: Getting Started with Search API in Drupal</strong>: Ivan Zugec covers setting up Drupal's Search API module <a href=\"https://www.youtube.com/watch?v=-45TDujkI2g\">Watch on YouTube↗</a></li>\n<li><strong>WebWash: Getting Started with DDEV for Drupal Development</strong>: Ivan Zugec walks through DDEV setup for Drupal projects <a href=\"https://www.youtube.com/watch?v=dHTuJzfpD_o\">Watch on YouTube↗</a></li>\n</ul>\n<h2>Help Us Out: Use HEAD</h2>\n<p>Want to help DDEV development? Consider testing with the HEAD version of DDEV. This helps us catch issues early. We think some advanced users with complex Dockerfiles may have hiccups with upcoming v1.25.0. It's easy, See <a href=\"https://docs.ddev.com/en/stable/developers/building-contributing/#testing-latest-commits-on-head\">the docs↗</a> for instructions.</p>\n<h2>DDEV Training Continues</h2>\n<p>Join us for upcoming training sessions for contributors and users.</p>\n<ul>\n<li><p><strong>January 22, 2026 at 10:00 US ET / 16:00 CET — Mutagen, syncing, problems, upload_dirs for direct bind mounts</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Mutagen%2C%20syncing%2C%20problems%2C%20upload_dirs%20for%20direct%20bind%20mounts&amp;dates=20260122T150000Z/20260122T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-01-22.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>February 26, 2026 at 10:00 US ET / 16:00 CET — Git bisect for fun and profit</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Git%20bisect%20for%20fun%20and%20profit&amp;dates=20260226T150000Z/20260226T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-02-26.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>March 26, 2026 at 10:00 US ET / 15:00 CET — Using <code>git worktree</code> with DDEV projects and with DDEV itself</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Using%20git%20worktree%20with%20DDEV%20projects%20and%20with%20DDEV%20itself&amp;dates=20260326T140000Z/20260326T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-03-26.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>April 23, 2026 at 10:00 US ET / 16:00 CEST — Creating, maintaining and testing add-ons</strong>\n2026-updated version of our popular add-on training. <a href=\"https://www.youtube.com/watch?v=TmXqQe48iqE\">Previous session recording↗</a>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Creating%2C%20maintaining%20and%20testing%20add-ons&amp;dates=20260423T140000Z/20260423T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-04-23.ics\">Download .ics</a></p>\n</li>\n</ul>\n<p>Zoom Join Info:\nLink: <a href=\"https://us02web.zoom.us/j/7315692237?pwd=RHR6NUkwb0g5WXIzS2NOcXRucCthZz09\">Join Zoom Meeting</a>\nPasscode: 12345</p>\n<h2>Governance and Planning</h2>\n<ul>\n<li><p><strong>Annual Advisory Group and Board Meeting</strong> — Join us for our annual extended advisory group and board meeting (public; all are welcome):</p>\n<p><strong>January 14, 2026 at 8:00 AM US Mountain Time / 4:00 PM CET — DDEV Extended Advisory Group and Board Meeting</strong>\nAnnual 2-hour review of 2025 and plans for 2026\n<a href=\"https://github.com/orgs/ddev/discussions/7863\">Discussion details↗</a> •\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=DDEV%20Extended%20Advisory%20Group%20and%20Board%20Meeting&amp;dates=20260114T150000Z/20260114T170000Z&amp;details=Annual%202-hour%20review%20of%202025%20and%20plans%20for%202026.%0AAgenda%3A%0A-%20DDEV%20Trademark%20transfer%20progress%0A-%202026%20goals%20for%20board%20consideration%0A-%202025%20year-end%20review%20feedback%0A-%20Financial%20summary%20and%20planning%20discussion%0A%0AMeeting%20details%3A%20https%3A%2F%2Fgithub.com%2Forgs%2Fddev%2Fdiscussions%2F7863&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-01-14.ics\">Download .ics</a></p>\n</li>\n</ul>\n<hr />\n<h2>Sponsorship Update: Your Help is Needed</h2>\n<p>With Upsun lowering their sponsorship in January, we'll drop from 70% to about 58% of our sponsorship goal. That's a significant gap.</p>\n<p><strong>Previous status</strong>: $8,376/month (70% of goal)</p>\n<p><strong>After January</strong>: ~$6,964/month (58% of goal)</p>\n<p>If DDEV has helped your team, now is the time to give back. Whether you're an individual developer, an agency, or an organization — your contribution makes a difference. → <a href=\"https://github.com/sponsors/ddev\">Become a sponsor↗</a></p>\n<p><a href=\"/contact\">Contact us</a> to discuss sponsorship options that work for your organization.</p>\n<h2>Stay in the Loop—Follow Us and Join the Conversation</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n<p>Compiled and edited with assistance from Claude Code.</p>\n"},{"id":"https://ddev.com/blog/upsun-thank-you-new-sponsors-needed","url":"https://ddev.com/blog/upsun-thank-you-new-sponsors-needed","title":"Thanks to Upsun, and Your Help is Needed Now!","content_html":"<p><strong>TL;DR</strong> <a href=\"https://upsun.com\">Upsun</a> has been (and remains) a great sponsor of DDEV, but is lowering their support level next month. We need you to fill the gap!</p>\n<p>I'm sure you remember how much Upsun (formerly Platform.sh) has helped the DDEV project along the way. When we were about to lose the ability to use the \"DDEV\" name, they stepped in and solved the problem. Then they <a href=\"platform-sh-becomes-a-lead-sponsor-of-ddev.md\">sponsored DDEV</a> at a very high level for a couple of years, and in 2025 at a <a href=\"platform-sh-ddev-funding-changes.md\">lower level</a>. They have also managed the DDEV trademark and are now transferring it to the rapidly maturing <a href=\"/foundation\">DDEV Foundation</a>. We appreciate their significant ongoing support very much, and fully recognize and appreciate their critical role in our history.</p>\n<p>Starting next month, Upsun will be lowering their sponsorship level to $1000/month. They are still one of our most significant supporters, but this leaves a significant gap in our funding.</p>\n<p>Starting in January, we'll be at about 53% of our sponsorship goal, down from 70% as of December 2025. The current sponsorship level is about $8300/month; with the decrease from Upsun it will drop to about $6300/month. That's a big hole to fill, and we're counting on you to help!</p>\n<p>In 2025, the DDEV Foundation (through your support) paid between $8,000-$10,000 per month to developers working on the project for you. Without additional funding, we're estimating a shortfall of about $2000 a month.</p>\n<h2>How You Can Help</h2>\n<p>DDEV is free and open-source because sponsors like you make it possible. Whether you're an individual developer, an agency using DDEV for client work, or an organization that depends on DDEV, now is the time to contribute.</p>\n<p><strong>Ways to sponsor:</strong></p>\n<ul>\n<li><strong><a href=\"https://github.com/sponsors/ddev\">GitHub Sponsors</a></strong> - Quick and easy, starting at any amount, personal or organizational.</li>\n<li><strong>Support contracts</strong> - Get priority support while funding development</li>\n<li><strong>Custom invoicing</strong> - We work with your procurement process</li>\n<li><strong>One-time contributions</strong> - Every bit helps!</li>\n</ul>\n<p><a href=\"/contact\">Contact us</a> to discuss sponsorship options that work for your organization.</p>\n<h2>Why This Matters</h2>\n<p>DDEV serves nearly 20,000 developers and teams worldwide every week. Your sponsorship ensures continued development, maintenance, security updates, and community support. When you sponsor DDEV, you're investing in a tool that saves your team countless hours and makes local development reliable and consistent.</p>\n<p>Let's work together to keep DDEV strong and sustainable. Thank you for being part of this community!</p>\n<p><em>Claude Code was used for editing and ideas helped with this post.</em></p>\n"},{"id":"https://ddev.com/blog/board-of-directors-established","url":"https://ddev.com/blog/board-of-directors-established","title":"The DDEV Foundation Now Has a Board of Directors!","content_html":"<p>We're excited to announce that the DDEV Foundation has officially established a Board of Directors! This is a significant milestone in our journey toward enhanced governance and long-term sustainability for the DDEV project.</p>\n<p>Today we filed an amended <a href=\"https://www.sos.state.co.us/biz/ViewImage.do?fileId=20258242147&amp;masterFileId=20211820326\">Articles of Incorporation</a> with the Secretary of State of Colorado, which includes the Board of Directors.</p>\n<h2>Introducing the New Board</h2>\n<h3>Michael Anello (<a href=\"https://github.com/ultimike\">@ultimike</a>)</h3>\n<p></p>\n<p>Mike Anello is a seasoned Drupal developer with over 15 years of experience. He specializes in Drupal consulting and training through his business, ensuring clients leverage Drupal's full potential. Mike is a notable community contributor and advocate, sharing his expertise and insights widely. Mike is already serving as the Treasurer of the Foundation.</p>\n<h3>Jen Lampton (<a href=\"https://github.com/jenlampton\">@jenlampton</a>)</h3>\n<p></p>\n<p>Jen Lampton has been building websites since 1997 and participating in Open Source communities since 2006. She is a co-founder of Backdrop CMS and a provisional member of the Drupal security team. Jen currently maintains dozens of Open Source projects and contributes to other projects (including DDEV!) as it applies to her work.</p>\n<h3>Benni Mack (<a href=\"https://github.com/bmack\">@bmack</a>)</h3>\n<p></p>\n<p>Benni Mack is a long-time TYPO3 core developer and contributor, serving as TYPO3 CMS Team Lead. He brings extensive experience in open source project governance and community building. Benni is passionate about developer experience and has been instrumental in modernizing TYPO3's development practices.</p>\n<h3>Andrew Berry (<a href=\"https://github.com/deviantintegral\">@deviantintegral</a>)</h3>\n<p></p>\n<p>Andrew Berry has been a member and contributor in the Drupal community since 2006. He is also the VP of Technology at Lullabot, where teams <a href=\"https://architecture.lullabot.com/adr/20211207-ddev-locals/\">rely on DDEV for local development</a>. When not doing Drupal and DDEV, Andrew spends his time working on home automation and related open source projects.</p>\n<h3>Randy Fay (<a href=\"https://github.com/rfay\">@rfay</a>)</h3>\n<p></p>\n<p>Randy is the original maintainer of DDEV, enjoying it since 2016. He has deep roots in the Drupal community and has done loads of traveling by bike.</p>\n<h2>Our Vision: Sustainability and Financial Stability for the Project</h2>\n<p>Improved governance is one of our key long-term goals for the project, and was a <a href=\"2025-plans.md\">key goal for 2025</a>. We know that this will be an ongoing process that we'll have to grow into, and we invite your participation. We meet every two months as a group, and the entire community is invited. Subscribe to the <a href=\"https://github.com/orgs/ddev/discussions/categories/ddev-advisory-group\">meeting announcements and summaries</a> and <a href=\"/contact\">ask for a calendar invitation</a> if you'd like. These meetings are also announced in the monthly <a href=\"/newsletter\">DDEV Newsletter</a>.</p>\n<p>Of course the key long-term goal is sustainability in general. We don't want to depend on any single maintainer, and we want to ensure that DDEV can continue to thrive and grow for years to come. Financial sustainability is a key part of that, but just one part. Read more about our <a href=\"sustainability-for-ddev.md\">path to sustainability</a>.</p>\n<h2>Share Your Thoughts!</h2>\n<p>Do you have additional ideas, suggestions, or insight into how DDEV's future could be more sustainable? We would sure love to <a href=\"/contact\">hear from you</a>! Or get active and join our <a href=\"https://github.com/orgs/ddev/discussions/categories/ddev-advisory-group\">DDEV Advisory Group</a>.</p>\n<p>Do you have questions or want to talk (about sponsoring or anything else)? <a href=\"https://ddev.com/contact/\">Contact us!</a> or join us in <a href=\"/s/discord\">Discord</a>.</p>\n<p><em>Have you signed up for the monthly <a href=\"/newsletter\">DDEV Newsletter</a>? We'd love to have you.</em></p>\n<p><em>Claude Code was used for editing and formatting in the blog post.</em></p>\n"},{"id":"https://ddev.com/blog/power-through-blackouts-ddev-community-support","url":"https://ddev.com/blog/power-through-blackouts-ddev-community-support","title":"Power Through Blackouts: How DDEV Community Helped Me in Ukraine","content_html":"<p>Since Russia's full-scale invasion of Ukraine in 2022, Russian forces have been systematically targeting our civilian power infrastructure. These attacks cause blackouts that can last hours or days, making it difficult to work, live normally, or even survive the winter. In November 2025, these attacks got much worse.</p>\n<p>I'm a DDEV maintainer living in Kremenchuk, Ukraine. I'm Stanislav Zhuk, but you can call me Stas. I became a DDEV maintainer in October 2023, and you can read more about my background in the <a href=\"introducing-maintainer-stas.md\">introduction post</a>. I work a typical five-day week, usually from afternoon to evening, which lets me overlap with Randy's timezone.</p>\n<p>This is my story of how your support helped me keep working through Russian attacks on our infrastructure, and why it matters so much.</p>\n<h2>Where Is Kremenchuk?</h2>\n<p>Kremenchuk is an industrial city in central Ukraine on the banks of the Dnieper River.</p>\n<div>\n\n</div>\n\n<h2>The Current Situation</h2>\n<p>In November 2025, Russians heavily attacked Kremenchuk's infrastructure. We had no electricity, water, or central heating for almost a whole day. Now we have blackouts every day - typically 1.5-2 hours with electricity, then 3-5 hours without it, and the cycle repeats. There's no sign of when this will get better.</p>\n<p>This is the reality we live in: you can never know when and where the next strike will happen. I read the news every day, and every day civilians die. I try to focus on other things to stay sane, but the threat is constant.</p>\n<p>Working during these conditions needs careful planning. For work, I need to keep my laptop running and have internet with acceptable speed. For home, I need to power the refrigerator during long blackouts so food doesn't spoil. Some things I cannot control: water supply and central heating. I have an electric radiator, but it uses too much power to run from battery stations during long outages.</p>\n<h2>Surviving Through Russian Attacks on Infrastructure</h2>\n<h3>2022: The Beginning</h3>\n<p>When Russian attacks on our power infrastructure started in fall 2022, I wasn't ready for long blackouts. I had a couple of small powerbanks for mobile phones and bought several portable lanterns so I wouldn't sit in the dark. I still use them.</p>\n<p></p>\n<p>The market was crazy at that time - prices went very high and it was hard to find equipment. I didn't buy anything big then, just waited for things to calm down.</p>\n<h3>2023-2024: Building Capacity</h3>\n<p>After the first wave of attacks on Ukrainian infrastructure ended and prices went back to normal, I bought two more powerful powerbanks to run my laptop. They got me through 2023 and the first half of 2024. Now I use them to charge mobile phones.</p>\n<p></p>\n<p>The second problem was internet during blackouts. I switched to a fiber optic provider and bought two UPS units: SKE UPS Mini POE 60W for the router and Marsriva Smart Mini UPS KP5 for the ONA (Optical Network Adapter). Together they give me stable internet for about 8-9 hours when there's no power.</p>\n<p></p>\n<p></p>\n<h3>2024: First Community Support</h3>\n<p>In 2024, Russian attacks on infrastructure came back. Thanks to all of you, an <strong>EcoFlow DELTA 2 was sponsored ($1,170)</strong>, and I bought it at a local shop. This changed everything. Instead of dealing with multiple devices and cables, I just plug one socket into the EcoFlow and have power for the whole room: laptop, external display, lights, and more.</p>\n<p>This made things much easier. With one power station, I could work through blackouts without constantly worrying about my battery dying.</p>\n<h3>November 2025: Facing Harder Russian Attacks</h3>\n<p>The Russian attacks in November 2025 are much harder than in 2022. They strike more often and cause more damage to our infrastructure.</p>\n<p>You helped again. An <strong>EcoFlow DELTA 3 ($910)</strong> was sponsored. The market changed, and these units got cheaper. Now I don't worry about whether DELTA 2 can charge fully in the short windows when we have electricity. I can power the refrigerator during very long blackouts and work on DDEV at the same time.</p>\n<p></p>\n<p>Having two power stations makes me feel much more confident during these hard war times. I can:</p>\n<ul>\n<li>Keep one station charging while using the other</li>\n<li>Run both laptop and refrigerator at the same time during long outages</li>\n<li>Work without worrying about power levels all the time</li>\n<li>Focus on DDEV work instead of managing power</li>\n</ul>\n<h2>The Impact of Your Support</h2>\n<p>Your support has been really important. Without these power stations, I couldn't do my work as a DDEV maintainer during blackouts. You didn't just give me equipment - you gave me the ability to keep contributing and keep helping the project and its users, even in these hard times.</p>\n<p>Thank you for supporting Ukraine and understanding how important our situation is to Europe and the world. Your support means more than just equipment - it's a reminder that we're not alone.</p>\n<p>This support is more than just hardware. It shows what open source communities can be: people helping each other through hard times, so we can keep building together.</p>\n<h2>Looking Forward</h2>\n<p>I don't know when things will get better. But I know I have what I need to keep working, thanks to you. Every contribution makes a real difference in keeping DDEV maintained and supported.</p>\n<p>If you want to support DDEV, visit <a href=\"https://github.com/sponsors/ddev\">DDEV's GitHub Sponsors page</a>.</p>\n<p>I'm grateful for everyone who supports DDEV. Your help lets me keep working, keep contributing, and keep helping this community grow, even in the darkest times.</p>\n<hr />\n<p><em>This article was edited and refined with assistance from Claude Code.</em></p>\n"},{"id":"https://ddev.com/blog/fritzbox-routers-and-ddev","url":"https://ddev.com/blog/fritzbox-routers-and-ddev","title":"Fritz!Box Routers and DDEV","content_html":"<p>DDEV is designed so that most people never have to change the configuration of their local workstation, and that includes not having to edit their hosts file. All the details are in <a href=\"ddev-name-resolution-wildcards.md\">DNS Name Resolution and Wildcards</a>.</p>\n<p>However, one particular brand of router, the Fritz!Box, has a different DNS configuration than most other routers, and it includes DNS Rebinding Protection that blocks local development domains.</p>\n<p><strong>TL;DR:</strong> <em>If you use a Fritz!Box router, add <code>ddev.site</code> to the router's DNS Rebinding Protection exceptions.</em></p>\n<h2>The Problem</h2>\n<p>When you first set up DDEV with a Fritz!Box router, you might encounter a failure to resolve the domain name when trying to access your <code>*.ddev.site</code> project, even though your site is accessible via the <code>127.0.0.1</code> direct URL given in <code>ddev describe</code>. This happens because Fritz!Box routers enable DNS Rebinding Protection that suppresses DNS responses pointing to your own network.</p>\n<h2>What is DNS Rebinding Protection?</h2>\n<p>DNS Rebinding Protection is a security feature that guards against a sophisticated attack technique. In a DNS rebinding attack, a malicious website tricks your browser into accessing services on your local network (like your computer, router, printer, or other devices) by manipulating DNS responses. Here's how the attack works:</p>\n<ol>\n<li>You visit a malicious website that includes JavaScript code</li>\n<li>The website's DNS initially resolves to the attacker's server</li>\n<li>The attacker then changes the DNS to point to a local IP address like <code>127.0.0.1</code> or <code>192.168.1.1</code></li>\n<li>The JavaScript code in your browser can now access local services, potentially extracting sensitive data or changing settings</li>\n</ol>\n<p>Fritz!Box routers protect against this by blocking DNS lookups that resolve to local IP addresses like <code>127.0.0.1</code>, <code>192.168.x.x</code>, and other private network ranges. While this security feature protects against real attacks, it also blocks legitimate local development domains (like DDEV's <code>ddev.site</code>).</p>\n<h2>Why DDEV is Safe</h2>\n<p>DDEV's use of <code>127.0.0.1</code> and the <code>ddev.site</code> domain is intentional and safe—it's not a DNS rebinding attack. Here's why:</p>\n<ul>\n<li><strong>You control the configuration</strong>: You explicitly install and configure DDEV on your own machine</li>\n<li><strong>Local-only access</strong>: DDEV projects only respond to requests from your own computer (<code>127.0.0.1</code>), not from external networks</li>\n<li><strong>Transparent operation</strong>: DDEV openly documents exactly how it uses DNS and local networking</li>\n</ul>\n<p>The Fritz!Box can't distinguish between a legitimate local development tool like DDEV and a potential DNS rebinding attack—both use domain names that resolve to <code>127.0.0.1</code>. That's why you need to explicitly allow <code>ddev.site</code> as an exception.</p>\n<h2>The Solution</h2>\n<p>Rather than relying on DDEV's hosts file fallback, it's better to solve the underlying DNS problem by configuring your Fritz!Box router to allow the <code>ddev.site</code> domain.</p>\n<p>Here's how to fix it:</p>\n<ol>\n<li>Access your Fritz!Box router settings - the factory defaults are <code>http://fritz.box</code> and <code>http://192.168.178.1</code></li>\n<li>Navigate to <strong>Home Network</strong> (Heimnetz) &gt; <strong>Network</strong> (Netzwerk) &gt; <strong>Network Settings</strong> (Netzwerkeinstellungen)</li>\n<li>Look for the DNS rebinding protection section</li>\n<li>Add <code>ddev.site</code> to the exceptions list</li>\n<li>Save your settings</li>\n</ol>\n<p></p>\n<p>After making this change, DDEV's DNS resolution will work as expected, and you can access your projects using the standard <code>.ddev.site</code> URLs.</p>\n<h2>Alternative Solutions</h2>\n<p>If you prefer not to modify your router settings, or you do not have access to them, you have two other options:</p>\n<ol>\n<li><strong>Configure your computer to use a less restrictive DNS provider</strong> such as Cloudflare's public DNS (<code>1.1.1.1</code>)</li>\n<li><strong>Use DDEV's hosts file fallback</strong> (this requires superuser privileges and modifies system files)</li>\n</ol>\n<p>The router configuration approach is recommended because it preserves DDEV's design principle of not requiring system file modifications.</p>\n<h2>Additional Resources</h2>\n<ul>\n<li><a href=\"https://docs.ddev.com/en/stable/users/usage/networking/#restrictive-dns-servers-especially-fritzbox-routers\">DDEV Documentation on Restrictive DNS Servers</a></li>\n<li><a href=\"https://www.npostnik.de/allgemein/ddev-neues-modem-fritzbox-und-dns_probe_finished_nxdomain/\">German blog post detailing the Fritz!Box issue</a></li>\n<li>Read all the details about DNS Name Resolution in <a href=\"ddev-name-resolution-wildcards.md\">DNS Name Resolution and Wildcards</a></li>\n<li><a href=\"https://ch.fritz.com/service/wissensdatenbank/dok/FRITZ-App-Fon/1_Benutzeroberflache-der-FRITZ-Box-aufrufen/\">Article in the Fritz! knowledge base (in German) how to access the admin interface of a Fritz!Box</a></li>\n</ul>\n<h2>Contacting Fritz!Box Support to Ask for <code>ddev.site</code> to be added to their exceptions</h2>\n<p>If you want to request that AVM (the makers of Fritz!Box) consider adding <code>ddev.site</code> to their default DNS Rebinding Protection exceptions, consider contacting their support team. A friend of DDEV has already done this, but more requests may help.</p>\n<h2>Thanks!</h2>\n<p>Thanks to <a href=\"https://my.typo3.org/u/ischmittis\">Ingo Schmitt</a> for investigating and demonstrating the fix. Thanks to <a href=\"https://www.npostnik.de/ueber-mich/\">npostnik</a> for already having documented this in a German blog post.</p>\n<h2>Keep in touch!</h2>\n<p>We'd love to hear your experience. Join us in <a href=\"/s/discord\">Discord</a> or <a href=\"https://github.com/ddev/ddev/issues\">open an issue</a> if you have success (or failure 😀). We're always trying to make DDEV better for you.</p>\n<p>Assisted in compilation and editing by Claude Code.</p>\n"},{"id":"https://ddev.com/blog/ddev-november-2025-newsletter","url":"https://ddev.com/blog/ddev-november-2025-newsletter","title":"DDEV November 2025 Newsletter","content_html":"<p>💕 A <a href=\"https://ryanstubbs.co.uk/2025/11/a-love-letter-to-ddev/\">Love Letter to DDEV</a>!</p>\n<p>As the year winds down, it's time to get serious about 2026 planning 📋. We'll have a meeting in the next few weeks talking about priorities for the new year. See some <a href=\"https://github.com/orgs/ddev/projects/10\">WIP proposals</a> and <a href=\"/contact\">contact us any time with your opinions↗</a> or to get an invitation to the meeting.</p>\n<h2>What's New</h2>\n<ul>\n<li><strong>Claude Code AI-assisted PRs for DDEV Training</strong> → Learn how to use Claude Code to create pull requests for DDEV <a href=\"claude-code-ai-pr-for-ddev-contributor-training.md\">Read more↗</a></li>\n</ul>\n<h2>Community Highlights</h2>\n<ul>\n<li><strong>A Love Letter to DDEV</strong>: Ryan Stubbs shares his appreciation for DDEV and its impact on development workflows <a href=\"https://ryanstubbs.co.uk/2025/11/a-love-letter-to-ddev/\">Read more↗</a></li>\n<li><strong>Claude Code Plugins for Drupal/DDEV</strong>: Community member Luděk Kvapil has created custom Claude Code commands and plugins for DDEV and Drupal development workflows <a href=\"https://github.com/siva01c/claude-plugins\">View on GitHub↗</a></li>\n<li><strong>Profiling Your Drupal App with New Relic and DDEV</strong>: Practical guide session from DrupalCon Vienna 2025 <a href=\"https://events.drupal.org/vienna2025/session/profiling-your-drupal-app-new-relic-ddev-practical-guide\">Session details↗</a> • <a href=\"https://www.youtube.com/watch?v=S5oPq1FqB1I&amp;list=PLpeDXSh4nHjR5zd_mBGhzW4YBwuv5zs3d&amp;index=113\">Watch on YouTube↗</a></li>\n</ul>\n<h2>Community Video Tutorials</h2>\n<ul>\n<li><strong>Drupal CMS und Core für Projektentwicklung unter Windows 11 von Null installieren (German)</strong>: Complete guide to installing Drupal CMS and Drupal Core for project development on Windows 11 from scratch <a href=\"https://www.youtube.com/watch?v=AwORq6A07pc\">Watch on YouTube↗</a></li>\n<li><strong>Drupal 11 für Entwickler:innen und Sitebuilder:innen (German)</strong>: Udemy course for Drupal 11 developers and site builders <a href=\"https://www.udemy.com/course/drupal-11-fur-entwicklerinnen-und-sitebuilderinnen/?couponCode=MT251103G2\">Enroll with coupon↗</a></li>\n</ul>\n<h2>DDEV Training Continues</h2>\n<p>Join us for upcoming training sessions for contributors and users.</p>\n<ul>\n<li><p><strong>November 20, 2025 at 10:00 US ET / 16:00 CET — Using DDEV on Windows with WSL2</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Using%20DDEV%20in%20Windows%20WSL&amp;dates=20251120T150000Z/20251120T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2025-11-20.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>January 22, 2026 at 10:00 US ET / 16:00 CET — Mutagen, syncing, problems, upload_dirs for direct bind mounts</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Mutagen%2C%20syncing%2C%20problems%2C%20upload_dirs%20for%20direct%20bind%20mounts&amp;dates=20260122T150000Z/20260122T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-01-22.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>February 26, 2026 at 10:00 US ET / 16:00 CET — Git bisect for fun and profit</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Git%20bisect%20for%20fun%20and%20profit&amp;dates=20260226T150000Z/20260226T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-02-26.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>March 26, 2026 at 10:00 US ET / 15:00 CET — Using <code>git worktree</code> with DDEV projects and with DDEV itself</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Using%20git%20worktree%20with%20DDEV%20projects%20and%20with%20DDEV%20itself&amp;dates=20260326T140000Z/20260326T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-03-26.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>April 23, 2026 at 10:00 US ET / 16:00 CEST — Creating, maintaining and testing add-ons</strong>\n2026-updated version of our popular add‑on training. <a href=\"https://www.youtube.com/watch?v=TmXqQe48iqE\">Previous session recording↗</a>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Creating%2C%20maintaining%20and%20testing%20add-ons&amp;dates=20260423T140000Z/20260423T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-04-23.ics\">Download .ics</a></p>\n</li>\n</ul>\n<p>Zoom Join Info:\nLink: <a href=\"https://us02web.zoom.us/j/7315692237?pwd=RHR6NUkwb0g5WXIzS2NOcXRucCthZz09\">Join Zoom Meeting</a>\nPasscode: 12345</p>\n<h2>Events &amp; Community</h2>\n<ul>\n<li><strong>DrupalCon EU in Vienna</strong> — Randy hosted multiple Birds-of-a-Feather (BoF) sessions at <a href=\"https://events.drupal.org/vienna2025\">DrupalCon EU in Vienna↗</a> thanks to sponsorship from <a href=\"https://www.tag1consulting.com/\">Tag1↗</a> and <a href=\"https://upsun.com\">Upsun↗</a>. Sessions included DDEV Office Hours, <a href=\"https://ddev.com/blog/claude-code-ai-pr-for-ddev-contributor-training/\">Contributing to DDEV using Claude Code↗</a>, <a href=\"https://ddev.com/blog/watch-ddev-local-from-scratch-with-windows-wsl2/\">Using DDEV on Windows↗</a>, DDEV new features, and Git Bisect for Fun and Profit. Watch the <a href=\"https://drupal.tv/events/florida-drupalcamp-2025/divide-and-conquer-systematic-approach-troubleshooting-issues\">Git Bisect: Divide and Conquer troubleshooting presentation↗</a> from Florida DrupalCamp.</li>\n<li><strong>DDEV workshops at TYPO3Camp RheinRuhr 2025</strong> — Randy presented DDEV training at TYPO3Camp RheinRuhr in Germany (Nov 7–9). <a href=\"https://rfay.github.io/ddev-from-beginning/\">View training materials↗</a></li>\n</ul>\n<h2>Governance: We have a Board!</h2>\n<p>The DDEV Foundation now has a formal board. Join us for our annual extended advisory group and board meeting (public; all are welcome): Watch for a blog post about the new board members! (Or <a href=\"https://github.com/orgs/ddev/discussions/7590\">sneak peak</a> by reading the meeting notes.)</p>\n<ul>\n<li><strong>January 14, 2026 at 8:00 AM US Mountain Time / 4:00 PM CET — DDEV Extended Advisory Group and Board Meeting</strong>\nAnnual 2-hour review of 2025 and plans for 2026\n<a href=\"https://github.com/orgs/ddev/discussions/7863\">Discussion details↗</a> •\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=DDEV%20Extended%20Advisory%20Group%20and%20Board%20Meeting&amp;dates=20260114T150000Z/20260114T170000Z&amp;details=Annual%202-hour%20review%20of%202025%20and%20plans%20for%202026.%0AAgenda%3A%0A-%20DDEV%20Trademark%20transfer%20progress%0A-%202026%20goals%20for%20board%20consideration%0A-%202025%20year-end%20review%20feedback%0A-%20Financial%20summary%20and%20planning%20discussion%0A%0AMeeting%20details%3A%20https%3A%2F%2Fgithub.com%2Forgs%2Fddev%2Fdiscussions%2F7863&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2026-01-14.ics\">Download .ics</a></li>\n</ul>\n<hr />\n<h2>Sponsorship Update</h2>\n<p>As of today, the monthly sponsorship commitment is up to 70% of our goal, at $8,376. Thank you! That's up from 69% and $8,231 last month. → <a href=\"https://github.com/sponsors/ddev\">Become a sponsor↗</a></p>\n<h2>Stay in the Loop—Follow Us and Join the Conversation</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n<p>Compiled and edited with assistance from Claude Code and Copilot.</p>\n"},{"id":"https://ddev.com/blog/ddev-october-2025-newsletter","url":"https://ddev.com/blog/ddev-october-2025-newsletter","title":"DDEV October 2025 Newsletter","content_html":"<p>🚀 October brings new tools, community contributions, and training opportunities! 🌟\nHave ideas for DDEV in 2026? <a href=\"/contact\">Contact us↗</a>.</p>\n<h2>What's New</h2>\n<ul>\n<li><strong>Upsun/Platform.sh Add-on Released</strong> → Configure your local project to match its Upsun equivalent with the new official add-on <a href=\"ddev-upsun-platformsh-addon.md\">Read more↗</a></li>\n<li><strong>DDEV on Linux in 10 Minutes</strong> → Quick-start guide for Linux users <a href=\"ddev-on-linux-in-10-minutes.md\">Read more↗</a></li>\n<li><strong>Contributing to ddev.com Training</strong> → Learn how to write and contribute blog posts <a href=\"contributing-to-ddev-com.md\">Watch↗</a></li>\n</ul>\n<h2>Community Highlights</h2>\n<ul>\n<li><strong>Metadrop Releases Aljibe</strong>: Quality and testing toolkit for Drupal development with DDEV <a href=\"https://metadrop.net/en/articles/aljibe-quality-and-testing-drupal-developments-ddev\">Read more↗</a> • <a href=\"https://www.thedroptimes.com/54668/metadrop-releases-aljibe-qa-and-testing-toolkit-drupal-development-with-ddev\">The Drop Times coverage↗</a></li>\n<li><strong>WordPress Development with <code>ddev pull</code></strong>: Guide to using <code>ddev pull</code> for WordPress projects <a href=\"https://www.koehnlein.dev/en/blog/2025/wordpress-ddev-pull/\">Read more↗</a></li>\n<li><strong>WebHaven Now Powered by DDEV</strong>: Development workflow success story <a href=\"https://webhaven.io/blog/webhaven-now-powered-ddev-local-development\">Read more↗</a></li>\n<li><strong>DDEV and PHPStorm's Node.js Remote Interpreter</strong>: Workflow guide for ESLint, Prettier, and more <a href=\"https://kitemetric.com/blogs/ddev-and-phpstorm-s-nodejs-remote-interpreter-a-smooth-workflow-for-eslint-prettier-and-more\">Read more↗</a></li>\n</ul>\n<h2>Community Video Tutorials</h2>\n<ul>\n<li><strong>Eureka Tutoriales: Instala WordPress en local con DDEV en 10 minutos (Spanish)</strong> <a href=\"https://www.youtube.com/watch?v=muk1Rs_3X64\">Watch↗</a></li>\n<li><strong>Eureka Tutoriales: Instala phpMyAdmin y Adminer en DDEV (Spanish)</strong> <a href=\"https://www.youtube.com/watch?v=n2vIoFSet2Y\">Watch↗</a></li>\n<li><strong>Setting up your local environment to work with the Mautic Documentation</strong> <a href=\"https://www.youtube.com/watch?v=Hnzp-aJ4NWA\">Watch↗</a></li>\n</ul>\n<h2>DDEV Training Continues</h2>\n<p>Join us for upcoming training sessions for contributors and users. Guest blog contributions are welcome—learn more in our October 9th training session recording!</p>\n<ul>\n<li><strong>November 20, 2025 at 10:00 US ET / 16:00 CET — Using DDEV in Windows WSL</strong>\n<a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Using%20DDEV%20in%20Windows%20WSL&amp;dates=20251120T150000Z/20251120T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2025-11-20.ics\">Download .ics</a></li>\n</ul>\n<p>Zoom Join Info:\nLink: <a href=\"https://us02web.zoom.us/j/7315692237?pwd=RHR6NUkwb0g5WXIzS2NOcXRucCthZz09\">Join Zoom Meeting</a>\nPasscode: 12345</p>\n<h2>Events &amp; Community</h2>\n<ul>\n<li><strong>CakeFest in Madrid</strong> — Randy presented a DDEV workshop at <a href=\"https://cakefest.org/\">CakeFest</a> in Madrid. Thanks to everyone who attended!</li>\n<li><strong>DrupalCon EU in Vienna</strong> — Randy will be at <a href=\"https://events.drupal.org/vienna2025\">DrupalCon EU in Vienna</a> thanks to sponsorship from <a href=\"https://www.tag1consulting.com/\">Tag1</a> and <a href=\"https://upsun.com\">Upsun</a>. Catch me to chat about DDEV, join Birds-of-a-Feather sessions, or connect if you're in the Vienna area. <a href=\"https://cal.com/randyfay/30min\">Make an appointment</a> to make sure we see each other!</li>\n</ul>\n<h2>DDEV Training at TYPO3Camp RheinRuhr</h2>\n<p>Randy will be presenting DDEV training at <a href=\"https://www.typo3camp-rheinruhr.de/workshops\">TYPO3Camp RheinRuhr</a> in Germany November 7-9. Join us to learn about DDEV or connect if you're in the area!</p>\n<h2>Governance: We have a Board!</h2>\n<ul>\n<li><strong>A Board for DDEV Foundation!</strong> — Join us for the <a href=\"https://github.com/orgs/ddev/discussions/7590\">November 5 Advisory Group Meeting</a> for<ul>\n<li><a href=\"https://docs.google.com/document/d/1MXatsz2FMBSnllnUArNCv562x0T2-EF1OwqsFEU9_-M/edit?usp=sharing\">Final discussion of updated Articles of Incorporation</a>.</li>\n<li>Introduction of new Board members.</li>\n</ul>\n</li>\n</ul>\n<hr />\n<h2>Sponsorship Update</h2>\n<p>As of the v1.24.8 release the daily reminders of DDEV sponsorship status on <code>ddev start</code> have been successful, and we've had a number of new sponsors, thank you! Your contributions help us maintain and grow DDEV for the entire community. As of today, the monthly sponsorship commitment is up to 69% of our goal, at $8,231. Thank you! That's up from 66% and $7,958 last month. → <a href=\"https://github.com/sponsors/ddev\">Become a sponsor↗</a></p>\n<h2>Stay in the Loop—Follow Us and Join the Conversation</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n<p>Compiled and edited with assistance from Claude Code.</p>\n"},{"id":"https://ddev.com/blog/contributing-to-ddev-com","url":"https://ddev.com/blog/contributing-to-ddev-com","title":"Contributor Training: Contributing to ddev.com","content_html":"<p>Here's our October 9, 2025 <a href=\"/blog/category/training\">Contributor Training</a> on contributing to ddev.com:</p>\n<div>\n\n</div>\n\n<h2>Key Topics</h2>\n<h3>Quick Edits via GitHub (<a href=\"https://www.youtube.com/watch?v=A-rsZ7SG_bg&amp;t=251s\">4:11</a>)</h3>\n<p>The easiest way to fix errors or update content is to click the pencil icon on any blog post. This takes you directly to GitHub where you can make edits and create a pull request—all without checking out the repository locally.</p>\n<h3>Writing Blog Posts (<a href=\"https://www.youtube.com/watch?v=A-rsZ7SG_bg&amp;t=773s\">12:53</a>)</h3>\n<p>Community blog posts are encouraged! Share your expertise, workarounds, and solutions. Start by opening an issue to discuss your blog post idea with the community. Then copy a similar blog post from <code>src/content/blog</code> and adapt it with your content.</p>\n<h3>Author Profiles (<a href=\"https://www.youtube.com/watch?v=A-rsZ7SG_bg&amp;t=1080s\">18:00</a>)</h3>\n<p>Add your author profile to <code>src/content/authors/</code> with your name, first name, and optional avatar URL. The avatar can be from Gravatar, the image directory, or your own site.</p>\n<h3>Local Preview (<a href=\"https://www.youtube.com/watch?v=A-rsZ7SG_bg&amp;t=1606s\">26:46</a>)</h3>\n<p>Run <code>ddev start</code> to preview your changes locally with hot module reloading at the URL shown in the startup output.</p>\n<h3>Quality Checks (<a href=\"https://www.youtube.com/watch?v=A-rsZ7SG_bg&amp;t=2115s\">35:15</a>)</h3>\n<p>Every pull request automatically runs:</p>\n<ul>\n<li><strong>Prettier</strong> for code formatting</li>\n<li><strong>Textlint</strong> for content consistency and terminology</li>\n</ul>\n<p>The linter rules are defined in <code>.textlintrc</code> and enforce consistent usage of terms like \"ARM64\", \"Bash\", and \"phpMyAdmin\".</p>\n<h3>Preview Deployments (<a href=\"https://www.youtube.com/watch?v=A-rsZ7SG_bg&amp;t=1935s\">32:15</a>)</h3>\n<p>Each pull request automatically creates a preview deployment on Cloudflare Pages, allowing you and reviewers to see exactly how the changes will look on the live site.</p>\n<h2>Resources</h2>\n<ul>\n<li><a href=\"https://rfay.github.io/contributing-to-ddev.com/\">Presentation Slides</a></li>\n<li><a href=\"https://github.com/ddev/ddev.com\">ddev.com Repository</a></li>\n<li><a href=\"ddev-website-for-contributors.md\">DDEV Website For Contributors</a> blog post</li>\n<li><a href=\"https://github.com/ddev/ddev.com/blob/main/MARKDOWN_FORMATTING.md\">Markdown Formatting Guide</a> - Complete guide to Markdown features available for blog posts</li>\n<li><a href=\"/blog/markdown-features-demo\">Markdown Features Demo</a> - Live examples of all formatting options</li>\n</ul>\n<h2>Contributions welcome!</h2>\n<p>Your suggestions to improve this blog are welcome. You can do a PR to this blog adding your techniques. Info and a training session on how to do a PR to anything in ddev.com is at <a href=\"ddev-website-for-contributors.md\">DDEV Website For Contributors</a>.</p>\n<p>Follow the <a href=\"/newsletter\">DDEV Newsletter</a> for information about upcoming user and contributor training sessions.</p>\n<p>Claude Code did almost all of the collation of the information in this blog from the YouTube video and the <a href=\"https://rfay.github.io/contributing-to-ddev.com\">presentation materials</a>.</p>\n"},{"id":"https://ddev.com/blog/ddev-on-linux-in-10-minutes","url":"https://ddev.com/blog/ddev-on-linux-in-10-minutes","title":"DDEV on Linux in 10 Minutes","content_html":"<div>\n\n</div>\n\n<p><em>This screencast walks you through setting up a complete DDEV development environment on Linux, starting completely from scratch. Whether you're new to DDEV or local development environments in general, this step-by-step guide will get you up and running quickly.</em></p>\n<h2>Video Outline</h2>\n<p><strong>Here's the video table of contents (opens on YouTube):</strong></p>\n<ul>\n<li>Introduction (<a href=\"https://youtu.be/14JvCVbn1qs?t=0\">0:00</a>)</li>\n<li>Install Docker CE (<a href=\"https://youtu.be/14JvCVbn1qs?t=30\">0:30</a>)</li>\n<li>Docker Post-Installation (<a href=\"https://youtu.be/14JvCVbn1qs?t=107\">1:47</a>)</li>\n<li>Install DDEV (<a href=\"https://youtu.be/14JvCVbn1qs?t=154\">2:34</a>)</li>\n<li>Configure HTTPS Certificates (<a href=\"https://youtu.be/14JvCVbn1qs?t=200\">3:20</a>)</li>\n<li>Create Project (<a href=\"https://youtu.be/14JvCVbn1qs?t=225\">3:45</a>)</li>\n<li>Project Startup (<a href=\"https://youtu.be/14JvCVbn1qs?t=300\">5:00</a>)</li>\n<li>Launch Project (<a href=\"https://youtu.be/14JvCVbn1qs?t=412\">6:52</a>)</li>\n<li>Install PhpStorm (<a href=\"https://youtu.be/14JvCVbn1qs?t=490\">8:10</a>)</li>\n<li>Configure Xdebug (<a href=\"https://youtu.be/14JvCVbn1qs?t=656\">10:56</a>)</li>\n<li>Test Step Debugging (<a href=\"https://youtu.be/14JvCVbn1qs?t=734\">12:14</a>)</li>\n<li>Recap (<a href=\"https://youtu.be/14JvCVbn1qs?t=799\">13:19</a>)</li>\n</ul>\n<h2>What Happens in This Screencast</h2>\n<p>Here's what happens in this screencast. You can do it yourself in just a few minutes. We're using <a href=\"/get-started\">DDEV's get-started</a>, but of course there is far more detail in the <a href=\"https://docs.ddev.com\">DDEV docs</a>, explaining how to use other distros or other install techniques.</p>\n<ol>\n<li><p>Install Docker CE. Use the <code>apt</code> repository technique from <a href=\"https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository\">Docker's docs</a>.</p>\n<ul>\n<li>Do the post-install one-time action:</li>\n</ul>\n<pre><code>sudo usermod -aG docker $USER\n</code></pre>\n<ul>\n<li>We could log out and log back in, but instead for now:</li>\n</ul>\n<pre><code>newgrp docker\n</code></pre>\n</li>\n<li><p>Install DDEV, using the <code>apt</code> repository technique from <a href=\"/get-started\">get-started</a>.</p>\n<ul>\n<li><code>ddev --version</code> shows us being working fine with current stable.</li>\n</ul>\n</li>\n<li><p>One-time <code>mkcert -install</code> helps your browser trust DDEV's HTTPS certificates.</p>\n</li>\n<li><p>Check out a project. I used <a href=\"https://github.com/rfay/d11\">rfay/d11</a>, a trivial demo Drupal 11 project. (DDEV's <a href=\"https://docs.ddev.com/en/stable/users/quickstart/\">quickstarts show many different project types</a> with quick startup.)</p>\n</li>\n<li><p><code>ddev config</code> the project. Most of the time you can take the defaults. But most of use use a non-interactive command like <code>ddev config --project-type=drupal11 --docroot=web</code>.</p>\n</li>\n<li><p><code>ddev start</code> the project. The first time on a new system you get the downloading of the Docker images.</p>\n</li>\n<li><p><code>ddev composer install</code> for most projects</p>\n</li>\n<li><p><code>ddev launch</code> and install with the web UI. On another project I might have used <code>ddev import-db</code> to load a database dump instead of doing an install.</p>\n</li>\n<li><p><code>sudo snap install --classic phpstorm</code></p>\n</li>\n<li><p>Open the project and set a breakpoint in <code>web/index.php</code>.</p>\n</li>\n<li><p>Click the \"Listen for PHP Debug Connection\" button in PhpStorm.</p>\n</li>\n<li><p><code>ddev xdebug on</code></p>\n</li>\n<li><p>Visit the site in the browser. PhpStorm wakes up and asks us to map the code from the host/workstation side to the mount point in the container. The default usually works.</p>\n</li>\n<li><p>Debug, step over, step in, view variables, etc.</p>\n</li>\n</ol>\n<h2>Key Things to Know</h2>\n<ul>\n<li><p><strong>Use your own IDE, including VS Code:</strong> I used PhpStorm here, but <a href=\"https://docs.ddev.com/en/stable/users/debugging-profiling/step-debugging/#ide-setup\">VS Code works great</a>.</p>\n</li>\n<li><p><strong>This demo used Ubuntu, but people use lots of distros:</strong> The differences for major platforms are shown in the docs, but the ideas are all the same, and people use all of them, including other Debian/Ubuntu, Fedora, and Arch Linux distros.</p>\n</li>\n<li><p><strong>Cross-Platform Compatibility:</strong> DDEV works the same on macOS, Linux, Traditional Windows, and WSL2, see <a href=\"/get-started\">Getting Started</a>. Your whole team can work on their preferred environment without friction. See <a href=\"watch-new-windows-installer.md\">DDEV on Windows in 10 Minutes</a> and <a href=\"watch-ddev-local-from-scratch-with-macos.md\">DDEV on macOS from Scratch</a>.</p>\n</li>\n<li><p><strong>Support for almost any PHP-based project and many Node.js environments</strong> DDEV supports development of <a href=\"https://docs.ddev.com/en/stable/users/quickstart/\">so many different web environments</a>, so you're not stuck with using separate tools for different CMSs.</p>\n</li>\n<li><p><strong>More Extensive Docs</strong>:</p>\n<ul>\n<li><a href=\"https://docs.ddev.com\">DDEV Docs</a></li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/quickstart/\">DDEV Quickstarts</a></li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/install/\">DDEV Installation</a></li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/configuration/config/\">DDEV Configuration</a></li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/debugging-profiling/step-debugging/\">Step-Debugging</a></li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/faq/\">DDEV FAQ</a></li>\n</ul>\n</li>\n<li><p><strong>Support the DDEV Project:</strong> DDEV is fully open-source and free to use, and run by the nonprofit DDEV Foundation. We ask you to help make us a sustainable project by sponsoring yourself or getting your organization to sponsor the project. <a href=\"https://github.com/sponsors/ddev\">Sponsor us on GitHub</a>.</p>\n</li>\n</ul>\n<p>Questions? Issues? We're here to help:</p>\n<ul>\n<li>Discord is great for real-time help: <a href=\"/s/discord\">Join our Discord</a></li>\n<li>💬 <a href=\"/contact\">Contact us</a></li>\n</ul>\n<p><em>Have you signed up for the monthly <a href=\"/newsletter\">DDEV Newsletter</a>? We'd love to have you.</em></p>\n<p>Claude Code was used in editing this blog and in preparing video outline, etc. Canva AI helped with the banner image.</p>\n"},{"id":"https://ddev.com/blog/ddev-upsun-platformsh-addon","url":"https://ddev.com/blog/ddev-upsun-platformsh-addon","title":"Upsun Support for DDEV in a New Add-on","content_html":"<h2>Introduction</h2>\n<p>We're proud to announce that DDEV now has an <a href=\"https://github.com/ddev/ddev-upsun\">Upsun add-on</a> with extensive support for Upsun Flex and Upsun Fixed (Platform.sh-style configuration)!</p>\n<p>Although DDEV has had <code>ddev pull upsun</code> support for Upsun projects for a couple of years, the add-on provides a more complete integration. It reads your Upsun configuration and automatically configures matching services in your local DDEV project, mirroring what your upstream project uses.</p>\n<hr />\n<h2>Getting Started</h2>\n<p>Getting started is straightforward:</p>\n<ol>\n<li>In your existing Upsun project directory, run:<pre><code>ddev config\nddev add-on get ddev/ddev-upsun\nddev start\n</code></pre>\n</li>\n<li>The add-on will read your <code>.upsun/config.yaml</code> or <code>.platform.app.yaml</code> and configure your local environment automatically.</li>\n</ol>\n<p>For more details, see the <a href=\"https://github.com/ddev/ddev-upsun#readme\">README</a>.</p>\n<hr />\n<h2>What the <code>ddev-upsun</code> Add-on Does</h2>\n<p>When you do a <code>ddev add-on get ddev/ddev-upsun</code> the add-on reads your <code>.upsun/config.yaml</code> or <code>.platform.app.yaml</code> file and configures your DDEV project to match the upstream environment. This requires careful translation between Upsun's cloud architecture and DDEV's local environment.</p>\n<ul>\n<li>Use the same PHP version and extensions.</li>\n<li>Use the same database type and version (supporting multiple versions of MariaDB, MySQL, and PostgreSQL).</li>\n<li>Detect the use of Redis, Memcache, and Opensearch and configure DDEV add-ons to mimic the Upsun configuration.</li>\n</ul>\n<hr />\n<h2>Why <code>ddev-upsun</code> Matters</h2>\n<p>Although many Upsun-hosted sites are basic nginx-fpm-database sites that DDEV has easily supported for years, the more complex ones have required special handling, like having to explicitly set PHP version, database type, etc. Now the add-on can do much of that for you.</p>\n<p>For example, if your Upsun project uses PostgreSQL 15 with Redis and a specific PHP version, previously you'd need to manually configure each in your <code>.ddev/config.yaml</code>. Now, the add-on detects and configures all of this automatically.</p>\n<p>Upsun is a great platform for developers, and so many of you use it in the new \"Flex\" style and the previous \"Fixed\" style (Platform.sh-style). The add-on makes it easy to use both with a single add-on.</p>\n<p>And of course Upsun is the lead sponsor of DDEV, so we always delight in making it work for you.</p>\n<hr />\n<h2>The Future of <code>ddev-upsun</code></h2>\n<p>A sophisticated platform like Upsun has many possibilities, and we want most things to work on most projects. The scope will be limited to PHP for now. However, we want to add:</p>\n<ul>\n<li>Versioning for add-ons (Redis version will be supported in <code>ddev/ddev-redis</code> add-on, for example).</li>\n<li>More service support, like Elasticsearch and Solr.</li>\n<li>Even more extensive automated tests. Currently we have a very extensive set of tests based on a Drupal setup, but want to add tests for other frameworks and CMSes.</li>\n</ul>\n<hr />\n<h2>How We Got Here (PHP Add-ons)</h2>\n<p>DDEV v1.24.8 (required) adds <a href=\"https://docs.ddev.com/en/stable/users/extend/creating-add-ons/#php-based-actions-new\">support for add-ons written mostly in PHP</a>. Originally, all add-ons were written in Bash, with Go templating. It worked great for so many simple add-ons, but was way too complicated for sophisticated ones. PHP is a familiar and powerful language for many add-on developers, so now provides a much more expressive way to write complex add-ons.</p>\n<p>The <a href=\"https://github.com/ddev/ddev-platformsh\">ddev-platformsh</a> add-on forced the issue on this. Every time we went back to it to maintain it we had to remember how Go templates worked and sort out complex Bash logic. Bash and Go templates are a lousy combination for maintainability. PHP should be much better. The <code>ddev-upsun</code> add-on will replace <code>ddev-platformsh</code> and supports both the Flex and Fixed Upsun configurations.</p>\n<p>If you're currently using the <code>ddev/ddev-platformsh</code> add-on, you can migrate to <code>ddev-upsun</code> by removing the old add-on with <code>ddev add-on remove ddev-platformsh</code> and adding the new one with <code>ddev add-on get ddev/ddev-upsun</code>.</p>\n<hr />\n<h2>What's Next</h2>\n<ul>\n<li>Check out the <a href=\"https://github.com/ddev/ddev-upsun#readme\">full documentation</a> for advanced configuration options.</li>\n<li>We'd love your feedback — open issues or contribute PRs if you encounter any edge case.</li>\n<li>If you like it, give us a star on <a href=\"https://github.com/ddev/ddev-upsun\">GitHub</a>.</li>\n</ul>\n<hr />\n<h2>Gratitude</h2>\n<p>Thanks as always to Upsun for their financial support and for the great products, and for access to testing accounts. Their continued support makes DDEV development possible.</p>\n<p>If you're not already an Upsun user, try an <a href=\"https://upsun.com/flexible-developer-experience/\">Upsun free trial</a>.</p>\n<h2>Stay in the Loop—Follow Us and Join the Conversation</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n<p>Reviewed with assistance from DDEV Contributors and Claude Code.</p>\n"},{"id":"https://ddev.com/blog/claude-code-ai-pr-for-ddev-contributor-training","url":"https://ddev.com/blog/claude-code-ai-pr-for-ddev-contributor-training","title":"Contributor Training: Using Claude Code for a DDEV PR","content_html":"<p>Here's our August 21, 2025 <a href=\"/blog/category/training\">Contributor Training</a> on using Claude Code AI for a DDEV PR:</p>\n<div>\n\n</div>\n\n<h2>Big Picture</h2>\n<ul>\n<li>The most amazing thing about Claude Code as an <strong>agent</strong> is that it can do things and respond to them, on your machine, and using the internet, with your permission. That puts it way ahead of any other AI I've used. It can run tests and respond to the results (and fix things). It can create a commit or a PR.</li>\n<li>Used with respect, AI can be really powerful, a whole new level of abstraction in software development, maybe a bit like having an IDE when you were previously using just a line editor.</li>\n<li>AI excels at repetitive tasks, but only you have <strong>judgment</strong>. It's phenomenal at repeating patterns that it's been trained on, and often good at imitating patterns that you point out to it.</li>\n<li>It's a pretty good collaborator for those of us who work mostly alone.</li>\n<li>When I don't have the energy to approach a problem from scratch, sometimes just explaining it to Claude Code and asking for a plan gets me started. I've taken on quite a number of DDEV bugs/features this way and got to them instead of procrastinating another year or two.</li>\n</ul>\n<h2>Guardrails</h2>\n<ul>\n<li>Your code is your code. Build it with guardrails that will help keep it under control. Tests and static analysis are great guardrails. (DDEV has hundreds of automated tests and <code>make staticrequired</code> for static analysis.)</li>\n<li>Control, read, and manually test the code yourself.</li>\n<li>Consider getting a different AI to do a review.</li>\n<li>Always try to get another human to do a review.</li>\n<li>AI is <em>fantastic</em> at creating new tests, but don't let it touch the existing tests.</li>\n</ul>\n<h2>Structure and Strategy</h2>\n<ul>\n<li>For complex initiatives, explain the entire goal in detail to Claude and then get it to write a PRD, then commit the PRD into the repository. That way you'll have a high-quality set of context to use.</li>\n<li>Put all your general directives in a <code>CLAUDE.md</code> file like <a href=\"https://github.com/ddev/ddev/blob/main/CLAUDE.md\">DDEV's CLAUDE.md</a>. Their docs claim that directives like this will be used properly to guide Claude's behavior, and it does help, but Claude does not seem to be strictly obedient and I often have to remind it of basic DDEV precepts.</li>\n<li><a href=\"https://www.task-master.dev/\">TaskMaster AI</a> is a pretty good structural tool. You can give it a PRD and have it create a task list, then Claude can use it to navigate that task list. This would have been a great tool long before AI, but I rarely used that much structure in my coding before using this tool and AI.</li>\n<li>Every time you accomplish a bit of something, make a commit or have Claude make a commit. That way you can roll it back, or review just one item. (This works for you as a human also.) Thanks <a href=\"https://www.drupal.org/u/shaal\">@shaal</a>.</li>\n</ul>\n<h2>Capabilities</h2>\n<ul>\n<li>I was amazed to find that Claude could create an issue or PR for me, and certainly do commits. It can also comment on an issue or PR. I don't let it do those things without permission. (It seems to know how to use the <code>gh</code> utility to do these things; you need to have that installed and configured.)</li>\n<li>I have definitely learned some things from Claude. It has used the Go <code>t.Run()</code> much more effectively for clearer subtests than I had ever done before. And it seems to use a bit more modern Go in general, so that's a plus.</li>\n</ul>\n<h2>Problems</h2>\n<ul>\n<li>The current billing situation for Claude is confusing. It's based on the number of tokens you're using, but it doesn't give you feedback until you've almost used it all up. Then (on the $20/month plan) you're not able to use it for a number of hours, which seems to be arbitrary. You can spend more for a higher monthly plan, and you can also pay-as-you-go for tokens. I haven't done either of those. Clear context (<code>/clear</code>) at key points to limit the amount of context you're carrying forward and limit the number of tokens you're using.</li>\n<li>Claude can get stuck and go in circles, like other AI. Clear context to try to get around that. Have an overall plan to get around it.</li>\n<li>I'm annoyed by how verbose and flowery the commit/issue/PR language is sometimes, but have tried to calm it down using directives in the <code>CLAUDE.md</code> file, but without success. It also is complimenting me all the time and always agreeing with what I say. I haven't been able to calm that down either.</li>\n<li>I find that the amount of code I can create quickly for a significant feature is amazing. But then I have to understand it. And since I didn't create it at the micro level, it can be exhausting to work with.</li>\n</ul>\n<h2>Demonstration</h2>\n<p>In this demonstration (see screencast) we asked Claude to work on <a href=\"https://github.com/ddev/ddev/issues/7424\">this issue about <code>ddev launch</code></a> and we asked it to create a PR for us. It generated <a href=\"https://github.com/ddev/ddev/pull/7548\">this PR</a> to resolve the problem. It was a trivial issue with a trivial solution, but the path to create it was similar to the path for a more complex situation.</p>\n<h2>Responsible AI Usage and Disclosure</h2>\n<p>This isn't an adequate place to discuss responsible AI, but:</p>\n<ul>\n<li>Acknowledge the use of AI. Claude is happy to add a tag onto every commit or comment.</li>\n<li>Take responsibility for what you build.</li>\n</ul>\n<h2>Resources</h2>\n<ul>\n<li><a href=\"https://www.anthropic.com/claude-code\">Claude Code AI</a></li>\n<li><a href=\"https://www.task-master.dev/\">TaskMaster AI</a></li>\n<li><a href=\"https://rfay.github.io/ddev-claude-presentation/\">Slides</a> and supporting <a href=\"https://github.com/rfay/ddev-claude-presentation\">repository</a> built on <a href=\"https://revealjs.com/\">reveal.js</a>, created using Claude.</li>\n<li><a href=\"https://www.coursera.org/learn/claude-code\">Coursera Claude Code Course</a>: I took this as a free course; it didn't take too long and I learned a lot that I would not have known otherwise.</li>\n</ul>\n<h2>Conclusions</h2>\n<p>Yes, AI can make us really lazy. And it can make us stupid. Those valid concerns were also leveled against the calculator and the computer, of course. People thought that using the <code>C</code> language instead of assembler was giving up control. It was. We have to learn how to use this technology, use it right, and grow with it.</p>\n<p>Build guardrails. Pay attention. Know what your code does. Enjoy the ride!</p>\n<h2>Contributions welcome!</h2>\n<p>Your suggestions to improve this blog are welcome. You can do a PR to this blog adding your techniques. Info and a training session on how to do a PR to anything in ddev.com is at <a href=\"ddev-website-for-contributors.md\">DDEV Website For Contributors</a>.</p>\n<p>Follow the <a href=\"/newsletter\">DDEV Newsletter</a> for information about upcoming user and contributor training sessions.</p>\n<p>Edited with assistance from Claude Code and Codex; banner image generated by Claude.</p>\n"},{"id":"https://ddev.com/blog/ddev-september-2025-newsletter","url":"https://ddev.com/blog/ddev-september-2025-newsletter","title":"DDEV September 2025 Newsletter","content_html":"<p>🚀 Our sprint to finish out 2025 has begun! 🌟\nTell us what you need for 2025–2026. <a href=\"/contact\">Contact us↗</a>.</p>\n<h2>What’s New</h2>\n<ul>\n<li><strong>Tailscale for DDEV: Simple and Secure Project Sharing</strong> → <a href=\"tailscale-router-ddev-addon.md\">Read more↗</a></li>\n<li><strong>Contributor Training: DDEV PR using Claude Code AI</strong> → <a href=\"claude-code-ai-pr-for-ddev-contributor-training.md\">Watch↗</a></li>\n<li><strong>DDEV Advisory Group Meeting</strong> → <a href=\"https://github.com/orgs/ddev/discussions/7579\">Read more↗</a></li>\n</ul>\n<h2>Community Tutorials</h2>\n<ul>\n<li><strong>2025 Drupal Developer Survey</strong>: \"Almost everybody loves DDEV\" <a href=\"https://www.ironstar.io/devsurvey25/\">Read more↗</a></li>\n<li><strong>Mike Anello: Reclaim Docker disk space when using DDEV</strong> <a href=\"https://www.drupaleasy.com/quicktips/reclaim-docker-disk-space-when-using-ddev\">Read more↗</a></li>\n</ul>\n<h2>DDEV Training Has Started Up Again!</h2>\n<p>We're doing training again this season, all are invited. Some sessions are more focused on contributors and maintainers, and others for all users. This month we'll talk about the key magic of hostname resolution, debugging, and DNS. This is critical for everybody in the web world, not just for DDEV users. Join us whatever your experience level is.</p>\n<p>See the full schedule below.</p>\n<h3>Upcoming DDEV Live Contributor and User Training Sessions</h3>\n<ul>\n<li><p><strong>September 18, 2025 at 10:00 US ET / 16:00 CEST — Hostname Resolution and Debugging for DDEV Users</strong><br /><a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Hostname%20resolution%20and%20debugging%20for%20DDEV%20users&amp;dates=20250918T140000Z/20250918T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2025-09-18.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>October 9, 2025 at 10:00 US ET / 16:00 CEST — How and Why to Contribute a Blog to ddev.com</strong><br /><a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=How%20and%20Why%20to%20contribute%20a%20blog%20to%20ddev.com&amp;dates=20251009T140000Z/20251009T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2025-10-09.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>November 20, 2025 at 10:00 US ET / 16:00 CET — Using DDEV in Windows WSL</strong><br /><a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Using%20DDEV%20in%20Windows%20WSL&amp;dates=20251120T150000Z/20251120T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2025-11-20.ics\">Download .ics</a></p>\n</li>\n</ul>\n<p>Zoom Join Info:<br />Link: <a href=\"https://us02web.zoom.us/j/7315692237?pwd=RHR6NUkwb0g5WXIzS2NOcXRucCthZz09\">Join Zoom Meeting</a><br />Passcode: 12345</p>\n<h2>Events &amp; Community</h2>\n<ul>\n<li><strong>Join Us at CakeFest in Madrid</strong> — Randy will be doing a workshop on DDEV at <a href=\"https://cakefest.org/\">CakeFest in Madrid</a>. See you there! Or if you're just in the Madrid area, let's do a get-together.</li>\n<li><strong>See Us at DrupalCon EU in Vienna</strong> — Randy will be at <a href=\"https://events.drupal.org/vienna2025\">DrupalCon EU in Vienna</a> thanks to sponsorship from <a href=\"https://www.tag1consulting.com/\">Tag1</a> and <a href=\"https://upsun.com\">Platform.sh/Upsun</a>. Please say hi. Let's talk about anything you might want to talk about. I normally do a bunch of Birds-of-a-Feather sessions. Or if you live in the Vienna area, let's do a get-together.</li>\n</ul>\n<h2>Governance &amp; Roadmap</h2>\n<ul>\n<li><strong>Formal Governance Proposal</strong> — We've been working on a <a href=\"https://docs.google.com/document/d/1MXatsz2FMBSnllnUArNCv562x0T2-EF1OwqsFEU9_-M/edit?usp=sharing\">formal governance proposal</a>. We'd love your comments and engagement.</li>\n<li><strong>Informal Nominations for the DDEV Foundation Board</strong> — Would you like to nominate someone (or yourself)? Ping us via any of our <a href=\"/contact/\">contact methods</a>.</li>\n</ul>\n<hr />\n<h2>Sponsorship Status</h2>\n<ul>\n<li><strong>Monthly average income</strong> up from $7,878 to $7,958 (66% of $12,000 goal). Every contribution helps sustain our work—thank you! → <a href=\"https://github.com/sponsors/ddev\">Become a sponsor↗</a></li>\n</ul>\n<h2>Stay in the Loop—Follow Us and Join the Conversation</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n<p>Edited with assistance from Claude Code and Codex; banner image generated by Claude.</p>\n"},{"id":"https://ddev.com/blog/tailscale-router-ddev-addon","url":"https://ddev.com/blog/tailscale-router-ddev-addon","title":"Tailscale for DDEV: Simple and Secure Project Sharing","content_html":"<p>I've found that DDEV's <a href=\"https://docs.ddev.com/en/stable/users/topics/sharing/\"><code>ddev share</code></a> command is a great way to quickly share my local development environment. However, since it uses ngrok, it requires ngrok to be installed on the host system and generates a new, random URL every time unless you use a <a href=\"https://docs.ddev.com/en/stable/users/topics/sharing/#setting-up-a-stable-ngrok-domain\">stable domain</a>. As an alternative, I've created the <a href=\"https://github.com/atj4me/ddev-tailscale-router\"><code>ddev-tailscale-router</code></a> add-on.</p>\n<p>This add-on uses <a href=\"https://tailscale.com/\">Tailscale</a>, a VPN service that creates a private and secure network between your devices. It is free for personal use and doesn't require any additional software to be installed on your host system!</p>\n<p>As a result, you get a stable, human-readable URL for each of your DDEV projects, which you can access from any device on your Tailscale network.</p>\n<p>I've found this approach to be particularly useful for:</p>\n<ul>\n<li><strong>Cross-device testing:</strong> I can easily test my sites on my phone or tablet without being on the same Wi-Fi network.</li>\n<li><strong>Stable webhook URLs:</strong> I can use the permanent Tailscale URL as a reliable endpoint for webhooks, such as those from payment gateways.</li>\n<li><strong>Team collaboration:</strong> I can share my development environment with team members so they can see my work in progress.</li>\n</ul>\n<h3>How it Works</h3>\n<p>The <code>ddev-tailscale-router</code> add-on works by installing Tailscale directly into your DDEV project's web container using userspace networking. This approach provides better macOS compatibility and improved reliability compared to running a separate container. The add-on automatically connects to your Tailscale network and securely proxies requests to your project.</p>\n<blockquote>\n<p><strong>Update:</strong> Version 3.0.0 brought significant architectural improvements! The add-on now uses YAML-based configuration, improved command structure, and better error handling. If you're upgrading from an earlier version, see the <a href=\"https://github.com/atj4me/ddev-tailscale-router/releases/tag/v3.0.0\">migration instructions</a> in the release notes.</p>\n</blockquote>\n<h3>Prerequisites</h3>\n<p>Before installing the add-on, you need to set up Tailscale:</p>\n<ol>\n<li><strong>Install Tailscale</strong> on at least two devices (phone, tablet, or computer) by following the <a href=\"https://tailscale.com/download\">installation guide</a>. This is required to generate an auth key.</li>\n<li><strong>Enable HTTPS</strong> by following the <a href=\"https://tailscale.com/kb/1153/enabling-https\">Tailscale HTTPS documentation</a>. This is required for TLS certificate generation.</li>\n<li><strong>Generate an auth key</strong> by following the <a href=\"https://tailscale.com/kb/1085/auth-keys\">Tailscale auth keys documentation</a>. Ephemeral, reusable keys are recommended.</li>\n</ol>\n<h3>Installation</h3>\n<p>To get started, follow these steps:</p>\n<ol>\n<li><p>First, <strong>set up your auth key</strong> (recommended approach):\nAdd the auth key to your shell environment:</p>\n<pre><code>echo 'export TS_AUTHKEY=tskey-auth-your-key-here' &gt;&gt; ~/.bashrc\nsource ~/.bashrc\n</code></pre>\n<p>Replace <code>~/.bashrc</code> with <code>~/.zshrc</code> if you use Zsh, or your relevant shell configuration file.</p>\n<p>Alternatively, you can use interactive authentication after installation by running <code>ddev tailscale login</code> after your project starts.</p>\n</li>\n<li><p>Next, <strong>install the add-on:</strong></p>\n<pre><code>ddev add-on get atj4me/ddev-tailscale-router\n</code></pre>\n</li>\n<li><p>Finally, <strong>restart DDEV:</strong></p>\n<pre><code>ddev restart\n</code></pre>\n</li>\n</ol>\n<h3>Using Your Tailscale URL</h3>\n<p>Once installation is complete, you need to start sharing your project:</p>\n<p>Start sharing your project:</p>\n<pre><code>ddev tailscale share\n</code></pre>\n<p>Launch your project's Tailscale URL in browser:</p>\n<pre><code>ddev tailscale launch\n</code></pre>\n<p>Get your project's Tailscale URL:</p>\n<pre><code>ddev tailscale url\n</code></pre>\n<p>Your project's permanent Tailscale URL will look like: <code>https://&lt;project-name&gt;.&lt;your-tailnet&gt;.ts.net</code>. You can also find it in your Tailscale admin console.</p>\n<p>To see all available commands and options, run <code>ddev tailscale help</code>. This will show you both the DDEV-specific shortcuts and all native Tailscale CLI commands that you can use.</p>\n<h3>Public vs. Private Mode</h3>\n<p>The add-on offers two modes for sharing your project:</p>\n<ul>\n<li><strong>Private (default):</strong> Your project is only accessible to devices on your Tailscale network.</li>\n<li><strong>Public:</strong> Your project is accessible to anyone on the internet.</li>\n</ul>\n<p>To switch between modes:</p>\n<p>Share publicly (accessible to anyone on the internet):</p>\n<pre><code>ddev tailscale share --public\n</code></pre>\n<p>Share privately (default, only accessible to your Tailscale devices):</p>\n<pre><code>ddev tailscale share\n</code></pre>\n<p>Stop sharing:</p>\n<pre><code>ddev tailscale stop\n</code></pre>\n<blockquote>\n<p><strong>Note:</strong> For public access, you need to configure your <a href=\"https://tailscale.com/kb/1223/funnel#funnel-node-attribute\">Access Control List (ACL)</a> to enable Funnel. See the <a href=\"https://tailscale.com/kb/1223/funnel\">Tailscale Funnel documentation</a> for details on setting up the required ACL policy.</p>\n</blockquote>\n<h3>Uninstalling the Add-on</h3>\n<p>If you need to remove the add-on from your project:</p>\n<ol>\n<li><p><strong>Stop any active sharing:</strong></p>\n<pre><code>ddev tailscale stop\n</code></pre>\n</li>\n<li><p><strong>Remove the add-on:</strong></p>\n<pre><code>ddev add-on remove tailscale-router\n</code></pre>\n</li>\n<li><p><strong>Restart DDEV:</strong></p>\n<pre><code>ddev restart\n</code></pre>\n</li>\n</ol>\n<h3>Additional Resources</h3>\n<p>Here are some additional resources that you might find helpful:</p>\n<ul>\n<li><strong><a href=\"https://tailscale.com/\">Tailscale</a></strong>: A VPN service that creates a private and secure network between your devices.</li>\n<li><strong><a href=\"https://tailscale.com/download\">Tailscale Download</a></strong>: Installation guide for Tailscale on various platforms.</li>\n<li><strong><a href=\"https://tailscale.com/kb/1153/enabling-https\">Tailscale: Enabling HTTPS</a></strong>: Official documentation on enabling HTTPS for TLS certificate generation.</li>\n<li><strong><a href=\"https://tailscale.com/kb/1085/auth-keys\">Tailscale Auth Keys</a></strong>: Detailed information about creating and managing auth keys.</li>\n<li><strong><a href=\"https://tailscale.com/kb/1223/funnel\">Tailscale Funnel</a></strong>: Documentation on enabling public access to your Tailscale services.</li>\n<li><strong><a href=\"https://tailscale.com/kb/1054/dns\">Tailscale DNS</a></strong>: DNS in Tailscale</li>\n<li><strong><a href=\"https://docs.ddev.com/en/stable/users/usage/commands/#dotenv\">DDEV dotenv</a></strong>: Documentation on managing environment variables with DDEV.</li>\n<li><strong><a href=\"https://docs.ddev.com/en/stable/users/topics/sharing\">DDEV Docs: Sharing</a></strong>: The official DDEV documentation on how to share your projects.</li>\n<li><strong>Medium: <a href=\"https://medium.com/@josephajithampi/my-journey-with-php-dev-environments-1da9f2806ee9\">My Journey with PHP Dev Environments</a></strong>: A blog post on setting up a PHP development environment.</li>\n<li><strong>LinkedIn: <a href=\"https://www.linkedin.com/pulse/day-my-development-environment-nearly-broke-me-how-i-thampi-joseph-ildhc/\">The Day My Development Environment Nearly Broke Me</a></strong>: An article on the importance of a reliable development environment.</li>\n</ul>\n<p>I hope this add-on helps streamline your development workflow! If you run into any issues or have suggestions for improvements, feel free to open an issue on the <a href=\"https://github.com/atj4me/ddev-tailscale-router/issues\">GitHub repository</a>.</p>\n<hr />\n<p><em>This blog post was updated with the assistance of GitHub Copilot (Claude). I used it to help update the content based on the latest add-on changes, improve accuracy, and maintain consistency. The original version was written with assistance from Amazon Q and Google Gemini.</em></p>\n"},{"id":"https://ddev.com/blog/ddev-august-2025-newsletter","url":"https://ddev.com/blog/ddev-august-2025-newsletter","title":"DDEV August 2025 Newsletter","content_html":"<p>🚀 Dive into August 2025 with DDEV! 🌟<br />This month: v1.24.7 release, Contributor Training starts up again, ddev-hostname security, new Windows installer, VS Code extension, DrupalCamp Colorado, Laracon US highlights, Passbolt environment, Tailscale troubleshooting, Magento 2 setup, DrupalCon Vienna, Ollama AI, and Board nominations.</p>\n<hr />\n<h2>What’s New</h2>\n<ul>\n<li><strong>DDEV v1.24.7 Released</strong> — Includes Windows Installer and MariaDB 11.8 update → <a href=\"https://github.com/ddev/ddev/releases/tag/v1.24.7\">Release notes↗</a></li>\n<li><strong>New Windows Installer Available</strong> — Install DDEV on WSL2 or traditional Windows with the new installer → <a href=\"https://ddev.com/blog/watch-new-windows-installer\">Read more↗</a></li>\n<li><strong>DDEV From Scratch with Windows WSL2</strong> — Step-by-step video guide to get started with DDEV on Windows WSL2 → <a href=\"https://ddev.com/blog/watch-ddev-local-from-scratch-with-windows-wsl2\">Watch guide↗</a></li>\n<li><strong>Security Priorities: Strengthening <code>ddev-hostname</code></strong> — Recent improvements securing host-file updates and future plans → <a href=\"https://ddev.com/blog/ddev-hostname-security-improvements\">Read more↗</a></li>\n<li><strong>DDEV VS Code Extension v3.0 Released</strong> — New container commands, auto config reload, improved IDE integration, and remote-host support → <a href=\"https://marketplace.visualstudio.com/items?itemName=biati.ddev-manager\">Get it on Marketplace↗</a><br />Learn about “Expose Commands From Container” → <a href=\"https://github.com/ddev/vscode-ddev-manager/wiki/Expose-from-Container\">Read more↗</a></li>\n</ul>\n<h2>Community Tutorials</h2>\n<ul>\n<li><strong>My Go-To Setup for Local Drupal Development with DDEV and Colima</strong><br />John Picozzi’s Colima + DDEV workflow for Drupal projects. → <a href=\"https://picozzi.com/notebook/2025/jul/my-go-setup-local-drupal-development-ddev-and-colima\">Read more↗</a></li>\n<li><strong>Passbolt: Your Local Development Environment in Minutes</strong><br />Quick-start guide to run Passbolt in DDEV. → <a href=\"https://www.passbolt.com/blog/set-up-your-local-passbolt-development-environment-in-minutes-with-ddev\">Read more↗</a></li>\n<li><strong>When Tailscale Nearly Broke My Dev Environment</strong><br />Joseph Thampi’s story and tips for using Tailscale with DDEV. → <a href=\"https://www.linkedin.com/pulse/day-my-development-environment-nearly-broke-me-how-i-thampi-joseph-ildhc/\">Read more↗</a></li>\n<li><strong>DDEV + Magento 2: Quickstart Setup</strong><br />Automate Magento 2 installs with DDEV. → <a href=\"https://github.com/jellesiderius/ddev-magento2-setup\">View on GitHub↗</a></li>\n<li><strong>Creating a Simple Donation Form in Drupal with Stripe &amp; Webforms</strong><br />Setup payments in minutes with DDEV and Webform. → <a href=\"https://picozzi.com/notebook/2025/jul/creating-simple-donation-form-drupal-stripe-and-webforms\">Read more↗</a></li>\n<li><strong>Free Local AI with Ollama &amp; DDEV</strong><br />How to Set Up Ollama as a Free, Local AI Provider for Your local Drupal Development. → <a href=\"https://www.linkedin.com/pulse/how-set-up-ollama-free-local-ai-provider-your-drupal-rakesh-james-gedje/\">Read more↗</a></li>\n</ul>\n<h2>DDEV Training Starting Up Again!</h2>\n<p>We're going to do training again this season, all are invited. Some sessions are more focused on contributors and maintainers, and others at all users. First up this month will be a session on using Claude Code to implement a DDEV feature or fix a bug. This will be using DDEV as an example, but probably anybody who works with code anywhere will profit from the approach.</p>\n<p>See the full schedule below.</p>\n<h3>Upcoming DDEV Live Contributor and User Training Sessions</h3>\n<ul>\n<li><p><strong>August 21, 2025 at 10:00 US ET / 16:00 CEST — Using Claude Code AI in DDEV Development</strong><br /><a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Using%20Claude%20Code%20AI%20in%20DDEV%20Development&amp;dates=20250821T140000Z/20250821T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2025-08-21.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>September 18, 2025 at 10:00 US ET / 16:00 CEST — Hostname Resolution and Debugging for DDEV Users</strong><br /><a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Hostname%20resolution%20and%20debugging%20for%20DDEV%20users&amp;dates=20250918T140000Z/20250918T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2025-09-18.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>October 9, 2025 at 10:00 US ET / 16:00 CEST — How and Why to Contribute a Blog to ddev.com</strong><br /><a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=How%20and%20Why%20to%20contribute%20a%20blog%20to%20ddev.com&amp;dates=20251009T140000Z/20251009T150000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2025-10-09.ics\">Download .ics</a></p>\n</li>\n<li><p><strong>November 20, 2025 at 10:00 US ET / 16:00 CET — Using DDEV in Windows WSL</strong><br /><a href=\"https://calendar.google.com/calendar/render?action=TEMPLATE&amp;text=Using%20DDEV%20in%20Windows%20WSL&amp;dates=20251120T150000Z/20251120T160000Z&amp;details=Join%20the%20DDEV%20training%20session%20via%20Zoom.%0ALink%3A%20https%3A%2F%2Fus02web.zoom.us%2Fj%2F7315692237%3Fpwd%3DRHR6NUkwb0g5WXIzS2NOcXRucCthZz09%0AMeeting%20ID%3A%20731%20569%202237%0APasscode%3A%2012345&amp;location=Online&amp;trp=true\">Add to Google Calendar</a> •\n<a href=\"/files/ics/ddev-2025-11-20.ics\">Download .ics</a></p>\n</li>\n</ul>\n<p>Zoom Join Info:<br />Link: <a href=\"https://us02web.zoom.us/j/7315692237?pwd=RHR6NUkwb0g5WXIzS2NOcXRucCthZz09\">Join Zoom Meeting</a><br />Passcode: 12345</p>\n<h2>Events &amp; Community</h2>\n<ul>\n<li><strong>DrupalCamp Colorado</strong><br />I got to see old friends, met new people, and attended great sessions that refreshed my Drupal knowledge at DrupalCamp Colorado.</li>\n<li><strong>Laracon US 2025: Younger, Bigger, Friendlier</strong><br />Since Laracon was right after DrupalCamp Colorado and in Denver I went to learn from the vibrant Laravel community. It was a big, highly produced event with lots of friendly people and immense emphasis on community. Folks seemed younger on average than in the Drupal world. I didn't learn a lot about Laravel, but there were great general sessions that inspired me to start using Git worktrees and some new AI techniques.</li>\n<li><strong>See Us at DrupalCon EU in Vienna</strong><br />Randy will be at <a href=\"https://events.drupal.org/vienna2025\">DrupalCon EU in Vienna</a> thanks to sponsorship from <a href=\"https://www.tag1consulting.com/\">Tag1</a> and <a href=\"https://upsun.com\">Platform.sh/Upsun</a>. Please say hi. Let's talk about anything you might want to talk about. I normally do a bunch of Birds-of-a-Feather sessions.</li>\n</ul>\n<h2>Governance &amp; Roadmap</h2>\n<ul>\n<li><strong>Informal Nominations for the DDEV Foundation Board</strong><br />At the upcoming <a href=\"https://github.com/orgs/ddev/discussions/categories/ddev-advisory-group\">DDEV Advisory Group</a> meetings (in September and November) we'll be implementing an actual Board of Directors for the DDEV Foundation. Would you like to nominate someone (or yourself)? Ping us via any of our <a href=\"/contact/\">contact methods</a>.</li>\n</ul>\n<hr />\n<h2>Sponsorship Status</h2>\n<ul>\n<li><strong>Monthly average income</strong> up from $7,759 to $7,878 (66% of $12,000 goal). Every contribution helps sustain our work—thank you! → <a href=\"https://github.com/sponsors/ddev\">Become a sponsor↗</a></li>\n</ul>\n<h2>Stay in the Loop—Follow Us and Join the Conversation</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n"},{"id":"https://ddev.com/blog/watch-ddev-local-from-scratch-with-windows-wsl2","url":"https://ddev.com/blog/watch-ddev-local-from-scratch-with-windows-wsl2","title":"Watch: DDEV from scratch with Windows WSL2","content_html":"<blockquote>\n<p><strong>Want just the 10-minute version of a DDEV WSL2 Install?</strong> Check out the <a href=\"watch-new-windows-installer.md\">New GUI Installer: Get DDEV Running on Windows in Just 10 Minutes</a> for a quicker setup using the GUI installer.</p>\n<p><strong>Using Linux or macOS?</strong> See <a href=\"ddev-on-linux-in-10-minutes.md\">DDEV on Linux in 10 Minutes</a> or <a href=\"watch-ddev-local-from-scratch-with-macos.md\">DDEV on macOS from Scratch</a>.</p>\n</blockquote>\n<div>\n\n</div>\n\n<p>This screencast walks you through setting up a complete DDEV development environment on Windows using WSL2, starting completely from scratch. Whether you're new to DDEV, WSL2, or local development environments in general, this step-by-step guide will get you up and running quickly.</p>\n<blockquote>\n<p>We also did a <a href=\"https://youtu.be/dcKXa23cFmg?si=NDXSHscN2blOJpL1\">DDEV Contributor/User Training on Windows with WSL2</a> in November, 2025 which did a casual walkthrough of this information.</p>\n</blockquote>\n<h2>What You'll Learn</h2>\n<p><strong>DDEV Fundamentals</strong>: Understanding what DDEV is and why it's become the go-to solution for local web development. The video explains that DDEV is a Docker-based local development environment aimed at web developers, mostly PHP and Node developers. Key benefits include:</p>\n<ul>\n<li>Developers can run websites on their local computer with almost no configuration</li>\n<li>Multiple projects can run simultaneously, each with different configurations</li>\n<li>Docker handles all the heavy lifting, so you don't even need PHP or Composer or Node on your host computer</li>\n<li>First-class support across macOS, Linux, Windows, and WSL2 - it works the same on every platform</li>\n</ul>\n<p><strong>WSL2 Setup and Benefits</strong>: WSL2 (<a href=\"https://learn.microsoft.com/en-us/windows/wsl/\">Windows Subsystem for Linux version 2</a>) transforms Windows development by providing a real Linux kernel running alongside Windows. The video covers the key advantages and considerations:</p>\n<p><em>Advantages:</em></p>\n<ul>\n<li>Complete Linux environment on your Windows machine - fast and capable</li>\n<li>Amazingly fast web serving with DDEV/Docker CE</li>\n<li>You're working with an environment much like the one you'll deploy to</li>\n</ul>\n<p><em>Considerations:</em></p>\n<ul>\n<li>Linux on your Windows machine means yet another system to learn and remember</li>\n<li>Context switches between Windows and WSL2 environments</li>\n<li>You must work in the WSL2 filesystem rather than Windows filesystem (optimized for web apps, not Microsoft Word)</li>\n</ul>\n<p><strong>Complete Installation Process</strong>: The video covers <a href=\"/get-started\">every step</a> of the installation process, including:</p>\n<ul>\n<li>Setting up WSL2 from scratch using the <code>wsl --install</code> command</li>\n<li>Running the new DDEV Windows installer that automatically configures your distro for Docker CE</li>\n<li>Understanding why you need to work in the WSL2 file system instead of the Windows NTFS filesystem for optimal performance</li>\n</ul>\n<p><strong>Real-World Usage</strong>: Beyond just installation, you'll see DDEV in action with:</p>\n<ul>\n<li>Creating a simple PHP project and launching it with trusted HTTPS certificates</li>\n<li>Installing Drupal 11 using <code>ddev composer create-project</code></li>\n<li>Essential DDEV commands like <code>ddev describe</code>, <code>ddev snapshot</code>, and <code>ddev export-db</code></li>\n<li>Advanced IDE integration with both PhpStorm and VS Code, including Xdebug debugging</li>\n</ul>\n<p><strong>Professional Development Features</strong>: The video demonstrates advanced workflows including:</p>\n<ul>\n<li>Setting up Xdebug debugging in both PhpStorm and VS Code</li>\n<li>Working with DDEV projects from within WSL2-integrated IDEs</li>\n<li>Understanding Docker Desktop vs Docker CE trade-offs for professional development</li>\n<li>Best practices for file system performance and cross-platform compatibility</li>\n</ul>\n<p>This screencast follows the official DDEV <a href=\"https://docs.ddev.com/en/stable/users/install/ddev-installation/#ddev-installation-windows\">WSL2 Installation Docs</a>, but provides additional context, troubleshooting tips, and real-world examples to ensure your success.</p>\n<p><strong>Here's the video table of contents (opens on YouTube):</strong></p>\n<ul>\n<li>Introduction and What is DDEV? (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=0\">0:00</a>)</li>\n<li>What is WSL2? (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=116\">1:56</a>)</li>\n<li>WSL2 Advantages and Disadvantages (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=170\">2:50</a>)</li>\n<li>WSL2 Installation Process (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=330\">5:30</a>)</li>\n<li>DDEV Windows Installer and Docker Setup (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=774\">12:54</a>)</li>\n<li>Creating a Simple PHP Project (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=974\">16:14</a>)</li>\n<li>Creating a Drupal 11 Project with Composer (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=1287\">21:27</a>)</li>\n<li>Essential DDEV Commands (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=1614\">25:25</a>)</li>\n<li>PhpStorm Integration and Xdebug Setup (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=1838\">30:38</a>)</li>\n<li>VS Code Integration and Debugging (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=2362\">39:22</a>)</li>\n<li>Docker Desktop vs Docker CE Discussion (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=2815\">46:55</a>)</li>\n<li>What about Traditional Windows? (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=2946\">49:06</a>)</li>\n<li>Wrap-up and Community Resources (<a href=\"https://youtu.be/1dr_4gPtFlQ?t=3012\">50:12</a>)</li>\n</ul>\n<h2>Additional Resources</h2>\n<h3>📺 Video Materials</h3>\n<ul>\n<li><a href=\"https://docs.google.com/presentation/d/1oCn7E1Bk0J9E14jiZ7tdvD80jBlibnc3f7PPJMEtqss/edit?usp=sharing\">Video slides and table of contents</a> - The slides used in the video</li>\n</ul>\n<h3>📖 Documentation</h3>\n<ul>\n<li><a href=\"https://docs.ddev.com/en/stable/\">DDEV documentation</a> - Complete DDEV documentation</li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/install/ddev-installation/#ddev-installation-windows\">WSL2 and DDEV Installation docs</a> - Official installation guide</li>\n</ul>\n<h3>💬 Community Support</h3>\n<ul>\n<li><a href=\"/s/discord\">DDEV Discord</a> - Join the DDEV community on Discord for real-time support and discussion</li>\n<li><a href=\"https://stackoverflow.com/questions/tagged/ddev\">DDEV Stack Overflow</a> - Q&amp;A with the community</li>\n<li><a href=\"https://github.com/ddev/ddev/issues\">DDEV issue queue</a> - Bug reports and feature requests</li>\n<li><a href=\"https://www.drupal.org/community/contributor-guide/reference-information/talk/tools/slack\">Drupal Slack</a> - <code>#ddev</code> channel</li>\n</ul>\n<h3>🔧 Development</h3>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev\">DDEV Project Repository</a> - Source code and releases</li>\n</ul>\n"},{"id":"https://ddev.com/blog/ddev-hostname-security-improvements","url":"https://ddev.com/blog/ddev-hostname-security-improvements","title":"Enhanced Security with DDEV's New `ddev-hostname` Binary","content_html":"<blockquote>\n<p><strong>TL;DR</strong>: The new binary <code>ddev-hostname</code> shipped with DDEV now takes care of <code>hosts</code> file editing when needed. <code>hosts</code> editing only happens when you use a non-<code>ddev.site</code> URL.</p>\n</blockquote>\n<p>One of the core principles of secure software development is the <strong>principle of least privilege</strong>: give a program only the minimal permissions it needs to do its job. With DDEV v1.24.7, we've taken a significant step forward in applying this principle to how DDEV manages hostname resolution on your development machine.</p>\n<p><strong>If you don't use an alternate top-level-domain (TLD) or custom FQDNs, you won't notice any changes here.</strong> Read on, but DDEV will continue to work as it always has for most users.</p>\n<h2>Why DDEV Sometimes Needs Elevated Privileges</h2>\n<p>Most of the time, DDEV projects work seamlessly with URLs like <code>https://yourproject.ddev.site</code> without any special setup. That's because DDEV maintains DNS records for <code>ddev.site</code> and all its subdomains that resolve to <code>127.0.0.1</code> (your local machine). As long as you have an internet connection, your browser can look up these hostnames automatically.</p>\n<p>However, there are situations where DDEV needs to edit your system's <code>hosts</code> file (<code>/etc/hosts</code> on Linux/macOS or <code>C:\\Windows\\System32\\drivers\\etc\\hosts</code> on Windows):</p>\n<ul>\n<li>When you don't have an internet connection</li>\n<li>When your DNS is broken or blocks <code>127.0.0.1</code> resolution (DNS rebinding protection)</li>\n<li>When you use custom hostnames with <code>additional_fqdns</code> that aren't under <code>ddev.site</code></li>\n<li>When you've configured a <code>project_tld</code> other than the default <code>ddev.site</code> or disabled DNS with <code>use_dns_when_possible: false</code></li>\n</ul>\n<p>For a deeper dive into how DDEV hostname resolution works, see our detailed guide on <a href=\"ddev-name-resolution-wildcards.md\">DDEV name resolution and wildcards</a>.</p>\n<h2>The Security Challenge: Minimal Elevated Access</h2>\n<p>When DDEV does need to edit the <code>hosts</code> file, it requires elevated permissions (root on Linux/macOS, Administrator on Windows). This is the <strong>only</strong> thing DDEV does with elevated privileges—but from a security perspective, how we handle that elevation matters a lot.</p>\n<p>Previously, the main DDEV binary—which handles containers, databases, files, and many other tasks—also had to manage hostname editing with elevated permissions. When you elevate privileges for one specific task (editing <code>hosts</code> files), you want to minimize what else that elevated process can do. The old approach meant a larger binary with more dependencies running with elevated permissions, increasing the potential attack surface.</p>\n<h2>The Solution: Meet ddev-hostname</h2>\n<p>DDEV v1.24.7 introduces a new dedicated <code>ddev-hostname</code> (and <code>ddev-hostname.exe</code> for Windows and WSL2) binary that handles hostname management exclusively. This specialized tool follows the security principle of least privilege in several important ways:</p>\n<h3>Minimal Capabilities</h3>\n<p>The <code>ddev-hostname</code> binary has been stripped down to do exactly one thing: manage hostname entries in your system's <code>hosts</code> file. It doesn't include Docker utilities, global configuration management, or the dozens of other features that the main DDEV binary provides.</p>\n<h3>Reduced Attack Surface</h3>\n<p>By removing unnecessary dependencies, we shrunk the <code>ddev-hostname</code> binary significantly. More important, though, we eliminated dependencies on several libraries that were previously included in the main DDEV binary but aren't needed for hostname management.</p>\n<p>Each removed dependency is one less potential entry point for security vulnerabilities in the elevated binary.</p>\n<h3>Platform-Specific Security</h3>\n<p>The new implementation provides native elevation techniques for each platform instead of relying on third-party tools like <code>gsudo.exe</code> on Windows. This reduces external dependencies and gives us better control over the security model.</p>\n<h2>Special Benefits for WSL2 Users</h2>\n<p>If you're using DDEV with Windows WSL2, you'll especially appreciate another improvement that comes with these changes. The new <code>ddev-wsl2</code> package provides the Windows-side binaries you need, including <code>ddev-hostname.exe</code> and <code>mkcert.exe</code>, directly within your Linux distro.</p>\n<p>This means <strong>you no longer need to install DDEV on the Windows side</strong> when using WSL2. The <code>ddev-wsl2</code> package gives you everything you need for proper WSL2 integration with Windows hostname and certificate management.</p>\n<p>To install it:</p>\n<pre><code>sudo apt-get update &amp;&amp; sudo apt-get install ddev-wsl2\n# or sudo dnf install --refresh ddev-wsl2\n</code></pre>\n<p>This streamlines the WSL2 setup process significantly and ensures you always have the correct versions of these critical utilities.</p>\n<h2>What This Means for You</h2>\n<p>As a DDEV user, these changes are largely transparent—your development workflow remains the same. But under the hood, you're now benefiting from:</p>\n<ol>\n<li><strong>Better security</strong>: Elevated processes now have minimal capabilities and smaller attack surfaces.</li>\n<li><strong>Simpler WSL2 setup</strong>: No need for Windows-side DDEV installation.</li>\n<li><strong>More reliable hostname management</strong>: Native platform elevation instead of third-party tools.</li>\n</ol>\n<h2>The Bigger Picture</h2>\n<p>These improvements reflect our ongoing commitment to making DDEV not just powerful and easy to use, but also secure by design. By applying established security principles like least privilege and minimal attack surface, we're building a development tool that you can trust with your local environment.</p>\n<h2>Getting Started</h2>\n<p>DDEV v1.24.7 with these security improvements is <a href=\"https://github.com/ddev/ddev/releases\">available now</a>. If you're using WSL2, install the new <code>ddev-wsl2</code> package.</p>\n<p>As always, we'd love to hear your feedback on these changes. Join us on <a href=\"/s/discord\">Discord</a> to share your experience or ask questions about the new hostname management approach.</p>\n<hr />\n<p><em>Follow our <a href=\"https://ddev.com/blog/\">blog</a>, <a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn</a>, <a href=\"https://fosstodon.org/@ddev\">Mastodon</a>, and join us on <a href=\"/s/discord\">Discord</a>. And we'd love to have you sign up for the <a href=\"/newsletter\">monthly newsletter</a>.</em></p>\n"},{"id":"https://ddev.com/blog/watch-new-windows-installer","url":"https://ddev.com/blog/watch-new-windows-installer","title":"New GUI Installer: Get DDEV Running on Windows in Just 10 Minutes (Video)","content_html":"<blockquote>\n<p><strong>Using macOS or Linux?</strong> See <a href=\"watch-ddev-local-from-scratch-with-macos.md\">DDEV on macOS from Scratch</a> or <a href=\"ddev-on-linux-in-10-minutes.md\">DDEV on Linux in 10 Minutes</a>.</p>\n</blockquote>\n<p>Tired of those complex PowerShell scripts we used to provide to get DDEV running on Windows? The new GUI installer changes everything.</p>\n<p>In <a href=\"https://github.com/ddev/ddev/releases/tag/v1.24.7\">DDEV v1.24.7</a> we've eliminated the complexity of Windows setup. What used to require a privileged PowerShell script and manual WSL2 configuration now takes just a few clicks.</p>\n<h2>Why This Changes Everything for DDEV Users on Windows</h2>\n<p>✅ <strong>Almost No Command Line Required for Setup</strong><br />\n✅ <strong>Handles WSL2 Setup Automatically</strong> - No more manual configuration<br />\n✅ <strong>Works with Your Preferred Docker Setup</strong> - Docker Desktop, Rancher Desktop, or Docker-CE, in WSL2 or with Traditional Windows<br />\n✅ <strong>Beginner-Friendly</strong> - Perfect for users new to DDEV</p>\n<p>The new installer supports:</p>\n<ul>\n<li>WSL2 Docker-CE</li>\n<li>WSL2 Docker Desktop and Rancher Desktop</li>\n<li>Traditional Windows installation</li>\n</ul>\n<h2>See It In Action</h2>\n<p>Watch me transform a fresh Windows machine into a fully functional DDEV development environment in about 10 minutes:</p>\n<p><strong>What you'll see:</strong></p>\n<ul>\n<li>Starting from a Windows machine without WSL2</li>\n<li>Complete WSL2 and Docker CE setup</li>\n<li>DDEV installation and first project</li>\n</ul>\n<div>\n\n</div>\n\n<p>This setup process is detailed in <a href=\"/get-started\">Get Started - Windows</a> and explained further in the <a href=\"https://docs.ddev.com/en/stable/users/install/ddev-installation/#ddev-installation-windows\">official docs</a>.</p>\n<h2>Ready to Try It?</h2>\n<p>🚀 <strong><a href=\"https://github.com/ddev/ddev/releases\">Download the new Windows installer</a></strong></p>\n<p><strong>Cross-Platform Compatibility:</strong> DDEV works the same on macOS, Linux, Traditional Windows, and WSL2, see <a href=\"/get-started\">Getting Started</a>. Your whole team can work on their preferred environment instead of fighting about it. It supports development of <a href=\"https://docs.ddev.com/en/stable/users/quickstart/\">so many different web environments</a>, so you're not stuck with using different tools for different CMSs.</p>\n<p><strong>Support the Project:</strong> DDEV is fully open-source and free to use, and run by the nonprofit DDEV Foundation. We ask you to help make us a sustainable project by sponsoring yourself or getting your organization to sponsor the project. <a href=\"https://github.com/sponsors/ddev\">Sponsor us on GitHub</a>.</p>\n<p>Questions? Issues? We're here to help:</p>\n<ul>\n<li>💬 <a href=\"/contact\">Contact our team</a></li>\n<li>📖 <a href=\"/get-started\">Simple installation docs</a></li>\n<li>📖 <a href=\"https://docs.ddev.com/en/stable/users/install/ddev-installation/#ddev-installation-windows\">Full installation docs</a></li>\n</ul>\n<p><em>Have you signed up for the monthly <a href=\"/newsletter\">DDEV Newsletter</a>? We'd love to have you.</em></p>\n"},{"id":"https://ddev.com/blog/testing-ddev-with-vmware-workstation-pro","url":"https://ddev.com/blog/testing-ddev-with-vmware-workstation-pro","title":"Testing DDEV with VMware Workstation Pro","content_html":"<h2>Introduction</h2>\n<p>DDEV works in various environments, and it's often tested in virtual machines, but nested virtualization can be hard to set up and may impact performance.</p>\n<p>In 2024, VMware Workstation Pro <a href=\"https://blogs.vmware.com/cloud-foundation/2024/05/13/vmware-workstation-pro-now-available-free-for-personal-use/\">became free for personal use</a>.</p>\n<p>This guide shows how <a href=\"https://www.vmware.com/\">VMware Workstation Pro</a> can be used to prepare environments for both Windows and Linux, where Docker and DDEV perform well even inside a VM.</p>\n<p><strong>Warning</strong>: Nested virtualization may not work on all systems:</p>\n<blockquote>\n<p>Virtualized Intel VT-x/EPT is not supported on this platform. Continue without virtualized Intel VT-x/EPT? VMware Workstation does not support nested virtualization on this host. Module 'HV' power on failed. Failed to start the virtual machine.</p>\n</blockquote>\n<p>If this occurs, search for known workarounds specific to your hardware and BIOS/UEFI configuration. It worked out of the box for me on Arch-based Linux but did not work for Randy on Windows 11.</p>\n<h2>Installing VMware Workstation Pro</h2>\n<p>Download and install <a href=\"https://knowledge.broadcom.com/external/article/344595/downloading-and-installing-vmware-workst.html\">VMware Workstation Pro</a>. You must click on the link to the terms and conditions to accept them before downloading (checkbox is inactive by default). Packages are available for Windows and Linux.</p>\n<p>On Arch-based systems, install via:</p>\n<pre><code>yay -S vmware-workstation\n</code></pre>\n<p>Initial configuration steps:</p>\n<ul>\n<li>Edit &gt; Preferences &gt; Workspace &gt; Default Location for Virtual Machines - use location with sufficient space</li>\n<li>Edit &gt; Preferences &gt; Hotkeys - remember shortcut to escape the VM, the default is Ctrl+Alt.</li>\n<li>Edit &gt; Preferences &gt; Updates &gt; Configure update behavior</li>\n<li>Check other settings</li>\n</ul>\n<h2>Installing Windows 11</h2>\n<p>Download <a href=\"https://www.microsoft.com/en-us/software-download/windows11\">the Windows 11 Disk Image (ISO) for x64 devices</a>.</p>\n<p>In VMware:</p>\n<ul>\n<li>File &gt; New Virtual Machine &gt; Typical &gt; I will install the operating system later</li>\n<li>Select Windows 10 x64, not Windows 11 x64 (I don't want to use TPM encryption)</li>\n<li>Specify 100 GB disk, stored as a single file</li>\n<li>Customize hardware and finish:<ul>\n<li>Set at least 8GB RAM</li>\n<li>Number of processors: 2, number of cores per processor: 2</li>\n<li>Virtualize Intel VT-x/EPT or AMD-V/RVI (check)</li>\n<li>Virtualize CPU performance counters (check)</li>\n<li>Network Adapter &gt; Connect at power on (uncheck) - to be able to set up a local Windows account and skip Windows updates</li>\n<li>Sound Card &gt; Connect at power on (uncheck) - I don't like any beeps on the first boot, will be turned on later</li>\n<li>USB Controller &gt; Automatically connect new USB devices (uncheck if you don't need USB devices)</li>\n<li>CD/DVD (SATA) &gt; Use ISO image &gt; Browse - select ISO file</li>\n</ul>\n</li>\n</ul>\n<p>To apply additional low-level VM configuration, close VMware itself and use the script below:</p>\n<pre><code>#!/usr/bin/env bash\n\n# This script changes more settings than the GUI allows\n# Tested only on Arch-based Linux\n# Run it from the virtual machine directory\n\nvmx_file=\"$( (find ./*.vmx -maxdepth 1 -type f 2&gt;/dev/null | head -1) || true)\"\n\nif [[ \"${vmx_file}\" == \"\" ]]; then\n    echo &gt;&amp;2 \"Unable to find *.vmx file in the current directory.\"\n    exit 1\nfi\n\n# from https://wiki.archlinux.org/title/VMware\ndeclare -A vmware_configs=(\n    # 3D acceleration\n    [\"mks.gl.allowBlacklistedDrivers\"]=\"TRUE\"\n    # 5 buttons mouse for windows\n    [\"mouse.vusb.enable\"]=\"TRUE\"\n    [\"mouse.vusb.useBasicMouse\"]=\"TRUE\"\n    # disable logging\n    [\"vmx.scoreboard.enabled\"]=\"FALSE\"\n    [\"logging\"]=\"FALSE\"\n    [\"vmx.buildType\"]=\"release\"\n    # paravirtual adapters\n    [\"scsi0.virtualDev\"]=\"pvscsi\"\n    [\"ethernet0.virtualDev\"]=\"vmxnet3\"\n    # performance\n    [\"MemTrimRate\"]=\"0\"\n    [\"mainmem.backing\"]=\"swap\"\n    [\"prefvmx.useRecommendedLockedMemSize\"]=\"TRUE\"\n    [\"MemAllowAutoScaleDown\"]=\"FALSE\"\n    [\"sched.mem.pshare.enable\"]=\"FALSE\"\n    [\"prefvmx.minVmMemPct\"]=\"100\"\n    [\"mainMem.partialLazySave\"]=\"FALSE\"\n    [\"mainMem.partialLazyRestore\"]=\"FALSE\"\n    # config\n    [\"tools.syncTime\"]=\"TRUE\"\n    [\"numvcpus\"]=\"4\"\n    [\"cpuid.coresPerSocket\"]=\"2\"\n    [\"memsize\"]=\"8192\"\n    [\"vhv.enable\"]=\"TRUE\"\n    [\"vpmc.enable\"]=\"TRUE\"\n)\n\nfor key in \"${!vmware_configs[@]}\"; do\n    value=\"${vmware_configs[\"${key}\"]}\"\n    line=\"${key} = \\\"${value}\\\"\"\n\n    if grep -q \"^${key}\" \"${vmx_file}\"; then\n        sed -i \"s/^${key}.*/${line}/\" \"${vmx_file}\"\n    else\n        echo \"${line}\" &gt;&gt; \"${vmx_file}\"\n    fi\ndone\n\necho \"Updated ${vmx_file}\"\n</code></pre>\n<p>Press \"Start up this guest operating system\".</p>\n<p>If Windows 10 was chosen as virtual machine type:</p>\n<ul>\n<li>Wait for the \"Select Image\" screen (where you choose which Windows to install), press Shift+F10 to open <code>cmd</code>, write <code>regedit</code>, open <code>HKEY_LOCAL_MACHINE\\SYSTEM\\Setup</code></li>\n<li>RMB (right mouse button) on Setup &gt; New &gt; Key &gt; write <code>LabConfig</code></li>\n<li>RMB on Values area &gt; New &gt; DWORD (32-bit) Value &gt; write <code>BypassSecureBootCheck</code>, set <code>1</code></li>\n<li>RMB on Values area &gt; New &gt; DWORD (32-bit) Value &gt; write <code>BypassTPMCheck</code>, set <code>1</code>\n</li>\n</ul>\n<p>After the first reboot (installation is not done yet), don't select country in the initial setup:</p>\n<ul>\n<li>Press Shift+F10, enter <code>OOBE\\BYPASSNRO</code> (<code>O</code> letter, not number) directly in <code>cmd</code>. This is needed to force creation of a local account (I don't want to login anywhere here).</li>\n</ul>\n<p>After Windows boots:</p>\n<ul>\n<li>VMware Menu &gt; VM &gt; Install VMware Tools</li>\n<li>Open Explorer, select <code>D:</code> drive with mounted tools, and run <code>setup.exe</code></li>\n<li>Reboot</li>\n</ul>\n<p>Windows configuration:</p>\n<ul>\n<li>Settings &gt; Windows Update &gt; Pause</li>\n<li>Explorer &gt; This PC &gt; View &gt; Show &gt; Filename extensions, Hidden items</li>\n<li>Settings &gt; Home &gt; Rename</li>\n<li>Settings &gt; System &gt; Power &gt; Screen and sleep timeouts &gt; Never</li>\n<li>Settings &gt; System &gt; Sound &gt; More sound settings &gt; Sounds &gt; No Sounds, uncheck \"Play Windows Startup sound\"</li>\n<li>Settings &gt; Personalization &gt; Taskbar &gt; Task View (uncheck), Widgets (uncheck)</li>\n<li>Settings &gt; Personalization &gt; Taskbar &gt; Taskbar behaviors &gt; Taskbar alignment &gt; Left</li>\n</ul>\n<p>Registry configuration:</p>\n<pre><code># Remove recommended applications from the Windows 11 start menu\nreg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\Cloud Content\" /v DisableWindowsConsumerFeatures /t REG_DWORD /d 1 /f\n# Disable automatic update for APPX applications in Microsoft Store\nreg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\WindowsStore\" /v AutoDownload /t REG_DWORD /d 2 /f\n# Disable Meltdown and Spectre fixes that slow down Windows\nreg add \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management\" /v FeatureSettingsOverride /t REG_DWORD /d 3 /f\nreg add \"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management\" /v FeatureSettingsOverrideMask /t REG_DWORD /d 3 /f\n# Mouse cursor on the default button\nreg add \"HKEY_CURRENT_USER\\Control Panel\\Mouse\" /v SnapToDefaultButton /t REG_SZ /d 1 /f\n# Enable developer mode feature\nreg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppModelUnlock\" /t REG_DWORD /v \"AllowDevelopmentWithoutDevLicense\" /d 1 /f\n# Set old right click menu\nreg add \"HKEY_CURRENT_USER\\SOFTWARE\\CLASSES\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\InprocServer32\" /ve /f\n# Restart Windows Explorer\ntaskkill /f /im explorer.exe\nstart explorer.exe\n# disable reserved storage in Windows 11\ndism /Online /Get-ReservedStorageState\ndism /Online /Set-ReservedStorageState /State:Disabled\n</code></pre>\n<p>Shutdown the virtual machine, press \"Edit virtual machine settings\":</p>\n<ul>\n<li>Hardware &gt; Network Adapter &gt; Connect at power on (check)</li>\n<li>Hardware &gt; Sound Card &gt; Connect at power on (check)</li>\n<li>Hardware &gt; USB Controller &gt; Automatically connect new USB devices (check if needed)</li>\n<li>Hardware &gt; CD/DVD (SATA) &gt; Connect at power on (uncheck)</li>\n</ul>\n<p>Press \"Start up this guest operating system\", and run inside Windows:</p>\n<ul>\n<li>Search &gt; Disk Cleanup</li>\n<li>Search &gt; Defragment and Optimize Drives</li>\n</ul>\n<p>At this point, the VM uses more disk space than needed. We can <a href=\"https://wiki.vi-toolkit.com/index.php?title=Shrink_guest_on_hosted_platform\">shrink guest on hosted platform</a>:</p>\n<ul>\n<li><p>Add VMware Tools to PATH, run Terminal as admin:</p>\n<pre><code>cmd /c \"setx /M PATH \"\"C:\\Program Files\\VMware\\VMware Tools;%PATH%\"\"\"\n</code></pre>\n</li>\n<li><p>Restart PowerShell, and run Terminal as admin:</p>\n<pre><code>VMwareToolboxCmd.exe disk shrink c:\\\n</code></pre>\n</li>\n<li><p>Wait until <code>*.vmdk</code> file at virtual machine location will be shrinked.</p>\n</li>\n</ul>\n<p>VMware Menu &gt; VM &gt; Snapshot &gt; Take snapshot.</p>\n<p>Install <a href=\"https://docs.ddev.com/en/stable/users/install/docker-installation/#docker-installation-windows\">Docker</a> and <a href=\"https://docs.ddev.com/en/stable/users/install/ddev-installation/#windows\">DDEV</a>. Create additional snapshots as needed.</p>\n<h2>Installing Linux</h2>\n<p>Follow similar steps as for Windows, using a Linux ISO (e.g. <a href=\"https://ubuntu.com/download/desktop\">Ubuntu</a>).</p>\n<p>Install VMware Tools inside the guest:</p>\n<pre><code># Debian-based:\nsudo apt-get install open-vm-tools-desktop\n# Fedora-based:\nsudo dnf install open-vm-tools-desktop\n# Arch-based:\nsudo pacman -S open-vm-tools\n</code></pre>\n<p>If display resolution is incorrect:</p>\n<pre><code>sudo systemctl restart vmtoolsd.service\n</code></pre>\n<p>If copy/paste from/to the host doesn't work:</p>\n<pre><code>vmware-user\n# or\nvmtoolsd -n vmusr\n</code></pre>\n<p>References:</p>\n<ul>\n<li><a href=\"https://github.com/vmware/open-vm-tools/issues/627\">https://github.com/vmware/open-vm-tools/issues/627</a></li>\n<li><a href=\"https://github.com/vmware/open-vm-tools/issues/568\">https://github.com/vmware/open-vm-tools/issues/568</a></li>\n</ul>\n<p>To configure shared folders inside the guest:</p>\n<pre><code>mkdir -p ~/Shared\necho \"vmhgfs-fuse $HOME/Shared fuse defaults,allow_other 0 0\" | sudo tee -a /etc/fstab\nsudo systemctl daemon-reload\nsudo mount -a\n</code></pre>\n<p><a href=\"https://wiki.vi-toolkit.com/index.php?title=Shrink_guest_on_hosted_platform\">Shrink Linux VM disk</a>, take a snapshot, then proceed with installing <a href=\"https://docs.ddev.com/en/stable/users/install/docker-installation/#docker-installation-linux\">Docker</a> and <a href=\"https://docs.ddev.com/en/stable/users/install/ddev-installation/#ddev-installation-linux\">DDEV</a>. Create additional snapshots as needed.</p>\n<h2>How Do You Test DDEV?</h2>\n<p>If you use a different setup that performs well, consider contributing a guest post to <a href=\"/\">ddev.com</a> or sharing your findings.</p>\n"},{"id":"https://ddev.com/blog/ddev-july-2025-newsletter","url":"https://ddev.com/blog/ddev-july-2025-newsletter","title":"DDEV July 2025 Newsletter","content_html":"<p><strong>Welcome to the July 2025 DDEV Newsletter</strong><br />This month: Downgrading Terminus for old PHP, FrankenPHP, Advisory Group meeting and Governance proposal, Shopware Storefront and Admin Watchers, Writing your first Drupal 10 Functional Test, and more.</p>\n<hr />\n<h2>What’s New</h2>\n<ul>\n<li><strong>How to Downgrade Terminus in DDEV's Web Container and Customize Other Bundled Tools</strong><br />A guest blog by Bill Seremetis explaining the problem with an old PHP version and Pantheon's Terminus, and how to fix it. → <a href=\"ddev-bundled-tools-using-custom-versions.md\">Read more↗</a></li>\n<li><strong>Experimenting with FrankenPHP in DDEV</strong><br />Stas Zhuk explains two ways to use <a href=\"https://frankenphp.org/\">FrankenPHP</a> in DDEV. → <a href=\"using-frankenphp-with-ddev.md\">Read more↗</a></li>\n<li><strong>July 2025 DDEV Advisory Group Meeting</strong> meeting notes and recording! → <a href=\"https://github.com/orgs/ddev/discussions/7373\">Read more↗</a>.</li>\n</ul>\n<h2>Community Tutorials</h2>\n<ul>\n<li><strong>From DevOps Headaches to Seamless Onboarding: How Dropping Chocolatey Made DDEV the Perfect Fit for a Client's Drupal Team</strong> → <a href=\"https://colan.pro/blog/dropping-chocolatey-for-ddev-on-windows-drupal-development/\">Read more↗</a></li>\n<li><strong>Shopware Storefront and Admin Watchers with DDEV</strong> → <a href=\"https://notebook.vanwittlaer.de/ddev-for-shopware/storefront-and-admin-watchers-with-ddev\">Read more↗</a></li>\n<li><strong>How to Write Your First Functional Test in Drupal 10</strong> → <a href=\"https://eduardotelaya.com/blog/technology/2025-05-26-how-to-write-your-first-functional-test-in-drupal-10/\">Read more↗</a></li>\n</ul>\n<h2>Governance &amp; Roadmap</h2>\n<ul>\n<li><strong>Apache Foundation-inspired Project Management Committee Exploration</strong><br />See a proposed early update to the DDEV Foundation's Articles of Incorporation, aiming us at governance like the Backdrop CMS folks have → <a href=\"https://docs.google.com/document/d/1MXatsz2FMBSnllnUArNCv562x0T2-EF1OwqsFEU9_-M/edit?usp=sharing\">Details↗</a></li>\n</ul>\n<hr />\n<h2>Sponsorship Status</h2>\n<ul>\n<li><strong>Monthly average income</strong> down slightly from $7,809 to $7,759 (65% of $12,000 goal). Every contribution helps sustain our work—thank you! → <a href=\"https://github.com/sponsors/ddev\">Become a sponsor↗</a></li>\n</ul>\n<h2>Stay in the loop—follow us and join the conversation</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n"},{"id":"https://ddev.com/blog/using-frankenphp-with-ddev","url":"https://ddev.com/blog/using-frankenphp-with-ddev","title":"Using FrankenPHP with DDEV","content_html":"<h2>Introduction</h2>\n<p>The PHP ecosystem is changing fast, with tools like <a href=\"https://frankenphp.dev\">FrankenPHP</a> improving both performance and developer experience.</p>\n<p>FrankenPHP is now <a href=\"https://thephp.foundation/blog/2025/05/15/frankenphp/\">officially supported</a> by The PHP Foundation.</p>\n<p>This guide explains how FrankenPHP can be used with DDEV using <a href=\"https://github.com/ddev/ddev-frankenphp\">ddev/ddev-frankenphp</a> add-on.</p>\n<h3>Generic web server</h3>\n<p>This blog shows an example of the recently added <a href=\"https://docs.ddev.com/en/stable/users/extend/customization-extendibility/#using-nodejs-as-ddevs-primary-web-server\">DDEV's generic web server</a>, which supports flexible configurations. It allows you to use any custom web server you want, including Node.js, Python, Ruby, etc.</p>\n<h2>DDEV FrankenPHP Add-on</h2>\n<p>The <a href=\"https://github.com/ddev/ddev-frankenphp\">ddev/ddev-frankenphp</a> add-on is now officially maintained by the DDEV team! It has matured to production-ready status with full feature support.</p>\n<h3>⚙️ Installation:</h3>\n<pre><code>ddev add-on get ddev/ddev-frankenphp\nddev restart\n</code></pre>\n<p>Install pre-packaged extensions using the <code>php-zts-</code> prefix (see <a href=\"https://pkg.henderkes.com/84/php-zts/packages?type=debian\">supported extensions</a>):</p>\n<pre><code># install mongodb and sqlsrv extensions\nddev config --webimage-extra-packages=\"php-zts-mongodb,php-zts-sqlsrv\"\nddev restart\n</code></pre>\n<h3>✨ Features:</h3>\n<ul>\n<li>Supports PHP 8.2+</li>\n<li>Install any PHP extension (Redis, Xdebug, Memcached, etc.)</li>\n<li>Custom FrankenPHP options supported</li>\n<li>Worker mode supported for maximum performance</li>\n<li>Full debugging support: <a href=\"https://docs.ddev.com/en/stable/users/usage/commands/#blackfire\"><code>ddev blackfire</code></a>, <a href=\"https://docs.ddev.com/en/stable/users/usage/commands/#xdebug\"><code>ddev xdebug</code></a>, <a href=\"https://docs.ddev.com/en/stable/users/usage/commands/#xhprof\"><code>ddev xhprof</code></a>, <a href=\"https://docs.ddev.com/en/stable/users/usage/commands/#xhgui\"><code>ddev xhgui</code></a></li>\n</ul>\n<p>If you want to suggest some feature or found a bug, feel free to <a href=\"https://github.com/ddev/ddev-frankenphp/issues\">open an issue</a>.</p>\n<h2>Resources</h2>\n<ul>\n<li><a href=\"https://frankenphp.dev/docs/\">FrankenPHP documentation</a></li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/extend/customization-extendibility/#using-nodejs-as-ddevs-primary-web-server\">DDEV's generic web server</a></li>\n<li><a href=\"https://github.com/ddev/ddev-frankenphp\">FrankenPHP add-on</a></li>\n<li><a href=\"https://debs.henderkes.com/\">FrankenPHP Static PHP Package Repository</a></li>\n<li><a href=\"https://medium.com/beyn-technology/hola-frankenphp-laravel-octane-servers-comparison-pushing-the-boundaries-of-performance-d3e7ad8e652c\">Hola FrankenPHP! Laravel Octane Servers Comparison: Pushing the Boundaries of Performance</a></li>\n</ul>\n<h2>Benchmarking</h2>\n<p>Using <a href=\"https://github.com/stasadev/ddev-frankenphp-benchmark\">ddev-frankenphp-benchmark</a>, I compared three setups:</p>\n<ul>\n<li><code>nginx-fpm</code>: DDEV's <code>nginx-fpm</code> web server with <code>php-fpm</code></li>\n<li><code>frankenphp</code>: DDEV's <code>generic</code> web server with <code>frankenphp</code></li>\n<li><code>apache-fpm</code>: DDEV's <code>apache-fpm</code> web server with <code>php-fpm</code></li>\n</ul>\n<p>Summary:</p>\n<ul>\n<li>All configurations delivered comparable and adequate performance.</li>\n<li>FrankenPHP is a win where there is an upstream hosting environment using FrankenPHP.</li>\n<li>Benchmarks used default DDEV settings, not production-optimized configurations.</li>\n<li>Laravel Octane (FrankenPHP worker mode) was not used and could yield better results.</li>\n<li>CPU and memory usage were not measured.</li>\n</ul>\n<h3>Benchmarking Results</h3>\n<p><b>Software:</b><br />\nDDEV: v1.24.10<br />\nMutagen: disabled<br />\nPHP: v8.4<br />\nLaravel: v12.44.0<br />\nFrankenPHP: v1.11.1<br />\nDocker Engine: v29.1.3<br />\nOperating System: Manjaro Linux AMD64<br />\nKernel Version: 6.12.63-1-MANJARO</p>\n<p><b>Hardware:</b><br />\nIntel i7 8750H (6 Core/12 Thread, 2.2 Ghz, Turbo 4.1 Ghz)<br />\n32 GB DDR4 2667 Mhz<br />\nSamsung 870 Evo SSD (530w/560r MB/s)</p>\n<p></p>\n<p></p>\n<p></p>\n<p></p>\n<p></p>\n<p></p>\n<p>If you find DDEV (and its add-ons like FrankenPHP) useful, consider <a href=\"/support-ddev/#sponsor-development\">supporting its development</a>. Thank you!</p>\n"},{"id":"https://ddev.com/blog/ddev-bundled-tools-using-custom-versions","url":"https://ddev.com/blog/ddev-bundled-tools-using-custom-versions","title":"How to Downgrade Terminus in DDEV's Web Container and Customize Other Bundled Tools","content_html":"<p><em>This guest post is by DDEV community member and <a href=\"https://drupal.org\">Drupal</a>\ncontributor <a href=\"/blog/author/bill-seremetis/\">Bill Seremetis</a> and sponsored by\n<a href=\"https://www.annertech.com\">Annertech</a>.</em></p>\n<p>DDEV comes bundled with a predefined set of tools, Pantheon's <code>terminus</code> being one of them.\nThe latest releases of <code>terminus</code> are not compatible with older PHP versions like PHP 8.1, though,\nso we needed to downgrade it inside DDEV's <code>ddev-webserver</code> Docker image.</p>\n<p>This guide covers how to downgrade <code>terminus</code> and will also explain how to use the same technique to install\nadditional custom tools.</p>\n<p>Please note there are many ways to install packages in a container. We will\ncover <a href=\"https://docs.ddev.com/en/stable/users/extend/customizing-images/#adding-extra-dockerfiles-for-webimage-and-dbimage\">extra Dockerfiles</a>\nhere, but also <a href=\"https://docs.ddev.com/en/stable/users/extend/customizing-images/#adding-extra-debian-packages-with-webimage_extra_packages-and-dbimage_extra_packages\">check <code>webimage_extra_packages</code> and <code>dbimage_extra_packages</code> in your\n<code>config.yaml</code>for more details</a>).</p>\n<h2>Case study: Manually Downgrading Terminus</h2>\n<p><a href=\"https://github.com/pantheon-systems/terminus/releases\">Terminus</a> dropped\nsupport for PHP 8.1 in recent versions, but some of our\nprojects still use PHP 8.1. We had to downgrade the DDEV-bundled version of <code>terminus</code> for those\nprojects by using a custom Dockerfile:</p>\n<pre><code># .ddev/web-build/Dockerfile.terminus\n# Terminus 4 drops support for PHP 8.1 which we still need\nARG TERMINUS_VERSION=\"3.6.2\"\nRUN curl -L --fail -o /usr/local/bin/terminus https://github.com/pantheon-systems/terminus/releases/download/${TERMINUS_VERSION}/terminus.phar &amp;&amp; chmod +x /usr/local/bin/terminus\n</code></pre>\n<p><code>terminus</code> is just an example here, it could be any command you wish,\n<a href=\"https://github.com/pantheon-systems/terminus/releases/tag/4.0.0\">either because you are running an older PHP version</a>\nor the bundled version <a href=\"https://github.com/platformsh/cli/discussions/166\">has a bug that ruins things for you</a>.</p>\n<h2>Installing custom tools</h2>\n<p>You can obviously use the same techniques to install a variety of custom tools:</p>\n<pre><code># .ddev/web-build/Dockerfile.fzf\n# fooscript relies on fzf\n# fooscript lists all your Pantheon projects using a fuzzy finder list\nARG FZF_VERSION=\"0.62.0\"\nRUN curl -s -L https://github.com/junegunn/fzf/releases/download/v${FZF_VERSION}/fzf-${FZF_VERSION}-linux_amd64.tar.gz | tar xvz -C /usr/local/bin/ &amp;&amp; chmod +x /usr/local/bin/fzf\n</code></pre>\n<h2>Resources</h2>\n<ul>\n<li><a href=\"https://docs.ddev.com/en/stable/users/providers/pantheon/\">DDEV Pantheon integration documentation</a></li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/extend/customizing-images/#adding-extra-dockerfiles-for-webimage-and-dbimage\">Adding extra Dockerfiles for <code>webimage</code> and <code>dbimage</code></a></li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/extend/customizing-images/#adding-extra-debian-packages-with-webimage_extra_packages-and-dbimage_extra_packages\">Adding extra Debian packages in DDEV</a></li>\n<li><a href=\"https://ddev.com/blog/customizing-ddev-local-images-with-a-custom-dockerfile/\">Customizing DDEV images with a custom Dockerfile</a></li>\n</ul>\n<h2>Contribute to DDEV</h2>\n<p>If you like DDEV then you are welcome to contribute! You can join the <a href=\"/s/discord\">Discord channel</a>,\ncreate a new <a href=\"https://docs.ddev.com/en/stable/users/extend/additional-services/\">DDEV Add-on</a>,\nor blog about how you use DDEV in your daily workflow.\nWe’re always happy to hear from you on any of our <a href=\"https://docs.ddev.com/en/stable/users/support/\">support channels</a>.</p>\n"},{"id":"https://ddev.com/blog/ddev-june-2025-newsletter","url":"https://ddev.com/blog/ddev-june-2025-newsletter","title":"DDEV June 2025 Newsletter","content_html":"<p><strong>Welcome to the June 2025 DDEV Newsletter</strong><br />This month: TYPO3 Community Budget Proposal (<strong>VOTE NOW</strong>), Randy is back from bikepacking, Running Old PHP versions, Vite and DDEV with WordPress, DDEV Architecture, and more.</p>\n<hr />\n<h2>TYPO3: Your Vote Requested Before June 16!</h2>\n<ul>\n<li><strong>Q3 TYPO3 Budget Proposal: Improved GitHub Codespaces and Dev Containers support</strong> - We’ve proposed significant enhancements to make DDEV shine in GitHub Codespaces and Dev Containers. This will help TYPO3 and all DDEV users. If you're a TYPO3 member, please <a href=\"https://typo3.org/article/budget-2025-ideas-for-quarter-3-2025-published-vote-now\">cast your vote to help the DDEV proposal</a> using the email you received from the TYPO3 Foundation <strong>before June 16</strong>. → <a href=\"https://github.com/ddev/ddev/issues/7294\">Read more↗</a></li>\n</ul>\n<h2>What’s New</h2>\n<ul>\n<li><strong>Randy is back from bikepacking!</strong><br />We covered <a href=\"https://facebook.com/randyfay\">lots of territory out in the state of New Mexico</a> and had a great time. I'll never forget though, laying in my tent when we had some coverage and watching the DDEV community continue on supporting each other so very successfully. And every support answer from Stas was exactly what I would have said. I'm proud and amazed by this wonderful community.</li>\n<li><strong>Using DDEV to Spin Up A Legacy PHP Application</strong><br />A guest blog by TYPO3 contributor Garvin Hickling on how to use DDEV to run a (very) old PHP 5.3/MySQL 5.5 application → <a href=\"https://ddev.com/blog/legacy-projects-with-unsupported-php-and-mysql-using-ddev\">Read more↗</a></li>\n<li><strong>Securing DDEV’s Future: Our Commitment to Financial &amp; Community Sustainability</strong> <a href=\"https://ddev.com/blog/sustainability-for-ddev/\">Read more↗</a></li>\n<li><strong>106 GitHub Sponsors</strong><br />We now have 106 GitHub Sponsors! Breaking our aggregation script was a delightful milestone—thank you for believing in DDEV.</li>\n<li><strong>May 2025 Advisory Group Meeting Notes</strong> → <a href=\"https://github.com/orgs/ddev/discussions/7223\">Read more↗</a>. Join us July 2; ask for a calendar invitation in the <a href=\"https://ddev.com/s/discord\">DDEV Discord</a> or the <a href=\"/contact\">contact page</a>.</li>\n</ul>\n<h2>Community Tutorials</h2>\n<ul>\n<li><strong>Integrating Vite and DDEV into WordPress</strong> → <a href=\"https://www.viget.com/articles/integrating-vite-and-ddev-into-wordpress/\">Read more↗</a></li>\n<li><strong>AI-generated DDEV Architecture by DeepWiki</strong>, pretty impressive! → <a href=\"https://deepwiki.com/ddev/ddev\">Read more↗</a></li>\n<li><strong>Setup an existing WordPress multisite locally with DDEV (with Bonus Pantheon support!)</strong> from Kalamuna → <a href=\"https://www.kalamuna.com/blog/setup-existing-wordpress-multisite-locally-ddev-bonus-pantheon-support\">Read more↗</a></li>\n</ul>\n<h2>Governance &amp; Roadmap</h2>\n<ul>\n<li><strong>Apache Foundation-inspired Project Management Committee Exploration</strong><br />We’re exploring a governance model inspired by the Apache Foundation and Backdrop CMS to better support long-term sustainability and shared leadership. Take a look and join the conversation about future DDEV governance → <a href=\"https://github.com/orgs/ddev/discussions/7293\">Details↗</a></li>\n</ul>\n<hr />\n<h2>Sponsorship Status</h2>\n<ul>\n<li><strong>Monthly average income</strong> up from $7,639 to $7,809 (65% of $12,000 goal, up a percent since early May!). Every contribution helps sustain our work—thank you! → <a href=\"https://github.com/sponsors/ddev\">Become a sponsor↗</a></li>\n</ul>\n<h2>Stay in the loop—follow us and join the conversation</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n"},{"id":"https://ddev.com/blog/sustainability-for-ddev","url":"https://ddev.com/blog/sustainability-for-ddev","title":"Securing DDEV’s Future: Our Commitment to Financial & Community Sustainability","content_html":"<p>Over the last nine years DDEV has grown from a tiny side project to a development environment and ecosystem that serves <a href=\"stats-on-ddev-usage-nov-2024.md\">about 17,000 weekly developer-users</a> and is critical to so many developers' workflows.</p>\n<p>We love this amazing open-source world that we're a part of. It's astonishing when communities can <a href=\"open-source-for-the-win.md\">work together</a> and of course the fact that we all stand on the shoulders of such giants like Linux, Debian, and hundreds of other projects.</p>\n<h2>What Happens When a Community Loses its Maintainer?</h2>\n<p>What happens when a great project loses a key maintainer? A couple of years ago Bram Moolenaar, the maintainer of the Vim editor, <a href=\"https://thenewstack.io/bram-moolenaar-author-of-the-open-source-vim-code-editor-has-died/\">passed away unexpectedly</a>. Every project faces unexpected transitions, whether a maintainer steps back, changes focus, or, as happened with Bram, passes away. The <a href=\"https://thenewstack.io/vim-after-bram-a-core-maintainer-on-how-theyve-kept-it-going/\">Vim community did step up successfully</a>, but that's not the only outcome possible for so many small projects.</p>\n<p>What can we learn from Vim's experience, and how is DDEV positioned in comparison?</p>\n<p>One thing that the Vim community discovered was that Bram's work was truly a full-time job, even with their incredible and active community.</p>\n<p>Many people may think that DDEV is just a tiny project that could carry on without its maintainers, but that might not be true. Right now support, maintenance, and improvements for DDEV use the full-time and consistent effort of two full-time maintainers. That's why you get the level of support and responsiveness you do. Both maintainers are currently paid, but perhaps not at a salary level that you would accept.</p>\n<h2>The Good Stuff</h2>\n<ul>\n<li><strong>Distributed controls</strong>: DDEV has two main leaders, Randy Fay and Stas Zhuk, who both have full control of the GitHub <code>ddev</code> organization, and a couple of other people also have full administrative privileges. This is good; we're not dependent on one person. Both of us are fully trained and capable on all of the technologies and infrastructures used in DDEV's testing and release environments. (We would like to have more full-trained maintainers, unpaid or paid. If you love DDEV, come and join us and we'll train you.)</li>\n<li><strong>Financial Organization</strong>: DDEV has its own fiscal organization, the <a href=\"/foundation\">DDEV Foundation</a>, which is a US 501(c)(3) tax-exempt entity. The organization has its own bank account, and Randy and long-term collaborator <a href=\"https://www.drupaleasy.com/users/ultimike\">Mike Anello</a> are signers on the account, so it's not dependent on a single person.</li>\n<li><strong>Financial Reporting</strong>: DDEV does track and provide <a href=\"https://github.com/orgs/ddev/discussions/categories/ddev-advisory-group\">financial reports</a> at each Advisory Group meeting.</li>\n<li><strong>Control of Communications</strong>: Both maintainers have full control of our social media accounts and Discord.</li>\n<li><strong>Passwords and Other Secrets</strong>: We use a group 1Password setup to manage all of our secrets, so they're not known to just one maintainer.</li>\n<li><strong>Accounts management</strong>: Thanks to great advice from Advisory Group member <a href=\"https://www.drupal.org/u/deviantintegral\">Andrew Berry</a> and thanks to having a free Google Workspace account (for nonprofits) we are able to use Google Groups for key email addresses, and current maintainers can be added to those groups. That way changes to maintainership don't result in loss of access to key external accounts.</li>\n</ul>\n<p>Vim had serious challenges in all these areas, as there was only one \"owner\" of the GitHub project, and financial setups were very much ad-hoc. Bram was truly the \"owner\" of the whole project.</p>\n<h2>Areas to Improve</h2>\n<p>We work hard to identify areas that are dependent on a single maintainer, and to resolve those. But it's a perpetual process!</p>\n<ul>\n<li><strong>Governance</strong>: From the beginning of DDEV, Randy has been the leader, acting as what's commonly called a \"Benevolent Dictator for Life\", or \"BDFL\". While that's a common model in open source, it's not a great model for overall sustainability. The BDFL model means that leadership can be concentrated in one person, preventing the development of community decision-making capabilities. One of our key goals for 2025 is to at least <em>start</em> moving past that model.</li>\n<li><strong>Regulatory</strong>: Randy has dealt with Colorado and US regulatory requirements, including getting the 501(c)(3) tax-exempt designation, changing the name of the organization to \"DDEV Foundation\", filing annual reports.</li>\n<li><strong>Finance and Reporting</strong>: Randy does the bimonthly financial reporting, tracks invoices, corresponds with donors, sends thank-you notes to donors, pays maintainers.</li>\n<li><strong>Promotion/Marketing</strong>: Randy seems to keep these roles year-in and year-out despite attempts to spread out the work</li>\n<li><strong>Test Runner Maintenance</strong>: Although Stas knows everything and has full access to our extensive test runner infrastructure, many of the runners are in Randy's house, and when something has to be done physically to them, it becomes Randy's problem.</li>\n</ul>\n<h2>What Comes Next?</h2>\n<ul>\n<li><strong>Improved Marketing/Monetization</strong>: As discussed above, open-source projects generally have a hard time asking for money because people take them for granted. We do hope to move toward adding premium features and premium support options that will encourage organizations and individuals to step up to the plate and do their fair share of support.</li>\n<li><strong>Financial</strong>: More than one person should know how to do (and have power to do) all the financial things, like paying contributors and other bills.</li>\n<li><strong>Governance</strong>: Figure out how to move from BDFL to something that lasts beyond one person. A <a href=\"https://github.com/orgs/ddev/discussions/7293\">proposal</a> is in progress.</li>\n<li><strong>Write up regulatory and financial tasks</strong>: We have a good set of documents and a private repository that explain maintainer tasks. This all needs to be done for governance, regulatory, financial, and marketing tasks.</li>\n<li><strong>You</strong>: DDEV is a collaborative open-source project. Are you interested in a role?</li>\n</ul>\n<h2>Current Financial Status</h2>\n<p>As of June, 2025, DDEV's monthly support is at the $7800 USD level. Our goal is $12,000. You can see this at any time on the top of <a href=\"/\">ddev.com</a>, and a full accounting updated daily is in the <a href=\"https://github.com/ddev/sponsorship-data/\">sponsorship-data</a> repository. Our current bank balance is about $19,000 USD.</p>\n<h2>Share Your Thoughts!</h2>\n<p>Do you have additional ideas, suggestions, or insight into how DDEV's future could be more sustainable? We would sure love to <a href=\"/contact\">hear from you</a>! Or get active and join our <a href=\"https://github.com/orgs/ddev/discussions/categories/ddev-advisory-group\">DDEV Advisory Group</a>.</p>\n<p>Do you have questions or want to talk (about sponsoring or anything else)? <a href=\"https://ddev.com/contact/\">Contact us!</a> or join us in <a href=\"/s/discord\">Discord</a>.</p>\n<p><em>Have you signed up for the monthly <a href=\"/newsletter\">DDEV Newsletter</a>? We'd love to have you.</em></p>\n"},{"id":"https://ddev.com/blog/legacy-projects-with-unsupported-php-and-mysql-using-ddev","url":"https://ddev.com/blog/legacy-projects-with-unsupported-php-and-mysql-using-ddev","title":"Using DDEV to spin up a legacy PHP application","content_html":"<p><em>This guest post is by DDEV community member and <a href=\"https://typo3.org\">TYPO3</a> contributor <a href=\"/blog/author/garvin-hicking/\">Garvin Hicking</a>.</em></p>\n<p>In my daily work, I develop <a href=\"https://typo3.org\">TYPO3</a>-based projects and also contribute to the TYPO3 CMS OpenSource project itself.</p>\n<p>Usually this means working with actively supported and up-to-date PHP versions as well as database systems like MySQL/PostgreSQL/MariaDB.</p>\n<p>Just recently I had to migrate a very outdated project: TYPO3 4.5, which utilized MySQL 5.5 and PHP 5.3. When that project was initially developed, it was done with XAMPP and later Vagrant-based VMs. This has been long superseded with using Docker and specifically DDEV for ease-of-use.</p>\n<p>So naturally I wanted to be able to use DDEV for the legacy project to get it working just as it is running on the (outdated) hosting provider's shared web servers.</p>\n<p>I quickly faced three major issues:</p>\n<ul>\n<li>No PHP 5.3 out-of-the-box support from DDEV; it starts with 5.6 as of the time of this writing</li>\n<li>No MySQL 5.5 ARM64 support either; it starts with 5.7</li>\n<li>Additionally, I use an Apple MacBook Pro M1 with ARM-chipset, which has no \"official\" MySQL 5.5 support</li>\n</ul>\n<p>Thanks to the outstanding DDEV support on Discord, I was quickly able to find a way with minimal effort, just by creating very small custom, additional docker-compose YAML files.</p>\n<p>One advantage (of many) of using DDEV instead the underlying Docker Compose is that so many things are pre-configured and \"just work\". So I really did not want to migrate everything to Docker Compose on my own, do my custom routing, PHP-FPM integration and whatnot.</p>\n<p>Just being able to \"bait and switch\" the PHP and DB container with a different base Docker image was all that was needed for me:</p>\n<h2>Step 1: Base config</h2>\n<p>I created the base <code>~/legacyphp/.ddev/config.yaml</code> file manually inside my <code>~/legacyphp</code> project directory, setting <code>legacyphp</code> as the project name.</p>\n<p>Note that I configured PHP and MySQL versions that are supported by DDEV for this first:</p>\n<pre><code>name: legacyphp\ntype: php\ndocroot: htdocs\nphp_version: \"8.3\"\nwebserver_type: apache-fpm\ndatabase:\n  type: mysql\n  version: \"8.0\"\n</code></pre>\n<h2>Step 2: Rewire DB</h2>\n<p>Next I created the very small file <code>~/legacyphp/.ddev/docker-compose.db.yaml</code> in the same directory next to <code>config.yaml</code>:</p>\n<pre><code>services:\n  db:\n    platform: linux/amd64\n    build:\n      args:\n        BASE_IMAGE: ddev/ddev-dbserver-mysql-5.5:v1.24.6\n    entrypoint:\n      - sh\n      - -c\n      - |\n        cp /docker-entrypoint.sh ~/docker-entrypoint.sh\n        sed -i '157s|.*|if false; then|' ~/docker-entrypoint.sh\n        sed -i '175s|.*|echo mysql_8.0 &gt;/var/lib/mysql/db_mariadb_version.txt|' ~/docker-entrypoint.sh\n        exec ~/docker-entrypoint.sh\n</code></pre>\n<p>Three things are noteworthy:</p>\n<ul>\n<li>Setting <code>linux/amd64</code> as the platform will require Rosetta to be available on the macOS ARM64 platform</li>\n<li>The <code>BASE_IMAGE</code> is set to a DDEV <code>db</code> container of legacy Docker images that are still provided.</li>\n<li>Changing the <code>entrypoint</code> is a workaround to prevent DDEV complaining about a mismatching MySQL version after restarting the project. The small script \"tricks\" the DDEV inspection into believing, the version matches the one configured in <code>.ddev/config.yaml</code>.</li>\n</ul>\n<h2>Step 3: Rewire PHP</h2>\n<p>Using a different PHP version is just a few lines more work, because we are not replacing the whole <code>web</code> container of DDEV. Instead, we add an additional PHP container which is executed from the web container via port 9000.</p>\n<p>This is done via the file <code>~/legacyphp/.ddev/docker-compose.php.yaml</code>:</p>\n<pre><code>services:\n  php:\n    container_name: ddev-${DDEV_SITENAME}-php\n    image: devilbox/php-fpm:5.3-work\n    restart: \"no\"\n    expose:\n      - 9000\n    labels:\n      com.ddev.site-name: ${DDEV_SITENAME}\n      com.ddev.approot: ${DDEV_APPROOT}\n    working_dir: /var/www/html\n    volumes:\n      - \"../:/var/www/html\"\n      - \".:/mnt/ddev_config:ro\"\n      - ddev-global-cache:/mnt/ddev-global-cache\n      - \"./php:/etc/php-custom.d\"\n    environment:\n      - NEW_UID=${DDEV_UID}\n      - NEW_GID=${DDEV_GID}\n      - DDEV_PHP_VERSION\n      - IS_DDEV_PROJECT=true\n  web:\n    depends_on:\n      - php\n</code></pre>\n<p>Note here that we use <code>devilbox/php-fpm</code> with our needed version, and a bind-mount takes care the PHP container can access our main project root directory.</p>\n<p>A special mount of <code>~/legacyphp/.ddev/php/</code> is included so that we can control the <code>php.ini</code> configuration, if needed. For example you could disable the OPCache+APC in case you're doing some legacy benchmarking that should not be falsified via caching, I created a very small file <code>~/legacyphp/.ddev/php/php.ini</code> file with the contents:</p>\n<pre><code># This is an example.\n# apc.enabled=Off\n# opcache.enable=Off\n</code></pre>\n<h2>Step 4: Utilize the PHP container with an Apache proxy</h2>\n<p>To execute PHP with our external PHP Docker image, I created the following file in <code>~/legacyphp/.ddev/apache/apache-site.conf</code>:</p>\n<pre><code>&lt;VirtualHost *:80&gt;\n    RewriteEngine On\n    RewriteCond %{HTTP:X-Forwarded-Proto} =https\n    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d\n    RewriteRule ^(.+[^/])$ https://%{HTTP_HOST}$1/ [redirect,last]\n    SetEnvIf X-Forwarded-Proto \"https\" HTTPS=on\n\n    Alias \"/phpstatus\" \"/var/www/phpstatus.php\"\n    DocumentRoot /var/www/html/htdocs\n    &lt;Directory \"/var/www/html/htdocs\"&gt;\n      AllowOverride All\n      Allow from All\n    &lt;/Directory&gt;\n\n    CustomLog /var/log/apache2/access.log combined\n    ProxyFCGIBackendType GENERIC\n    ProxyPassMatch ^/(.*\\.php(/.*)?)$ fcgi://php:9000/var/www/html/htdocs/$1\n    DirectoryIndex /index.php index.php\n&lt;/VirtualHost&gt;\n</code></pre>\n<p>Note that if your document root is not <code>htdocs</code> you would need to adapt this name to your liking (like <code>public</code> or <code>wwwroot</code> or anything) in all occurrences of this file.</p>\n<h2>Step 5: Lift-Off</h2>\n<p>Now you can execute <code>ddev start</code> and then <code>ddev launch</code> to see your project up and running.</p>\n<p>You could create a simple <code>~/legacyphp/htdocs/index.php</code> file with <code>&lt;?php phpinfo(); ?&gt;</code> to verify the version.</p>\n<p>Using <code>ddev mysql</code> will connect you to the MySQL 5.5 instance:</p>\n<pre><code>~/legacyphp&gt; ddev mysql\nWelcome to the MySQL monitor.  Commands end with ; or \\g.\nYour MySQL connection id is 5\nServer version: 5.5.62-log MySQL Community Server (GPL)\n</code></pre>\n<h2>Caveats</h2>\n<p>You can enter the PHP Docker container with a command like <code>docker exec -it -u devilbox ddev-legacyphp-php bash</code> if you need/want to execute PHP commands on shell-level, because the regular <code>web</code> container will run with the more recent PHP 8.3 version.\nSo if you need to perform composer CLI calls, be sure to do this within the matching PHP container.</p>\n<p>Another thing to pay attention to is that if you for example want to utilize Mailpit with TYPO3's mail configuration, you can not use <code>localhost:1025</code> as an SMTP server. <code>localhost</code> in PHP's case will be that devilbox PHP container, and not the DDEV web container. Instead you need to setup <code>web:1025</code> as the hostname.</p>\n<p>The devilbox PHP config has pretty much all available PHP extensions set up to use, but if you need specific imagemagick or other tools, you will have to either ensure these are executed on the <code>web</code> container, or make them available with customization of a different base Docker container that you can build yourself.</p>\n<p>If you want to use Xdebug with this setup, you'll need to do more internal port forwarding in the docker-compose setup, which is beyond the scope of this article.</p>\n<h2>Closing words</h2>\n<p>Having shown you what is possible, I hope you will never need to use it, and you will always use well-supported and current software. :-)</p>\n<p>Thanks so much to the DDEV project for getting me across the finish line with just very little effort!</p>\n"},{"id":"https://ddev.com/blog/ddev-may-2025-newsletter","url":"https://ddev.com/blog/ddev-may-2025-newsletter","title":"DDEV May 2025 Newsletter","content_html":"<p><strong>Welcome to the May 2025 DDEV Newsletter</strong><br />This month: special-networking guides, add-on maintenance tips, community tool highlights, and Randy’s bikepacking plans.</p>\n<hr />\n<h2>What’s New</h2>\n<ul>\n<li><strong>Special Network Configurations</strong><br />Handling packet-inspection VPNs (Zscaler, GlobalProtect) → <a href=\"https://docs.ddev.com/en/stable/users/usage/networking/\">Read more↗</a></li>\n<li><strong>Add-On Maintenance Guide</strong> by @stasadev → <a href=\"https://ddev.com/blog/ddev-add-on-maintenance-guide\">Read more↗</a></li>\n<li><strong>AMD64 on Apple Silicon</strong> → <a href=\"https://ddev.com/blog/amd64-with-rosetta-on-macos/\">Read more↗</a></li>\n</ul>\n<h2>Community Tutorials</h2>\n<ul>\n<li><strong>Drupal Modern Tooling</strong> by Andrey Yurtaev → <a href=\"https://iamdroid.net/blog/dev-tools\">Read more↗</a></li>\n<li><strong>VS Code in DDEV Web Container</strong> by Michael Anello → <a href=\"https://www.drupaleasy.com/blogs/ultimike/2025/04/drupal-development-using-visual-studio-code-connected-directly-ddevs-web\">Read more↗</a></li>\n<li><strong>TYPO3 in 8 Steps</strong> → <a href=\"https://t3planet.de/blog/install-typo3-with-ddev/\">Read more↗</a></li>\n</ul>\n<h2>Events &amp; Talks</h2>\n<ul>\n<li><strong>Drupal4Gov</strong>: “Divide and Conquer: A Systematic Approach to Troubleshooting” → <a href=\"https://www.youtube.com/watch?v=zliDmAUBwrQ\">Watch on YouTube↗</a></li>\n<li><strong>Backdrop Live</strong>: migrating from Lando to DDEV (not recorded)</li>\n</ul>\n<h2>Governance &amp; Roadmap</h2>\n<ul>\n<li><strong>Apache-style PMC Exploration</strong><br />We'll be exploring an Apache-style \"Project Management Committee\" model for DDEV governance → <a href=\"https://www.apache.org/foundation/governance/pmcs\">Details↗</a></li>\n</ul>\n<h2>Your Input Requested!</h2>\n<ul>\n<li><strong>Q3 TYPO3 Budget Ideas</strong> - We'd like to propose something useful to all and also attractive to the TYPO3 Community for the <a href=\"https://typo3.org/article/call-for-community-budget-ideas-q3-2025\">TYPO3 Q3 Call for Community Budget Ideas↗</a>. Please let us know your suggestions!</li>\n</ul>\n<hr />\n<blockquote>\n<p><strong>Heads-Up:</strong> Randy will be out bikepacking <strong>May 23–June 23</strong>, so updates may be limited; Stas will keep things moving!</p>\n</blockquote>\n<hr />\n<h2>Sponsorship Status</h2>\n<ul>\n<li><strong>Monthly average income</strong> up from $7,639 to $7,659 (64% of $12,000 goal) → <a href=\"https://github.com/sponsors/ddev\">Become a sponsor↗</a></li>\n</ul>\n<h2>Stay Connected</h2>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">Blog↗</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn↗</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon↗</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky↗</a></li>\n<li><a href=\"/s/discord\">Discord↗</a></li>\n</ul>\n"},{"id":"https://ddev.com/blog/ddev-add-on-maintenance-guide","url":"https://ddev.com/blog/ddev-add-on-maintenance-guide","title":"DDEV Add-on Maintenance Guide","content_html":"<h2>Introduction</h2>\n<p>Maintaining a DDEV add-on is more than a <a href=\"advanced-add-on-contributor-training.md\">one-time task</a>. As DDEV evolves, so should your add-ons. This guide will help you stay in sync with recent changes and keep your add-ons up-to-date, reliable, and aligned with current standards.</p>\n<p>As part of preparing this guide, I also updated all official DDEV add-ons to reflect the latest recommendations and improvements.</p>\n<h2>Recommendations for Add-on Maintainers</h2>\n<p>Run the update checker script periodically in your add-on to verify it is up to date:</p>\n<pre><code>curl -fsSL https://ddev.com/s/addon-update-checker.sh | bash\n</code></pre>\n<p>Here are some high-level practices to follow:</p>\n<ul>\n<li>Take inspiration from the <a href=\"https://addons.ddev.com/\">official add-ons</a>, see how they're structured and follow similar practices</li>\n<li>Keep an eye on updates in <a href=\"https://github.com/ddev/ddev-addon-template\">ddev-addon-template</a></li>\n<li>Track changes in <a href=\"https://github.com/ddev/ddev/releases\">DDEV releases</a></li>\n<li>Configure your add-on <a href=\"#repository-configuration-best-practices\">repository settings</a></li>\n<li>Add the <code>ddev-get</code> <a href=\"https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/classifying-your-repository-with-topics\">topic</a> to your GitHub repository if it should be discoverable by the wider community. (If your add-on is currently just an experiment or a fork, wait until it matures to add the topic.)</li>\n<li>Write a clear <a href=\"https://github.com/orgs/community/discussions/60507\">description</a> and include relevant keywords to improve discoverability</li>\n<li>Use <code>#!/usr/bin/env bash</code> instead of <code>#!/bin/bash</code> at the top of your command scripts, it's more portable and works better across different environments.</li>\n<li>Ensure your add-on cleans up after itself: both <code>ddev add-on get</code> and <code>ddev add-on remove</code> should be idempotent. All files added via <code>project_files</code> and <code>global_files</code> must include a <code>#ddev-generated</code> stanza to support proper removal</li>\n<li>Remember to publish a new release after any update (unless it's just a <code>README.md</code> change)</li>\n</ul>\n<h2>What's New in the DDEV Ecosystem</h2>\n<p>DDEV development is moving fast, and new features are introduced regularly. Here are some recent updates you should be aware of:</p>\n<h3>Recommending DDEV Version Constraints</h3>\n<p>Your add-on should encourage users to keep DDEV updated. The current recommendation is to add this stanza to <code>install.yaml</code>:</p>\n<pre><code>ddev_version_constraint: \"&gt;= v1.24.10\"\n</code></pre>\n<p>This ensures compatibility and resolves known issues, such as those related to the <a href=\"open-source-for-the-win.md#mutagen-problemreport\">Mutagen Problem Report</a>.</p>\n<h3>Customizing <code>ddev describe</code> Output</h3>\n<p>With DDEV v1.24.10, add-ons can now customize the output of the <code>ddev describe</code> with <code>x-ddev.describe-*</code> extension.</p>\n<p><a href=\"https://docs.ddev.com/en/stable/users/extend/custom-docker-services/#customizing-ddev-describe-output\">This feature</a> is useful for showing credentials, URLs, or usage notes for custom services.</p>\n<p>Example:</p>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev-redis/blob/main/docker-compose.redis.yaml\">https://github.com/ddev/ddev-redis/blob/main/docker-compose.redis.yaml</a></li>\n</ul>\n<h3>Changing <code>ddev ssh</code> Shell</h3>\n<p>DDEV v1.24.10 also introduced the ability for add-ons to specify a custom shell for the <code>ddev ssh -s my-service</code> command using the <a href=\"https://docs.ddev.com/en/stable/users/extend/in-container-configuration/#changing-ddev-ssh-shell\"><code>x-ddev.ssh-shell</code></a> extension.</p>\n<pre><code>services:\n  my-service:\n    x-ddev:\n      ssh-shell: bash\n</code></pre>\n<p>Example:</p>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev-varnish/blob/main/docker-compose.varnish.yaml\">https://github.com/ddev/ddev-varnish/blob/main/docker-compose.varnish.yaml</a></li>\n</ul>\n<p>To ensure your add-on works reliably, include a shell availability check in your Bats health checks (<code>tests/test.bats</code>):</p>\n<pre><code>health_checks() {\n  # Verify that bash is available in the \"my-service\" container\n  run ddev exec -s my-service command -v bash\n  assert_success\n  assert_output --partial \"bash\"\n  # ... additional checks ...\n}\n</code></pre>\n<h3>MutagenSync Annotation for Commands</h3>\n<p>With DDEV v1.24.4, custom commands can now use the <a href=\"https://docs.ddev.com/en/stable/users/extend/custom-commands/#mutagensync-annotation\"><code>MutagenSync</code></a> annotation.</p>\n<p>You should use this annotation if your <code>host</code> or <code>web</code> commands modify, add, or remove files in the project directory. It ensures that file sync is handled correctly when Mutagen is enabled, preventing unexpected behavior or sync delays. (It does no harm and causes no performance issues if Mutagen is not in use.)</p>\n<p>Example:</p>\n<ul>\n<li><a href=\"https://github.com/backdrop-ops/ddev-backdrop-bee/blob/main/commands/web/bee\">https://github.com/backdrop-ops/ddev-backdrop-bee/blob/main/commands/web/bee</a></li>\n</ul>\n<h3>Support for Optional Compose Profiles</h3>\n<p>The same DDEV v1.24.4 release introduced support for <a href=\"https://docs.ddev.com/en/stable/users/extend/custom-compose-files/#optional-services\">optional docker-compose profiles</a>, which can be used by add-ons to offer more flexible configuration.</p>\n<p>Example:</p>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev-mongo/blob/main/docker-compose.mongo.yaml\">https://github.com/ddev/ddev-mongo/blob/main/docker-compose.mongo.yaml</a></li>\n<li><a href=\"https://github.com/ddev/ddev-mongo/blob/main/commands/host/mongo-express\">https://github.com/ddev/ddev-mongo/blob/main/commands/host/mongo-express</a></li>\n</ul>\n<h3><code>ddev get</code> Deprecation</h3>\n<p>The classic <code>ddev get</code> command is deprecated in DDEV v1.23.5 and replaced by <code>ddev add-on get</code>.</p>\n<p>Huge thanks to <a href=\"https://github.com/GuySartorelli\">@GuySartorelli</a> for implementing this feature, and also for proactively updating many add-on <code>README.md</code> files. You've likely already seen a pull request for your add-on!</p>\n<h3>Better Testing with Bats Libraries</h3>\n<p>While all add-ons use the <a href=\"https://bats-core.readthedocs.io/en/stable/\">Bats</a> framework for testing, many are still missing Bats libraries that simplify assertions and test writing.</p>\n<p>Consider adopting these libraries to enhance test clarity and maintainability.</p>\n<p>Example:</p>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev-addon-template/blob/main/tests/test.bats\">https://github.com/ddev/ddev-addon-template/blob/main/tests/test.bats</a></li>\n</ul>\n<h3>Issue and PR Templates</h3>\n<p>Make sure your add-on includes:</p>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev-addon-template/tree/main/.github/ISSUE_TEMPLATE\">Issue templates</a></li>\n<li><a href=\"https://github.com/ddev/ddev-addon-template/blob/main/.github/PULL_REQUEST_TEMPLATE.md\">Pull request template</a></li>\n</ul>\n<p>These improve the quality of contributions and bug reports.</p>\n<h3>Add-on Badges</h3>\n<p>The old <code>maintained</code> badge required yearly updates, which became a maintenance burden, especially for contributors with many add-ons. It's now replaced by a <code>last commit</code> badge.</p>\n<p>To improve visibility and engagement on the <a href=\"https://addons.ddev.com\">DDEV Add-on Registry</a>, add the registry badge to your <a href=\"https://github.com/ddev/ddev-addon-template\">README.md</a>.</p>\n<p>Example:</p>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev-addon-template/blob/main/README.md\">https://github.com/ddev/ddev-addon-template/blob/main/README.md</a></li>\n</ul>\n<h3>Advanced Customization with Flags</h3>\n<p>Starting with DDEV v1.23.5, you can now use <a href=\"https://docs.ddev.com/en/stable/users/usage/commands/#dotenv-set\"><code>ddev dotenv set</code></a> to manage environment variables more cleanly. This allows your add-on to read custom environment variables defined in <code>.ddev/.env.*</code> files, and use them inside your <code>docker-compose.*.yaml</code> configuration.</p>\n<p>This feature is especially useful for advanced setups where flexibility and dynamic configuration are needed.</p>\n<p>Example:</p>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev-adminer#advanced-customization\">https://github.com/ddev/ddev-adminer#advanced-customization</a></li>\n<li><a href=\"https://github.com/ddev/ddev-adminer/blob/main/docker-compose.adminer.yaml\">https://github.com/ddev/ddev-adminer/blob/main/docker-compose.adminer.yaml</a></li>\n</ul>\n<h3>Making Small Changes to Docker Images</h3>\n<p>If your add-on needs a customized Docker image, the typical approach is to create a separate <code>Dockerfile</code> and configure your add-on to use it. However, for minor tweaks, you can take advantage of the <a href=\"https://docs.docker.com/reference/compose-file/build/#dockerfile_inline\"><code>dockerfile_inline</code></a> option in your <code>docker-compose.*.yaml</code> file.</p>\n<p>This approach lets you define a small <code>Dockerfile</code> directly in the YAML, avoiding the overhead of maintaining a separate file.</p>\n<p>Examples:</p>\n<ul>\n<li><a href=\"https://github.com/ddev/ddev-solr/blob/main/docker-compose.solr.yaml\">https://github.com/ddev/ddev-solr/blob/main/docker-compose.solr.yaml</a></li>\n<li><a href=\"https://github.com/ddev/ddev-opensearch/blob/main/docker-compose.opensearch.yaml\">https://github.com/ddev/ddev-opensearch/blob/main/docker-compose.opensearch.yaml</a></li>\n</ul>\n<h2>Repository Configuration Best Practices</h2>\n<p>To keep your add-on repository tidy, safe, and aligned with community standards, consider adjusting the following GitHub settings:</p>\n<h3>General Settings</h3>\n<p>Go to <strong>Settings → General</strong> in your repository:</p>\n<ul>\n<li>Uncheck features you don’t use, such as <strong>Wikis</strong>, <strong>Discussions</strong>, and <strong>Projects</strong></li>\n<li>Enable <strong>Allow squash merging</strong> with <strong>Pull request title</strong></li>\n<li>Disable <strong>Allow merge commits</strong> and <strong>Allow rebase merging</strong></li>\n<li>Enable <strong>Always suggest updating pull request branches</strong></li>\n<li>Enable <strong>Automatically delete head branches</strong></li>\n</ul>\n<h3>Branch Protection Rules</h3>\n<p>Go to <strong>Settings → Rules → Rulesets</strong>:</p>\n<ol>\n<li>Click <strong>New ruleset → New branch ruleset</strong></li>\n<li>Set <strong>Ruleset name</strong> to <code>main</code></li>\n<li>Under <strong>Enforcement status</strong>, select <strong>Active</strong></li>\n<li>Under <strong>Targets</strong>, click <strong>Add target</strong> → choose <strong>Include default branch</strong></li>\n<li>Under <strong>Rules</strong>, enable:<ul>\n<li><strong>Restrict deletions</strong></li>\n<li><strong>Require a pull request before merging</strong> (set <strong>Allowed merge methods</strong> to only <strong>Squash</strong>)</li>\n<li><strong>Block force pushes</strong></li>\n</ul>\n</li>\n<li>Click <strong>Create</strong> to apply the ruleset</li>\n</ol>\n<h2>Conclusion</h2>\n<p>Keeping your add-on current means less work for users and fewer issues for you to manage. Use this guide as your checklist and stay in sync with the DDEV ecosystem.</p>\n<p>Have questions, suggestions, or something cool to share? Join the conversation in our <a href=\"/s/discord\">Discord</a>, <a href=\"https://github.com/ddev/ddev/issues\">open an issue</a>, or reach out via <a href=\"mailto:support%40ddev.com\">email</a>. Your feedback helps improve the tools we all rely on.</p>\n<p>If DDEV is helping you or your organization, please consider <a href=\"/support-ddev/#sponsor-development\">supporting its ongoing financial sustainability</a>. Every bit helps keep the ecosystem growing and maintained.</p>\n<p>Happy maintaining!</p>\n"},{"id":"https://ddev.com/blog/amd64-with-rosetta-on-macos","url":"https://ddev.com/blog/amd64-with-rosetta-on-macos","title":"Solving Intel-only AMD64/X64 problems on macOS with Apple Silicon","content_html":"<p>It's been almost 5 years since Apple introduced its ARM64-based Macs, and the world has loved them. But they threw a complete monkey wrench into the software works, which had expected the Intel/AMD64 architecture for many, many years. (Read more: <a href=\"arm64-apple-silicon-m1-ddev-local-what-does-it-all-mean.md\">ARM64! Apple Silicon! M-Series! DDEV! What does it all mean?</a>)</p>\n<p>Almost all systems that distributed binary artifacts had extensive troubles. That included compiled binaries, Docker images, libraries, etc. In some cases the problem was just the fundamental assumptions in the software.</p>\n<p>Apple released <a href=\"https://support.apple.com/en-us/102527\">Rosetta 2</a> with the initial Apple Silicon macs, and it was great for simple situations, but it was initially quite unpredictable for Docker-based applications. You may know that I resisted any use of Rosetta for some years because of initial experiences of unpredictability. However, everything has gotten better around Rosetta over the years, but more than that, almost everything is available as a native app or native Docker image these days (and that has always included all DDEV apps and Docker images, from the very beginning).</p>\n<p>But it doesn't include everything. Microsoft continues to publish AMD64-only binaries and Docker images, and Oracle is just as guilty. Surely they'll come around.</p>\n<p>In the meantime, here are some techniques to get niche AMD64-only applications going with DDEV. I recommend these techniques only if you have no good alternative, because native performance and reliability are much higher.</p>\n<ul>\n<li>Run a service as <code>platform: linux/amd64</code> if only AMD64 Docker images are available</li>\n<li>Run the DDEV web container as <code>platform: linux/amd64</code> if you absolutely must install AMD64-only software in there (this happens most often with <code>npm</code> packages).</li>\n<li>Run your entire Docker environment as AMD64 with emulation.</li>\n</ul>\n<h2>Running an External Service as <code>linux/amd64</code></h2>\n<p>There are still a few Docker images that have not been properly updated to multi-platform builds, including <a href=\"https://hub.docker.com/r/typo3solr/ext-solr\">typo3solr</a> and <a href=\"https://hub.docker.com/r/microsoft/mssql-server\">mssql/server</a>.</p>\n<p>With these, if you have a <code>docker-compose.*.yaml</code> file that names an image which is only available as AMD64, you can just add to it this line:</p>\n<pre><code>platform: linux/amd64\n</code></pre>\n<p>And if you're using a Docker provider like Orbstack or Docker Desktop that has robust Rosetta support (and you have Rosetta enabled) then it will \"just work\". It will have reduced performance, but it may work just fine for your application.</p>\n<p>I <a href=\"https://github.com/ddev/ddev-sqlsrv/blob/main/docker-compose.sqlsrv.yaml#L2-L7\">recently added</a> this setup to the <code>ddev-sqlsrv</code> DDEV add-on, which previously was limited to Intel users only. Adding these lines to the service's <code>docker-compose.sqlsrv.yaml</code> made the add-on work fine on Apple Silicon:</p>\n<pre><code># On macOS Apple Silicon, this only works with Rosetta enabled\nimage: ${MSSQL_DOCKER_IMAGE:-mcr.microsoft.com/mssql/server:2022-CU18-ubuntu-22.04}\nplatform: linux/amd64\n</code></pre>\n<h2>Adding AMD64-only Software to the DDEV Web Container</h2>\n<p>Sometimes the problem is <em>adding</em> software that is Intel-specific to the DDEV web container. For example, the classic npm packages <code>node-sass</code> and <code>puppeteer</code> had this problem for years, and the <code>gifsicle</code> npm package still does.</p>\n<p>On an Apple Silicon machine you might get an ugly error like this when doing <code>ddev npm install gifsicle</code>:</p>\n<pre><code>npm error OrbStack ERROR: Dynamic loader not found: /lib64/ld-linux-x86-64.so.2\nnpm error\nnpm error This usually means that you're running an x86 program on an arm64 OS without multi-arch libraries.\nnpm error To fix this, you can:\nnpm error   1. Use an Intel (amd64) container to run this program; or\nnpm error   2. Install multi-arch libraries in this container.\n</code></pre>\n<p>In this situation, if you have Rosetta enabled and a Docker provider configured to support it, you can add a <code>.ddev/docker-compose.amd64.yaml</code> like this:</p>\n<pre><code>services:\n  web:\n    # Force the DDEV web image to run as `linux/amd64` on Apple Silicon with Rosetta\n    platform: linux/amd64\n</code></pre>\n<p>Now on <code>ddev restart</code> you'll be running an AMD64 web container and <code>ddev npm install gifsicle</code> will work just fine. And your colleagues who are on Intel processors will have no trouble with this configuration.</p>\n<p>Test it with <code>ddev exec arch</code>, you'll now get <code>x86_64</code>.</p>\n<p>(If you run into issues, try <code>ddev debug rebuild</code> to clear the old Dockerfile build cache.)</p>\n<h2>Run Your Entire Docker System as AMD64</h2>\n<p>Since those techniques work so well, it seems unlikely that you'd want to run everything as AMD64, but <a href=\"amd64-on-apple-silicon-ddev.md\">DDEV on Intel... on Apple Silicon</a> tells you how if you want to!</p>\n<h2>Wrapping Up: Try to Use Native Software When You Can</h2>\n<p>I don't recommend using either of these techniques if you have the option of updating to native software or images, but they're pretty nice if you can't!</p>\n<p>Do you have specific examples of Intel-focused software or images that you've had trouble with? I'd love to hear about it, and hear your solutions. I'd love to update this article with more specific examples.</p>\n<p>I'd love to hear your experience. Join us in <a href=\"/s/discord\">Discord</a> or <a href=\"https://github.com/ddev/ddev/issues\">open an issue</a> or send <a href=\"/contact\">an email</a> if you have success (or failure 😀).</p>\n<p>Thanks for your support and engagement with DDEV!</p>\n"},{"id":"https://ddev.com/blog/building-offramp-from-wordpress-with-ddev","url":"https://ddev.com/blog/building-offramp-from-wordpress-with-ddev","title":"Building an Off-Ramp from WordPress with DDEV","content_html":"<p><strong>TL;DR:</strong> <em>DDEV was a huge force multiplier, enabling me to focus on writing a WordPress plugin to export WordPress content for use in Grav CMS. More information on the plugin can be found at the GitHub repository <a href=\"https://github.com/jgonyea/wp2grav_exporter\">wp2grav_exporter</a>.</em></p>\n<hr />\n<p>Popular content managment systems like WordPress and Drupal store content in databases (MySQL/ PostgreSQL/ etc.). <a href=\"https://getgrav.org/\">Grav CMS</a> stores content and configuration in local files (Markdown and YAML respectively). Grav's simpler flat-file storage mechanism is one of the things that drew me to start dabbling with it.</p>\n<h2>Why consider leaving WordPress?</h2>\n<p>While the recent shenanigans from Automattic's CEO accelerated my work, it wasn't the primary reason I developed this content exporter. I fell in love with Grav development back in 2018 when I first started writing a <a href=\"https://www.drupal.org/project/grav_export\">Drupal 7 exporter</a>, and I wanted to port something similar over to WordPress. I value data portability, empowering the end user to control where their content is used! In the end, it's about giving options.</p>\n<h2>Why DDEV?</h2>\n<p><a href=\"https://github.com/ddev/ddev\">DDEV</a> is a fantastic tool, and it is perfect for my PHP development workflow. It made spinning up two local developlment sites a breeze. I normally relish building and configuring my own automated environments, <em>but DDEV makes it so simple to configure local environments</em>. Additionally, DDEV comes with many \"quickstart\" configurations, meaning that popular CMS's like Drupal and WordPress work out of the box with nearly all settings ready to go.</p>\n<h2>Development setup</h2>\n<p>I made two different directories, one for WordPress and the other for Grav. After running <code>ddev config</code> on each respective directory, <code>ddev start</code> on each starts serving the content.</p>\n<p>I installed <a href=\"https://wordpress.org/plugins/demopress/\">DemoPress</a> in the WordPress environment to help generate random test content and users to export.</p>\n<h3>Xdebug</h3>\n<p>Step debugging is imperative while trying to inspect content in-flight. Xdebug needed to listen on two different ports to avoid collisions between the two sites, and the <a href=\"https://docs.ddev.com/en/stable/users/debugging-profiling/step-debugging/#using-xdebug-on-a-port-other-than-the-default-9003\">DDEV docs</a> are informative on how to configure this. I personally use VS Code, but other IDE's should work just as well, too. Step debugging was crucial to finding appropriate data structures and information I needed my converter plugin to use in a Grav site.</p>\n<h2>Wp2grav_exporter WordPress plugin</h2>\n<p>The <a href=\"https://github.com/jgonyea/wp2grav_exporter\">wp2grav_exporter</a> plugin is the resultant labor of love. It automatically exports:</p>\n<ul>\n<li>Users and assigned roles</li>\n<li>Post Types, including custom types</li>\n<li>Posts and associated custom fields, including ACF fields</li>\n<li>File attachments</li>\n<li>Site metadata</li>\n</ul>\n<p><a href=\"/img/blog/2025/04/sample-wordpress-grav-page-render.png\"></a></p>\n<p>Additional screenshots of example content exports can be found at the plugin's GitHub page.</p>\n<p>After running the export, content was drag-dropped between my two DDEV directories, and I could immediately test how content looked. The exported post configurations are encompassed in a Grav plugin, so the end user is free to use whatever theme they want!</p>\n<h2>Final thoughts</h2>\n<p>DDEV has saved me countless hours with its easy setup and dependability. If you haven't yet taken it for a test spin, I can't recommend it enough!</p>\n<hr />\n<p><em>Find an issue with my exporter? Submissions are welcome at the project's <a href=\"https://github.com/jgonyea/wp2grav_exporter/issues\">issue queue</a>!</em></p>\n"},{"id":"https://ddev.com/blog/ddev-expose-node-app-on-subdomain","url":"https://ddev.com/blog/ddev-expose-node-app-on-subdomain","title":"Exposing a Node.js App Over HTTP / HTTPS on a Subdomain in DDEV","content_html":"<h1>Exposing a Node.js App Over 80/443 on a Subdomain in DDEV</h1>\n<p>Have you ever needed to run a separate Node.js application alongside your main site in DDEV, and serve it securely\nover ports 80 and 443 on a custom subdomain? While DDEV has built-in mechanisms for exposing additional ports,\nsometimes you need more control, especially if you want to expos it through a domain like\n<code>frontend.example.ddev.site</code> instead of a port-specific URL. This is where Traefik, bundled with DDEV,\nbecomes incredibly powerful.</p>\n<p>In this post, we’ll walk through how to configure DDEV and Traefik to proxy requests from a subdomain directly\nto your Node.js app on port 3000 within the DDEV web container.</p>\n<hr />\n<h2>Why Not Just Use <code>web_extra_exposed_ports</code>?</h2>\n<p>DDEV's' <a href=\"https://docs.ddev.com/en/stable/users/extend/customization-extendibility/#exposing-extra-ports-via-ddev-router\"><code>web_extra_exposed_ports</code> feature</a> is great for making your service accessible via a specific port\n(e.g., (<code>3000</code>)). However, it doesn’t magically set up a subdomain for you to use on standard web ports (80/443).\nIf you want <code>frontend.example.ddev.site</code> to map to your Node.js app over HTTPS, you need a reverse proxy rule.\nThat’s where Traefik comes in.</p>\n<h2>Step 1: Update Your <code>.ddev/config.yaml</code></h2>\n<p>In your project’s <code>.ddev/config.yaml</code>, define the project name and the additional hostname you want to use. For example:</p>\n<pre><code>name: example\n\nadditional_hostnames:\n  - frontend.example\n</code></pre>\n<p><em>(Optional)</em> You can still use web_extra_exposed_ports to expose the Node.js port if you want:</p>\n<pre><code>web_extra_exposed_ports:\n  - name: node-app\n    container_port: 3000\n    http_port: 3000\n    https_port: 3001\n</code></pre>\n<p>However, for a subdomain over standard web ports, the critical part is the next step with Traefik.</p>\n<h2>Step 2: Create a Project-level Traefik Configuration File</h2>\n<p>:::warning\nThis technique does not work in DDEV v1.25.0. That release included a major Traefik refactoring that did not yet cover project-level configuration. Upgrade to v1.25.1 or later, which includes a fix for this and other issues introduced in v1.25.0.\n:::</p>\n<p>In your project's <code>.ddev/traefik/config</code> folder add a file named <code>frontend.yaml</code>. In <code>frontend.yaml</code>, you’ll define two routers—one for HTTP (port 80) and one for HTTPS (port 443)—and\na service that points to the Node.js app on port 3000.</p>\n<pre><code>http:\n  routers:\n    # Router for HTTP (port 80)\n    example-web-80-http-frontend:\n      entrypoints:\n        - http-80\n      rule: Host(`frontend.example.ddev.site`)\n      service: \"example-web-3000\"\n      ruleSyntax: v3\n      tls: false\n      priority: 100\n\n    # Router for HTTPS (port 443)\n    example-web-80-https-frontend:\n      entrypoints:\n        - http-443\n      rule: Host(`frontend.example.ddev.site`)\n      service: \"example-web-3000\"\n      ruleSyntax: v3\n      tls: true\n      priority: 100\n\n  services:\n    # The custom service that routes to your Node app\n    example-web-3000:\n      loadbalancer:\n        servers:\n          - url: http://ddev-example-web:3000\n</code></pre>\n<p>Here’s what’s happening:</p>\n<ul>\n<li>Routers: Each router inspects incoming requests. If the hostname matches <code>frontend.example.ddev.site</code>, it passes the request to the <code>example-web-3000</code> service.</li>\n<li>Service: Defines where to actually send the traffic. In this case, <code>http://ddev-example-web:3000</code> is the internal address of the web container running on port 3000.</li>\n</ul>\n<h2>Step 3: Restart DDEV</h2>\n<p>Run:</p>\n<pre><code>ddev restart\n</code></pre>\n<p>DDEV will pick up your new Traefik configuration, and you should now be able to access your Node.js application at:</p>\n<pre><code>ddev launch https://frontend.example.ddev.site\n</code></pre>\n<p>No more messing with non-standard port numbers in your URLs!</p>\n<hr />\n<h2>Wrapping Up</h2>\n<p>By leveraging Traefik's routing capabilities, you can expose any service running in the web container on standard HTTP/HTTPS ports and map it to a dedicated subdomain. This approach keeps your development environment clean, user-friendly, and closer to production-like URLs.</p>\n<p>If you’ve followed these steps, your Node.js application will be served seamlessly over <code>frontend.example.ddev.site</code>.</p>\n<hr />\n<p><strong>Further Reading</strong></p>\n<ul>\n<li><a href=\"https://docs.ddev.com/en/stable/users/extend/traefik-router/#traefik-configuration\">DDEV Router Customization and Debugging (Traefik)</a></li>\n<li><a href=\"https://doc.traefik.io/traefik/\">Traefik Proxy Docs</a></li>\n</ul>\n<p><strong>Do You Have a Favorite DDEV Recipe? Contribute It!</strong></p>\n<p>We welcome community contributions to the DDEV blog and would love to have yours. The <a href=\"https://github.com/ddev/ddev.com\">ddev.com repository</a> has full details, and there's even a <a href=\"https://ddev.com.ddev.site/blog/ddev-website-for-contributors/\">training session on how to do it</a>. It's all just Markdown and we'll help!</p>\n"},{"id":"https://ddev.com/blog/ddev-april-2025-newsletter","url":"https://ddev.com/blog/ddev-april-2025-newsletter","title":"DDEV April 2025 Newsletter","content_html":"<p><strong>Spring has Sprung in Palisade, Colorado!</strong></p>\n<p><strong>DDEV v1.24.4</strong> was <a href=\"https://github.com/ddev/ddev/releases/tag/v1.24.4\">released</a> with the new <a href=\"xhgui-feature.md\">XHGui profiling feature</a> (funded by TYPO3 Community Ideas Budget!).</p>\n<p><strong>DDEV Notes and News</strong></p>\n<ul>\n<li><a href=\"https://ddev.com/blog/xhgui-feature\">XHGui Feature Makes Profiling Even Easier</a></li>\n<li><a href=\"https://ddev.com/blog/sponsor-thanks\">Thanks to our Amazing Sponsors</a></li>\n<li><a href=\"https://ddev.com/blog/drupalcon-atlanta-2025\">DDEV at DrupalCon Atlanta</a></li>\n<li><a href=\"https://www.kalamuna.com/blog/setup-existing-wordpress-multisite-locally-ddev-bonus-pantheon-support\">Set up an existing WordPress multisite locally with DDEV (with Bonus Pantheon support!)</a></li>\n<li><a href=\"https://darren.oh.name/node/81\">Darren Oh: Zscaler, DDEV, and Colima</a>. (We'd love to have you contribute your own experience with packet-inspection VPNs in <a href=\"https://github.com/ddev/ddev/pull/7061\">this docs PR</a>. Note that in DDEV v1.24.4 a significant problem with using internet proxies was resolved; full documentation will be included in that PR.</li>\n<li>The TYPO3 Q2 Community Budget Idea to implement mDNS (multicast DNS) in DDEV didn’t receive enough votes, so unfortunately it won’t be funded this quarter. The proposed <a href=\"https://github.com/ddev/ddev/issues/6663\">mDNS feature</a> offers an alternative to the standard <code>ddev.site</code> DNS resolution. It’s especially helpful for users who experience issues with DNS, and it could also eliminate the need for DDEV to modify the <code>/etc/hosts</code> file in those cases. We still hope to explore this in 2025!</li>\n</ul>\n<p><strong>We welcome your contributions to the blog!</strong> A number of community members have contributed blog articles demonstrating their use of DDEV to solve problems, and we welcome your contributions. It's easy, it's just Markdown, and full instructions are at <a href=\"https://github.com/ddev/ddev.com\">the ddev.com repository</a>.</p>\n<p><strong>Thanks for subscribing to the newsletter! We love to have this way to keep in touch.</strong> If you're not getting it yet by email, please sign up at <a href=\"/newsletter\">ddev.com/newsletter</a>.</p>\n<p><strong>Great News: Sponsorship Level is Increasing!</strong> According to our <a href=\"https://ddev.com/s/sponsorship-data.json\">open sponsorship feed</a> our total monthly average income went up from $7099 to $7639 since March 1, a $540 bump in one month. Wow, you're awesome, thank you! If your organization or you aren't on the bandwagon yet, <a href=\"https://github.com/sponsors/ddev\">join us to help make DDEV sustainable</a>. GitHub Sponsors is great, but we also do support contracts, invoicing, PayPal — anything that works for you! Our goal is $12,000/month, so we're more than halfway there. Special thanks to new $100/month sponsors <a href=\"http://www.fullfatthings.com/\">@fullfatthings</a>, <a href=\"https://www.liip.ch/en\">@liip</a>, <a href=\"https://www.anwesoft.com/\">@andreas-anwesoft</a>, <a href=\"https://wearerudder.com/\">@wearrudder</a>!</p>\n<p><strong>THANKS to all of you who are supporting DDEV’s path to sustainability</strong> and who have gotten your organizations to do so.</p>\n<p>Want to keep up as the month goes along? Follow on</p>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">blog</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky</a></li>\n<li>and join our community on <a href=\"/s/discord\">Discord</a></li>\n</ul>\n<p>Happy April from Randy Fay, DDEV Project Lead. It's a delight to collaborate with you!</p>\n"},{"id":"https://ddev.com/blog/drupalcon-atlanta-2025","url":"https://ddev.com/blog/drupalcon-atlanta-2025","title":"DDEV at DrupalCon Atlanta 2025","content_html":"<h2>DDEV at DrupalCon Atlanta 2025</h2>\n<p>While I didn’t speak at any formal sessions this year, I had the chance to lead several Birds-of-a-Feather (BoF) discussions:</p>\n<ul>\n<li><strong>DDEV VS Code Integration Improvement</strong>: We talked about ways that DDEV could integrate better with VS Code. Although the well-maintained <a href=\"https://marketplace.visualstudio.com/items?itemName=biati.ddev-manager\">DDEV Manager VS Code Extension</a> does great for people, there are a couple of things VS Code does not know how to do well. The biggest is that it doesn't know how to use <code>php</code> or <code>phpstan</code> or <code>phpunit</code> properly inside a Docker container (like the DDEV web container), so it's hard to use the nice VS Code integration with those tools. DDEV Community member <a href=\"https://www.drupal.org/u/ultimike\">Mike Anello</a> was present and talked about his favorite usage, which involves the <a href=\"https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-explorer\">Remote Explorer</a> extension. In his long-form Drupal trainings at <a href=\"https://www.drupaleasy.com/\">DrupalEasy</a> he teaches folks to use Remote Explorer with DDEV and work inside the web container all the time, and that solves the problem, but it is different from what DDEV users normally do. (PhpStorm knows how to use tools and interpreters inside the container, so doesn't have this problem.) Mike has <a href=\"https://www.youtube.com/watch?v=Nn_L6N4ZQqo\">presented his technique many times as Maximizing Visual Studio Code with DDEV</a>.</li>\n<li><strong>Replacing Gitpod for DrupalPod and DDEV</strong>: Many of you know that Gitpod has been a great resource for DDEV users to do development in a web environment, and that Gitpod Classic is scheduled to shut down in April 2025. The <a href=\"https://www.drupal.org/project/drupalpod\">DrupalPod</a> project, which wrapped Gitpod and DDEV to make Drupal contribution easy in a browser was used extensively by Drupal community members to review issues and contribute code. It was great for Contribution Day at DrupalCons these last few years because there was no need for people to set up a local development environment, and the bandwidth requirements were minimal. The <a href=\"https://www.drupal.org/project/drupalpod/issues/3500792\">Drupal.org issue about this</a> has the details of the discussion, including a recording.</li>\n<li><strong>DDEV Office Hours</strong>: DDEV Office Hours are a simple place to talk about anything DDEV-related, and we had a pleasant time.</li>\n<li><strong>Git Bisect for Fun and Profit</strong>: This Git tutorial on the lovely <code>git bisect</code> technique went well and we all had a good time. It was based on the <a href=\"https://drupal.tv/events/florida-drupalcamp-2025/divide-and-conquer-systematic-approach-troubleshooting-issues\">Florida Drupal Camp presentation \"Divide and conquer: A systematic approach to troubleshooting issues\"</a>. Here's the <a href=\"https://github.com/rfay/git-bisect-example\">git-bisect-example repository</a> for hands-on practice.</li>\n</ul>\n<h2>First-time Contributor Mentoring</h2>\n<p>The highlight of every DrupalCon is helping new contributors on Contribution Day, a whole day where folks get help contributing for the first time to code, documentation, or marketing. I was able to help a few people, and of course, was the resident DDEV and DrupalPod expert.</p>\n<h2>Helping Out</h2>\n<p>I published an invitation to meet one-on-one and a few people took advantage of meeting in person to look at their DDEV issues. It was great to meet them!</p>\n<h2>Notes</h2>\n<ul>\n<li><strong>Drupal CMS was all the rage</strong>: The <a href=\"https://new.drupal.org/docs/drupal-cms\">Drupal CMS</a> project has been quite successful this year, and it seemed like dozens of sessions talked about it. It seems to me like the Drupal community has taken an excellent path with this. As Dries said in the <a href=\"https://dri.es/state-of-drupal-presentation-march-2025\">Driesnote</a>, Drupal was always a huge bunch of building blocks that could do lots of things and do them well... but only experts understood how to do that. And they all did it in different ways. Now Drupal CMS provides a clear and refined starting point for people who need a website, but still has all the power of Drupal behind it, and you don't have to be an expert to get that polish and those features at the very beginning of your journey.</li>\n<li><strong>DDEV Maintainer <a href=\"https://github.com/stasadev\">Stas Zhuk</a></strong> can't travel outside Ukraine, but he was welcomed with an honorary badge! </li>\n<li><strong>Docksal seems to be in trouble</strong>: In the Drupal community many folks have happily used <a href=\"https://docksal.io/\">Docksal</a> over the years, but its maintenance has recently fallen off. (Docksal is a Docker-based local development environment similar to DDEV.) There were people at DrupalCon asking about the situation with Docksal and asking for help migrating their sites to DDEV because of frustration with the project, which hasn't had a release since May, 2024. As open-source maintainers ourselves, we understand the pressures of maintenance and life and hope the Docksal maintainers are getting all the support they need in both places.</li>\n</ul>\n<h2>Thanks!</h2>\n<p><a href=\"https://www.drupal.org/u/bernardm28\">Bernardo Martinez</a> shared a room and a DrupalCon ticket, making this whole thing possible.</p>\n<p><a href=\"https://platform.sh\">Platform.sh</a> was kind enough to fund the airline ticket to Atlanta.</p>\n<p>Thanks to both of you! I wouldn't have made it without both those things.</p>\n"},{"id":"https://ddev.com/blog/xhgui-feature","url":"https://ddev.com/blog/xhgui-feature","title":"XHGui Feature Makes Profiling Even Easier","content_html":"<h2>XHGui Lands in DDEV v1.24.4</h2>\n<p>Thanks to sponsorship from the <a href=\"https://talk.typo3.org/c/t3a/community-budget-ideas-2025-q1/45\">TYPO3 Community Budget Ideas</a>, DDEV now includes XHGui support for its XHProf profiling. This brings a much-improved experience with a consistent, browser-based interface.</p>\n<p>DDEV has had XHProf profiling for some time, and many in the community have loved it, but it had a few flaws; the list of profiling runs was ugly and uncoordinated, and the list was lost on <code>ddev restart</code>.</p>\n<p>However, the longstanding <a href=\"https://github.com/perftools/xhgui\">XHGui</a> project was out there for years, and it made much more sense.</p>\n<p>With XHGui, you can now track performance bottlenecks with a clean interface, persistent data, and detailed breakdowns of CPU and memory usage.</p>\n<h2>How to Use XHGui for Profiling</h2>\n<p>In DDEV v1.24.4+ you can switch to the XHGui profiling mode (permanently) with</p>\n<pre><code>ddev config global --xhprof-mode=xhgui &amp;&amp; ddev restart\n</code></pre>\n<p>Start profiling with</p>\n<pre><code>ddev xhgui on\n</code></pre>\n<p>Visit a few pages in your app to collect profiling data, then</p>\n<pre><code>ddev xhgui launch\n</code></pre>\n<p>In general, click one of the <code>GET</code> or <code>POST</code> links and follow it in to explore detailed CPU and memory usage breakdowns.</p>\n<p>If you have questions, join us in one of the <a href=\"https://docs.ddev.com/en/stable/users/support/\">DDEV support venues</a>, especially <a href=\"https://ddev.com/s/discord\">Discord</a> and we'll work it through with you.</p>\n<p>The <a href=\"https://docs.ddev.com/en/stable/users/debugging-profiling/xhprof-profiling/\">DDEV Docs on XHProf</a> have some good starters, but your suggestions are welcome!</p>\n<h2>XHGui Demonstration Screencast</h2>\n<p>Here's a quick demonstration of using XHGui with a TYPO3 site in DDEV.</p>\n<div>\n\n</div>\n\n<h2>Thanks to TYPO3, glensc, and tyler36</h2>\n<p>Serious thanks are due to:</p>\n<ul>\n<li>The <a href=\"https://typo3.org/\">TYPO3 Organization</a> for funding this feature integration.</li>\n<li><a href=\"https://github.com/glensc\">Elan Ruusamäe (glensc)</a> for years of maintaining the XHGui project (and extreme responsiveness as we worked on this).</li>\n<li>DDEV community member <a href=\"https://github.com/tyler36\">tyler36</a>, who created the original DDEV add-on and helped it incubate and mature over years and supported its inclusion in DDEV core.</li>\n</ul>\n<h2>Support</h2>\n<p>Try it out today and let us know how it goes — your feedback helps shape the future of DDEV! Join us in the <a href=\"https://docs.ddev.com/en/stable/users/support/\">DDEV support venues</a> if you want to talk about XHGui and profiling.</p>\n"},{"id":"https://ddev.com/blog/sponsor-thanks","url":"https://ddev.com/blog/sponsor-thanks","title":"Thanks to our Amazing Sponsors!","content_html":"<h2>Thank you!</h2>\n<p>We just want to take a moment to thank all of the amazing sponsors of the DDEV open source project. All of you reading this know that we've been working for years now to make DDEV a financially sustainable project, so it can serve you into the future. So many have responded to that call. Thank you!</p>\n<p><strong>Even though we're going to mention the biggest sponsors first, we want all of you to know that your sponsorship matters too, and with care we can expand to many, many small sponsors to ensure DDEV's resilience and sustainability.</strong></p>\n<h2>Major Sponsors</h2>\n<ul>\n<li><a href=\"https://platform.sh\">Platform.sh</a> has been a major sponsor of DDEV for a few years now. You may know that they recently reduced their sponsorship, but they remain our largest single supporter, and we appreciate it greatly. Platform.sh has also transferred the \"ddev\" domain names to the <a href=\"/foundation\">DDEV Foundation</a> and will be transferring the \"DDEV\" trademark. And they're funding Randy's plane ticket to Drupalcon Atlanta!</li>\n<li><a href=\"https://tag1consulting.com\">Tag1 Consulting</a> stepped up to generously support DDEV at a very significant level so many years ago, and has continued doing that. And they don't just offer outstanding financial support, they're always making clear that they use and support DDEV, and we get to see them at conferences.</li>\n<li><a href=\"https://mobilistics.de/\">Mobilistics</a> and <a href=\"https://i-gelb.net\">i-gelb</a> both sponsor at the $500/month level.</li>\n<li>All these lovely organizations sponsor at the $100/month (or a bit higher) level: <a href=\"https://lullabot.com\">Lullabot</a>, <a href=\"https://affinitybridge.com/\">Affinity Bridge</a>, <a href=\"https://github.com/claudiu-cristea\">Webikon</a>, <a href=\"https://fame.fi/\">FameHelsinki</a>, <a href=\"https://www.optasy.com/\">OPTASY</a>, <a href=\"https://gizra.com\">Gizra</a>, <a href=\"https://cambrico.net/\">Cambrico</a>, <a href=\"https://agaric.coop\">Agaric</a>, <a href=\"https://centarro.io\">Centarro</a>, <a href=\"https://craftcms.com/\">Craft CMS</a>, <a href=\"https://redfinsolutions.com/\">Redfin Solutions</a>, <a href=\"https://b13.com\">b13</a>. And brand new this week (welcome!) <a href=\"https://www.fullfatthings.com/\">Full Fat Things</a>.</li>\n</ul>\n<h2>So many more wonderful sponsors!</h2>\n<p>Here are some of many sponsors who help out via <a href=\"https://github.com/sponsors/ddev\">GitHub Sponsors</a>.</p>\n<p></p>\n<h2>In-Kind Sponsors</h2>\n<p>The open-source community has lots of folks helping out multiple collaborators. In our case, <a href=\"https://macstadium.com\">MacStadium</a> provides us testing resources, and <a href=\"https://jetbrains.com\">JetBrains</a> provides a subscription to their IDE products, thanks!</p>\n<p>But we never forget Docker. Docker has adopted us in the <a href=\"https://docs.docker.com/docker-hub/repos/manage/trusted-content/dsos-program/\">Docker-Sponsored-Open-Source (DSOS)</a> program for a few years now, and this means that all of your image pulls are sponsored in that project. You may know that normal image pulls will be strictly limited starting April 1, 2025, but because of the DSOS, users of DDEV won't hit that restriction.</p>\n<p>And please don't forget that the <a href=\"https://github.com/moby/moby\">open-source Docker project</a> underlies every single Docker provider. It doesn't matter if you're using OrbStack or Lima or Docker Desktop or whatever, they're all built on top of the amazing Docker open-source project.</p>\n<h2>JSON Detail about Sponsorships</h2>\n<p>We recently set up a <a href=\"/s/sponsorship-data.json\">full updated JSON feed</a> that can be used to see exactly where DDEV's sponsorship comes from and how we're doing. You can see the latest data any day in the <a href=\"https://github.com/ddev/sponsorship-data/blob/main/data/all-sponsorships.json\">all sponsorships</a> feed. And <a href=\"https://bsky.app/profile/mark.ie\">Mark Conroy</a> has built a <a href=\"https://web-components.mark.ie/web-components/ddev/sponsors-banner/\">web component</a> that can be used to show where we're at on any website. Thank you!</p>\n<h2>Many Ways to Sponsor</h2>\n<p>We have almost too many ways that you can sponsor, but we want to make it easy for you and your organization.</p>\n<ul>\n<li>For individuals and some organizations, <a href=\"https://github.com/sponsors/ddev\">GitHub Sponsors</a> is super easy, takes moments and can be changed any time.</li>\n<li>We are happy to invoice your organization and do more of a \"support contract\" so that you don't have to explain open-source to your finance department. We accept ACH, Wise.com, bank transfer, IBAN, SWIFT, checks, we'll work with your organization to make it work for you. Just send us a note <a href=\"/contact\">via the contact page</a> or any other way.</li>\n<li><a href=\"https://www.paypal.com/donate?hosted_button_id=R42QBRNKKSFFL\">PayPal to DDEV</a></li>\n</ul>\n<h2>Oops, are you missing or did I forget you?</h2>\n<p>Is your name or your organization's name missing here? It's easy to get it here. How much does DDEV's support and ongoing maintenance mean to your organization?</p>\n<p>(If I made a mistake and left you out, let me know and I'll edit this.)</p>\n<p>Do you have questions or want to talk (about sponsoring or anything else)? <a href=\"https://ddev.com/contact/\">Contact us!</a> or join us in <a href=\"/s/discord\">Discord</a>.</p>\n"},{"id":"https://ddev.com/blog/ddev-march-2025-newsletter","url":"https://ddev.com/blog/ddev-march-2025-newsletter","title":"DDEV March 2025 Newsletter","content_html":"<p><strong>Happy March!</strong></p>\n<p><strong>DDEV v1.24.3</strong> was <a href=\"https://github.com/ddev/ddev/releases/tag/v1.24.3\">released</a> earlier than planned for two major reasons: the new <code>generic</code> web server type allows Node.js and other interesting possibilities, and an upcoming Docker engine release was going to be incompatible with current Mutagen version. <strong>We encourage you all to upgrade because of this upcoming incompatibility, thanks!</strong></p>\n<p><strong>Open-Source For The Win</strong>: See the details about how a future incompatibility with the Docker engine was pre-emptively caught and fixed, <a href=\"open-source-for-the-win.md\">Open Source for the Win!</a></p>\n<p><strong>Web-based DDEV Add-on Registry</strong> is now live! Try it out at <a href=\"https://addons.ddev.com\">https://addons.ddev.com</a> and check out the <a href=\"ddev-addon-registry-introduction.md\">introduction blog</a>.</p>\n<p><strong>TYPO3 Community Budget Ideas: Please vote!</strong>: We <a href=\"https://talk.typo3.org/t/implement-mdns-for-ddev-name-resolution/6119/4\">applied for the Q2 approval process</a> to fund a great feature for DDEV, supporting mDNS as a domain-name resolution technique. If you're a member of the TYPO3 Association, you should have received an email to vote on this. We'd appreciate your vote!</p>\n<p><strong>Platform.sh has transferred domain names to DDEV</strong>: Thanks again to <a href=\"https://platform.sh\">Platform.sh</a> for their ongoing support. As a part of the process in <a href=\"platform-sh-ddev-funding-changes.md\">change of their support</a>, they have transferred control of the <code>ddev.com</code> and <code>ddev.site</code> domain names to the DDEV Foundation.</p>\n<p><strong>DDEV Notes and News</strong></p>\n<ul>\n<li>The DDEV Advisory Group <a href=\"https://github.com/orgs/ddev/discussions/7031\">Annual Review and Planning Meeting</a> is on Wednesday, March 5 (tomorrow!), and <strong>all are invited</strong>. The Zoom link is in the agenda link. We'll be looking at 2025 ambitions and 2024 review, we'd love to have you there!</li>\n<li>A review of DDEV's year 2024 has been added to the <a href=\"https://ddev.com/blog/2025-plans/\">2025 Plans and 2024 Review</a> blog post. We'd love your feedback about both 2024 and the 2025 plans!</li>\n<li><a href=\"https://thedroptimes.com\">The Drop Times</a> rolled out an amazing promotion for DDEV, showing the current funding status against our goals. Now we need a community member to do the same thing for us in our website!\n</li>\n<li>The promotion done by The Drop Times consumes DDEV's current sponsorship information from the <a href=\"https://github.com/ddev/sponsorship-data\">sponsorship-data</a> repository, which has lots of potential for communicating about DDEV's funding status. Today's situation and totals are in <a href=\"https://github.com/ddev/sponsorship-data/blob/main/data/all-sponsorships.json\">all-sponsorships.json</a>.</li>\n<li>Randy presented on <a href=\"https://www.fldrupal.camp/session/divide-and-conquer-systematic-approach-troubleshooting-issues\">Divide and conquer: A systematic approach to troubleshooting issues</a> at Florida Drupalcamp. The full recording is on the link.</li>\n<li>Blog: <a href=\"https://www.webwash.net/drupal-cms-v1-installation-and-demo/\">Installing Drupal CMS with DDEV</a></li>\n<li>Blog from Matthias Andrasch: <a href=\"https://dev.to/mandrasch/vite-is-suddenly-not-working-anymore-due-to-cors-error-ddev-3673\">Vite suddenly not working due to CORS errors? 🧐 (DDEV)</a></li>\n<li>Docker has renewed DDEV's \"Docker-Sponsored Open Source\" membership, meaning that DDEV users don't have a pull limit on DDEV images on hub.docker.com. This is a great thing for DDEV. Thanks, Docker!</li>\n<li>We applied for the <a href=\"https://summerofcode.withgoogle.com/\">Google Summer of Code</a> but did not get accepted due to the high volume of applications and limited available slots. We'll try again in the future!</li>\n<li>We're working on integrating the excellent XHGui performance exploration GUI for Xhprof to DDEV. This work is being funded by the TYPO3 Community's Q1 Community Budget Idea, and needs to be completed in March.</li>\n<li>The Gitpod that we have known and loved is shutting down. This affects DDEV contributors that have used it and makes <a href=\"https://www.drupal.org/project/drupalpod/issues/3500792\">DrupalPod as it stands obsolete</a>. If you're interested in DrupalPod and will be at DrupalCon Atlanta, there is a Birds-of-a-Feather session scheduled on the path forward, 04:00pm - 04:30pm Tuesday, March 25, 2025.</li>\n</ul>\n<p><strong>Funding DDEV to allow both maintainers to work full-time on DDEV</strong>: <em>We need your help and your organization's help! Let me know if you need help getting this into your budget!</em> Our key financial goal is to <a href=\"lets-fund-stas-maintainer.md\">fully fund @stasadev so he can work exclusively on DDEV</a>. We've slipped back in recent months. We need about $3700/month in increased pledges from organizations and individuals. See <a href=\"https://github.com/sponsors/ddev\">Full information about supporting DDEV</a>. We’re happy to invoice you, happy to <a href=\"https://cal.com/randyfay/30min\">do a call discussing this</a>, and would love it if you’d include DDEV in your budgeting process for this year or next. (Our current status: We receive about $6000/month, have been spending about $7000/month. Bank balance is about $9,000, up from $6,000 last month (progress!).)</p>\n<p><strong>THANKS to all of you who are supporting DDEV’s path to sustainability</strong> and who have gotten your organizations to do so.</p>\n<p>Want to keep up as the month goes along? Follow on</p>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">blog</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky</a></li>\n<li>and join our community on <a href=\"/s/discord\">Discord</a></li>\n</ul>\n<p>Happy March from Randy Fay, DDEV Project Lead. It's a delight to collaborate with you!</p>\n"},{"id":"https://ddev.com/blog/ddev-addon-registry-introduction","url":"https://ddev.com/blog/ddev-addon-registry-introduction","title":"DDEV Add-on Registry Introduction","content_html":"<h2>Welcome to the DDEV Add-on Registry</h2>\n<p>We're excited to introduce <a href=\"https://addons.ddev.com\">https://addons.ddev.com</a>, a central hub where the community can explore, contribute to, and enhance the collection of DDEV add-ons.</p>\n<p>The source code is available and your contributions are encouraged at <a href=\"https://github.com/ddev/addon-registry\">https://github.com/ddev/addon-registry</a>.</p>\n<h2>Search the Add-ons</h2>\n<p>Need to find a specific add-on? Use the search field, and watch results update in real-time as you type.</p>\n<p></p>\n<h2>Sorting the Add-ons</h2>\n<p>Click on a column title to organize the entries based on that field. A second click will reverse the sort order, and a third click resets it back.</p>\n<p></p>\n<h2>Add-on Types</h2>\n<p>Add-ons fall into two categories: <strong>Official</strong> add-ons, which are supported by the DDEV team, and <strong>Contrib</strong> add-ons, which are supported by the community.</p>\n<p></p>\n<h2>Engage by Leaving Comments</h2>\n<p>Want to share your thoughts or feedback on an add-on? Scroll to the bottom of an add-on's page and click \"Sign in with GitHub\". We use <a href=\"https://giscus.app/\">giscus</a> to manage comments, making it easy to join the conversation by authorizing your GitHub account. You can also react to other comments or add your own insights.</p>\n<p></p>\n<h2>What's Next?</h2>\n<p>The DDEV Add-on Registry is a living project, and we're eager to involve the community in its future. If you have suggestions or want to contribute, head over to <a href=\"https://github.com/ddev/addon-registry\">https://github.com/ddev/addon-registry</a>. We look forward to your feedback and collaboration!</p>\n<p>Want to keep up as the month goes along? Follow us on</p>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">blog</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky</a></li>\n<li>and join our community on <a href=\"/s/discord\">Discord</a></li>\n</ul>\n"},{"id":"https://ddev.com/blog/open-source-for-the-win","url":"https://ddev.com/blog/open-source-for-the-win","title":"Open Source for the Win!","content_html":"<h2>DDEV v1.24.3 Release</h2>\n<p>Today we released <a href=\"https://github.com/ddev/ddev/releases/tag/v1.24.3\">DDEV v1.24.3</a> ahead of schedule because of a wonderful set of open-source interactions. (There's other important stuff in the release, but I'll cover that later.)</p>\n<p><strong>We would appreciate it if you could upgrade soon, especially if you're on macOS or traditional Windows, so that we don't have to answer questions about this when it starts to hit users.</strong></p>\n<h2>Mutagen Problem Report</h2>\n<p>On Monday, two days ago, @LoganHornbuckle reported <a href=\"https://github.com/ddev/ddev/issues/7015\">a problem</a> (apparently with Mutagen or Docker) we had never seen before. They helped extensively with followup, and it turned out that they had done a <code>colima update</code> and as a result gotten the new Docker/Moby Engine version 28.0.0.</p>\n<p>The update exposed an incompatibility between Mutagen and Docker 28, which showed up as a fatal error, completely breaking DDEV's Mutagen support for Docker 28.</p>\n<p>Once we understood the situation, we were able to reproduce the problem, and assumed it was a problem with Docker 28.</p>\n<h2>The Fix to Mutagen</h2>\n<p>We contacted @xenoscopic (Jacob Howard), the maintainer of Mutagen (now with Docker), and he was able to reproduce it immediately. By the end of the day, he had diagnosed it and provided a new release! (It turned out to be a place where Mutagen had worked around a Docker Engine quirk, and the Docker quirk got fixed, breaking Mutagen.)</p>\n<p>So here we are just two days later with a pre-emptive DDEV release v1.24.3 that should prevent most people from ever seeing the Mutagen problem.</p>\n<h2>THANKS!</h2>\n<p>Thanks to @LoganHornbuckle and the community for keeping in touch, reporting, and helping to sort out problems. Amazing thanks to @xenoscopic for the quick diagnosis and fix. And thanks to Docker, Inc. for the wonderful open-source Docker project that underlies all of the available Docker providers, not just Docker Desktop. And of course thanks for supporting @xenoscopic's ongoing maintenance of Mutagen.</p>\n<p>Open source software is amazing!</p>\n<p>Want to keep up as the month goes along? Follow on</p>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">blog</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky</a></li>\n<li>and join our community on <a href=\"/s/discord\">Discord</a></li>\n</ul>\n"},{"id":"https://ddev.com/blog/ddev-feb-2025-newsletter","url":"https://ddev.com/blog/ddev-feb-2025-newsletter","title":"DDEV February 2025 Newsletter","content_html":"<p><strong>Happy February!</strong></p>\n<p><strong>DDEV v1.24.2</strong> was <a href=\"https://github.com/ddev/ddev/releases/tag/v1.24.2\">released</a> with <a href=\"https://ddev.com/blog/database-improvements\">MySQL 8.4 support</a> and improved <code>ddev composer create</code> making it nearly compatible with <code>composer create-project</code>.</p>\n<p><strong>DDEV Notes and News</strong></p>\n<ul>\n<li>The <a href=\"https://github.com/orgs/ddev/discussions/6853\">DDEV Advisory Group</a> met January 8. The primary topic of discussion was the <a href=\"https://ddev.com/blog/platform-sh-ddev-funding-changes\">change in DDEV's funding</a> and budgeting response to it. Our decision was to continue the arrangement with Stas as-is (bill hours at $50/hour, cap $4000/month). Randy will also bill at $50/hour with cap of $4000, but limited by always trying to leave $6000 in the bank.</li>\n<li><strong>We need your input!</strong> Please take a look at the proposed <a href=\"2025-plans.md\">2025 Plans for DDEV</a> and let us know your opinion, how these things should be ordered, and what we might have missed!</li>\n<li>macOS users will be interested in the (not-DDEV-focused) <a href=\"https://www.paolomainardi.com/posts/docker-performance-macos-2025/\">Docker Performance macOS 2025</a>.</li>\n<li><a href=\"https://ddev.com/blog/open-source-pledge\">The Open Source Pledge and DDEV: A Path to Sustainability</a>.</li>\n<li><a href=\"https://ddev.com/blog/database-improvements/\">MySQL 8.4 is now in DDEV v1.24.2</a>.</li>\n<li>DDEV v1.24.2 has improved argument handling for <code>ddev composer create</code>, making it nearly compatible with <code>composer create-project</code>. Additionally, the <code>ddev composer create-project</code> alias has been added for improved usability.</li>\n<li>The Gitpod that we have known and loved is shutting down. This affects DDEV contributors that have used it and makes <a href=\"https://www.drupal.org/project/drupalpod/issues/3500792\">DrupalPod as it stands obsolete</a>. If you're interested in DrupalPod and will be at DrupalCon Atlanta, there is a Birds-of-a-Feather session scheduled on the path forward, 04:00pm - 04:30pm Tuesday, March 25, 2025.</li>\n<li>The Drop Times did a nice and extensive <a href=\"https://www.thedroptimes.com/interview/45389/making-ddev-past-present-and-future-in-focus\">interview with Randy</a> and <a href=\"https://www.youtube.com/watch?v=EctDtSZcBhU\">video interview</a>.</li>\n<li>Tag1 Consulting did a performance comparison of the new Drupal CMS vs WordPress, (using DDEV for everything). See <a href=\"https://www.tag1consulting.com/blog/drupal-cms-vs-wordpress-performance-2025\">Drupal CMS vs WordPress Performance</a>.</li>\n<li>The latest DDEV Quickstarts in the docs are for <a href=\"https://docs.ddev.com/en/stable/users/quickstart/#drupal-drupal-cms\">Drupal CMS</a> and <a href=\"https://docs.ddev.com/en/stable/users/quickstart/#processwire\">ProcessWire</a>! Congratulations to the Drupal community on Drupal CMS, and welcome ProcessWire folks. Thanks to <a href=\"https://github.com/BernhardBaumrock\">Bernhard Baumrock</a> for the ProcessWire initiative!</li>\n<li><a href=\"https://www.youtube.com/watch?v=WkOoPEbtHwI\">DDEV: We use it on all our projects</a>. (Followups in <a href=\"https://www.reddit.com/r/PHP/comments/1ijsev2/ddev_we_use_it_on_all_our_projects/\">Reddit r/php</a> and <a href=\"https://www.reddit.com/r/drupal/comments/1ijsemd/ddev_we_use_it_on_all_our_projects/\">Reddit r/drupal</a>).</li>\n</ul>\n<p><strong>Ongoing DDEV Work</strong></p>\n<ul>\n<li><strong>Node.js</strong> improved support: People have asked for some time for Node.js to be the primary web server (instead of Nginx+php-fpm, etc), and now it can be done in a number of ways. This is now in <a href=\"https://docs.ddev.com/en/stable/developers/building-contributing/#testing-latest-commits-on-head\">DDEV HEAD</a> and there are Quickstarts for <a href=\"https://docs.ddev.com/en/stable/users/quickstart/#nodejs-nodejs-web-server\">Simple Node.js</a> and <a href=\"https://docs.ddev.com/en/stable/users/quickstart/#nodejs-sveltekit\">SvelteKit</a>. Incidentally, this also provides experimental support for <a href=\"https://frankenphp.dev/\">FrankenPHP</a> and provides a <a href=\"https://docs.ddev.com/en/stable/users/quickstart/#generic-frankenphp\">Quickstart</a> for it as a demonstration of the \"generic\" web server type.</li>\n<li><strong>Web-based Add-on Registry</strong>: As add-ons have become so very popular it's hard to sort them out and understand which ones are meaningful for a particular need. This long-term goal is nearing completion as Stas has a proof of concept and now has to push it through to a maintained production status.</li>\n<li><strong>Automated Tests for Quickstarts</strong>: You won't see these, but it's a big step for us. Because our <a href=\"https://docs.ddev.com/en/stable/users/quickstart/\">Quickstarts</a> are so dependent on the behavior of the upstream projects, it's always been hard for us to know when the target project has had a change that invalidates them. Now we have automated tests for the quickstarts of number of project types, and will add others as maintenance is done. Thanks to <a href=\"https://github.com/rpkoller\">Ralf Koller</a> for extensive work on the Drupal, WordPress, and TYPO3 quickstarts.</li>\n<li><strong>Funding situation data feed</strong>: Aiming for ever-increasing transparency in the DDEV funding situation, we now have an automatically-updated feed showing our <a href=\"https://github.com/ddev/sponsorship-data\">funding situation from all sources</a>. You can see the <a href=\"/s/sponsorship-data.json\">exact situation</a> at any time. We expect to use this feed in the message-of-the-day on DDEV, as well as ddev.com and the DDEV README.</li>\n<li><strong>New contributors and maintainers</strong>: As DDEV's community grows, we always need new contributors and maintainers. We love to get contributors trained and get privileges to maintainers as needed! We already have lots of <a href=\"https://ddev.com/blog/category/training/\">Contributor Training</a> material, and <a href=\"https://docs.ddev.com/en/stable/developers/\">docs on how to contribute</a> but we'll do anything you ask for! Need help with something? Need updates? Join us in <a href=\"/s/discord\">Discord</a> or <a href=\"https://cal.com/randyfay/30min\">make an appointment with me</a>.</li>\n</ul>\n<p>The next <strong>DDEV Advisory Group Meeting</strong> is Wednesday, March 5, 2025. We'll be doing a review of DDEV's 2024 and a discussion of <a href=\"2025-plans.md\">proposed plans for 2025</a>. This is open to all and we'd love to have you!</p>\n<p><strong>Funding DDEV to allow both maintainers to work full-time on DDEV</strong>: <em>We need your help and your organization's help! Let me know if you need help getting this into your budget!</em> Our key financial goal is to <a href=\"lets-fund-stas-maintainer.md\">fully fund @stasadev so he can work exclusively on DDEV</a>. We've slipped back in recent months. We need about $3700/month in increased pledges from organizations and individuals. See <a href=\"https://github.com/sponsors/ddev\">Full information about supporting DDEV</a>. We’re happy to invoice you, happy to <a href=\"https://cal.com/randyfay/30min\">do a call discussing this</a>, and would love it if you’d include DDEV in your 2025 budgeting process. (Our current status: We receive about $3000/month, have been spending about $3000-$4000/month. Bank balance is about $6,000, down from $8,600 last month.)</p>\n<p><strong>THANKS to all of you who are supporting DDEV’s path to sustainability</strong> and who have gotten your organizations to do so.</p>\n<p>Want to keep up as the month goes along? Follow on</p>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">blog</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky</a></li>\n<li>and join our community on <a href=\"/s/discord\">Discord</a></li>\n</ul>\n<p>Happy February from Randy Fay, DDEV Project Lead. It's a delight to collaborate with you!</p>\n"},{"id":"https://ddev.com/blog/2025-plans","url":"https://ddev.com/blog/2025-plans","title":"DDEV 2025 Plans and 2024 Review","content_html":"<h1>2025 Plans and Notes</h1>\n<p>Every year we try to clarify goals early, and here we go for 2025! We'd love to have your thoughts and opinions! Some of the things we <a href=\"2024-plans.md\">planned in 2024</a> aren't quite done yet, but we're working and planning and responding to your needs.</p>\n<p>At the DDEV Advisory Group's 2-hour <a href=\"https://github.com/orgs/ddev/discussions/7031\">annual review/planning meeting on March 5, 2025</a>, we'll talk about plans and priorities for 2025. You are invited! The meeting link is in the meeting page.</p>\n<p>We'd love to have your input as regular users as we work through these priorities.</p>\n<h2>Community</h2>\n<ul>\n<li><strong>Continue outstanding user support</strong> even with growth of our user base. This remains a key priority from last year, but we still need to involve the entire community (meaning you!) in all the places.</li>\n<li><strong>Begin formal governance for the DDEV Foundation</strong>. We've been talking about this in the Advisory Group for years, but this year I'll propose a 3-person board for the DDEV Foundation, where I retain operational control, but we have at least one other board member fully enabled on financial controls and payments. Future years can bring future refinements.</li>\n</ul>\n<h2>Sustainability and Finance</h2>\n<ul>\n<li><strong>Improve our Marketing CTA and information</strong>: The <a href=\"https://ddev.com/support-ddev/\">ddev.com \"Support DDEV\"</a> page says lots of things, but the financial CTA gets lost there. We need to communicate successfully:<ul>\n<li>For the project to be sustainable, the community will need to support the two developers who are working full-time on it.</li>\n<li>Show the many ways that support can be done can be done.</li>\n<li>Communicate clearly our current situation. (<a href=\"https://thedroptimes.com\">The Drop Times</a> rolled out an amazing promotion for DDEV, showing the current funding status against our goals. Now we need a community member to do the same thing for us in our website! See the <a href=\"ddev-march-2025-newsletter.md\">March 2025 Newsletter</a>).</li>\n</ul>\n</li>\n<li><strong>Continue to develop contributors and maintainers</strong>: As the project grows, we need more skilled contributors and maintainers. (The only difference between those is that maintainers typically have a higher level of direct access to project resources, but as a wide-open source project, almost all interested contributors can accomplish almost anything without enhanced privileges.) In the last two years, we've had <a href=\"/blog/category/training\">quite a lot of contributor trainings</a>, and anecdotes indicate that people are using those recordings and blogs for training, but the actual attendance at them was not impressive. I'm thinking that this year these topics should probably be addressed with screenshare recordings and updated blogs instead of calendar-scheduled events. Given the financial struggles in our contributors' world, I doubt that we'll be able to add paid maintainers in 2025, I'm most interested right now in the reasonable goal of retaining and paying the two amazing maintainers we currently have.</li>\n</ul>\n<h2>Features and Initiatives</h2>\n<h3>Funded and Work-In-Progress Initiatives</h3>\n<ul>\n<li>The TYPO3 Association has agreed to fund the <a href=\"https://typo3.org/article/four-ideas-to-be-funded-in-quarter-1-2025\">integration of XHGui into DDEV</a> as part of their Community Budget Ideas. Part of this work has already been done in the <a href=\"https://github.com/ddev/ddev-xhgui\">ddev/ddev-xhgui</a> project, and it must be completed by March 31, 2025.</li>\n<li><a href=\"https://docs.ddev.com/en/stable/users/extend/customization-extendibility/#using-nodejs-as-ddevs-primary-web-server\">Top-level Node.js support</a> as planned in 2024 is included in DDEV v1.24.3+. There will be a number of follow-up opportunities, including Caddy support, etc.</li>\n<li>The <a href=\"https://addons.ddev.com\">Web-based Add-on Registry</a> is <strong>live</strong>.</li>\n</ul>\n<p><a name=\"proposed-features\"></a></p>\n<h3>Proposed Features and Initiatives</h3>\n<ol>\n<li><a href=\"https://github.com/ddev/ddev/issues/6663\">Implement mDNS as an alternate name resolution technique</a> in addition to DNS and hosts file manipulation. Our traditional use of DNS and hosts-file manipulation have been successful, but mDNS might allow avoiding hosts-file manipulation, especially with non-ddev.site URLs and when internet DNS is not available. This has been submitted for funding to the TYPO3 Community <a href=\"https://typo3.org/article/call-for-community-budget-ideas-q2-2025\">Q2 Community Budget Ideas</a></li>\n<li><a href=\"https://github.com/ddev/ddev/issues/6912\">Allow Add-ons to include other add-ons</a>: Add-ons can already require other add-ons, but they should be able to automatically result in a download.</li>\n<li><a href=\"https://github.com/ddev/ddev/issues/6533\">Go-based Upsun Add-on like ddev-platformsh</a>. (This would pioneer golang-based add-ons; Go is probably a much better language for complicated add-ons of this type.)</li>\n<li>Rewrite ddev-platformsh Add-on in Go: Assuming success of the Upsun add-on, it would be great to backport that work to <a href=\"https://github.com/ddev/ddev-platformsh\">ddev-platformsh</a>. It's even possible that the two add-ons could be combined into one and maintained in one place.</li>\n<li>Develop a replacement for \"Gitpod Classic\", which has EOL in April, 2025. This may not need much more than improved GitHub Codespaces support, but we have loved Gitpod and hope to have something to replace it.</li>\n<li><a href=\"https://github.com/ddev/ddev/issues/6461\">Improve self-diagnose capability</a> . We currently have ddev debug test but it would be great to implement something that was readable and actionable for ordinary mortals.</li>\n<li><a href=\"https://github.com/ddev/ddev/issues/6892\">DDEV's Message-of-the-day and ddev.com should show current funding status and need</a>. We now have an automatically updated JSON feed that can make this possible.</li>\n<li>DDEV Windows/WSL2 packaging and installation: The traditional Windows installer needs work, and the WSL2 install scripts are written in hard-to-maintain PowerShell. This work can be consolidated and improved, including <a href=\"https://github.com/ddev/ddev/issues/6440\">improving the Windows hosts-file escalation technique</a>.</li>\n<li><a href=\"https://github.com/ddev/ddev/issues/6441\">Change <code>ddev share</code> to a more configurable custom-command-based option</a>. Instead of always using <code>ngrok</code> there should be multiple ways to share.</li>\n<li><a href=\"https://github.com/ddev/ddev/issues/5763\">Rework configuration system using Viper</a>.</li>\n</ol>\n<p>(We applied to the <a href=\"https://summerofcode.withgoogle.com/\">Google Summer of Code</a>, hoping to mentor contributors via that program. We did not get accepted, but will try in future years.)</p>\n<p>Do you see other important things in the <a href=\"https://github.com/ddev/ddev/issues\">issue queue</a> or elsewhere that are important to you? Are there frictions that impact your work that DDEV could fix? Please let us know.</p>\n<p>We would dearly love to have your input on these as the planning process goes forward. You can respond so very many ways in all the <a href=\"https://docs.ddev.com/en/stable/users/support/\">support venues</a>.</p>\n<h2>2025 Planning Additional Notes</h2>\n<h3>Recognized Risks</h3>\n<p>We are a very small organization, so we try to pay careful attention to the risks as we go forward.</p>\n<ul>\n<li>Key maintainer Stas lives in a very volatile situation in Ukraine, and none of us knows how to predict the future. Physical risks, communication risks, and financial transfer risks are always possible.</li>\n<li>Randy is not young and can always face new risks.</li>\n<li>The financial outlook for discretionary funding from agencies and hosting companies (and perhaps individuals) is horrible right now.</li>\n<li>Any of our maintainers can become overworked or discouraged or can burn out. We take the risk of burnout and overwork very seriously and are careful to talk about them and try to prevent them.</li>\n</ul>\n<h3>Minor Notes</h3>\n<ul>\n<li>I (Randy) do expect to work less in 2025, but that hasn't worked out so far. However, I am planning a bicycle trip that will make me mostly out of touch from late May through much of June. Stas has the keys to the kingdom and all the capabilities needed to make sure everything runs smoothly in my absence.</li>\n<li>Updated blogs about key DDEV ideas are needed. For example, an updated blog about how DDEV is different from roll-your-own or bare metal, especially multiple database and PHP versions, and team share.</li>\n<li>We need to review how key features are exposed in the documentation and in <a href=\"https://ddev.com\">https://ddev.com</a>. There are a number of cases the docs and website reflect DDEV as it was a few years ago. For example, add-ons, which are a fundamental feature, are not exposed clearly.</li>\n<li>More screenshare blogs for ordinary DDEV users are important. We have many out there, but some are seriously aged.</li>\n</ul>\n<h2>2024 DDEV Review</h2>\n<p>This section is updated for our annual review of the past year at the <a href=\"https://github.com/orgs/ddev/discussions/7031\">DDEV Advisory Group</a>.</p>\n<h3>Great Things</h3>\n<ul>\n<li>Stas Zhuk as a maintainer has been a massive success in so many ways. Not only is he completely technically fluent with DDEV in every area, but he loves supporting DDEV users, and we've been progressively successful in making sure he has adequate control of most areas of external accounts, etc.</li>\n<li>Despite our challenges, our finances are currently in balance, and our expenditures are within our means. This is a result of many wonderful sponsors, both individuals and organizations. Thank you!</li>\n<li>Outstanding contributors like tyler36, GuySartorelli, Hanoii, Bernardo Martinez, and Ralf Koller and many others continued to improve the project.</li>\n<li>We continue to offer world-class support to DDEV users in many venues. In most cases, our community's response is better than any commercial organization can offer. I think this has to do with the quality of the software (most people don't need support) and also with our community's overall commitment to generous and friendly support.</li>\n<li>We worked hard at <a href=\"/blog/category/training/\">Live Contributor Training</a>, and recorded blogs and training sessions, which is great. It's not clear how successful these were in enabling new contributors, but occasional reports say that the recorded sessions have been helpful.</li>\n<li>Prompted largely by The Drop Times we created the automatically-updated <a href=\"https://github.com/ddev/sponsorship-data\">sponsorship-data</a> repository, which has lots of potential for communicating about DDEV's funding status.</li>\n<li>The <a href=\"https://addons.ddev.com\">addons.ddev.com</a> web-based add-on registry is now live.</li>\n</ul>\n<h3>Less Great Things</h3>\n<ul>\n<li>We didn't really make progress with marketing or promotion in 2024. In fact, hosting companies and agencies with a clear stake in DDEV's success did not step up and even started ghosting discussions about this. This is likely a result of market conditions, but it's uncomfortable for us.</li>\n<li>We tried to improve our marketing situation by engaging Open Strategy Partners, but didn't achieve all we had hoped, and had to end the arrangement earlier than planned because our funding was inadequate to continue it.</li>\n<li>Randy is definitely tired of reaching out to organizations and finding that they either don't respond, or promise a response and don't follow through, or just don't have discretionary funds available and are unable to support DDEV at this point.</li>\n<li><a href=\"platform-sh-ddev-funding-changes.md\">Platform.sh changed their funding</a>. While their ongoing commitment remains generous, this was certainly a challenge.</li>\n<li>We never did see a return of amazing contributor Simon Gilli and still mourn his loss. Nobody knows what happened to him. Of course this is a reminder that none of us and none of our contributions are guaranteed into the future and is another reason to shore up the organization to continue into the future with or without specific individuals.</li>\n</ul>\n<h3>Financial Status</h3>\n<p>Our full year financial reports, including balance sheet and profit-and-loss, were posted in the <a href=\"https://github.com/orgs/ddev/discussions/6853\">2025-01-08 Advisory Group Meeting</a>. You'll see we ended the year with about $8,500 in the bank.</p>\n<p>Want to keep up as the month goes along? Follow us on</p>\n<ul>\n<li><a href=\"https://ddev.com/blog/\">blog</a></li>\n<li><a href=\"https://www.linkedin.com/company/ddev-foundation\">LinkedIn</a></li>\n<li><a href=\"https://fosstodon.org/@ddev\">Mastodon</a></li>\n<li><a href=\"https://bsky.app/profile/ddev.bsky.social\">Bluesky</a></li>\n<li>and join our community on <a href=\"/s/discord\">Discord</a></li>\n</ul>\n"}]}}