<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Drupal</title>
    <description>Dries Buytaert on Drupal.</description>
    <link>https://dri.es/tag/drupal</link>
    <atom:link href="https://dri.es/tag/drupal/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>State of Drupal presentation (September 2026)</title>
      <link>https://dri.es/state-of-drupal-presentation-september-2026</link>
      <guid>https://dri.es/state-of-drupal-presentation-september-2026</guid>
      <pubDate>Wed, 07 Oct 2026 03:50:03 -0400</pubDate>
      <description><![CDATA[<p>Drupal is now light-years ahead of its reputation. Closing that gap is our #1 challenge, and it was the main message of my DrupalCon Rotterdam keynote.</p>
<p>Just over two years ago, I launched <a href="https://dri.es/introducing-drupal-starshot-product-strategy">Drupal Starshot</a>. I did it because I wasn't sure we could still innovate like we used to. It turns out we can.</p>
<p>Starshot became <a href="https://dri.es/drupal-cms-1-released">Drupal CMS</a>, which brings together Site Templates, Recipes, Drupal AI, Drupal Canvas and more to make building websites easier.</p>
<p>Alongside that work, Drupal Core has become a faster and better framework for developers. A stronger Drupal Core helps us build a better Drupal CMS, while building Drupal CMS has driven further improvements in Drupal Core.</p>
<p>Unfortunately, many people outside the Drupal community haven't seen what Drupal can do today. In Rotterdam, I showed how far we have come and where we're going next, and we launched an advocacy program to help more people see how great Drupal has become.</p>
<p>If you missed the keynote, you can <a href="https://youtu.be/jrXnvVD8ryo">watch the video below</a> or <a href="https://dri.es/files/state-of-drupal-september-2026.pdf">download my slides</a> (86 MB).</p>
<figure><div style="position: relative; padding-bottom: 56.25%; height: 0"><iframe src="https://www.youtube-nocookie.com/embed/jrXnvVD8ryo" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%" loading="lazy" title="YouTube video" allowfullscreen></iframe></div></figure>
<h2>More ways to reach more people</h2>
<p>The first part of my keynote showed improvements for multilingual sites, JavaScript front-ends, headless Canvas, and Drupal AI.</p>
<p>Drupal has long had strong multilingual capabilities, but <a href="https://www.drupal.org/project/canvas">Drupal Canvas</a>, our powerful new page builder, didn't yet support multilingual sites. Not only did we add multilingual support to Canvas, but we made all multilingual sites easier to set up.</p>
<figure><div style="position: relative; padding-bottom: 56.25%; height: 0"><iframe src="https://www.youtube-nocookie.com/embed/xoPDb4UhHyg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%" loading="lazy" title="YouTube video" allowfullscreen></iframe></div></figure> 
<p>React has one of the world's largest developer communities. Drupal Canvas code components are written in React, and we designed the developer experience around the tools, patterns, and workflows front-end JavaScript developers already know. They can use their preferred development tools, including modern AI-assisted workflows, without having to learn Drupal-specific concepts or conventions. We've continued to make that experience better, lowering the barrier for a much larger community of developers to build with Drupal.</p>
<figure><div style="position: relative; padding-bottom: 56.25%; height: 0"><iframe src="https://www.youtube-nocookie.com/embed/zim-Wr-HJNk" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%" loading="lazy" title="YouTube video" allowfullscreen></iframe></div></figure>
<p>At DrupalCon, we extended that same model with <a href="https://project.pages.drupalcode.org/canvas/headless/">Drupal Canvas Headless</a>. Developers can now use Drupal to manage content while building the front-end separately with frameworks like Next.js, Astro, TanStack, Angular, or Nuxt. Editors still get the visual experience of Drupal Canvas: they can build pages in Drupal and preview exactly how those pages will appear on the front-end.</p>
<p>This changes an important trade-off. Teams no longer have to choose between a modern JavaScript front-end and Drupal Canvas' visual authoring experience. They can have both. That opens Drupal to more developers, more front-end architectures, and more types of projects.</p>
<figure><div style="position: relative; padding-bottom: 56.25%; height: 0"><iframe src="https://www.youtube-nocookie.com/embed/IPaNNc0MBnE" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%" loading="lazy" title="YouTube video" allowfullscreen></iframe></div></figure>
<p>Drupal AI is moving so fast that I could have filled a whole keynote with it. Instead, we launched a <a href="https://drupal.org/ai/demo">new Drupal AI demo</a> where people can experience Drupal AI for themselves. It comes preconfigured, making it easy to explore what Drupal AI can do or even show it to customers.</p>
<p>With the latest Drupal AI, you can ask questions and get answers grounded in your site's content. You can audit your content against brand guidelines, translate content, classify content,  build pages and React components with AI, and more. Through MCP, AI assistants can work with Drupal content from outside Drupal.</p>
<p>What excites me most is the foundation underneath all of this. Drupal AI turns Drupal into an AI harness: organizations can connect AI models to structured content, tools, and workflows, while keeping control through permissions, guardrails, observability, metering, and a choice of AI models.</p>
<figure><div style="position: relative; padding-bottom: 56.25%; height: 0"><iframe src="https://www.youtube-nocookie.com/embed/Ka1cLG5nvkw" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%" loading="lazy" title="YouTube video" allowfullscreen></iframe></div></figure>
<h2>Opening Drupal's capabilities to other software</h2>
<p>The second part of my keynote looked at another important shift: AI assistants can give people a new way to work with Drupal.</p>
<p>In one demo, an editor simply asked an AI assistant to unpublish a page. They didn't need to know where to click or understand Drupal's revisions, moderation workflows, or permissions. The assistant translated their intent into action, but Drupal remained in control: it checked whether the editor was allowed to unpublish the page and applied the site's publishing rules, just as it would if they had done it by hand.</p>
<p>If you want to see the demo in more detail, Scott Falconer, who worked on it, recorded a <a href="https://www.youtube.com/watch?v=Gpq0ZnMg4mg">behind-the-scenes walkthrough</a> showing how to set it up yourself, what happens under the hood, and how to get involved.</p>
<p>That demo was built on the <a href="https://www.drupal.org/project/tool">Tool module</a>, which I believe is one of the most important modules for Drupal developers to watch. Drupal modules already contain thousands of useful capabilities: publishing content, managing users, processing media, changing configuration, and much more. The Tool module gives developers a standard way to expose those capabilities so AI assistants and other software can discover and use them.</p>
<p>Today, exposing existing capabilities as tools can still require too much code. My own album module didn't expose tools, and making its existing capabilities available to an AI assistant took about 1,000 additional lines of code.</p>
<p>But once those tools were available, the value became obvious. Adding MCP support has already changed how I manage the more than 10,000 photos on my site. Tasks that used to take a lot of time can now be done much faster and more accurately with an AI assistant, while Drupal still manages the content, permissions, and workflows underneath.</p>
<p>That experience reinforced something I wrote about in <a href="https://dri.es/ai-and-the-great-cms-unbundling">AI and the great CMS unbundling</a>: AI can take on more of the execution work while Drupal remains the control layer. I expect more organizations will want to manage parts of their sites through AI assistants. AI can make complex tasks much faster and easier without giving up the structure, governance, and safeguards that Drupal provides.</p>
<p>I believe thousands of module developers will eventually want to expose their capabilities in the same way, so I've been working with Matt Glaman to make it much easier. Matt has been developing <a href="https://git.drupalcode.org/project/tool/-/work_items/3518120">a change to the Tool API</a> that lets developers expose existing PHP methods as tools using attributes.</p>
<p>The idea is simple: add PHP attributes to an existing method to describe its name, purpose, inputs and outputs. In my album module, roughly 1,000 lines of integration code became about 20 attributes. My site already uses the experimental branch, and we're working to get it merged into the <a href="https://www.drupal.org/project/tool">Tool module</a> proper.</p>
<p>And this isn't only about AI. The same tools can be called by AI assistants over MCP, by other applications over HTTP, or used to generate schemas for JavaScript components and connect Drupal modules to workflow systems like <a href="https://www.drupal.org/project/eca">ECA</a>, <a href="https://www.drupal.org/project/flowdrop">FlowDrop</a>, and <a href="https://www.drupal.org/project/maestro">Maestro</a>. The video below shows FlowDrop using capabilities exposed by my album module:</p>
<figure><div style="position: relative; padding-bottom: 56.25%; height: 0"><iframe src="https://www.youtube-nocookie.com/embed/7CnZd63-JWg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%" loading="lazy" title="YouTube video" allowfullscreen></iframe></div></figure>
<h2>Talk louder about Drupal</h2>
<p>In the last part of my keynote, I came back to Drupal's reputation gap. We can make enormous progress with Drupal, but that doesn't automatically change what people or AI agents think of it. For example, an <a href="https://dri.es/do-ai-coding-agents-recommend-drupal-2026">AI coding agent I tested in June</a> didn't even mention Drupal CMS or Site Templates when it evaluated Drupal.</p>
<p>Over the past few years, much of my personal focus has been on accelerating innovation in Drupal. That work is paying off, and we have real product momentum. I'm now shifting more of my attention to the other side of the equation: making sure people see what we've built, understand what has changed, and know why it matters.</p>
<figure><img src="https://dri.es/files/cache/drupalcon-rotterdam-2026/reputation-1280w.png" alt="Slide reading &quot;Drupal is now light-years ahead of its reputation&quot; over translucent red and yellow shapes, with a pink glass rocket on the left." width="1280" height="720" />  </figure>
<p>So I announced the <a href="https://www.drupal.org/advocacy">Drupal Advocacy Program</a>, led by the Drupal Association.</p>
<p>Drupal already has a contribution credit system. It recognizes the people who contribute to Drupal and the organizations that support their work. For businesses, those credits also help determine visibility in the Drupal marketplace. Until now, we've been much better at recognizing technical contributions and financial support than advocacy work.</p>
<p>The new Drupal Advocacy Program will change that. Advocacy work can now earn contribution credit, and work that reaches people outside the existing Drupal community can earn more weight.</p>
<p>If we want to close Drupal's reputation gap, we can't only talk to people who already know Drupal well. We need more talks at external events, articles in broader publications, customer stories, demos, tutorials, and other work that helps people see what Drupal can do today.</p>
<p>Blue Drop Labs is a good example of what I mean. The day after the DriesNote, they published a post on <a href="https://www.bluedroplabs.com/resources/articles/drupal-canvas-headless-astro">building a website with Drupal CMS and Canvas Headless</a>. The project itself was already live, but they quickly turned that work into a story others could learn from, with demos showing how editors and developers work with Drupal today.</p>
<p>That is exactly what I mean by &quot;talking louder&quot;. There is already a lot of impressive Drupal work happening. We need to do a better job of showing it to the world.</p>
<p>I was a little nervous about announcing the Advocacy Program. We've wrestled with Drupal's reputation gap for a long time, and I felt we needed to do more than acknowledge it. Using contribution credit to reward advocacy was a concrete way to change the incentives, but I wasn't sure how the community would react.</p>
<p>It turned out to be one of the best-received announcements of the keynote. That response gave me confidence that people were ready to act on the reputation gap, not just recognize it.</p>
<p>You can <a href="https://www.drupal.org/association/blog/drupal-advocacy-program">learn how to earn Drupal advocacy credit</a> and <a href="https://www.drupal.org/advocacy">submit your advocacy work</a>.</p>
<figure><img src="https://dri.es/files/cache/drupalcon-rotterdam-2026/talk-louder-1280w.png" alt="Slide reading &quot;Talk louder&quot; over translucent circuit boards and electronic parts glowing red, orange and yellow." width="1280" height="720" />  </figure>
<p>My ask is simple: talk louder about Drupal, especially to people outside our community. Drupal doesn't need hype, but we do need a better public record. We need more people showing, with real examples, what Drupal can do today.</p>
<p><em>I want to extend my gratitude to everyone who contributed to making my presentation and demos a success. A special thank you to <a href="https://www.drupal.org/u/balintbrews">Bálint Kléri</a>, <a href="https://www.drupal.org/u/breidert">Christoph Breidert</a>, <a href="https://www.drupal.org/u/g%C3%A1bor-hojtsy">Gábor Hojtsy</a>, <a href="https://www.drupal.org/u/lauriii">Lauri Timmanee</a>, <a href="https://www.drupal.org/u/mglaman">Matt Glaman</a>, <a href="https://www.drupal.org/u/michaellander">Michael Lander</a>, <a href="https://www.drupal.org/u/pameeela">Pamela Barone</a>, <a href="https://www.drupal.org/u/d34dman">Shibin Das</a>, and the <a href="https://www.drupal.org/ai/partners">Drupal AI partners</a>. Many others contributed indirectly to make this possible. If I've inadvertently omitted anyone, please reach out.</em></p>
]]></description>
    </item>
    <item>
      <title>Acquia rebrands around content and Drupal</title>
      <link>https://dri.es/acquia-rebrands-around-content-and-drupal</link>
      <guid>https://dri.es/acquia-rebrands-around-content-and-drupal</guid>
      <pubDate>Mon, 14 Sep 2026 20:13:35 -0400</pubDate>
      <description><![CDATA[<p>Today <a href="https://www.acquia.com/">Acquia</a> launched a new brand, and my favorite part is the updated logo. Right under the Acquia name, it now says &quot;Powered by Drupal&quot;.</p>
<p>Drupal has always been at the core of Acquia, but for the past 5 years it was less visible in how we described ourselves. Now it's front and center again.</p>
<div class="large">
  <figure><img src="https://dri.es/files/cache/acquia/acquia-com-september-2026-1280w.png" alt="Acquia.com homepage promoting Acquia as &quot;the agentic content platform that marketing loves and IT trusts&quot;." width="1280" height="834" />  </figure>
</div>
<p>But that is not the main reason for the rebrand. The bigger reason for the rebrand is to help people see what Acquia has become. Our products have evolved faster than awareness of them.</p>
<p>The new brand leads with content instead of digital experiences, and the homepage calls Acquia an &quot;agentic content platform&quot; rather than a &quot;digital experience platform&quot;.</p>
<p><a href="https://www.acquia.com/products/source">Acquia Source</a> is our new <em>command center</em>, bringing content management, digital asset management, and web governance into one workspace. <a href="https://www.acquia.com/products/source/ai">Acquia AI</a> coordinates agent work across those tools.</p>
<p>For agents to work safely across these tools, they need content they can trust and clear rules for using it. Somebody still has to decide what is approved, who can use it, and where it can go. I wrote about that in <a href="https://dri.es/ai-and-the-great-cms-unbundling">AI and the great CMS unbundling</a>, and the new brand puts that idea at the center of our story.</p>
<p>Drupal is well suited for that job. Structured content, granular permissions, workflows, and revision history are the things agents need to work safely, and Drupal has refined them for years.</p>
<p>Customers can use Acquia Source CMS, our <a href="https://dri.es/the-product-we-should-not-have-killed">fully managed Drupal SaaS offering</a>. For teams that want full control over their Drupal sites, we offer Acquia Cloud. Acquia Source brings sites on either platform into a shared workspace.</p>
<p>As you scroll the new homepage, it builds up our technology stack one layer at a time, starting from Drupal.</p>
<figure><div style="position: relative; padding-bottom: 56.25%; height: 0"><iframe src="https://www.youtube-nocookie.com/embed/s38IkIirDeo" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%" loading="lazy" title="YouTube video" allowfullscreen></iframe></div></figure>
<p>Acquia leaning into <a href="https://www.drupal.org/">Drupal</a> is also good news for Drupal itself. It helps close the <a href="https://dri.es/the-gap-between-drupal-and-its-reputation">gap between Drupal and its reputation</a>. Drupal is still often seen as a CMS that requires a developer for everything, even as improvements in recent years have made it easier for marketers to build pages and manage content themselves.</p>
<p>So alongside the new brand, we'll be investing more in helping the Drupal community evangelize Drupal, reaching developers and marketing leaders who may not have looked at it in years. I want more people to see what Drupal has become.</p>
]]></description>
    </item>
    <item>
      <title>The 60-second procurement test</title>
      <link>https://dri.es/the-60-second-procurement-test</link>
      <guid>https://dri.es/the-60-second-procurement-test</guid>
      <pubDate>Wed, 09 Sep 2026 14:45:17 -0400</pubDate>
      <description><![CDATA[<p>I believe any Open Source project with a commercial or institutional funding ecosystem should publish an official contribution record: who contributes, how much and over what period, what kind of work they do, which parts of the project they work on, and, where disclosed, who paid for the work.</p>
<p>The test for a good record is simple. A buyer should be able to answer three questions in about a minute: does this vendor contribute at all, how much do they contribute compared to other vendors, and do they work on the parts of the project I care about?</p>
<p>A good record serves both sides. Buyers get answers they can check, and vendors who contribute get credit for work that often goes unseen.</p>
<p>Of course, contribution does not prove that a vendor can deliver. It is one procurement factor alongside delivery capability, expertise, and price.</p>
<h2>Vendor claims are hard to verify and compare</h2>
<p>Say you need a vendor for your Drupal site, your Kubernetes cluster, or whatever Open Source software you use, and two firms bid. Both say they're deeply involved in the project, and both might be telling the truth by their own definition of &quot;involved&quot;.</p>
<p>Without a project record, verifying those claims often means reconstructing each vendor's contribution history yourself.</p>
<p>The code repository seems like the obvious place to start, but even counting commits by vendor is not simple. A project has to connect individual contributors to the organizations that employed or funded their work, and those relationships can change over time.</p>
<p>More importantly, Open Source contribution can include documentation, support, event organization, governance work, promotion, and more. Much of that work happens outside the code repository or isn't recorded in a form a buyer can easily interpret. The data may all be public, but public is not the same as usable. A contribution record exists to close that gap.</p>
<h2>Projects are best placed to decide which contributions matter</h2>
<p>Drupal has tracked contribution credits since 2015, following <a href="https://dri.es/a-method-for-giving-credit-to-organizations-that-contribute-code-to-open-source">a method I proposed in 2014</a> and now <a href="https://www.drupal.org/contribution-credit">governed by the Drupal Association</a>. Its system records more than code and gives credit not only to individual contributors, but also to the organizations and customers that fund their work.</p>
<p>Not every contribution counts the same. A contribution to Drupal Core or a strategic initiative earns more credit than one to a module that few sites use, and work on contributed projects counts for more when more sites depend on them.</p>
<p>Raw contribution data does not tell buyers which work matters most to the project. The project has the context to decide what advances its priorities and how different contributions should be weighted. Its record should publish those rules, link to the underlying contributions, and explain how mistakes are corrected.</p>
<p>In Drupal, contribution credits feed into the <a href="https://www.drupal.org/drupal-services">Drupal.org marketplace</a> where buyers can look up agencies and compare them. While we have a strong foundation, we still have work to do to make the record easier to find, understand, and compare.</p>
<h2>The record is the project's job, not the vendor's</h2>
<p>A fair objection is that this puts the burden on the wrong party: if a vendor claims to contribute, the vendor should prove it, and the project shouldn't spend scarce time tracking contributions.</p>
<p>Suppose the two firms from earlier both send proof. Each proves its own numbers, in the measure it looks best on, and it is still not clear who has the better record. Buyers meet this problem everywhere, which is why procurement leans on third parties: auditors, certifiers, industry analysts, references.</p>
<p>For vendor contribution, the project is often the natural third party. The work happens inside it, so it has the data and is uniquely placed to express an opinion on the value and strategic impact of a vendor's contribution.</p>
<p>A contribution record is a way for a project to recognize its <a href="https://dri.es/balancing-makers-and-takers-to-scale-and-sustain-open-source">Makers</a> and to say who it would like to see win bids. It also settles the question once, for every buyer, instead of every buyer auditing every bid.</p>
<p>A project should take on the burden when publishing the record is in its interest. Making contribution visible steers commercial work toward the vendors that sustain the project, and that work is what pays for the contribution. So the project gets more contribution, and public credit is how the project gives back to the vendors that contribute.</p>
<h2>Projects can start with a simple record</h2>
<p>Not every project may want or need a system as elaborate as Drupal's. How much record a project needs depends on how services around it are bought and sold: a project with hundreds of firms competing for work needs more than one with a handful of known vendors, and a project with no commercial ecosystem may not need a record at all.</p>
<p>For a small project, a text file in the official repository listing its recognized organizational contributors and what they worked on can be enough for a first version.</p>
<p>More complex ecosystems may need to categorize vendors, support searches by location, or weight different kinds of contribution. Whatever form it takes, the record has to be easy to find and quick to use.</p>
<p>So if you maintain an Open Source project with a commercial or institutional funding ecosystem, start publishing a contribution record and improve it over time.</p>
<p>If you buy services built on Open Source, ask for the project's contribution record. Decide at the start how contribution should count in your purchasing decision, then check bidder claims against the record.</p>
<p>Finally, if you fund Open Source, use the record to find contributors working on the parts of the project you want to support.</p>
<p>Where buyers and funders can consider contribution, I expect projects with clear records to see more commercial opportunities go to their maintainers than projects that rely on appeals alone.</p>
<p><em>Special thanks to <a href="https://en.wikipedia.org/wiki/Henry_Poole_(technologist)">Henry Poole</a> for his contributions to this blog post, and to <a href="https://www.linkedin.com/in/sachikomuto/">Sachiko Muto</a>, <a href="https://www.drupal.org/u/farriss">Tiffany Farriss</a>, <a href="https://www.drupal.org/u/hestenet">Tim Lehnen</a>, and <a href="https://www.linkedin.com/in/amandinelepape/">Amandine Le Pape</a> for their review.</em></p>
]]></description>
    </item>
    <item>
      <title>Open Source is a cost-allocation system</title>
      <link>https://dri.es/open-source-is-a-cost-allocation-system</link>
      <guid>https://dri.es/open-source-is-a-cost-allocation-system</guid>
      <pubDate>Thu, 27 Aug 2026 15:21:42 -0400</pubDate>
      <description><![CDATA[<p>Open Source is usually described as a licensing model, a development model, or a production model. All three descriptions are useful, but they leave something out. Every Open Source ecosystem is also a <em>cost-allocation system</em>.</p>
<p>Keeping software relevant and dependable requires people to write code, review contributions, prepare releases, investigate security reports, operate infrastructure, write documentation, answer questions, and support upgrades and migrations. Someone always bears those costs.</p>
<p>A proprietary vendor can tie access to payment: every license or subscription sold helps fund developers, security work, infrastructure, and releases.</p>
<p>Open Source breaks the link between access and payment. Anyone can redistribute the software at any price, including zero. Payment is therefore not a condition of using or redistributing it, and those rights do not themselves provide a durable mechanism for funding production and maintenance.</p>
<p>But separating payment from access does not make the costs disappear. Costs are distributed across maintainers, employers, foundations, sponsors, and users. A maintainer may volunteer their time. An employer may pay a developer to contribute. A foundation may operate infrastructure.</p>
<p>Because these costs are distributed rather than collected through a single transaction, they are harder to see and harder to fund.</p>
<p>Technical choices often shape where those costs fall. That allocation is not always deliberate; it can emerge slowly from decisions that were individually reasonable and become visible only years later.</p>
<p>Drupal's update service recently gave me a good example. Drupal sites periodically contact <code>updates.drupal.org</code> to ask whether new versions of Drupal or any installed add-ons are available. Drupal calls these add-ons &quot;contributed projects&quot;, such as modules and themes maintained by members of the community.</p>
<p>The current design sends one request for Drupal itself and one for every contributed project installed on the site. A site with 100 contributed projects therefore makes 101 requests each time it checks for updates, by default, once a day.</p>
<p>There were good reasons for that design. Each project's release history could be stored as a static file and served repeatedly without rebuilding it for every request. The design was straightforward, and it worked.</p>
<p>But Drupal grew. Today, <code>updates.drupal.org</code> serves nearly a billion requests a month. The file containing <a href="https://updates.drupal.org/release-history/drupal/current">Drupal Core's release history</a> is roughly half a megabyte by itself. Based on the number of requests for that file, I estimate that Drupal Core update checks alone may account for roughly 50 to 75 TB of data transfer each month. Traffic for contributed projects comes on top of that.</p>
<p>No one chose to make <code>updates.drupal.org</code> transfer tens of terabytes of release data each month. That scale emerged gradually as Drupal grew, from a design that had been reasonable when the ecosystem was smaller.</p>
<p>Part of the challenge is that, in Open Source, the people who benefit, the people who decide, and the people who bear the costs are often different and may have no formal obligations to one another.</p>
<p>Site owners benefit from reliable update notifications, usually without paying the Drupal Association for them. Drupal Association staff operate the update service, while the Association bears its traffic and infrastructure costs. But the code that determines how sites make those requests lives in Drupal Core, where changes require the involvement of Core committers. The Core committers do not report to the Drupal Association, so the Association cannot change that behavior on its own.</p>
<p>In practice, Drupal Association staff and Core committers collaborate closely. That collaboration is important because decision-making authority and cost-bearing sit with different groups.</p>
<p>The people bearing material costs need a way to make those costs visible and influence the decision, even if they do not control it.</p>
<p>This example shows why every Open Source architecture is also a cost-allocation system. Good governance considers that allocation up front, monitors its effects over time, and revisits it when it becomes unsustainable.</p>
<p>Understanding an Open Source system therefore requires more than understanding its code or license. We also need to understand who benefits, who decides, and who bears the costs as the system grows. Once those relationships are visible, a community can decide whether the allocation is sustainable or whether the architecture should change.</p>
]]></description>
    </item>
    <item>
      <title>Finding related posts with embeddings</title>
      <link>https://dri.es/finding-related-posts-with-embeddings</link>
      <guid>https://dri.es/finding-related-posts-with-embeddings</guid>
      <pubDate>Wed, 26 Aug 2026 04:40:02 -0400</pubDate>
      <description><![CDATA[<p>I added a new feature to my blog: a list of related posts at the bottom of each post. I implemented it using embeddings, and this note documents how.</p>
<p>I looked at how other content management systems identify related posts: most use shared tags, backlinks, manual curation, or embeddings. I chose embeddings, which compare the meaning of each post, because they can uncover connections without shared tags, existing links, or manual curation.</p>
<h2>Embeddings turn meaning into numbers</h2>
<p>An embedding model reads text and returns a vector: a long list of numbers. The model I use, <a href="https://huggingface.co/BAAI/bge-base-en-v1.5"><code>bge-base-en-v1.5</code></a> from the Beijing Academy of Artificial Intelligence (BAAI), returns 768 numbers for each post.</p>
<p>For one of my posts, the first handful of those coordinates looks something like this:</p>
<pre><code class="language-text">[ 0.021, -0.045, 0.038, -0.012, 0.007, ..., 0.019 ]
</code></pre>
<p>You can think of those 768 numbers as coordinates in a high-dimensional meaning space, where each dimension captures some pattern the model learned from text.</p>
<p>Conceptually, it is a bit like tagging each blog post with hundreds of auto-generated tags, except that these tags are unnamed (they are just numbers) and distributed (meaning is spread across all of them). Together, the 768 numbers place the post near other posts with similar meaning.</p>
<p>This is what lets two posts match even when they use different words. During training, the model learns that certain words and phrases appear in similar contexts or play similar roles, so it places them near each other in the space. It does not need &quot;car&quot; and &quot;automobile&quot; to share any letters to learn that they are used in related ways.</p>
<h2>Raw cosine similarity makes everything look related</h2>
<p>Once every post has an embedding vector, the next question is how to compare them. This is where I had to dust off a little math. Fortunately, it turned out to be mostly high-school math: averages, angles, and multiplication.</p>
<p>The standard way to compare two vectors is <a href="https://en.wikipedia.org/wiki/Cosine_similarity">cosine similarity</a>. Imagine each vector as an arrow pointing away from the origin. Cosine similarity measures the angle between two of these arrows and then takes the cosine of that angle, which is where the name comes from.</p>
<p>Two arrows pointing in nearly the same direction form a small angle, and the cosine of a small angle is close to 1, meaning the posts are related. As the arrows spread apart, the cosine falls: at a right angle it is 0, and for arrows pointing in opposite directions it drops to -1, so unrelated posts score closer to 0 or even negative.</p>
<p>In practice, these raw cosine values can be misleading, because embedding models rarely spread their vectors evenly in every direction. They tend to pack most vectors into a narrow cone, a property called <a href="https://arxiv.org/abs/1907.12009">anisotropy</a>. It means that the cosine similarities tend to cluster in a narrow band.</p>
<p>On my blog, the raw cosine similarity between two randomly chosen posts is almost always between 0.5 and 0.75, with a median of 0.64. The practical effect is that almost any two posts look somewhat similar even if they are not.</p>
<h2>Mean-centering reveals what makes each post distinct</h2>
<p>Anisotropy has several known fixes. The easiest is <em>mean-centering</em>, which is what I use and what the rest of this section explains.</p>
<p>Other solutions include <a href="https://arxiv.org/abs/1702.01417">All-but-the-top</a>, which removes the average and the next few strongest directions. <a href="https://arxiv.org/abs/2103.15316">Whitening</a> stretches the space so every direction carries equal weight (the name comes from white noise).</p>
<p>With mean-centering you simply compute the average vector across all posts and subtract it from every post's vector. Subtracting the average vector from each post removes what all posts have in common; what remains is what makes each post distinct.</p>
<p>A modern model like <code>bge-base-en-v1.5</code> already suffers less from anisotropy than older or simpler encoders: it is trained with <a href="https://en.wikipedia.org/wiki/Self-supervised_learning#Contrastive_self-supervised_learning">contrastive learning</a>, which pushes unrelated texts apart, and version 1.5 was tuned specifically to spread out its similarity scores. That said, centering still made the scores much more useful on my corpus.</p>
<p>An example might help. Imagine three posts with only two numbers each instead of 768:</p>
<pre><code class="language-text">A = (0.90, 0.10)
B = (0.85, 0.80)
C = (0.80, 0.75)
</code></pre>
<p>At first glance, all three posts might look somewhat similar. In every post the first number is high and close to the others (0.90, 0.85 and 0.80). A number that barely changes from post to post tells you little about how they differ, so that first number is not very useful.</p>
<p>The average (mean) of the three vectors is:</p>
<pre><code class="language-text">mean = (0.85, 0.55)
</code></pre>
<p>Now subtract that average from each post:</p>
<pre><code class="language-text">A = ( 0.05, -0.45)
B = ( 0.00,  0.25)
C = (-0.05,  0.20)
</code></pre>
<p>Now the picture is already clearer. B and C both have a positive second number, so they point in roughly the same direction; A's second number is negative, so it points somewhere else.</p>
<p>Before centering, everything looked similar. After centering, the comparison focuses on what is different from the average.</p>
<h2>Normalization reduces comparison to a dot product</h2>
<p>After centering, each vector has a length as well as a direction. Length says how far a post sits from the average, and direction says in what way it differs.</p>
<p>I want to rank posts by what they are about, not by how unusual they are, so only the direction matters. Hence, we normalize each vector by dividing it by its own length, which scales it to length 1 and moves it onto the unit circle (or, in 768 dimensions, the unit sphere), leaving only its direction.</p>
<p>It also makes the comparison cheaper. Cosine similarity is normally the dot product divided by the product of the two vectors' lengths. If both vectors have length 1, that denominator is 1 × 1 = 1, so the expression reduces to the dot product alone: multiply the two lists number by number, then add the results.</p>
<p>Using the same example, the centered vectors for B and C are:</p>
<pre><code class="language-text">B = ( 0.00, 0.25)
C = (-0.05, 0.20)
</code></pre>
<p>First, normalize each vector to length 1. A vector's length is the square root of the sum of its squared numbers (good old Pythagoras, only with more numbers). B has length √(0.00² + 0.25²) = 0.25, while C has length √((-0.05)² + 0.20²) ≈ 0.206, so dividing each vector by its own length gives:</p>
<pre><code class="language-text">B ≈ ( 0.00, 1.00)
C ≈ (-0.24, 0.97)
</code></pre>
<p>Then take the dot product:</p>
<pre><code class="language-text">(0.00 × -0.24) + (1.00 × 0.97) = 0.97
</code></pre>
<p>That is a strong match: the closer the score is to 1, the more the two posts point in the same direction. B and C are nearly aligned.</p>
<p>A, after normalization, points mostly downward. Next to B:</p>
<pre><code class="language-text">A ≈ ( 0.11, -0.99)
B ≈ ( 0.00,  1.00)
</code></pre>
<p>Multiplying them the same way:</p>
<pre><code class="language-text">(0.11 × 0.00) + (-0.99 × 1.00) = -0.99
</code></pre>
<p>That is not a match at all.</p>
<h2>The PHP code is shorter than the explanation</h2>
<p>The production code does the same arithmetic, just with 768 numbers per post instead of two:</p>
<pre><code class="language-php">public static function center(array $raw): array {
  if ($raw === []) {
    return [];
  }
  $mean = array_fill(0, count(reset($raw)), 0.0);
  foreach ($raw as $vector) {
    foreach ($vector as $i =&gt; $value) {
      $mean[$i] += $value;
    }
  }
  $count = count($raw);
  foreach ($mean as $i =&gt; $sum) {
    $mean[$i] = $sum / $count;
  }
  $centered = [];
  foreach ($raw as $nid =&gt; $vector) {
    $norm = 0.0;
    foreach ($vector as $i =&gt; $value) {
      $vector[$i] = $value - $mean[$i];
      $norm += $vector[$i] * $vector[$i];
    }
    // A vector sitting exactly on the mean centers to zero; fall back to 1.0
    // so the division below never hits a zero norm.
    $norm = sqrt($norm) ?: 1.0;
    foreach ($vector as $i =&gt; $value) {
      $vector[$i] = $value / $norm;
    }
    $centered[$nid] = $vector;
  }
  return $centered;
}

public static function topMatches(array $source, array $pool, int $self): array {
  $scores = [];
  foreach ($pool as $nid =&gt; $vector) {
    if ($nid === $self) {
      continue;
    }
    $similarity = 0.0;
    foreach ($source as $i =&gt; $value) {
      $similarity += $value * $vector[$i];
    }
    $scores[$nid] = $similarity;
  }
  arsort($scores);
  return array_keys(array_slice($scores, 0, 3, TRUE));
}
</code></pre>
<p>While my explanation was long, both PHP methods are relatively short. In <code>center()</code>, each vector has the corpus mean subtracted, then is divided by its own length. In <code>topMatches()</code>, I calculate the cosine similarity between one post and every other post, then keep the three highest.</p>
<p>You might expect a vector database to replace all of this. It would replace some of it: storing a vector and asking for the closest three would remove <code>topMatches()</code>, but it would not remove <code>center()</code>. Centering is optional, but it meaningfully improved my results.</p>
<p>A vector database likely makes centering harder. Today I store raw vectors and subtract the average when I compare them, so a new post does not change anything I have stored. A vector database would search what I stored, so the subtraction would have to happen before storing. I'd have to update all stored vectors for every new post or every edit, which feels more complex. Maybe vector databases have a good answer for that; I have not looked.</p>
<h2>One-time embeddings, occasional ranking</h2>
<p>You might wonder how expensive it is to generate these embeddings and compare all these vectors. It turns out to be fast and cheap.</p>
<p>There are two kinds of work, and they happen at different times. Generating an embedding calls an AI model, but happens only once after a post is created or edited. Ranking uses ordinary PHP arithmetic and happens occasionally, when Drupal rebuilds a page's cached related-post list.</p>
<p>I run the model on Cloudflare Workers AI. To generate an embedding, my server makes an HTTPS call that passes the post's text to Cloudflare, which runs the model and returns the 768-number vector. That round trip takes about 250ms. It happens on the first view after a post is created or edited, and the vector is then cached. The model is deterministic, so the same text always produces the same 768 numbers.</p>
<p>Cloudflare bills Workers AI usage in units it calls Neurons and includes 10,000 free each day. Embedding my full archive of roughly 1,500 posts used roughly 4,000 Neurons, and a new post costs about three. Embedding my blog is basically free.</p>
<p>Calculating the related posts never calls the AI model. It all happens in <a href="https://www.drupal.org/">Drupal</a>, my website's content management system. When Drupal needs to build one of the related posts lists, it loads all the stored vectors, centers them, and scores the current post against all the others: roughly 1,500 dot products, each over 768 numbers. This takes around 250ms on my site. After a list has been built, it is cached.</p>
<p>In other words, my website never loads model weights; it just stores the 768 numbers that come back. The machine-learning compute lives at Cloudflare's edge, and my server stays a plain PHP application. None of this needs a vector database or a machine-learning framework: one HTTP call generates the embedding, a key-value store caches it, and a few dozen lines of arithmetic choose the related posts.</p>
<p>Tags are too blunt, backlinks only capture the links I remembered to make, and manual curation does not scale. All three need me to notice the connection first. Using embeddings might sound a bit scary, but they turned out to be easy to implement, fully automated, and able to surface posts I would never have thought to link.</p>
]]></description>
    </item>
    <item>
      <title>The software business after code scarcity</title>
      <link>https://dri.es/the-software-business-after-code-scarcity</link>
      <guid>https://dri.es/the-software-business-after-code-scarcity</guid>
      <pubDate>Mon, 17 Aug 2026 05:35:44 -0400</pubDate>
      <description><![CDATA[<p>If AI can generate an application from a description, is software still worth anything?</p>
<p>I have lived with a version of that question longer than most.</p>
<p>I released <a href="https://www.drupal.org">Drupal</a> for free more than twenty-five years ago, and later co-founded <a href="https://www.acquia.com">Acquia</a>, which has grown into a large enterprise software company built around Drupal.</p>
<p>Granted, Drupal is free in a different way than AI-generated applications are free, but I'm not sure that changes the basic question of how to build a successful business around either one.</p>
<p>Open Source made code abundant by giving people broad rights to use, modify, and redistribute it. AI is lowering the cost of producing code. One lets you copy the software; the other makes it cheaper to recreate software.</p>
<h2>Free code changes what customers pay for</h2>
<p>Because anyone could use Drupal for free, Acquia could never build a durable business around access to the code. From the start, <a href="https://dri.es/acquia-first-decade-the-founding-story">we had to make money another way</a>.</p>
<p>We built that business around helping enterprises build, run, and manage Drupal applications throughout their lifecycle. That includes hosting, but goes well beyond it: the tools and services needed to develop, deploy, secure, scale, monitor, and improve applications in production.</p>
<p>Proprietary SaaS typically bundles access to the application with the hosting and operations required to run it. With Open Source, organizations can run the software themselves or choose who hosts and operates it.</p>
<p>As AI makes applications cheaper to recreate, the traditional SaaS bundle of software and operations comes under pressure. Customers may become less willing to pay for access to application functionality without becoming any less willing to pay to run and manage applications in production. For Open Source businesses those economics are not new.</p>
<h2>Dependability becomes the product</h2>
<p>Software can be free, or nearly free, without becoming cheap to depend on. The more people and organizations depend on a system, the more of its value comes from operating it securely, reliably, and at scale.</p>
<p class="pullquote">Once people depend on an application, the cost of its failure has little to do with how much it cost to build. An application that costs $1,000 to build can still cause a $10 million failure.</p>
<p>As AI makes enterprise applications easier to create, adapt, and integrate, they still have to be deployed, secured, scaled, monitored, and run reliably over time. As software cost comes down, dependability becomes a differentiator.</p>
<p>Linux is abundant; dependable cloud infrastructure is a service worth paying for. Drupal is abundant; dependable digital experience infrastructure is a service worth paying for.</p>
<p>Acquia has lived with those economics for nearly 20 years. Drupal made the code abundant, so we built our business around helping organizations build, run, and improve what they created with it. As AI makes code cheaper to generate, that business model may start to look a lot less unusual.</p>
<p>Either way, more software companies will have to answer the same question: if code and capabilities are abundant, what are customers really paying you for?</p>
]]></description>
    </item>
    <item>
      <title>Responsibility follows control</title>
      <link>https://dri.es/responsibility-follows-control</link>
      <guid>https://dri.es/responsibility-follows-control</guid>
      <pubDate>Thu, 30 Jul 2026 12:46:27 -0400</pubDate>
      <description><![CDATA[<p>An AI model does not decide what data it can access, which tools it can use, or whether it can act without approval. People make those decisions at different points. Upstream, a model developer trains and tests the model and decides whether and how to release it. Downstream, a developer builds the model into a system, connects that system to data and tools, and decides whether a person must review its proposed actions before they take effect.</p>
<p>Those choices determine whether harm is possible at all. So when harm occurs, responsibility should fall on those who controlled the relevant choices. That responsibility may be shared: model developers control training and release, product builders control permissions and deployment, and users control deliberate misuse.</p>
<p>Responsibility should follow meaningful control</p>
<p>That principle is missing from much of the debate over open-weight AI models, which often treats the decision to release a model as the only one that counts.</p>
<p>Axios recently reported that United States officials had <a href="https://www.axios.com/2026/07/20/ai-us-china-open-source-kimi">considered measures that could restrict American companies from using Chinese open-weight models</a>. Open-weight models make their trained parameters available for others to download, modify, and run on their own infrastructure, without going through the company that built them.</p>
<p>More than 230 companies and organizations have since signed an <a href="https://www.microsoft.com/en-us/corporate-responsibility/topics/open-weight/">industry letter defending open weights</a>. After critics accused Anthropic of supporting a ban on open-weight models, Anthropic CEO Dario Amodei published a <a href="https://www.anthropic.com/news/position-open-weights-models">statement denying that position</a>. He described open-weight models that do not have dangerous capabilities as a public good and supported mandatory safety testing for sufficiently capable models, open or closed.</p>
<p>The disagreement is less about whether open weights can create risk than about when those risks justify restricting a release, and whether restrictions would improve safety or mainly concentrate power in the largest AI labs.</p>
<p>I am firmly in the open-weights camp. I have <a href="https://dri.es/comparing-local-llms-for-alt-text-generation-round-2">run and compared open-weight models</a>, argued that <a href="https://dri.es/the-software-sovereignty-scale">digital sovereignty depends on who controls software, not where it comes from</a>, and believe organizations should control their infrastructure and data instead of depending on a handful of providers.</p>
<p>I also believe consequential algorithms need oversight. More than a decade ago, I argued that we would eventually need <a href="https://dri.es/algorithms-rule-our-lives-so-who-should-rule-them">something like an FDA for software</a>. The harder question is where responsibility for that oversight should lie.</p>
<h2>Open-weight models unbundle control</h2>
<p>With hosted, closed-weight models from providers such as Anthropic and OpenAI, the provider typically keeps the weights private, controls how customers access the model, and decides when to update the hosted service.</p>
<p>Open weights can separate those roles. One organization creates and releases the model. A repository such as Hugging Face hosts and distributes the weights. Another team might fine-tune them. A product builder incorporates the model into a product and connects it to data, tools, and users.</p>
<p>Each team controls something different. Because open weights unbundle control, it becomes harder to say who is responsible when harm occurs.</p>
<p>A model developer controls the training process, capability testing, documentation, and release decisions. A repository controls what information it displays about a model's origin, which security checks it performs on uploaded files, and which access restrictions it provides or enforces. A product builder controls what data and tools the resulting system can reach, which actions require human approval, and what gets logged.</p>
<p>Control is not the only thing that matters, but it shows who could still have changed the outcome. When harm involves AI, several actors may bear responsibility for the same incident because each controlled a different opportunity to prevent it.</p>
<h2>Open Source shows how responsibility follows control</h2>
<p>Like open-weight models, Drupal's Open Source code can be copied and changed without asking anyone's permission. A site owner could use it to spread misinformation or operate a fraudulent website. The site owner controls the content and operation of the site and is responsible for those choices. The Drupal project is not responsible merely because someone used its code.</p>
<p>But the Drupal project controls other decisions. When someone privately reports a security vulnerability, the Drupal Security Team follows a <a href="https://www.drupal.org/drupal-security-team/general-information">coordinated disclosure policy</a>. It keeps the issue private while a fix is prepared. Once a security release is available, the team publishes an advisory and tells site owners to upgrade. The timing of that disclosure can give site owners a fair chance to protect themselves.</p>
<p>The same distinction applies to AI. Responsibility should follow the decisions each actor controls.</p>
<h2>Products turn capability into authority</h2>
<p>A model generates outputs. An agent is a software system that uses a model to work toward a goal, often by calling tools and taking actions. The people who build and configure the agent decide what it can access, which actions it can take, and when it needs a person's approval.</p>
<p>In a coding agent such as Claude Code, a model can generate a database command. Whether that command can run depends on the tools and permissions the agent provides, as well as the access allowed by the computer, network, and database.</p>
<p>A content management agent can propose deleting an article. The content management system (CMS) determines whether the agent has permission to delete it, whether the deletion is reversible, and whether the action is recorded.</p>
<p>Permissions, isolation, audit logs, rate limits, human approval, and rollback are not merely engineering details. They determine who has control at the point where harm can still be prevented. That is why AI governance is becoming an essential part of product architecture.</p>
<h2>Regulate AI at each point of control</h2>
<p>Deciding who should answer <em>after</em> harm is easier, even when the answer is not obvious. The harder question is what government should require <em>before</em> any harm has happened.</p>
<p>If control and responsibility are distributed across several actors, government rules should be distributed across them too. This is not a new idea. We already regulate many technologies this way.</p>
<p>More than a decade ago, when I argued for something like an FDA for software, I had drug approval in mind. I no longer think that is the right model. The FDA approves a drug for one or more intended uses, while a general-purpose model may be used for many different purposes.</p>
<p>Cars are a better comparison. The government sets safety standards, and manufacturers certify that their vehicles meet them. Separately, drivers must pass a test defined by the government before they are licensed to drive.</p>
<p>The layers extend beyond cars and drivers. States set legal blood-alcohol limits for drivers and require bars to have licenses they can lose. In many states, a bar can also be held liable for serving a visibly intoxicated person who later causes harm.</p>
<p>Each rule targets the actor who controls a particular decision. Together, they reduce risk for everyone. I would take the same layered approach to AI.</p>
<p>Blocking a model's release is a much stronger step, and one that should rarely be used. For an open-weight model, that means preventing the developer from publishing the weights. For a closed model, it could mean preventing the provider from offering access.</p>
<p>I would support that only when safeguards in products and rules governing their use could not prevent a serious danger in time. The two-part test below applies only to this exceptional step, not to AI regulation in general.</p>
<h2>Require extraordinary evidence to block a release</h2>
<p>The strongest argument for restricting an open-weight release is that it is effectively irreversible. Once the weights are public, the developer cannot withdraw every copy, monitor how the model is used, or ensure that its safeguards remain in place.</p>
<p>If a model made catastrophic harm much easier, its release could be the last moment anyone had meaningful control. By catastrophic, I mean mass-casualty or comparably systemic harm, not ordinary product failure, fraud, or abuse.</p>
<p>As of July 2026, I have not seen public evidence that an open-weight model has crossed this threshold. That said, I believe it is just a matter of time, which is why I still think meaningful regulation is coming.</p>
<p>Before blocking a model's release, a government should have clear evidence that the answer to both questions is yes:</p>
<ol>
<li>
<p><strong>Would releasing this model make catastrophic harm much easier?</strong> Compare it with closed models and other tools people can already access.</p>
</li>
<li>
<p><strong>Would blocking its release meaningfully reduce that danger?</strong> A restriction should not merely shift access to another country or distribution channel.</p>
</li>
</ol>
<h2>Default to openness with distributed responsibility</h2>
<p>So where do I land today? I would default to allowing publication and place obligations where control already exists: on model creators for testing and release decisions, on distributors for provenance and file integrity, on product builders for permissions and deployment, and on users for deliberate misuse.</p>
<p>This approach also protects competition. A regulatory regime that only the largest labs can satisfy could protect them from competition without necessarily making anyone safer. It could also push organizations toward depending on a handful of providers for infrastructure they cannot inspect.</p>
<p>Open weights do not eliminate control. They distribute it, making it harder to say who is responsible when harm occurs. Regulation should follow that structure: place obligations on each actor at the point where harm can still be prevented, and block publication only when release would make catastrophic harm substantially easier and a restriction would materially reduce the danger.</p>
]]></description>
    </item>
    <item>
      <title>From personal AI experiments to shared tools</title>
      <link>https://dri.es/from-personal-ai-experiments-to-shared-tools</link>
      <guid>https://dri.es/from-personal-ai-experiments-to-shared-tools</guid>
      <pubDate>Tue, 28 Jul 2026 16:06:31 -0400</pubDate>
      <description><![CDATA[<p>In April 2025, I published <a href="https://dri.es/claude-code-meets-drupal">Claude Code meets Drupal</a>, my first public experiment with an AI coding agent. I have been experimenting with coding agents ever since, often by building tools to solve problems in my own work.</p>
<p>Last week, I joined the <a href="https://www.drupal.org/about/initiatives/ai/drupal-ai-learners-club">Drupal AI Learners Club</a> to discuss several experiments I had already published. <a href="https://www.drupal.org/u/webchick">Angie Byron</a> started the club and runs it with co-organizer <a href="https://www.drupal.org/u/amber-himes-matz">Amber Himes Matz</a>. It gives people in the Drupal community a place to show how they are using AI and talk honestly about what works and what does not.</p>
<p>I spent an hour walking through some of my AI experiments, starting with <a href="https://dri.es/a-better-way-to-follow-drupal-development">Drupal Digests</a>, a tool that uses AI to summarize key developments across Drupal Core, Drupal CMS, Drupal Canvas, and the Drupal AI initiative.</p>
<p>Drupal Digests led to another experiment: <a href="https://dri.es/ai-generated-rector-rules-for-drupal">AI-generated Rector rules</a>. When a Drupal Core change deprecates an API, Drupal Digests analyzes the issue and code changes and generates a rule that can automate the corresponding upgrade in other Drupal projects.</p>
<p>I also showed <a href="https://dri.es/helping-agents-discover-my-site-search-with-an-api-catalog">my API Catalog</a> that helps AI agents discover my website's search API.</p>
<p>These are only some of my AI experiments. Most begin as tools I build for myself, and many never go any further. When one seems useful beyond my own work, I publish it so others can benefit from it.</p>
<p>Once a tool is public, we can see whether people use it and want to help improve it. If they do, it may eventually become a proper community project. If not, that is useful to know too.</p>
<p>The recording goes into more detail, with demonstrations of the tools and questions from the group. You can watch it below.</p>
<figure><div style="position: relative; padding-bottom: 56.25%; height: 0"><iframe src="https://www.youtube-nocookie.com/embed/mvx04sltraQ" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%" loading="lazy" title="YouTube video" allowfullscreen></iframe></div></figure>
]]></description>
    </item>
    <item>
      <title>Helping agents discover my site search with Agentic Resource Discovery</title>
      <link>https://dri.es/helping-agents-discover-my-site-search-with-agentic-resource-discovery</link>
      <guid>https://dri.es/helping-agents-discover-my-site-search-with-agentic-resource-discovery</guid>
      <pubDate>Thu, 23 Jul 2026 15:25:24 -0400</pubDate>
      <description><![CDATA[<p>Yesterday I blogged about the <a href="https://dri.es/helping-agents-discover-my-site-search-with-an-api-catalog">API catalog</a> that announces my site's search API to agents. In response, someone pointed me to the <a href="https://agenticresourcediscovery.org/">ARD specification</a>, a draft announced last month by a working group that includes Google, Microsoft, GitHub, Hugging Face, Cisco, Nvidia, and Salesforce.</p>
<p>What ARD adds to yesterday's API catalog is <em>discovery</em>. If an agent has never heard of you, it does not know to look for your API catalog. Ask an agent what people have written about the future of Drupal, for example, and it will probably search Google. It may not think to check dri.es or drupal.org directly.</p>
<p>The web solved discovery decades ago. Search engines find the right site, so you do not have to know where the answer lives.</p>
<p>ARD brings search-engine-style discovery to AI agents. ARD registries crawl the web for catalogs published by sites and add their resources to a searchable index. An agent can then ask a registry a plain-language question, such as &quot;Who can answer questions about the future of Drupal?&quot;. The registry returns a ranked list of relevant resources, perhaps pointing the agent to my site's search API.</p>
<p>You opt in by publishing a manifest at <code>/.well-known/ai-catalog.json</code>. Here is what my mine currently returns:</p>
<pre><code class="language-json">{
  &quot;specVersion&quot;: &quot;1.0&quot;,
  &quot;host&quot;: {
    &quot;displayName&quot;: &quot;Dries Buytaert&quot;
  },
  &quot;entries&quot;: [
    {
      &quot;identifier&quot;: &quot;urn:air:dri.es:search&quot;,
      &quot;displayName&quot;: &quot;Site search&quot;,
      &quot;type&quot;: &quot;application/openapi+json&quot;,
      &quot;url&quot;: &quot;https://dri.es/openapi.json&quot;,
      &quot;description&quot;: &quot;Full-text search across the site's content, ranked by relevance.&quot;,
      &quot;representativeQueries&quot;: [
        &quot;Find posts about the future of Drupal&quot;,
        &quot;What has been written about open source sustainability?&quot;,
        &quot;Find writing about digital sovereignty&quot;,
        &quot;How is AI changing how we build websites?&quot;,
        &quot;Search Dries Buytaert's blog and notes&quot;
      ]
    }
  ]
}
</code></pre>
<p>Each entry describes a resource an agent can use. ARD deliberately defines &quot;resource&quot; broadly: it can be an API, an MCP server, another agent, a skill, or even a nested catalog containing more resources.</p>
<p>My site offers just one resource: a simple search API. The whole thing took less than an hour to implement because the ARD entry simply points to the existing OpenAPI document, <a href="https://dri.es/openapi.json">https://dri.es/openapi.json</a>, that I wrote about yesterday. In other words, it makes the same API description available through a second discovery mechanism.</p>
<p>The <code>representativeQueries</code> field is the interesting part. It lists example questions registries use to match an agent's intent. Mine are first guesses that I will revise once I can see how they get used.</p>
<p>Of the eleven companies listed as contributors, <a href="https://huggingface.co/">Hugging Face</a> is the only one whose <a href="https://huggingface.co/.well-known/ai-catalog.json">AI catalog</a> I could find on its primary domain. It also <a href="https://huggingface.co/blog/agentic-resource-discovery-launch">runs an early registry</a>. So I queried Hugging Face's registry. It responded correctly using the protocol defined by the specification, but for my queries, it returned only skills hosted by Hugging Face.</p>
<p>Broad adoption will depend on whether major agents begin searching ARD registries. Microsoft, Google, and GitHub are members of the working group, but OpenAI and Anthropic are not. Google has said its <a href="https://developers.googleblog.com/announcing-the-agentic-resource-discovery-specification/">Agent Platform will connect to ARD registries</a> in the coming months, but it remains to be seen how widely the specification will be adopted.</p>
<p>Does my blog need this? Probably not. Other sites have more to gain. An online store could announce its product search and checkout APIs, a restaurant its reservation system, and a city its appointment system for renewing a permit.</p>
<p>Many of these sites run on a content management system. A CMS that made its capabilities discoverable through ARD by default could therefore be interesting. Experiments like this help me understand whether <a href="https://www.drupal.org/">Drupal</a> should be that CMS.</p>
]]></description>
    </item>
    <item>
      <title>The CMS Fragmentation Tax</title>
      <link>https://dri.es/the-cms-fragmentation-tax</link>
      <guid>https://dri.es/the-cms-fragmentation-tax</guid>
      <pubDate>Mon, 20 Jul 2026 18:10:58 -0400</pubDate>
      <description><![CDATA[<p>In recent months, a number of <a href="https://www.acquia.com">Acquia</a> customers have independently made the same strategic decision: to migrate hundreds of websites from <a href="https://wordpress.org">WordPress</a> and other platforms to <a href="https://www.drupal.org">Drupal</a>.</p>
<p>Some of these sites will move to Acquia Cloud, our Drupal PaaS, while others will move to Acquia Source, our Drupal SaaS. Drupal CMS played an important role in these decisions by making Drupal more approachable to marketers and site builders.</p>
<p>Why are different organizations making the same choice? One key reason is the cost of CMS fragmentation.</p>
<p>A few months ago, a CMO told me that her team had purchased a new digital asset management system (DAM). The estimate to connect it to the organization's websites came back at nearly $100,000 and three months of work.</p>
<p>Why so much? The organization ran three CMS platforms: Drupal, WordPress, and Contentful. The DAM had to be integrated with all three. That meant not only three integrations, but also three sets of expertise, three rollout plans, and three ongoing maintenance responsibilities. One new capability had become three separate projects.</p>
<p>Organizations are under pressure to move faster and reduce costs. CMS fragmentation creates a recurring tax through duplicated integrations, security practices, governance policies, infrastructure, technical expertise, and more. It also fragments attention and makes it harder to share improvements across teams and websites.</p>
<p>Organizations pay that tax every day through higher operating costs and slower execution, not only when they introduce new capabilities. When it consistently slows their ability to improve digital experiences, it can become a competitive disadvantage.</p>
<p>Some of this duplication can be reduced by standardizing hosting and portfolio governance across multiple CMS platforms. That is valuable, but it addresses only one layer of the problem. Each CMS still has its own extension model, editorial experience, security considerations, and required expertise.</p>
<p>This fragmentation usually happens for understandable reasons. Teams often make technology decisions independently, and different sites can have genuinely different requirements.</p>
<p>A marketing team may need to launch a campaign site in days without involving developers, making SaaS solutions attractive. A team responsible for a high-traffic enterprise application with custom integrations may need the flexibility and control of an Open Source solution running in a PaaS environment.</p>
<p>Each decision can make sense for the individual project while creating significant duplication across the organization.</p>
<p>More than 15 years ago, I argued in a post about <a href="https://dri.es/acquia-product-strategy-and-vision">Acquia's product strategy</a> that organizations should standardize on a common CMS while choosing the right operating model for each site.</p>
<p>Today, the case is even stronger. Websites depend on more integrations, digital experiences are more complex, and AI is becoming another shared capability that organizations need to deploy across their portfolios. With multiple CMS platforms, every new capability becomes harder and more expensive to deploy safely.</p>
<p>Standardizing on a single CMS lets teams reuse more of their design systems, security practices, integrations, and expertise across sites. Marketers get a more consistent way to create and manage content, while developers spend less time implementing the same capabilities on unrelated platforms.</p>
<p>But standardizing on Drupal does not mean forcing every site into the same architecture or operating model. Organizations can share a common CMS foundation while choosing a different balance of convenience and control for each site.</p>
<p>That is where Acquia Source and Acquia Cloud fit together.</p>
<p>Acquia Source provides the SaaS operating model. It is designed for teams that value speed and simplicity. Acquia manages the underlying platform, while marketers and site builders customize experiences through the user interface, reusable components, and supported integrations. Developers can extend sites through custom components, APIs, webhooks, and other supported tools without managing the Drupal codebase or installing arbitrary modules.</p>
<p>Acquia Cloud provides the PaaS operating model. It is designed for sites that need deeper customization and more developer control. Teams can build custom Drupal modules, use contributed modules, manage code through Git, run CI/CD pipelines, and integrate Drupal more deeply with other systems.</p>
<p>Both are built on Drupal. This gives organizations a shared foundation for skills, content practices, design systems, security, and integrations, while allowing each site to choose the right balance of speed, simplicity, flexibility, and control.</p>
<p>A site can begin on Acquia Source when speed and simplicity matter most. If its requirements later grow to include custom modules, deeper integrations, or more developer control, the organization can export its source code, database, and files and move to Acquia Cloud or another Drupal environment without adopting a different CMS.</p>
<p>I have been calling this &quot;Open SaaS&quot;: the convenience of SaaS combined with the ownership and portability of Open Source. Organizations can choose a different operating model without leaving Drupal or surrendering control of their sites.</p>
<p>When organizations standardize this way, the economics change dramatically. We have helped some customers save millions of dollars each year by reusing shared capabilities instead of rebuilding them for different platforms.</p>
<p>The goal is not to operate every website in the same way. A campaign site and a mission-critical application require different levels of speed, flexibility, and control, but they do not need unrelated CMS platforms.</p>
<p>The goal is to create operating leverage across an organization's digital portfolio. Each site can use the operating model that fits its needs, while teams reuse investments in content, design, integrations, security, and expertise.</p>
<p>Then, when the organization adds a DAM, a personalization engine, an analytics platform, or an AI capability, teams can build on shared work rather than start over for each CMS. The result is faster execution, greater returns on digital investments, lower costs, and less risk.</p>
<p>One CMS foundation with multiple operating models makes that possible.</p>
]]></description>
    </item>
  </channel>
</rss>
