<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Drupal CMS</title>
    <description>Stay informed about developments in Drupal CMS.</description>
    <link>https://www.drupal.org/project/drupal-cms</link>
    <item>
      <title>#3580694: The project template should always place config outside the web root by default</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3580694.md</link>
      <guid isPermaLink="false">019d857f-33e4-728b-bbba-950cfdc8e447</guid>
      <category>Site owners</category>
      <pubDate>Tue, 24 Mar 2026 21:33:54 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal feature request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes:&lt;/strong&gt; 4 files, +21/−5 · txt +10 · php +8/−5 · json +3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff:&lt;/strong&gt; &lt;a href="https://git.drupalcode.org/project/drupal_cms/-/commit/1accadea08e646807555a3b72a5441695ffbb1fe"&gt;1accade&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3580694"&gt;#3580694&lt;/a&gt; · 1 contributor · 6 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The Drupal CMS project template now places the configuration sync directory outside the web root by default. New sites created from the template will store exported configuration in a &lt;code&gt;config/sync&lt;/code&gt; directory at the project root, preventing direct web access to configuration files. This follows Drupal security best practices. Existing sites are not affected.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;Affects site owners.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Config change:&lt;/strong&gt; New projects place config sync directory at &lt;code&gt;../config/sync&lt;/code&gt; (outside web root) by default&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The project template already uses a relocated web root at &lt;code&gt;web/&lt;/code&gt;. This change adds a &lt;code&gt;config/sync&lt;/code&gt; directory as a sibling to the web root, keeping configuration files outside the publicly accessible directory tree.&lt;/p&gt;
&lt;p&gt;The implementation uses the drupal-scaffold Composer plugin's file-mapping feature to append settings to &lt;code&gt;default.settings.php&lt;/code&gt;. A new &lt;code&gt;assets/append-default.settings.php.txt&lt;/code&gt; file contains PHP code that sets &lt;code&gt;$settings['config_sync_directory']&lt;/code&gt; to &lt;code&gt;realpath('../config/sync')&lt;/code&gt; if that directory exists. The template includes an empty &lt;code&gt;config/sync&lt;/code&gt; directory with a &lt;code&gt;.gitkeep&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;The test suite in &lt;code&gt;SiteTemplateInstallTest.php&lt;/code&gt; was updated to mirror the new &lt;code&gt;assets/&lt;/code&gt; directory along with &lt;code&gt;composer.json&lt;/code&gt;. The test switched from using &lt;code&gt;copy()&lt;/code&gt; to &lt;code&gt;Filesystem::mirror()&lt;/code&gt; with a Finder to include both the assets directory and composer.json file.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: March 21, 2026&lt;/li&gt;
&lt;li&gt;Committed: March 24, 2026 (2 days and 2 commits later)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key contributors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;phenaproxima (Acquia)&lt;/li&gt;
&lt;li&gt;brianperry&lt;/li&gt;
&lt;li&gt;dorficus (HeroDevs)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>#3579163: Add support for listing paid site templates in the installer</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3579163.md</link>
      <guid isPermaLink="false">019d857f-33e4-728b-bbba-94e34423fd91</guid>
      <pubDate>Tue, 17 Mar 2026 22:08:57 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal feature request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes:&lt;/strong&gt; 1 file, +2/−2 · css +2/−2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff:&lt;/strong&gt; &lt;a href="https://git.drupalcode.org/project/drupal_cms/-/commit/689f58926839a8c55a71b617679c1df6dde3c90d"&gt;689f589&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3579163"&gt;#3579163&lt;/a&gt; · 3 contributors · 43 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 4&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The Drupal CMS installer can now list and install paid site templates. During installation, site builders can browse premium templates, view pricing and purchase links, and install them using a license key provided by the vendor. When a paid template is selected, the installer opens a purchase URL in a new tab, then prompts for a license key that authorizes Composer to download the package from the vendor's repository. This infrastructure supports multiple site template vendors offering commercial starter kits through the installer.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;No upgrade or configuration changes required.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The installer's site template infrastructure was extended to represent both free and paid templates through a &lt;code&gt;SiteTemplate&lt;/code&gt; value object. This object encapsulates metadata including name, description, screenshot, package information, pricing, purchase URLs, and repository details.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;SiteTemplateForm&lt;/code&gt; reads template definitions from a remotely curated &lt;code&gt;site-templates.yml&lt;/code&gt; file, and supports a per-site override via &lt;code&gt;sites/default/site-templates.php&lt;/code&gt; for hosts or testing scenarios. Templates can specify an alternate Composer repository and an authorization type (currently only &lt;code&gt;bearer&lt;/code&gt; tokens are supported).&lt;/p&gt;
