Drupal Planet
The Drop Times: Drupal GovCon 2026 Speakers Examine Bots, AI Trade-Offs, Accessibility, Search, and Migration
Stuart Clark (Deciphered): JSON:API Views 8.x-1.2
JSON:API on its own gets you decoupled entities: fetch a node, fetch a set of IDs, done. It doesn't get you the filtering, sorting and pagination that most real content listings actually need - a list of articles by tag, a paginated product catalogue, an events calendar with a date filter. You either reimplement that logic on the frontend, or Drupal ships a hand-written custom resource for every list on the site. That gap is the same regardless of what's rendering on the other end, React and Next.js, Vue and Nuxt, or anything else that can call an API.
JSON:API Views closes it: whatever a View can already do, a decoupled frontend can ask for over JSON:API, using the access checks and query logic the view already has, no separate endpoint to write or maintain. It's also, not coincidentally, why I still maintain the module at all: it's the backend half of DruxtViews, the piece that makes Views work in Druxt, my own Nuxt-based decoupled Drupal framework.
Webpro Company blog: Managing Drupal content with ChatGPT and MCP
Webpro Company blog: How to evaluate a Drupal developer's competence
Drupal Association blog: Responding to Drupal Enquiries with a Community-First Mindset
This is a guest post from the team at Zoocha, a Gold Drupal Certified Partner with offices in the United Kingdom, Spain, Brazil, and the United States.
As Drupal agencies, we're fortunate to benefit from a vibrant ecosystem that generates awareness, interest, and opportunities for all of us. At Zoocha we receive inbound enquiries from a variety of sources. Whether they arrive via Drupal AI, Drupal CMS, a community recommendation, a Drupal event, or direct through our site, every enquiry often represents something important: a person taking their first step towards our community.
Not every lead is a project.
Not every lead has a budget.
Not every lead is ready to buy.
But they always deserve a meaningful response.
The First Impression of DrupalWhen someone reaches out to a Drupal agency, they're rarely just evaluating that agency, they’re more often than not seeking to engage with Drupal itself. For many prospective clients, they may not know the difference between Drupal, the Drupal Association, Drupal CMS, an implementation partner, a hosting provider, or the wider open source community. They simply know they've heard about Drupal and are looking for guidance.
The response they receive helps shape their perception of the entire ecosystem. If their first interaction feels dismissive, transactional, or overly focused on qualification, they may walk away believing that's what the Drupal community is like. If their first interaction is friendly and genuine, they leave with a very different impression.
Resist the Urge to Qualify Too EarlyMost agencies have some form of qualification process. It's sensible, and so do we. Time is valuable, and we know not every conversation will become a project.
However, there is a difference between understanding someone's needs and interrogating them. We've all seen responses that immediately ask:
- What's your budget?
- What's your timeline?
- Have you secured funding?
- How many pages does the site need?
- Can you complete this requirements questionnaire?
While those questions have their place, they are rarely the most important thing during an initial conversation. Many prospects simply don't know the answers yet.
Some are conducting research. Some are exploring options. Some are trying to understand whether Drupal is even the right fit. At this stage, what they often need most is guidance.
Be Helpful Without ExpectationOne of the most effective approaches we've found at Zoocha is to assume that the first conversation may never lead to a sale. That does sound counterintuitive for a commercial organisation, but it changes the nature of the interaction. Instead of trying to move the conversation towards a proposal as quickly as possible, we focus on being useful. That might mean:
- Answering questions about Drupal CMS
- Explaining how Drupal compares to other platforms
- Pointing someone towards community resources
- Offering advice on procurement approaches
- Helping clarify requirements
- Suggesting next steps, even if they don't directly involve us
Sometimes that conversation ends there, and that's ok. The contact doesn't leave empty handed. They leave with a positive impression of who we are in the Drupal community.
The Long-Term Value of Community-First ThinkingInterestingly, some of our most successful client relationships started with conversations that had no immediate commercial outcome. We've had early exchanges that were little more than an idea, with individuals facing a specific challenge and just looking to find out if they're even in the right place with Drupal. After a person-first conversation, they disappeared. But a few months, or even a year, later, they came back, and what began as a casual enquiry became a long-term client partnership.
This didn't happen because we had the best sales team or process. It happened because we prioritised human connection over a fast sale.
Open Source Values Apply to Business Development TooDrupal has always been built around principles of collaboration, openness, and knowledge sharing, these values really shouldn't stop at code contributions. They can also shape how we engage with prospective users of the platform. When we answer questions generously, share expertise freely, and help organisations make informed decisions, we're strengthening confidence in Drupal itself.
Even if a particular opportunity never becomes a client engagement, the person on the other end of that conversation is left with a positive impression of the community. That's good for all of us!
ConclusionThe next time a speculative Drupal enquiry lands in your inbox, try viewing it differently. Consider simply asking, "How can we actually help this person?" The answer might only require a short email, a useful link, or a brief conversation, and yes, the immediate commercial return is likely to be zero. But the long-term return, for your agency and for the Drupal ecosystem, can be significant.
Every first interaction is an opportunity to demonstrate what makes the Drupal community different. Let's make sure it's a positive one.
Aten Design Group: Choosing a Multisite Approach in Drupal
Organizations usually begin considering a multisite approach (the ability to manage multiple distinct websites from one single Drupal instance) when they are scaling their digital presence. This scaling is not only about traffic, but also about organizational structure.
Common drivers include:
- the need to support many related brands, locations, or programs that require their own websites
- pressure to reduce long-term maintenance costs and duplicated effort
- desire to balance central governance with local autonomy, while maintaining shared design systems or functionality across multiple properties.
A multisite architecture is not always the right answer. It often introduces additional complexity and is rarely justified when sites have fundamentally different goals or audiences, when editorial teams require complete independence, or when there is insufficient technical capacity to support shared infrastructure.
When a multisite approach does make sense, there are several established patterns in Drupal. Each pattern solves a different organizational problem and comes with meaningful tradeoffs.
Single Codebase, Multiple SitesThis category includes approaches where many independent Drupal sites share a common codebase while maintaining separate databases, configuration, and content.
Two common implementations of this pattern are custom upstreams (commonly used on Pantheon) and Acquia Site Factory. These approaches are often discussed together, but they differ in important and practical ways.
Custom UpstreamsWhat it is
Custom upstreams allow multiple Drupal sites to inherit from a shared upstream Git repository. Each site is a fully independent Drupal installation. The upstream defines only the shared code, and perhaps a starting point for the site configuration.
Sites choose when to pull updates and can diverge when necessary.
Best fit when
- You have many similar sites such as offices, chapters, or locations.
- Central engineering teams manage releases.
- Site autonomy and failure isolation are important.
- Governance can be handled through process rather than tooling.
Pros
- Clear separation between sites, including content, configuration, and databases.
- Centralized feature and security updates.
- Predictable deployments and rollbacks.
- Site-specific issues are easier to debug and reason about.
- Strong failure isolation between sites.
Cons
- Cross-site content sharing is difficult.
- Mass content updates require custom tooling or workflows.
- Site-level customization can lead to long-term divergence.
- Consistency depends on discipline rather than enforcement.
Summary
Custom upstreams optimize for operational clarity and independence. They scale well when sites are intentionally similar but not tightly coupled.
Acquia Site FactoryWhat it is
Acquia Site Factory is a managed multisite platform layered on top of Drupal and Acquia’s hosting infrastructure. In addition to sharing code, Acquia Site Factory provides a central control plane for provisioning, governance, and operations across a large portfolio of sites.
The platform is designed as a true site factory, with templated site creation and centralized management.
Best fit when
- You manage very large site portfolios, often numbering in the hundreds.
- Governance, compliance, and standardization are primary concerns.
- Non-technical users need to create new sites.
- Central control is valued over flexibility.
Pros
- Centralized site creation and lifecycle management.
- Built-in governance, roles, and permission models.
- Templated site provisioning at scale.
- Integrated security, monitoring, and platform support.
- Reduced operational burden for large programs.
Cons
- Higher platform dependency and lock-in.
- More opinionated workflows and constraints.
- Less transparency into the underlying architecture.
- Cost and complexity may be excessive for smaller portfolios.
- Failure domains may be broader depending on platform configuration.
Summary
Acquia Site Factory optimizes for governance and scale. It trades architectural flexibility for centralized control and operational efficiency.
A critical distinctionWhile both approaches support a single codebase with multiple sites, they emphasize different priorities.
- Pantheon Custom Upstreams emphasize site autonomy.
- Acquia Site Factory emphasizes centralized governance.
This distinction affects deployment workflows, debugging, onboarding new sites, and the long-term evolution of the platform.
Traditional Drupal MultisiteWhat it is
Traditional Drupal multisite allows multiple websites to run from a single Drupal codebase using separate directories under /sites. Each site typically has its own database and configuration. All sites share the same runtime, deployment process, and underlying infrastructure.
This approach is built into Drupal core and remains fully supported.
Best fit when
- You manage a small number of closely related sites.
- Infrastructure simplicity is a priority.
- Centralized deployments are acceptable.
- Failure isolation is not critical.
Pros
- Native to Drupal with no additional platform requirements.
- Shared codebase with minimal tooling.
- Lower hosting and infrastructure costs.
- Familiar pattern for long-time Drupal teams.
Cons
- All sites share the same runtime and infrastructure.
- A deployment issue, performance problem, or outage can affect every site.
- Limited isolation between sites.
- CI/CD and rollback workflows are more complex.
- Risk increases significantly as the number of sites grows.
Summary
Traditional multisite optimizes for simplicity and cost reduction at small scale. Shared runtime risk becomes a significant drawback as complexity increases.
Drupal Domain moduleWhat it is
The Domain module allows a single Drupal site and database to serve multiple domains or subdomains. Content is explicitly assigned to one or more domains at publish time.
Out of the box, content is not automatically shared across domains. Editors must intentionally choose which domain or domains the content belongs to.
Best fit when
- Domains represent closely related organizations, programs, or campaigns.
- Editorial teams overlap significantly.
- Content reuse is intentional and controlled.
- Centralized user management is important.
Pros
- A single codebase, database, and user system.
- Explicit control over where content appears.
- Content can be assigned to multiple domains when needed.
- Shared media libraries and assets.
- Centralized editorial workflows and permissions.
Cons
- Content sharing is manual and intentional rather than implicit.
- Editorial complexity increases as the number of domains grows.
- Menus, blocks, and layouts often require domain-specific configuration.
- Configuration management becomes significantly more complex.
- All domains share the same runtime and infrastructure.
- A failure or deployment issue affects every domain.
Summary
The Domain module shifts complexity away from infrastructure and into editorial experience and configuration management. Clear domain boundaries and editor training are essential.
Decoupled or Composable MultisiteWhat it is
In a decoupled approach, multiple sites share front-end applications, design systems, or component libraries. Each site maintains its own Drupal backend or content management system.
This pattern is typically part of a broader composable architecture strategy.
Best fit when
- Front-end engineering maturity is high.
- User experiences vary significantly.
- Design systems are a long-term investment.
- Teams already operate across multiple platforms.
Pros
- Maximum flexibility in frontend experiences.
- Clear separation of concerns.
- Independent evolution of design systems.
- Reduced coupling at the Drupal layer.
Cons
- Significantly higher technical complexity.
- Increased infrastructure and operational overhead.
- Slower initial development timelines.
- Strong DevOps and frontend discipline are required.
- Shared frontend infrastructure can introduce shared failure domains.
Summary
Decoupled multisite architectures prioritize strategic flexibility rather than cost savings.
Fully Separate SitesIn some cases, the best multisite decision is not to use a multisite approach at all and maintain separate websites.
Pros
- Maximum autonomy.
- The simplest editorial model.
- Complete isolation of failures.
Cons
- Duplicated effort and higher long-term cost.
- Difficulty enforcing standards.
- Feature parity becomes expensive over time.
There is no universally perfect Drupal multisite solution.
The real question is what are you optimizing your site for? Autonomy, consistency, speed, and shared content lead to different architectural decisions.
Most multisite challenges are organizational first and technical second. The right architecture reflects how teams work today and how they expect to scale in the future.
Get in touch with us to talk about the best multisite options for your organization.
Joel SteidlBloomIdea: Rendering Mermaid diagrams in Drupal, and the highlight.js trap along the way
This started with an agent writing a comment into our Drupal intranet. It had traced an authentication flow, decided a sequence diagram was the clearest way to say it, and wrote one. What landed on the page was a grey box of monospaced text.
That is a small failure with a wider shape behind it. A growing share of what gets written into a Drupal site is no longer typed by a person into CKEditor. It arrives through an API, from a script, from an agent with an MCP connection to the site. And whatever writes it, the diagram comes out the same way:
<pre><code class="language-mermaid">sequenceDiagram Alice->>Bob: hello</code></pre>That is not a choice anyone made. It is what a fenced ```mermaid block becomes when Markdown is converted to HTML, which is the shape a language model writes in because it is the shape it was trained on. It is also, independently, exactly what CKEditor 5's Code Block plugin emits when a human picks a language from the dropdown. Human authors and machine authors converge on the same markup, which is a convenient thing to be able to rely on.
Mermaid is worth supporting for the ordinary reasons too. The diagram stays as text in the field, so it is searchable, it diffs, and the next person fixes one line instead of rebuilding a PNG that nobody has the source for. But the reason it became urgent for us is the one above: content we did not hand-write was arriving in a form the site silently failed to render.
Getting it working turned out to be short, with one genuinely non-obvious trap in the middle. This post is the trap, wrapped in the working solution.
What already existsMermaid Integration is the contrib module. It has been around since 2020, it is maintained by people whose names you will recognise, and its filter renders diagrams from a [mermaid]...[/mermaid] shortcode.
That syntax is the whole problem, and it is worth being precise about why. No model will ever emit [mermaid] unprompted, because nothing in its training data looks like that. Neither will any Markdown converter, nor CKEditor, nor a paste from a README. A human can be told to switch to source view and hand-type a shortcode. A pipeline cannot be told anything, and it does not fail loudly: the content saves fine, the page renders fine, and the diagram is simply a code block forever.
So a shortcode-only integration is invisible to every non-human author your site has. That is a different problem from being inconvenient, and it is the one that decided this for us.
We wrote our own filter rather than fight that, and we are contributing code block support back upstream. More on that at the end.
The filterThe pattern to copy is Highlight.js Input Filter. Its filter does a cheap regex first and only attaches its libraries when the text actually contains a code block. That conditional attachment is the whole game when your library is measured in megabytes.
public function process($text, $langcode): FilterProcessResult { $result = new FilterProcessResult($text); // No diagram in this text: attach nothing, change nothing. if (!preg_match(self::DETECT_PATTERN, (string) $text)) { return $result; } $count = 0; $processed = preg_replace_callback(self::BLOCK_PATTERN, /* ... */, (string) $text); if ($processed === NULL || $count === 0) { return $result; } $result->setProcessedText($processed); $result->addAttachments(['library' => ['your_module/mermaid']]); return $result; }Nothing surprising so far. Then you turn it on next to your existing syntax highlighter and the page breaks in two ways at once.
The trap: highlight.js has two halvesOur site runs Highlight.js Input Filter on the same text format. The moment a language-mermaid block appeared, two things went wrong: a 404 in the console on every page with a diagram, and syntax highlighting painted underneath the rendered graph.
The 404 is easy to explain. That module scans the text server-side for language-* classes and passes the languages it found to the browser in drupalSettings, and the front end then imports a grammar per language from a CDN. There is no Mermaid grammar in highlight.js, and there never will be, because highlighting and diagramming are not the same operation. One paints tokens and leaves the text as text. The other deletes the block and draws something else in its place. So the import 404s:
GET https://unpkg.com/@highlightjs/cdn-assets@11.9.0/es/languages/mermaid.min.js 404The obvious fix is filter weight. Give your filter a negative weight so it runs before the highlighter, take the block out of the way, done.
It is not enough, and this is the part worth remembering. The highlighter has a second half that filter weight cannot reach. Its JavaScript calls:
hljs.highlightAll();highlightAll() walks every pre code element in the document and auto-detects a language for each one. It does not consult drupalSettings. It does not know or care what your PHP decided. Ordering filters fixes the server-side half and leaves the client-side half completely untouched, which is why the double-render survives a fix that looks like it should have worked.
So the filter has to change the markup, not just run first. Two edits, one per half:
// Before: what CKEditor stored. <pre><code class="language-mermaid">… // After: what our filter emits. <pre data-bloom-mermaid="1"><code class="nohighlight">…The attribute on the <pre> defeats the server-side half, because that module's regex requires a bare <pre> immediately followed by <code:
'/<pre>\s*<code\s+class="\s*(?:[\w-]+\s+)?\b[\w-]*lang(?:uage)?-([\w-]+)\b/i'Add any attribute and it stops matching, so mermaid never reaches drupalSettings and the 404 never happens.
The nohighlight class defeats the client-side half. It is the class highlightElement checks before giving up on an element:
const shouldNotHighlight = (languageName) => /^(no-?highlight)$/i.test(languageName);Both, or you have only half a fix. We have this written down in the repo with a note not to remove it, because the rewrite looks redundant if you only know about the filter ordering.
There is a neater variant available if you control the output shape. Contrib's module emits <pre class="mermaid"> with no <code> element inside at all, and highlightAll() selects pre code, so the collision simply cannot occur. We kept the <code> because we wanted a readable code block as the failure mode. Pick whichever tradeoff you prefer, but pick deliberately.
Vendor the library, and know what you are vendoringContrib pulls Mermaid from cdn.jsdelivr.net with no version pin. We wanted the file in the repo: no third-party dependency in the critical path of an internal page, and no surprise when a major version lands.
The tidy Drupal answer is composer require npm-asset/mermaid, which installs into web/libraries. We measured before committing to it, and the numbers ended the discussion. Mermaid 11.16.1 unpacks to 83 MB across 1171 files, about 26 MB of which are source maps that never reach a browser. web/libraries is tracked in git in our project, so that is 83 MB of repository for one diagram renderer.
What you actually need is one file. dist/mermaid.min.js is the self-contained UMD build, 3.6 MB raw and 975 KB gzipped, and it sets globalThis.mermaid. We vendored that single file with a README next to it recording the version, the licence, the exact source URL and the upgrade command.
3.6 MB is still a lot, which is exactly why the conditional attachment matters. A page with no diagram downloads none of it. We also set preprocess: false on the library so a file that size stays out of the aggregated JavaScript bundle:
mermaid: version: 11.16.1 js: js/vendor/mermaid.min.js: { minified: true, preprocess: false } js/mermaid-init.js: {} dependencies: - core/drupal - core/once Two details in the JavaScriptRead textContent, never innerHTML. The stored markup escapes the arrows, so a sequence diagram is sitting in the database as A-->>B. textContent gives you the decoded text that Mermaid's parser expects; innerHTML hands the parser the entities and it fails on every diagram with an arrow in it, which is to say all of them.
A broken diagram must never break the page. Someone will eventually get the syntax wrong in a comment, and a syntax error in one diagram cannot be allowed to take down a task page. So the render is wrapped, the failure is silent, and the original code block stays visible and readable:
mermaid.render(id, source) .then((result) => { /* replace the <pre> with the SVG */ }) .catch((error) => { // Degrade to the plain code block. pre.classList.add('bloom-mermaid-error'); console.warn('Mermaid: diagram not rendered.', error); });Set securityLevel: 'strict' while you are there, and suppressErrorRendering: true so Mermaid does not inject its own error graphic into your page when a parse fails.
One more that cost us a test to find: Mermaid leaves a throwaway measurement element in document.body when parsing throws. It cleans up after a successful render but not always after a failed one. Remove #d<your-id> in a finally.
Adding it to the editorLast step, and easy to forget: put Mermaid in CKEditor's Code Block language list, so authors can pick it from the dropdown instead of needing source view.
plugins: ckeditor5_codeBlock: languages: # … - label: Mermaid language: mermaidExport that config. If it only exists in the active store, the next config:import takes it away again.
Contributing backNone of the above is Mermaid-specific except the library name. Any renderer that replaces a code block rather than colouring it hits the same two-halves problem: PlantUML, Vega-Lite, ABC notation, chemical structures. If you build one of those, the ordering fix will look like it worked and it will not have.
Two merge requests are open against Mermaid Integration:
- #3616088 adds code block support alongside the shortcode, carries the highlight.js de-confliction, and makes the library attachment conditional instead of unconditional.
- #3592975 adds the config schema the filter currently lacks. Without it, installing the module blocks saving any text format on Drupal 11.3, whether or not the Mermaid filter is enabled anywhere.
Reviews welcome.
As for the comment that started this: the agent reran it after the filter went live, and the diagram drew. Which is the useful test, in the end. If the machines writing into your site cannot render a diagram, neither the machines nor the people reading after them get one.
Specbee: How to build accessible Drupal Themes with Twig and BEM
The Drop Times: Drupal GovCon 2026 Speakers Preview AI Governance, Migrations, Performance, and Delivery
Cheppers: ExperienceKit: AI Landing Page Generation for Drupal - How It Actually Works
ImageX: Meet Drupal Canvas: A Faster, Smarter Way to Build Content
The latest chapter of content management within Drupal officially started with the release of Drupal Canvas. And we have to admit, the pages in this chapter look fantastic!
The Drop Times: Who Pays for Drupal’s Shared Work?
Recent audited figures give Drupal’s sustainability debate a concrete baseline. The Drupal Association says unrestricted reserves are about $960,000, equal to 2.3 months of operating expenses and below the board’s three-month minimum. Its 2025 accounts put Drupal.org and supporting services at about $2.1 million in programme expenses, without a dedicated funding mechanism. The question is no longer whether shared work has a cost, but how those costs become recurring commitments.
The same problem appears across infrastructure, security review, dependency maintenance and contribution. These responsibilities continue after software is adopted and cannot be assumed to exist indefinitely through volunteer capacity, one-off grants, donated services or event revenue. Current proposals differ on the mechanism, but increasingly treat stewardship as capacity that organisations and institutions have to plan and fund.
That makes this week’s question narrower than whether Drupal needs stewardship. It is who pays, for what, and on what recurring basis. With voting in the 2026 Drupal Association at-large board election open until 14 August 2026 at 23:59 UTC, those choices are also part of a live governance decision.
Follow The DropTimes on LinkedIn, X, Bluesky, and Facebook, or join #thedroptimes on Drupal Slack.
This issue of Editor’s Pick was written and curated by Allen Jason.
Gábor Hojtsy: Introducing Language Audit and Configuration Language Lock for Drupal and asking for your feedback
The Drop Times: Display Builder Beta 6 Brings UX Refresh and Drupal 11.4 Fixes
Talking Drupal: Talking Drupal #564 - Approachable Open Source
Today we are talking about Maintaining NodeJS, Patternlab, Writing Books, and Open Source with guest Brian Muenzenmeyer. We'll also cover AI Webform Generator as our module of the week.
For show notes visit: https://www.talkingDrupal.com/564
Topics- Brian Open Source Origins
- Pattern Lab Node Journey
- Maintaining and Moving On
- Writing Approachable Open Source
- Who the Book Is For
- Beyond Code Contributions
- All Things Open Book Signing
- Choosing Conferences to Attend
- Pitching Open Source at Work
- Misconceptions and Starting Small
- Avoiding Maintainer Burnout
- Handling AI Noise and Low Effort PRs
- DCO and Licensing Basics
- Better Communication and Reviews
- Node and Drupal Lessons
- Optimism for Open Source Future
- Brian Muenzenmeyer
- https://brianmuenzenmeyer.com
- https://approachableopensource.com/
- https://bsky.app/profile/brianmuenzenmeyer.com
- https://www.linkedin.com/in/brian-muenzenmeyer-91a77554/
- https://www.renderatl.com/schedule upcoming
- https://nodeconf.eu/program upcoming
- spectrum of engagement
- https://approachableopensource.com/blog/2025-open-source-pace-layers/ change in contention
- https://brianmuenzenmeyer.com/posts/2018-i-maintainer/ burnout
- https://approachableopensource.com/read/the_spectrum_of_engagement/
- https://approachableopensource.com/read/the_four_files_of_any_open_source_project/ LICENSE
- Hodag
- You should write a book
- All contributors spec
- Talk at all things apart
- DCO
- Developer Certificate of Origin
- Open source law policy and practice
- Sustain OSS
Brian Muenzenmeyer - brianmuenzenmeyer.com
HostsNic Laflin - nLighteneddevelopment.com nicxvan John Picozzi - epam.com johnpicozzi Bernardo Martinez - bernardm28 JD Flynn - dorficus
MOTW CorrespondentJacob Rockowitz - jrockowitz.com jrockowitz
- Brief description:
- AI Webform Generator enables site builders to create a Drupal Webform, or update an existing one, from plain-English instructions. It sends the request through the site's configured Drupal AI provider, validates the returned Webform definition, and saves the resulting form. Review the generated change before using the form.
- Module name/project name:
- Brief history
- Created on 2 July 2026 by chaitanyadessai (Chaitanya R Dessai).
- The current stable release is 1.0.2, released on 3 July 2026, and supports Drupal ^10 || ^11.
- Maintainership
- Appears actively maintained: Drupal.org lists an update on 24 July 2026.
- Maintainers: zeeshan_khan and chaitanyadessai. (Specbee)
- Security coverage: Yes. Stable releases are covered by Drupal's security advisory policy.
- Test coverage: Yes. Version 1.0.2 includes unit, kernel, and functional tests for prompt building, JSON validation, settings, route access, Webform building, and optional CAPTCHA elements.
- Documentation: Yes. The project page and module README cover requirements, configuration, usage, security considerations, and supported field types.
- Issues: 1 open issue, with 0 open bug reports (7 issues total).
- Usage stats:
- 1 site reports using this module.
- Module features and usage
- Creates complete Webforms and updates existing Webforms in place from natural-language prompts.
- Supports common Webform elements, including text, email, telephone, number, date, select, checkbox, radio, range, password, hidden, and managed-file elements.
- Validates the AI response before applying the Webform definition.
- Uses the existing Drupal AI provider configuration; API keys are not stored in this module's configuration.
- Provides configurable model, temperature, output-token, and per-user request limits to balance output quality and provider spend.
- Requires trusted users with both the generator permission and ordinary Webform edit access when changing an existing form.
- AI-Generate Notes, Review, and Recipe (used for testing)
- https://github.com/jrockowitz/drupal_playground/tree/main/recipes/drupal_playground_webform_ai
- AI-Generated Assessment
- Technical:
- The module separates AI generation, prompt building, JSON validation, and Webform construction into Drupal services. It uses the site's configured Drupal AI provider, validates a limited allowlist of Webform element types before saving, and exposes model, temperature, output-token, and per-user request-limit settings.
- Access and error handling:
- Generation requires its own permission, and updating an existing Webform also requires normal Webform update access. A per-user flood limit constrains provider spend; failures are logged, with detailed upstream errors shown only to generator administrators.
- Code quality:
- Version 1.0.2 uses strict types and separates form, service, validation, and persistence responsibilities. It includes unit, kernel, and functional coverage for core behavior. This assessment is a code review of the released module, not a security audit.
- Implementation:
- The module creates new Webforms and updates supported fields of existing Webforms in place, but saves the generated definition immediately without a preview, diff, or approval screen.
- Usefulness:
- The module is useful for quickly drafting straightforward Webforms and iterating on common field changes when a site builder reviews the result. Complex, highly customized, or regulated forms need especially careful manual review before publication.
- How to use it:
- Configure a chat-capable provider, select an existing Webform or choose to create one, describe the fields and validation in plain English, submit the request, and then review the saved Webform. For example, create a disposable contact Webform and ask the generator to add a required telephone field while preserving the existing fields.
- AI-generated source code:
- The module's runtime use of AI and its code style cannot establish whether its source was AI-generated or AI-assisted. Its public project metadata does not make an authorship claim, so this is unknown.
- Possible improvements:
- Add a preview/diff and explicit approval before saving; broaden support for advanced Webform structures and handlers; add optional, privacy-conscious prompt and response audit logs; and expand regression coverage for complex Webform updates.
- Next steps for adopters:
- Restrict generation to trusted roles, begin with a low request limit, test representative prompts outside production, and review every generated field, validation rule, confirmation message, and permission before publishing.
The Drop Times: James Abrahams Makes Sustainable Funding a Focus of Board Candidacy
joshics.in: A backend engineer guide to Single Directory Components in Drupal
Single Directory Components completely changed how we handle the frontend. But if you spend most of your time engineering the backend, SDC can feel incredibly frustrating.
You build a massive render array, pass it to the template, and the strict schema rejects it instantly. The days of dumping raw entity objects into Twig are over.
When you work with SDC, the component dictates exactly what data it accepts. This guide details the cleanest way to format your data and bridge the gap between custom backend logic and strict frontend schemas.
Implementing the Component WorkflowIf your backend architecture does not format data perfectly, the system throws a fatal error. Follow these steps to ensure your data matches the strict schema requirements.
1. Define your component schemaEvery component needs a YAML file. This is the contract your backend must follow. Keep your properties simple and predictable.
name: Article Card description: A strict component for displaying article summaries. props: type: object required: - title - url properties: title: type: string title: Article Title url: type: string title: Target Link summary: type: string title: Teaser Text 2. Format the render arrayBackend engineers usually try to pass the entire node object. Do not do that. Extract the exact strings your schema demands. Set the render array type to component so Drupal knows how to route it.
$build['article_card'] = [ '#type' => 'component', '#component' => 'my_theme:article_card', '#props' => [ 'title' => $node->getTitle(), 'url' => $node->toUrl()->toString(), 'summary' => $node->get('field_summary')->value, ], ]; 3. Render the componentYour Twig file is now incredibly clean. It only prints exactly what the backend provided. No complex logic. No processing overhead.
<div class="article-card"> <h2><a href="{{ url }}">{{ title }}</a></h2> <p>{{ summary }}</p> </div>Notice how we completely avoid preprocess functions here. The template simply accepts the data contract and renders the output.
Key Considerations- Never pass full entity objects into SDC props. Always extract the raw values first.
- Validate your schema early. A mismatched type will trigger a rendering error that brings down the page.
- Keep your #props mapping clean by handling all complex business logic in the controller rather than the template.
This strict separation keeps your backend logic secure and your templates highly predictable. Adapting to Single Directory Components requires a mindset shift for backend developers. But it is the absolute best way to scale enterprise software without creating a massive technical debt trap for future engineers.
Drupal SDC Drupal Planet Drupal 11 Drupal 12 Share this Copied to clipboard Add new comment