&lt;p&gt;When a paid template is selected, the installer collects a license key through a modal dialog with client-side UUID formatting. The key is validated by attempting to query the package from the vendor's repository. If successful, Composer is configured with the bearer token in &lt;code&gt;auth.json&lt;/code&gt; and the repository is added to &lt;code&gt;composer.json&lt;/code&gt;. The installer then proceeds with normal template installation.&lt;/p&gt;
&lt;p&gt;The implementation includes comprehensive test coverage through kernel tests for the &lt;code&gt;SiteTemplate&lt;/code&gt; class, functional tests for the installer flow, and a build test that simulates installing a paid template from a protected repository using a test HTTP server.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: March 13, 2026&lt;/li&gt;
&lt;li&gt;First commit: March 14, 2026 (1 day later)&lt;/li&gt;
&lt;li&gt;Last commit: March 17, 2026 (3 days and 14 commits later)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key contributors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;phenaproxima (Acquia)&lt;/li&gt;
&lt;li&gt;mherchel (Dripyard)&lt;/li&gt;
&lt;li&gt;andyg5000 (Dripyard)&lt;/li&gt;
&lt;li&gt;pameeela (Technocrat)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Collaboration&lt;/h3&gt;
&lt;p&gt;This feature was developed through close collaboration between Acquia (phenaproxima) and Dripyard (mherchel, andyg5000), with design review from pameeela. The work progressed through multiple merge requests over several days, with phenaproxima building the backend infrastructure and validation logic, mherchel implementing UI/UX and styling, andyg5000 adding server-side license validation, and pameeela contributing style refinements. The implementation required updating a core patch to make profile build tests discoverable by PHPUnit.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>#3579729: Add an `overwrite` option to `drush site:export`</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3579729.md</link>
      <guid isPermaLink="false">019d857f-33e4-728b-bbba-94efa4f6944c</guid>
      <pubDate>Tue, 17 Mar 2026 16:37:23 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal feature request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes:&lt;/strong&gt; 3 files, +45/−10 · php +45/−10&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff:&lt;/strong&gt; &lt;a href="https://git.drupalcode.org/project/drupal_cms/-/commit/73ee652134af85e6021a435573ec8db1c62b5c97"&gt;73ee652&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3579729"&gt;#3579729&lt;/a&gt; · 1 contributor · 6 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;drush site:export&lt;/code&gt; command now supports an &lt;code&gt;--overwrite&lt;/code&gt; option that allows you to re-export a site to an existing directory. Previously, the command would fail if the destination directory already existed, requiring manual deletion before exporting again. This makes it easier to iterate on site exports during development without manually cleaning up directories between runs.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;No upgrade or configuration changes required.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;SiteExportCommand&lt;/code&gt; class in the &lt;code&gt;drupal_cms_helper&lt;/code&gt; module now accepts an &lt;code&gt;--overwrite&lt;/code&gt; option. When this option is provided, the command skips the check that would normally fail if the destination directory exists.&lt;/p&gt;
&lt;p&gt;The underlying &lt;code&gt;SiteExporter::copyBaseRecipe()&lt;/code&gt; method was also updated to exclude &lt;code&gt;config&lt;/code&gt; and &lt;code&gt;recipe.yml&lt;/code&gt; from the base recipe when mirroring files, in addition to the existing &lt;code&gt;content&lt;/code&gt; exclusion. This ensures these key files are always regenerated during export. The &lt;code&gt;delete&lt;/code&gt; option was removed from the &lt;code&gt;Filesystem::mirror()&lt;/code&gt; call, which means overwriting will only update files that are part of the export, not delete everything in the destination first. This preserves any additional files in the destination directory (like &lt;code&gt;.git&lt;/code&gt; directories from version control).&lt;/p&gt;
&lt;p&gt;The test coverage confirms that overwriting replaces exported files like &lt;code&gt;recipe.yml&lt;/code&gt; while leaving untouched files like &lt;code&gt;.git&lt;/code&gt; directories intact.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: March 17, 2026&lt;/li&gt;
&lt;li&gt;Committed: March 17, 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key contributors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;phenaproxima (Acquia)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>#3579616: The site:export command should always use drupal_cms_site_template_base as a base, if available</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3579616.md</link>
      <guid isPermaLink="false">019d857f-33e4-728b-bbba-94ea95b66010</guid>
      <pubDate>Tue, 17 Mar 2026 02:17:21 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal feature request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes:&lt;/strong&gt; 9 files, +161/−203 · php +161/−203&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff:&lt;/strong&gt; &lt;a href="https://git.drupalcode.org/project/drupal_cms/-/commit/c72081fdf12a56ca0555404b5c928d61c2f03844"&gt;c72081f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3579616"&gt;#3579616&lt;/a&gt; · 1 contributor · 7 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The site export command now defaults to using the Drupal CMS site template starter kit as a base, making it easier to create new site templates. Running &lt;code&gt;drush site:export&lt;/code&gt; with no arguments produces a complete, working recipe with documentation, tests, and a screenshot. The exported recipe is self-contained and does not depend on other recipes, simplifying the site template creation workflow for DrupalCon Chicago and the Drupal CMS marketplace.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;No upgrade or configuration changes required.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;site:export&lt;/code&gt; command previously allowed exporting to any base recipe and attempted to merge changes into existing recipe files. This approach was overcomplicated and error-prone for the primary use case: creating new site templates for the Drupal CMS marketplace.&lt;/p&gt;
&lt;p&gt;The command now automatically uses &lt;code&gt;drupal_cms_site_template_base&lt;/code&gt; (the site template starter kit) as the default base if available. Both the Drush command and the UI export controller check for the starter kit's existence using a new &lt;code&gt;SiteExporter::getRecipePath()&lt;/code&gt; method, which determines where Composer installs recipes by parsing the project's &lt;code&gt;composer.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The export process now completely overwrites &lt;code&gt;recipe.yml&lt;/code&gt; and &lt;code&gt;composer.json&lt;/code&gt; rather than merging changes. The generated &lt;code&gt;recipe.yml&lt;/code&gt; contains only the site name, type, installed extensions, and config actions—no references to other recipes. The &lt;code&gt;composer.json&lt;/code&gt; file is rebuilt from scratch with requirements for all installed extensions, removing any starter kit development dependencies.&lt;/p&gt;
&lt;p&gt;This produces monolithic site templates that are self-contained and ready to publish. The export includes all content, configuration, documentation, tests, and supporting files from the starter kit (README, CI configuration, screenshots), but excludes the starter kit's sample content.&lt;/p&gt;
&lt;p&gt;The installer form no longer stores the selected base template in state, since the export functionality now handles this automatically.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: March 16, 2026&lt;/li&gt;
&lt;li&gt;Committed: March 17, 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key contributors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;phenaproxima (Acquia)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>#3575283: Add the ability to export a site template as a ZIP file</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3575283.md</link>
      <guid isPermaLink="false">019d857f-33e4-728b-bbba-949a7bcf6bf5</guid>
      <pubDate>Mon, 09 Mar 2026 00:30:57 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal feature request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes:&lt;/strong&gt; 6 files, +176/−36 · php +167/−36 · yml +9&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff:&lt;/strong&gt; &lt;a href="https://git.drupalcode.org/project/drupal_cms/-/commit/dfd34d6c83764de4f9f968629d3781b45a40137f"&gt;dfd34d6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3575283"&gt;#3575283&lt;/a&gt; · 4 contributors · 24 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 6&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Drupal CMS now provides an internal route that exports the current site as a downloadable ZIP file containing a recipe. This makes it possible to capture a customized site's configuration and content for reuse. The route is not exposed in the UI by default, allowing individual site templates to decide where and when to make it available. Sites based on the starter kit can optionally include this export capability.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;No upgrade or configuration changes required.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;drupal_cms_helper&lt;/code&gt; module adds a new route at &lt;code&gt;/admin/config/development/site-export&lt;/code&gt; that returns a ZIP archive containing a site recipe. The route controller &lt;code&gt;ExportController&lt;/code&gt; uses the existing &lt;code&gt;SiteExporter&lt;/code&gt; service to generate the recipe, which includes configuration, content, and metadata.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;SiteExporter::export()&lt;/code&gt; method now accepts an optional &lt;code&gt;$base&lt;/code&gt; parameter to copy files from a base recipe template. During installation, when a user selects the starter kit template, the installer stores its path in state. The export controller retrieves this path to include template-specific files like README and CI configuration in the exported archive.&lt;/p&gt;
&lt;p&gt;The route requires the &lt;code&gt;administer site configuration&lt;/code&gt; permission but is intentionally not linked anywhere in the UI. Individual site templates can add menu links or other UI elements to expose this functionality where appropriate. The &lt;code&gt;.htaccess&lt;/code&gt; file is removed from the exported config directory since site templates are meant to be shared.&lt;/p&gt;
&lt;p&gt;The implementation went through several iterations, first attempting to add a button to the config export form, then reverting due to UX concerns, and finally settling on an invisible route that templates can expose as needed.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: February 23, 2026&lt;/li&gt;
&lt;li&gt;First commit: February 23, 2026&lt;/li&gt;
&lt;li&gt;Last commit: March 8, 2026 (13 days and 8 commits later)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key contributors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;phenaproxima (Acquia)&lt;/li&gt;
&lt;li&gt;thejimbirch (Kanopi Studios)&lt;/li&gt;
&lt;li&gt;penyaskito (Acquia)&lt;/li&gt;
&lt;li&gt;pameeela (Technocrat)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Collaboration&lt;/h3&gt;
&lt;p&gt;The change took a winding path to its final form. Initially committed with a button in the config management UI, it was quickly reverted after UX review found that location confusing. Discussion then explored creating a separate module, but the maintainer preferred keeping the functionality in &lt;code&gt;drupal_cms_helper&lt;/code&gt; alongside existing dev tooling.&lt;/p&gt;
&lt;p&gt;The breakthrough came when the team decided to create an invisible route that individual site templates could expose through menu links. This approach ensures only sites meant for customization and export would show the feature. Over eight commits and two weeks, the implementation was refined to remove unnecessary access checks and properly integrate with the installer's template selection.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>#3574664: The `site:export` command should be able to export on top of another recipe</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3574664.md</link>
      <guid isPermaLink="false">019d857f-33e4-728b-bbba-948ce321ec76</guid>
      <pubDate>Fri, 27 Feb 2026 19:33:22 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal feature request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes:&lt;/strong&gt; 2 files, +31/−1 · php +31/−1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff:&lt;/strong&gt; &lt;a href="https://git.drupalcode.org/project/drupal_cms/-/commit/867047915339821e056e5c2c47f5f96062c44a36"&gt;8670479&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3574664"&gt;#3574664&lt;/a&gt; · 1 contributor · 12 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The site export command in Drupal CMS now allows you to build on top of an existing recipe template, preserving important scaffolding like CI configuration, license files, and documentation. This makes it easier to share custom site configurations while keeping best practices intact. The command also fixes several export bugs that affected menu hierarchies and front page paths, ensuring exported recipes work correctly when shared with others.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;No upgrade or configuration changes required.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;drush site:export&lt;/code&gt; command gains a &lt;code&gt;--base&lt;/code&gt; option that accepts a path to an existing recipe. When specified, the command uses Symfony Filesystem to mirror the base recipe's files (excluding version control and content) into the destination, then exports the current site configuration on top. Files with a &lt;code&gt;.example&lt;/code&gt; suffix are automatically renamed to their active form.&lt;/p&gt;
&lt;p&gt;Three export bugs are also fixed with temporary shims pending core releases. First, &lt;code&gt;system.site&lt;/code&gt; config now exports front page paths as aliases rather than system paths by using &lt;code&gt;AliasManagerInterface&lt;/code&gt; during the transform. Second, &lt;code&gt;DefaultContentSubscriber&lt;/code&gt; ensures menu link content entities export their parent dependencies by loading parent menu links by UUID and adding them to export metadata. Third, the command prevents overwriting existing destinations by checking for directory existence upfront.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;GenericConfigurationListener&lt;/code&gt; class changes from readonly to mutable to support the conditional front page transformation. Test coverage validates base recipe copying, file renaming, content exclusion, and the menu link dependency fix.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: February 19, 2026&lt;/li&gt;
&lt;li&gt;First commit: February 19, 2026&lt;/li&gt;
&lt;li&gt;Last commit: February 27, 2026 (7 days and 4 commits later)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key contributors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;phenaproxima (Acquia)&lt;/li&gt;
&lt;li&gt;andyg5000 (Dripyard)&lt;/li&gt;
&lt;li&gt;vishalkhode (Acquia)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Collaboration&lt;/h3&gt;
&lt;p&gt;phenaproxima authored, reviewed, and committed this feature independently over nine days across four commits. The issue originated from feedback by Andy from Dripyard, who reported the export bugs affecting site template creators. phenaproxima acknowledged the urgency of unblocking site template development and merged the changes with confidence after adding comprehensive test coverage.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>#3575789: If there's only one site template in the code base, choose it automatically</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3575789.md</link>
      <guid isPermaLink="false">019d857f-33e4-728b-bbba-94a9f4ab6767</guid>
      <pubDate>Thu, 26 Feb 2026 19:27:11 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal feature request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes:&lt;/strong&gt; 5 files, +82/−83 · php +82/−83&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff:&lt;/strong&gt; &lt;a href="https://git.drupalcode.org/project/drupal_cms/-/commit/8f0de4048273a928e3a1b7d25c054b588bdebb89"&gt;8f0de40&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3575789"&gt;#3575789&lt;/a&gt; · 1 contributor · 6 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The Drupal CMS installer now automatically selects a site template if only one is available in the codebase. Previously, the installer always displayed a selection form even when only a single template was present. This streamlines the installation process by skipping the unnecessary selection step. This change prepares for a marketplace workflow where users could download a pre-configured project with a single site template already chosen, then proceed directly through installation without redundant selection prompts.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;No upgrade or configuration changes required.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;drupal_cms_installer_choose_template()&lt;/code&gt; task was converted from a simple form task to a custom function. This function scans for site templates using &lt;code&gt;RecipeHandler::scan('Site')&lt;/code&gt; and stores them in install state. If exactly one recipe is found, it temporarily sets &lt;code&gt;$install_state['interactive']&lt;/code&gt; to FALSE before calling &lt;code&gt;install_get_form()&lt;/code&gt;, which causes the form to submit programmatically without user interaction.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;RecipeHandler::scan()&lt;/code&gt; method was refactored from returning a raw Finder object to yielding &lt;code&gt;Recipe&lt;/code&gt; objects directly, with optional filtering by recipe type. This moves error handling and recipe validation into the service layer. The method now catches &lt;code&gt;RecipeFileException&lt;/code&gt; and displays errors, simplifying callers.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;SiteTemplateForm&lt;/code&gt; receives pre-scanned recipes from install state rather than scanning itself. The administrator role recipe is now enqueued earlier in the task function rather than on form submit. The default selection is set to the first recipe in the array, which is always &lt;code&gt;drupal_cms_starter&lt;/code&gt; due to custom sorting logic.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: February 25, 2026&lt;/li&gt;
&lt;li&gt;Committed: February 26, 2026 (1 day later)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key contributors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;phenaproxima (Acquia)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Collaboration&lt;/h3&gt;
&lt;p&gt;phenaproxima identified the need to support a streamlined marketplace download workflow and implemented the automatic selection behavior within a single day. The change maintains backward compatibility with Drupal CMS's default multi-template setup while enabling future single-template distributions.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>#3573304: Create a 'Blank' template option for users who want to start from scratch</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3573304.md</link>
      <guid isPermaLink="false">019d857f-33e4-728b-bbba-9473cdaec044</guid>
      <pubDate>Wed, 18 Feb 2026 15:53:41 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal feature request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes:&lt;/strong&gt; 2 files, +8/−6 · php +5/−5 · yml +3/−1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff:&lt;/strong&gt; &lt;a href="https://git.drupalcode.org/project/drupal_cms/-/commit/85790f55005f481e301667998f4d5e251b4afece"&gt;85790f5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3573304"&gt;#3573304&lt;/a&gt; · 4 contributors · 24 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 4&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Drupal CMS now offers a &amp;quot;Blank&amp;quot; template option during installation for users who want to start with a minimal foundation. This template provides Drupal CMS's baseline functionality without the Mercury design system or component library, giving developers complete freedom to build their own design approach. The blank template includes an automatically generated minimal theme with just header, content, and footer regions, plus a single blank Canvas page as the home page.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;No upgrade or configuration changes required.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The blank template is implemented by making &lt;code&gt;drupal_cms_site_template_base&lt;/code&gt; visible and usable during installation. Previously, this site template was hidden from the installer UI and only available to developers via command line.&lt;/p&gt;
&lt;p&gt;The implementation leverages the &lt;code&gt;site_template_helper&lt;/code&gt; Composer plugin to dynamically generate a minimal theme called &amp;quot;blank&amp;quot; when the template is installed. This theme is based on core's &lt;code&gt;starterkit_theme&lt;/code&gt; but includes only three regions: header, content, and footer. The theme generation happens automatically at &lt;code&gt;composer require&lt;/code&gt; time through plugin configuration in the site template's &lt;code&gt;composer.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;drupal_cms_installer_install_tasks_alter()&lt;/code&gt; function was simplified by removing the &lt;code&gt;SiteTemplateFormAlter&lt;/code&gt; class that previously hid &lt;code&gt;drupal_cms_site_template_base&lt;/code&gt; from the installer. The template now appears alongside other options like Starter and the various prebuilt templates.&lt;/p&gt;
&lt;p&gt;The installer UI received CSS improvements to accommodate the additional template option, switching from a fixed three-column grid to a responsive grid that adapts from two to four columns based on viewport width. The &lt;code&gt;SiteExporter&lt;/code&gt; service was updated to remove development-only dependencies like &lt;code&gt;site_template_helper&lt;/code&gt; when exporting site configurations.&lt;/p&gt;
&lt;p&gt;The blank template includes a single empty Canvas page set as the front page to avoid a 404 on first visit. It also includes the utility page content type through &lt;code&gt;drupal_cms_content_type_base&lt;/code&gt;, which provides the Canvas page functionality.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: February 13, 2026&lt;/li&gt;
&lt;li&gt;First commit: February 16, 2026 (3 days later)&lt;/li&gt;
&lt;li&gt;Last commit: February 18, 2026 (2 days and 4 commits later)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key contributors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;pameeela (Technocrat)&lt;/li&gt;
&lt;li&gt;lauriii (Acquia)&lt;/li&gt;
&lt;li&gt;phenaproxima (Acquia)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Collaboration&lt;/h3&gt;
&lt;p&gt;phenaproxima implemented the technical approach after pameeela identified the need and lauriii provided requirements feedback. phenaproxima resurrected and integrated the &lt;code&gt;site_template_helper&lt;/code&gt; plugin to enable dynamic theme generation, solving the challenge of scaffolding a minimal theme without maintaining another static theme in the codebase.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>#3574009: Add a hidden Drush command to export all content</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3574009.md</link>
      <guid isPermaLink="false">019d857f-33e4-728b-bbba-948085cf90de</guid>
      <pubDate>Tue, 17 Feb 2026 15:16:32 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal feature request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes:&lt;/strong&gt; 6 files, +138/−35 · php +138/−35&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff:&lt;/strong&gt; &lt;a href="https://git.drupalcode.org/project/drupal_cms/-/commit/8a6b09bacd4a25dca24ba392ea9a63754131c5c7"&gt;8a6b09b&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3574009"&gt;#3574009&lt;/a&gt; · 1 contributor · 6 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Drupal CMS now includes a hidden Drush command that makes it easy for developers to export all content from a site to a directory. This is useful for creating development snapshots, migrating content between environments, or backing up site content in a portable format. The command is hidden because it's intended for developer use rather than routine site administration. The change also extracts the content loading logic into a reusable component that both the site export and content export commands can use.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;No upgrade or configuration changes required.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;This change adds a new &lt;code&gt;content:export:all&lt;/code&gt; Drush command in the &lt;code&gt;drupal_cms_helper&lt;/code&gt; module. The command is marked as hidden (not shown in normal help listings) and exports all content entities to a specified directory using Drupal's default content export system.&lt;/p&gt;
&lt;p&gt;The implementation extracts the content loading logic from &lt;code&gt;SiteExporter::loadAllContent()&lt;/code&gt; into a new &lt;code&gt;ContentLoader&lt;/code&gt; class that implements &lt;code&gt;IteratorAggregate&lt;/code&gt;. The &lt;code&gt;ContentLoader&lt;/code&gt; iterates through all entity types, filters out internal entities and path aliases, and yields all content entities. It excludes users 0 and 1 since those always exist with the same IDs.&lt;/p&gt;
&lt;p&gt;The new &lt;code&gt;ExportAllContentCommand&lt;/code&gt; class uses the &lt;code&gt;Exporter&lt;/code&gt; service to export each entity with its dependencies to the target directory. The command accepts a single required argument for the destination directory path.&lt;/p&gt;
&lt;p&gt;Both &lt;code&gt;ContentLoader&lt;/code&gt; and &lt;code&gt;ExportAllContentCommand&lt;/code&gt; are marked as &lt;code&gt;@internal&lt;/code&gt;, but the command itself is marked as &lt;code&gt;@api&lt;/code&gt; to signal that developers can rely on it. The change also adds &lt;code&gt;@api&lt;/code&gt; annotations to existing commands (&lt;code&gt;content:import&lt;/code&gt;, &lt;code&gt;site:export&lt;/code&gt;) to clarify their stability guarantees within Drupal CMS.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: February 17, 2026&lt;/li&gt;
&lt;li&gt;Committed: February 17, 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key contributors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;phenaproxima (Acquia)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Collaboration&lt;/h3&gt;
&lt;p&gt;phenaproxima identified the use case and implemented the feature in a single day, including extracting the shared content loading logic into a reusable component and updating the existing site export functionality to use it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>#3569529: Add an AGENTS.md file</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3569529.md</link>
      <guid isPermaLink="false">019d857f-33e3-726a-abae-0f8241a88f1c</guid>
      <pubDate>Wed, 04 Feb 2026 17:24:31 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal feature request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes:&lt;/strong&gt; 5 files, +134/−0 · md +134&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff:&lt;/strong&gt; &lt;a href="https://git.drupalcode.org/project/drupal_cms/-/commit/aecaffbe229e6296ba2092a2bc073b2f2b7807dc"&gt;aecaffb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3569529"&gt;#3569529&lt;/a&gt; · 4 contributors · 12 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 13&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Drupal CMS now includes an AGENTS.md file to help AI coding assistants work more effectively with the codebase. This file provides structured guidance on the project's technology stack, coding standards, development commands, and prohibited actions. The documentation helps AI tools avoid common mistakes and follow project conventions when assisting developers with Drupal CMS contributions.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;No upgrade or configuration changes required.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The new &lt;code&gt;AGENTS.md&lt;/code&gt; file documents Drupal CMS-specific conventions for AI coding assistants. It covers the monorepo structure with recipes in the &lt;code&gt;recipes&lt;/code&gt; directory, the &lt;code&gt;drupal_cms_helper&lt;/code&gt; module, and the &lt;code&gt;project_template&lt;/code&gt; directory used for end-user installations.&lt;/p&gt;
&lt;p&gt;The file provides command references for common development tasks using DDEV and Drush, including recipe application, PHPUnit testing, site installation, and content export with &lt;code&gt;drush content:export&lt;/code&gt;. It specifies coding standards like using strict typing, the &lt;code&gt;?type&lt;/code&gt; nullable syntax, &lt;code&gt;#[\Override]&lt;/code&gt; attributes, and marking new classes as final with private members.&lt;/p&gt;
&lt;p&gt;Several README files in protected directories (&lt;code&gt;cpanel_template&lt;/code&gt;, &lt;code&gt;patches&lt;/code&gt;, &lt;code&gt;scripts&lt;/code&gt;, &lt;code&gt;splitter&lt;/code&gt;) now explicitly warn agents not to modify those areas. The prohibited actions section lists destructive operations like running &lt;code&gt;ddev tag&lt;/code&gt; or &lt;code&gt;composer update&lt;/code&gt; outside the project root, and prevents agents from adding patches or pinning dependencies in Composer files.&lt;/p&gt;
&lt;p&gt;The documentation emphasizes defensive programming in &lt;code&gt;drupal_cms_helper&lt;/code&gt;, requiring checks like &lt;code&gt;\Drupal::moduleHandler()-&amp;gt;moduleExists()&lt;/code&gt; before using optional module functionality. It also instructs agents to mark new non-test classes as internal with specific warning text.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: January 25, 2026&lt;/li&gt;
&lt;li&gt;Committed: February 4, 2026 (9 days and 2 commits later)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key contributors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;phenaproxima (Acquia)&lt;/li&gt;
&lt;li&gt;nod_ (Très Bien Tech)&lt;/li&gt;
&lt;li&gt;marcus_johansson (FreelyGive)&lt;/li&gt;
&lt;li&gt;thejimbirch (Kanopi Studios)&lt;/li&gt;
&lt;li&gt;rajab natshah (Vardot)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Collaboration&lt;/h3&gt;
&lt;p&gt;This issue demonstrates the Drupal CMS team's pragmatic approach to AI tooling. The issue author acknowledged ambivalence about AI while recognizing its practical utility and the need to accommodate developers using these tools. Multiple contributors provided feedback to improve structure and readability, with discussion about whether to manage the file through a separate package like the scaffold system. The team decided keeping &lt;code&gt;AGENTS.md&lt;/code&gt; in the repository made more sense for documenting internal workings.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>#3557383: Ship local video media type with Drupal CMS for better compatibility with Canvas</title>
      <link>https://github.com/dbuytaert/drupal-digests/blob/main/issues/drupal-cms/3557383.md</link>
      <guid isPermaLink="false">019dcd57-1279-7774-a274-b91262fab190</guid>
      <pubDate>Wed, 19 Nov 2025 07:46:39 +0000</pubDate>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project:&lt;/strong&gt; Drupal CMS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Normal task&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Fixed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://www.drupal.org/node/3557383"&gt;#3557383&lt;/a&gt; · 3 contributors · 15 comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Followers:&lt;/strong&gt; 5&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;drupal_cms_remote_video&lt;/code&gt; recipe now also ships the local video media type, so Canvas components that reference a &lt;code&gt;video&lt;/code&gt; schema can use the media library picker instead of falling back to a less reliable file picker. The recipe description has been updated to reflect that it now covers both locally and remotely hosted video. Additionally, whitespace-to-underscore filename sanitization is enabled for uploaded files, and the built-in &lt;code&gt;files&lt;/code&gt; view is disabled to avoid confusing site editors who may not understand the difference between &amp;quot;Files&amp;quot; and &amp;quot;Media&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;No upgrade or configuration changes required.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The root problem was that Canvas resolves a &lt;code&gt;video&lt;/code&gt; field (via &lt;code&gt;json-schema-definitions://canvas.module/video&lt;/code&gt;) through the local video media type. When that media type was absent, Canvas degraded to a generic file picker that was unreliable. The fix adds &lt;code&gt;core/recipes/local_video_media_type&lt;/code&gt; to the &lt;code&gt;recipes&lt;/code&gt; list in &lt;code&gt;drupal_cms_remote_video/recipe.yml&lt;/code&gt;, alongside the existing &lt;code&gt;core/recipes/remote_video_media_type&lt;/code&gt;. The recipe also installs the &lt;code&gt;file&lt;/code&gt; and &lt;code&gt;views&lt;/code&gt; modules explicitly. A new &lt;code&gt;core.entity_form_display.media.video.*&lt;/code&gt; config action mirrors the existing remote video form display: it hides &lt;code&gt;uid&lt;/code&gt;, &lt;code&gt;langcode&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, and &lt;code&gt;created&lt;/code&gt;, and enables the &lt;code&gt;name&lt;/code&gt; field. &lt;code&gt;file.settings&lt;/code&gt; is updated via &lt;code&gt;simpleConfigUpdate&lt;/code&gt; to set &lt;code&gt;filename_sanitization.replace_whitespace: true&lt;/code&gt; in both &lt;code&gt;drupal_cms_remote_video&lt;/code&gt; and &lt;code&gt;drupal_cms_media&lt;/code&gt; (the latter backported to the 1.2.x branch of &lt;code&gt;drupal_cms_image&lt;/code&gt; as a bug fix). &lt;code&gt;views.view.files&lt;/code&gt; is disabled, and authenticated users receive the &lt;code&gt;delete own files&lt;/code&gt; permission. The &lt;code&gt;composer.json&lt;/code&gt; description was updated from &amp;quot;Configures display options for remote video&amp;quot; to &amp;quot;Configures display options for locally and remotely hosted video.&amp;quot; A follow-up is planned to explore a Composer package alias so the recipe can also be referenced as &lt;code&gt;drupal/drupal_cms_local_video&lt;/code&gt;, since the current package name (&lt;code&gt;drupal_cms_remote_video&lt;/code&gt;) no longer reflects its full scope.&lt;/p&gt;
&lt;h2&gt;Contribution&lt;/h2&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opened: November 12, 2025&lt;/li&gt;
&lt;li&gt;Committed: November 19, 2025 (6 days and 3 commits later)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Collaboration&lt;/h3&gt;
&lt;p&gt;pameeela noted early in the thread that adding the local video media type had always been planned as optional support, but she saw no major reason to keep it optional and suggested simply depending on the core recipe. phenaproxima agreed, opened MR !685, and then flagged the awkward naming of &lt;code&gt;drupal_cms_remote_video&lt;/code&gt; after the fact. pameeela acknowledged the naming issue but approved the change rather than holding it up, reasoning it was not worth blocking the fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This content is AI-generated and may contain errors. See &lt;a href="https://github.com/dbuytaert/drupal-digests/"&gt;Drupal Digests&lt;/a&gt; for more.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>