.avif)
Drupal is a versatile framework that is known for its capability and flexibility to build a wide range of websites. But, building a Drupal site often involves starting with a blank canvas which can be time-consuming and sometimes overwhelming.
Imagine if you could choose from a menu of 'recipes' tailored for specific needs, like creating a blog, news site, or e-commerce platform, to kickstart your Drupal project. It would make projects easier and much faster. That’s exactly what Drupal recipes do.
In this blog, we will consider three significant aspects; What are Drupal recipes? Why are they essential, and how you can use them to your advantage?
Drupal recipes are sets of predefined configurations and components that simplify web development in Drupal. They help streamline the process of creating Drupal projects, ensuring you follow best practices and reuse components. With recipes, developers can efficiently start and fine-tune their websites.
Profiles: These are pre-configured site setups designed for specific purposes, forming the base of your recipe.
Features: Consider features as the building blocks that add functions to your site, anything from contact forms to e-commerce capabilities.
Distributions: Think of distributions as ready-made theme parks for your website. They combine Drupal with specific profiles and features, creating a complete package for specific project types.
Drupal recipe configuration keys are just like keys on a treasure map, each one unlocking a unique aspect of your web development journey. These keys are guides to simplifying the development process.
Let's take a look at them:
Name:This is the label that tells us what the recipe is called.
Description: A short explanation of what the recipe is meant to achieve.
Type: This categorizes the recipe as "Site," "Content-Type," or "Feature," guiding the nature of your project.
Install: This is a set of instructions for arranging the components.
Config: Your rulebook for customizing the site, covering appearance, functionality, and hidden features.
Actions: Secret commands that instruct Drupal to perform specific tasks, adding value to your projects.
Imagine you're an architect designing a new building. Instead of starting from scratch, you have a library of pre-designed floor plans, blueprints, and resources at your disposal. This not only saves you time but also ensures your project starts on a strong foundation. That's precisely the advantage Drupal recipes bring to web development.
In web development, certain guidelines and recommended settings are crucial. Drupal recipes act like a handy checklist of these best practices. They make sure that your site building starts with the necessary components configured correctly, preventing potential issues in the future.
Consider Drupal recipes as reusable templates. When you've created a recipe for a particular site type (blog or an e-commerce store), you can use it as a foundation for future projects. This not only saves time but also ensures consistency across all your sites.
Now that we understand the significance of Drupal recipes and what they are, let's explore how to utilize them effectively.
Creating a Drupal recipe involves picking the right modules and configurations for your project. Think of it like selecting the ideal template for your masterpiece. You mix and match the components that best suit your site's requirements.
With your recipe prepared, the next step is to apply it to your Drupal installation. This process is similar to following a well-structured plan. Drupal handles the site configuration as per the recipe's instructions. It's a quick and efficient procedure that ensures your site starts on a firm footing.
Now, let’s create a sample Drupal recipe to kickstart your web projects.
Before we craft our recipe, let's ensure we have the necessary setup. Here's how to install Drupal recipes:
On your command line, go to your web server's root directory, and initiate a new Drupal project using Composer.
Use the following command:
This will create a new Drupal site in a directory named "my-drupal-site."
Now, navigate to your new Drupal site's directory:
Install Drupal using Drush (Drupal Shell):
This will set up a basic Drupal website, which serves as the foundation for our recipe.
You must apply a patch before you can begin with the recipes.
Step 1
Step 2
Step 3
When you request Composer for a recipe, it will automatically place it in your project's recipes/contrib directory, similar to how it handles modules or themes.
The following recipe depends on my-custom recipe, which is unique. "Underinstall" offers several modules that can be activated during recipe import. It determines which configurations from the recipe's config directory should be loaded after enabling the modules.
This my-custom-recipe.yml file will be included when you import a drupal-base recipe.
The composer.json from the recipe will also be considered, and the necessary modules will be downloaded during the import process.
Next, command to run the recipe script.
After using the recipe, you can further customize your Drupal site, just like how an artist adds their unique touch to a canvas. You have the freedom to enhance features, adjust settings, and even create your own custom modules to shape it into exactly what you envision.
Exploring the New “Recipes” Feature in Drupal 10
To sum it up, Drupal recipes are the key to making Drupal web development more efficient and reliable. They accelerate the development process, ensure best practices, and promote reusability. By understanding why, what, and how to use recipes, you can easily create impressive websites.
Whether you're an experienced Drupal developer or just starting your journey in web development, harness the potential of Drupal recipes and watch your projects succeed like never before!

While working on one of the sites, I was facing responsive issues on mobile devices. It was annoying to deploy smaller changes to check on the actual device.
So I was looking for some tool/solution using which I could check the changes done on a local site immediately on the mobile device.
I was using Lando on my local. So I searched for making Lando’s local site accessible on mobile devices within the same network.
I found that there is a command, lando share, using which we can share our local site not only on the same network but over other networks as well (to your client too). But it is no longer functional though you can sponsor to make it functional again.
I continued searching if there was any other alternative solution, and found one. Please go through the explanation below for detailed steps.
First, we will need to change the bindAddress in the config.yml file. This file specifies the core configuration options for Lando. And it has nothing to do with your .lando.yml file. (Changing the Bind)
Then run the lando config command to check the location of the config.yml file on your machine.
Open the config.yml in your desired code editor. Initially, this file will be blank, with just opening and closing curly brackets.

Then add the following code in the same file and save it.

Go to your project directory and run the lando rebuild command so that these changes will take effect.
After running lando rebuild, this file will look like this:

As soon as you are done with it, find your IPv4 address.
Mac: How to Find Your IP Address on a Mac
Linux: How to Find your IP Address in Linux
Windows: How to Find an IP Address in Command Prompt or Find your IP address in Windows
Access your site on the devices connected on the same network with: https://<ip_address>:<port_number>

So, if your IP address is 198.168.0.1 and your site’s port address is 59061, then hit the following URL in your device’s browser: https://198.168.0.1:59061
Here's a screenshot of my local Lando site:
Desktop

iPhone and iPad

Remove the bindAddress from config after use to avoid any security issues.
Here is a link for quick Drupal site installation guide using Lando: Getting Started
By following the steps mentioned above, you can access your local Lando site on any device within the same network with a few changes in the Lando's config file.

If you are a Drupal user, you are already aware of how the platform helps you curate amazing user experiences. Drupal 9 is already delivering rich user and editor experiences through the WYSIWYG text editor and the Media Library.
It doesn’t stop at that. Drupal 10 is up for release in December 2022. The new version comes with exciting new features and capabilities. An interesting development in the UI landscape is the launch of new default themes in Drupal 10 that guarantee a better user experience than Drupal 9.
Each version of Drupal is made up of a strong and complex suite of layers that add to its experience and security. Drupal 10, an enhanced Drupal 9, is stronger and better at meeting the needs of the end users, especially with updated UI. Consider how Drupal UI has evolved over the years.
The original Drupal theme was designed by developers and made for developers. As it evolved, the Views module made it possible for site builders who were not developers to create pages. These patterns were incorporated in other Drupal components, such as the Field UI, which enabled site developers to create complex pages without a developer’s help. Next, Drupal focused on including the requirements of content editors who had to struggle with menus that were not built for them.
This evolution brings us to the present, where Drupal UI is user-friendly and easy to use, due to multiple modules, such as the Layout Builder, Media, and Themes. Currently, Seven is the default admin theme and Bartik is the default front-end theme in Drupal 9. Drupal 10 ushers in new default themes with enhanced and intuitive properties.

Claro will replace Seven as the new default admin theme in Drupal 10. Seven was introduced in Drupal 7 in 2011. UI design trends have certainly modernized and evolved after more than a decade. A completely new JavaScript-based admin UI was required for Drupal to remain competitive with other open-source CMSs.
Claro was built as a part of the Admin UI Modernization initiative, to make Drupal compatible with decoupled apps and provide smoother navigation. Claro was launched with the Drupal 9.4 update and is currently available to use. It will become the default admin theme for Drupal 10 upon release.
Claro comes with enhanced features, such as a new color scheme, redesigned content pages, touchscreen readiness, higher contrasts, and file & image upload widgets. Claro uses a new design system that is more user-friendly and accessible than the earlier themes. It is visually simple with minimalist iconography, a high-contrast color palette, and curated visual cues, like dept and shadows.
Claro follows the guidelines of the Drupal admin theme design which include:

Olivero will replace Bartik as the new default front-end theme in Drupal 10. Bartik was launched with Drupal 7 in 2011. While Bartik is responsive to mobile devices and meets Drupal 9’s mobile-first requirements, its design is outdated. Bartik is not compatible with the latest functionalities and does not showcase the visual appeal of Drupal completely.
The idea for a Drupal 9 default theme grew into a Drupal 9 theme initiative. The goals of the initiative were to update to a modern design that stays relevant for the next 5-10 years, supports Drupal’s new functionalities, and is WCAG AA compliant. Olivero was designed keeping these goals in mind. While Olivero is currently available to use with Drupal 9, it will become the default front-end theme for Drupal 10.
Olivero is designed for optimal compatibility with Drupal’s current site-building features. It is WCAG AA compliant right from the start and showcases an accessible and beautiful interface with a high-contrast color palette and ample whitespace.
The key design features and guidelines of Olivero include:
With a bright blue base color and neutral grays for balance, Olivero highlights a bright and modern look that aligns with Drupal branding.
Olivero offers a header that collapses into a hamburger menu upon scrolling. Users can easily access the menu on longer pages, and wider pages with multiple first-level menu items.
Olivero’s buttons are in bright blue to be easily recognizable as clickable elements. The primary button style is filled with color and the secondary button style is outlined.
With an 18px font for the body copy, Olivero’s other UI elements, such as quotations and headers are created based on this font. The font size is adjusted for smaller screens ensuring consistency and the right proportions.
Website messages in Olivero are in a bright color to make them stand out visually. Icons are utilized to support message types and the readability is optimal.
Olivero’s forms are simple with a uniform look and a color bar on the left. Labels are positioned above the fields making the forms more accessible and recognizable.
Olivero provides a single sidebar instead of two to help highlight additional content. The sidebar region floats right next to the primary content.
Breadcrumbs are located on top of the page with the link color the same as the other links on the website. On mobiles, breadcrumbs spill off the edge where users can swipe from side to side to view the complete breadcrumb trail.
To fully reap the benefits of the latest Drupal UI, you need to upgrade to Drupal 10. Other than an enhanced UI, Drupal 10 also brings in exciting new features that enhance digital experiences.
If you are using Drupal 9, you can prepare to migrate to Drupal 10. If you are using an older version of Drupal, you might have to switch over to Drupal 9 before upgrading to Drupal 10. Consider an efficient strategy to migrate to Drupal 10 without any hassles.
QED42 has helped Fortune 200 and Fortune 500 companies to migrate to the latest Drupal version. If you are planning for Drupal migration, chat with our Drupal experts for a free website audit and a curated Drupal migration strategy that works for your business.

The scale and scope of web development have exploded exponentially over the last two decades. With 1.8 billion active websites globally, the web development market has gone through transformational changes in this time period.
Traditional web development has a monolithic architecture which despite having some benefits has major drawbacks which become detrimental to the success of an enterprise or a startup alike. Designed on a single block, monolithic web development lacks the scale and flexibility that modern websites require.
The lack of flexibility in a monolithic architecture ultimately became the final nail in its coffin and gave rise to the concept of headless CMSs.
A headless, or decoupled CMS is a modern architecture in software and web development which releases the front-end from the back-end. Designed on different platforms, decoupled architecture presents opportunities that traditional web development can’t even imagine.
Drupal being one of the greatest web development platforms, also presents decoupling options with its hub and spoke model. It integrates all the different spokes (delivery channels) in a single hub (Drupal back-end).

To be precise about it, there are essentially two ways in which you can decouple Drupal; progressive and fully. Let's talk about them in detail for a bit.
So in order for you to decide which approach suits your situation best, think of the editors+content creators and the developers. Who would you want to have more control?
If you want editors to have more control over the end user’s experience, then it would be best to go for a monolithic approach. Whereas, if you want the developers to have more (or complete) control over the digital experience you’re offering, you’d want to go with a decoupled approach.
A progressively decoupled approach gives you best of both worlds as in such an approach, both the editors will have control over the web experience of the end-users.
In any web development, the front-end is responsible for rendering the web pages on the websites. In a monolithic approach, the front-end and the back-end both rely on the same technology, Drupal in this instance.
JavaScript is one of the major languages on which the front-end of decoupled websites are developed. Why, you may ask? Because it helps in delivering an omnichannel experience with elegant user interfaces. It makes websites performant, it also enables fantastic user interactions via chatbots, APIs, real-time data, an intuitive editorial experience, so on and so forth.
This also facilitates the collection of real-time data resulting in much higher personalization of the user experience, as compared to a monolithic or coupled architecture.
There are some impressive options when it comes to rendering beautiful user experiences on the Drupal back-end. Listed below are some of these technologies.
In a decoupled framework, there are multiple components interacting and working collaboratively to create an immersive digital experience. Listed below are these components.
Decoupled Drupal solves many of the challenges that enterprises face on a daily basis. Some of those challenges are listed below:
Here are the scenarios in which decoupled can create magic for your digital experience:
We have helped a number of our clients go headless with Drupal. Using headless Commerce, we helped Shop The Area create a multi-vendor e-commerce website that harnesses the power of Drupal to deliver outstanding customer experience.
We used an advanced JavaScript framework to decouple their Drupal website. We used GatsbyJS since it presented an opportunity to solve the business challenges of STA, which was rendering static web pages at blazing fast speeds while also supporting API-enabled e-commerce functions.

Our approach resulted in an increase in the performance score of STA by 96% and the SEO score increasing by 100%. Explore the detailed case study here.
We have immense expertise in going headless with Drupal and can help you as well to decouple. Explore our decoupled Drupal offerings here.

Investing in a robust digital presence has become highly important for non-profits as it brings out the mission’s purpose and fosters connection. Many influential non-profits are relying on Drupal to create an amplified digital platform as it has been the most reliable and cost-effective content management system with fast performance, good accessibility, robust security, and customizable features among others.
Recently, Drupal also achieved recognition as a Digital Public Good which makes it the best choice for building a digital presence in the public sector, educational, and social-impact organizations as it adds a significant value.
Let’s look at a few examples of how Drupal enabled top non-profit organizations’ digital experiences.
EOCI is based in Toronto and operates with the mission of creating a just and equal opportunity for children around the world. Built on Drupal, EOCI’s digital platform contributes to its goal of providing equal opportunities to underprivileged children around the world.

EOCI’s Drupal platform is visually appealing, well-organized, and easy to navigate. Drupal’s mobile-first approach and user-friendly page layout contribute to the non-profit’s mission through maximum global exposure.
Human Rights Watch is a well-known international organization that advocates freedoms in connection with fundamental human rights. Focused on the organization’s digital-first publishing strategy, its digital presence is content-focused and user-centric.

Human Rights Watch’s Drupal platform is scalable for handling traffic spikes and allows content editors to publish content seamlessly.
Habitat for Humanity sets the stage for families, volunteers, donors, and supporters to come together and build homes that provide the foundation for a better life. Their mobile-responsive digital platform connects supporters globally.

Habitat for Humanity’s digital presence is future-focused with Drupal’s scalable and robust web architecture.
Doctors Without Borders is an international, independent medical humanitarian organization providing medical assistance to people affected by conflict, epidemics, disasters, etc.

Built on Drupal, the non-profit’s digital presence has become fast, and responsive which has resulted in better reach.
The UNICEF VentureFund program enables local social ecosystems and startups to create Digital Public Goods (DPGs) that have a profound impact on children's lives worldwide. Their digital platform established a central hub that streamlines collaboration and information management.

The digital solution brings several remarkable enhancements, offering a seamless content authoring experience, and enabling users to craft compelling narratives effortlessly.
Drupal is a highly flexible platform for digital transformation, speedy implementation, and scalability. Drupal’s open-source backdrop supports the non-profit community around the globe in creating an amplified digital presence and contributes to the noble cause. Get in touch with our team of experts today to create a future-focused digital architecture with Drupal.
.webp)
In today’s digital landscape, delivering content is only one part of the customer experience equation. What increasingly differentiates successful organisations is their ability to understand how users interact with digital platforms and continuously improve those experiences based on measurable outcomes.
This is where the integration of Acquia and VWO becomes especially valuable. By combining Acquia’s digital experience capabilities with VWO’s experimentation and optimisation tools, organisations can move beyond static personalisation and build digital journeys that evolve through data, testing, and insight.
Acquia VWO is an experimentation and optimisation solution that integrates with Acquia’s Digital Experience Platform, enabling marketing teams, product owners, and developers to improve digital performance through structured experimentation.
With this integration, organisations can:
• Run A/B tests and multivariate tests to identify which experiences perform best
• Deliver personalised experiences based on visitor behaviour, location, device type, or audience attributes
• Use data-driven insights to improve customer journeys across websites and applications
• Launch experiments quickly without waiting for lengthy development cycles
By bringing experimentation into the digital experience stack, businesses can continuously refine their websites based on real user behaviour rather than assumptions.
Testing landing pages, forms, content layouts, and calls to action helps identify which variations generate stronger engagement and conversion outcomes.
Audience segments can receive relevant experiences based on behavioural signals, geography, or device usage, improving both engagement and customer retention.
Real-time experimentation data helps teams make informed optimisation decisions with measurable confidence.
Experiments can be launched and adjusted quickly, allowing teams to iterate without disrupting broader development priorities.
For organisations already using Acquia, VWO adds an additional layer of measurable optimisation without requiring major platform changes.
Marketers can create and manage experiments without relying heavily on development resources.
Different page versions can be tested against each other to compare performance across full-page experiences.
User interaction data provides visibility into click patterns, scrolling behaviour, and friction points.
Winning variations can be identified faster through automated statistical analysis.
Experiences can be tailored dynamically based on visitor attributes and behavioural signals.
For organisations running Drupal, integration is simplified through the official Acquia VWO module.
This module enables teams to:
• Configure and authenticate API keys directly within Drupal
• Enable experimentation and personalisation across Acquia Cloud environments
• Manage tracking scripts and integration settings without extensive custom development
This reduces technical overhead and helps teams begin experimentation faster within existing Drupal workflows.
This integration is particularly suited for:
• Enterprise organisations already using Acquia for content and experience management
• Marketing teams seeking more advanced optimisation than traditional A/B testing
• Organisations focused on measurable ROI from personalisation initiatives
• Digital teams building a culture of continuous experimentation
Acquia helps organisations deliver relevant digital experiences. VWO helps validate and improve those experiences through structured experimentation.
Together, they create a continuous optimisation framework where insights inform testing, testing improves performance, and each iteration strengthens the customer journey.
In a competitive digital environment, personalisation alone is no longer enough. Organisations that consistently test, learn, and optimise are better positioned to improve engagement, increase conversions, and maximise the value of every digital interaction.
.webp)
Drupal Canvas has officially launched, and many of you are likely already building impressive projects with it. As you may know, Drupal Canvas ships with several "out-of-the-box" AI features, such as AI-assisted code component generation, title/metatag generation, and full-page content generation.
I previously explained the underlying architecture of AI in Drupal Canvas. In this blog, we are going to focus on the practical side: how to add a brand-new AI feature to Drupal Canvas.
We will build an AI agent that analyses a news article, evaluates its engagement potential, and provides a score out of 5 along with actionable suggestions for improvement.
Before we begin, ensure you have the following:
As we explored in my previous blog, AI features in Canvas are powered by an orchestration of agents.
When a user sends a message, it goes to the Canvas AI Orchestrator agent. Based on the intent of the request, the Orchestrator delegates the work to "Sub-Agents," such as the Component Agent (for code generation) or the Metadata Agent (for meta description generation).
Therefore, adding a new capability involves three key steps:
Navigate to Configuration -> AI -> AI Agent and add a new agent.
The Canvas AI module provides a useful token: [canvas_ai:layout]. This token automatically retrieves the content placed in all components on the current page. We will use this token in the agent’s instructions.
Agent instructions:
You are an editorial analyst who evaluates news articles for reader engagement potential.
Your task: Analyse the provided article and rate its engagement potential from 1-5.
Scoring criteria:
Output format:
Article to evaluate:[canvas_ai:layout]
.png)
Save the agent.
Now that our sub-agent exists, we need to tell the Orchestrator about it.


Let’s see it in action:
The Orchestrator will recognise the intent, call the Analyse Readability tool, and present the feedback directly in the chat interface.

Troubleshooting tip:
If the Orchestrator fails to call the sub-agent, refine the Orchestrator's prompt with more explicit instructions, such as:
"This tool is capable of looking at the content of the existing page to provide improvement suggestions. The tool does not require user input, as it automatically pulls the layout context via tokens."
This is the real strength of Drupal Canvas AI; it’s not limited to the features it ships with. Agents can be designed to reflect how teams think, review, and improve content.
Check out the video:
AI moves from being a generic assistant to becoming part of the editorial workflow. It reads what is built, understands context, and gives feedback that is tied directly to page structure and components.
Over time, Canvas shifts from a creation tool to a quality system. One where AI helps maintain consistency, clarity, and engagement across every page.
The impact is not just faster content. It is smarter, more reliable publishing.

Drupal Trivandrum celebrated the 25th anniversary of both Drupal and Wikipedia on 15th January. I attended the meetup in person, and it was a good experience. Our involvement started with a simple conversation between Piyuesh and The Drop Times, which led to us being part of the event, and in turn, I got to be there as well. Destiny!

The event was held at the International Centre for Free and Open Source Solutions (ICFOSS), Trivandrum, and the turnout was impressive. There were many college students and fresh graduates attending, asking thoughtful questions, and engaging deeply with how Drupal is evolving. At a time when Free and Open Source communities are actively thinking about how to stay relevant for the next generation, seeing this level of curiosity and participation felt like a strong sign that the ecosystem is moving in the right direction.
The program opened with the Presidential Address by Sunil TT, Director of ICFOSS, followed by a session titled ‘Drupal: Past, Present, and Future’ by Sebin A. Jacob, Editor-in-Chief of The Drop Times. The session traced Drupal’s journey over the years and gave a clear picture of how the platform has grown and changed.

One of the most inspiring parts of the meetup was hearing people share their personal Drupal journeys. They spoke about how they discovered it, how they learned it, and how it ended up changing their lives.
What struck me deeply was how, in a time when the internet was not widely accessible and knowledge was not available at everyone’s fingertips, people still built communities and shared learning. They laid the foundation of an ecosystem that today creates jobs for so many of us and quite literally puts food on our plates. I spoke about the Drupal AI initiative and Drupal Canvas, which I am always happy to talk about.
As part of the celebration of 25 years of Wikipedia, Mujeeb Rahman from Wikimedians of Kerala presented the history of Wikipedia and explained how thousands of contributors collaborate every minute to make knowledge freely available and accessible to the world. He also introduced us to a fascinating site called Listen to Wikipedia(http://listen.hatnote.com/), which plays a sound whenever a Wikipedia page is edited or updated in real time. It felt like a powerful symbol of community spirit and collaboration.
To make sure Drupal and Wikipedia continue to stay relevant for the younger generation, two thoughtful initiatives were announced during the meetup:
The second initiative felt particularly timely, as Wikipedia remains one of the most trusted and widely referenced sources of information, including by many AI systems and search tools. Strengthening Drupal’s presence there makes the information more reliable, more accessible, and easier for people to discover.
Dinner followed, supported by the event sponsors, and it gave everyone a relaxed space to talk, connect, and spend time together over good food. It was a simple but nice way to wind down after a packed day.
Meetups like this leave me feeling refreshed. They create room for real conversations, new ideas, and stronger community ties, and they remind me why being part of the Drupal and the wider open-source ecosystem matters.
Thanks to QED42 (that’s where I work), which supported the event as the Title Sponsor, along with several other sponsors who helped make the gathering possible.


Just like people, technology grows, adapts, and figures itself out over time. And after 25 years, Drupal has done all of that and more.
On January 10, 2026, the Drupal Pune community came together to celebrate this milestone at a special Drupal Birthday Edition meetup, marking 25 years of Drupal. Hosted by QED42 at their Pune, India office, the event brought together Drupal enthusiasts, professionals, and long-time community members for a morning filled with learning, reflection, and good conversations.
The day kicked off with a relaxed meet-and-greet, setting the tone for what felt less like a formal event and more like a community reunion. That was followed by an insightful session titled “Drupal at 25: A Quarter-Century of Innovation and Community” by me.
I took everyone on a journey through Drupal’s story, one that mirrors human growth in many ways. It started back in 2001 as this simple dorm-room experiment, just people trying to solve a problem, no big master plan. And over time, through a lot of trial, learning, and collaboration, it turned into something real and dependable.
Today, that same idea has grown into a powerful, enterprise-grade content management system trusted by governments, universities, media houses, and global brands. That evolution is kind of crazy when you think about it. I talked about the key milestones that shaped Drupal and how it wasn’t about sudden breakthroughs, but steady progress.
Consistent innovation, a strong open-source community, and a commitment to flexibility are what helped it grow without losing what made it special in the first place.

One of the most engaging parts of the meetup was the discussion between members around Drupal’s future in the age of AI. The conversation focused on how Drupal is becoming increasingly AI-ready, thanks to its flexible architecture and API-first approach.
From content generation and personalisation to smarter workflows, participants shared how Drupal is well-positionedwell positioned to support modern, intelligent digital experiences without compromising on security or scalability.


The meetup ended over lunch, with people breaking into small groups (that’s honestly where the deeper conversations always happen at any event).
Conversations flowed easily, ideas were exchanged, and there was a shared sense of excitement about what lies ahead.
More than anything, the event was a reminder that Drupal’s real strength isn’t just technology. It’s the community that continues to build, support, and evolve it together.
Here’s to the next chapter of Drupal!
.webp)
If you've ever inherited a Drupal project with 50+ custom modules, zero documentation, and a deadline breathing down your neck, you know the feeling. That pit in your stomach when someone asks, "How long will this take?" and you genuinely have no idea because you haven't even figured out which modules talk to each other yet.
I've been there. After nearly 9 years of building and maintaining Drupal applications, I've lost count of how many hours I've spent manually tracing function calls, hunting for security vulnerabilities buried in legacy code, and trying to explain architectural complexity to non-technical stakeholders using nothing but hand-waving and whiteboard diagrams that made sense to absolutely no one.
So I built EventHorizon.

Here's the dirty secret of large-scale projects: understanding code takes longer than writing it.
When you join a new project or pick up a client's existing site, you're not just reading code. You're doing archaeology. You're tracing dependencies across dozens of modules. You're searching for performance bottlenecks that might be lurking in some forgotten hook implementation. You're praying that whoever wrote custom_module_form_alter actually knew what they were doing with user input sanitisation.
The traditional approach looks something like this:
This isn't just inefficient. It's dangerous. When you don't fully understand a codebase, you miss security vulnerabilities. You introduce performance regressions. You break things that seem unrelated. And worst of all, you give inaccurate estimates to clients because you're essentially guessing at complexity.
EventHorizon is a comprehensive static analysis and visualisation platform built specifically for Drupal 8, 9, 10, and 11 projects. But calling it a "static analyser" is like calling a smartphone a "calculator that makes calls." It does so much more.
At its core, EventHorizon:
And here's the thing that makes it actually usable: you don't need to configure anything complicated or install dependencies on your Drupal site. Just upload a ZIP file of your codebase and let EventHorizon do its thing.

One of my biggest frustrations with existing code analysis tools is the setup process. Half the time, you spend more effort configuring the tool than actually using it.EventHorizon takes a different approach. You upload your Drupal project as a ZIP file through a simple web interface. That's it.

The system automatically extracts your codebase, configures the analysis paths, and makes your project available for analysis immediately. No Docker restarts. No config file editing. No command-line wizardry.
Required:

Here's something I'm particularly proud of: EventHorizon respects your data privacy requirements.
When you upload a project, you'll see a checkbox labelled "Is this project AI compliant?"

If you check this box, only then EventHorizon will:
If you leave it unchecked, EventHorizon will:
This matters because not every project allows sending code to third-party AI services. Some clients have strict data handling requirements. Some codebases contain proprietary business logic that shouldn't leave your infrastructure. EventHorizon handles both scenarios without compromising on functionality.
You get the full power of automated static analysis regardless of AI compliance status. The AI features are an enhancement, not a requirement.
Let me walk you through every tool EventHorizon provides. Each of these would typically require a separate tool or hours of manual work.

The dashboard is your command centre. At a glance, you see:
KPI cards:
Visual analytics:
The scoring system is designed to be actionable. A score of 85+ means you're in good shape. 70-84 means some attention is needed. Below 70? Time to prioritise cleanup.

This is the feature that makes architecture discussions actually productive.
The mindmap is a force-directed graph where:
Three visualisation modes:
Module view: See how modules interconnect. Identify those highly-coupled modules that everyone's afraid to touch.

Function view: Drill down to function-level dependencies. See which functions call which across module boundaries.
Service view: Visualise dependency injection patterns. Understand how your services wire together.
Interactive controls:
I can't tell you how many times this mindmap has saved hours of explanation. Instead of describing architecture in a meeting, I just share my screen and let people explore.
Circular dependencies are the silent killers of maintainability. When function A calls B, B calls C, and C calls A, you've created a cycle that makes testing nearly impossible and refactoring terrifying.
EventHorizon automatically detects these cycles and visualises them:

Severity Levels:
The visualisation groups functions by their parent modules, so you can immediately see if the cycle is internal to a module or spans multiple modules (which is worse).

This feature alone has helped me identify refactoring opportunities that would have taken days to find manually.

The Dependency Info page gives you hard numbers on module coupling:
Summary metrics:
Per-module metrics:
Coupling score interpretation:
When I'm planning a refactoring sprint, this page tells me exactly where to focus and gives me measurable targets.

EventHorizon scans your codebase for performance anti-patterns using pattern-based detection:
What it catches:
Report structure:
You can export to CSV or Excel for sprint planning.

Security scanning that understands Drupal-specific patterns:
Detection categories:
Each finding includes the severity level, file location, line number, and a clear explanation of the risk.
Important caveat: Static analysis doesn't replace security audits. It supplements them. EventHorizon catches pattern-based vulnerabilities, but can't detect all security issues. Use it as part of a broader security strategy.

Drupal's caching system is powerful but notoriously tricky to implement correctly. EventHorizon provides context-aware caching analysis:
What it detects:
The best part: Code snippets showing exactly what's wrong and recommended fixes with actual code examples.
This goes beyond "you need caching" to "here's the exact code to add, and here's why it works."

If your project includes a config sync directory, EventHorizon validates your Drupal configuration structure:
What it validates:
Severity levels:
This is incredibly valuable for sites with complex content models. I've found orphaned paragraph types sitting in configs for years, consuming memory and confusing content editors.

Evaluation of your codebase against Drupal coding standards:
5 Core categories:
Each category gets a 0-100 score with specific recommendations that include:



This is where EventHorizon goes from useful to indispensable.
The AI chat assistant isn't a generic chatbot. It's a RAG (Retrieval Augmented Generation) system that has indexed your entire codebase. When you ask a question, it:
Example questions you can ask:

The responses include source attribution, so you can verify the information and click through to the actual code.
Multi-LLM support:

The settings page handles:
Project management:
AI model configuration:
Usage logs:
I want to talk about the RAG (Retrieval Augmented Generation) implementation because it's not just a technical detail. It's why the AI chat actually works.
Most vector databases split text into fixed-size chunks. 512 tokens per chunk, regardless of what's in them. This works fine for prose, but absolutely destroys code.
Imagine splitting a PHP function right in the middle of a conditional block. Now your vector database has two chunks that each contain half a function. When you ask about that function, you might retrieve the first half but miss the second. Or worse, you get partial code that doesn't even parse.
Instead of arbitrary text splitting, EventHorizon chunks code by semantic entities:

Drupal Canvas is changing how websites are built inside Drupal by bringing design, content, and intelligence into one space. It introduces a visual editor that works in real time, supports React-based components, and understands what you want to build through conversational input.
Instead of writing code or manually assembling layouts, you can describe what you need. Ask for a “homepage with a hero section, a product grid, and a contact form,” and Canvas knows how to put those pieces together. It can also create components, suggest titles, and generate metadata, all within the same interface.
Behind this simplicity is a system of AI agents that collaborate to interpret prompts, choose the right components, and build structured pages. This article explores how these agents work, how they communicate with Drupal, and what makes Canvas a more fluid and efficient way to design and manage content.
Before diving into Canvas AI specifically, we need to understand what AI agents are. Let's first understand the basic problem the AI agents are trying to solve. Imagine you ask a basic LLM, "Add a chocolate ice cream recipe to my site."

The LLM will happily give you a perfectly good recipe. But it's just plain text. You still have to manually copy that text, log into Drupal, create a new 'Recipe' content type (if it even exists), paste the title, paste the ingredients, and so on. It's a hassle.
So, we get smarter. We tell the LLM, "Give me the recipe in a structured JSON format."

This is better! Now we have clean, structured data. But it still requires a developer to write code that can parse this JSON and create a node in Drupal.
An AI agent is essentially an LLM that's been given instructions and tools, allowing it to autonomously decide how to act to complete a task. The keyword here is autonomously. You tell it what you want, and it figures out which tools to use and in what order. Here's what makes agents special:

A 'tool' is essentially a backend plugin that the AI can call. So when the user says, "Add the recipe," the AI Agent understands the intent. It doesn't just return text. It thinks, 'Aha, the user wants to create a recipe. I have a tool for that called add_recipe.' It then calls that tool with the right arguments (the title and instructions). The Drupal backend executes the tool, a new recipe node is created, and the AI can then report back, "Done! I've added the recipe to your site."
In Drupal, AI agents can be created from the UI itself using the ‘AI agents’ module. Refer to my previous blog to understand more about AI agents. AI features in Canvas are built using AI agents.
AI features are integrated into their own module, canvas_ai, which comes as a sub-module of Canvas. To set it up:
Once done, click on the AI panel icon to launch the chatbot.

Canvas AI isn't just one large agent doing everything. It's actually an orchestrator pattern with multiple specialised agents, each handling the specific tasks you're asking for. These sub-agents are:
.webp)
Each of these agents has its own set of tools that let it do its job. Let's look at what each one does.
One of the standout features in Drupal Canvas is the ability to create React components directly from the UI. It's an awesome feature that lets even people with no prior Drupal knowledge create components in Drupal Canvas. This agent lets you create code components directly using natural language. You just describe what you want in plain English, like "create a testimonial card with an image, name, title, and quote," and the agent figures out the rest. It is also possible to generate a component by uploading an image.
The main tools used by the component agent are
Create new component: To create code components
- Arguments: Component name, JS code, CSS code, Props data
Edit JavaScript on components: To edit a code component
- Arguments: Component name, JS, Props data
Get JS Component: Get the code of a component
- Arguments: Component name
The following is a sample of how the agent uses the Create new component tool when asked to create a CTA component.

Watch this video to see a demo of the code component agent
These agents specialise in adding SEO-focused titles and metadata (descriptions) to the page based on the added content. Both agents work only with the canvas_page entity type, a content entity shipped with Drupal Canvas and tailored specifically for it. The following is an overview of the tools used by these agents:
Here is a demo of title and metadata generation in action.
This is where it gets really powerful for content editors. The Page Builder Agent is for creating individual sections of a page. Instead of dragging and dropping components, you can just tell the AI what you want. You can give specific prompts like 'Add a hero banner followed by three paragraph components for a blog about climate change,' which the agent will pick up and add to the page, or generic prompts like 'Create a today's specials section for a bakery website.'
It has been observed that with certain models, the Orchestrator Agent might fail to delegate page-building tasks to the Page Builder Agent. Therefore, it's better to prepend all page-building-related prompts with the text, 'Using page builder tool.' For example: 'Using the page builder tool, create a today's specials section for a bakery website.'
Once components are added to the page, you can click on a component and ask the agent to add new components above, below, or into the slots of the selected component. The Page Builder Agent will understand the selected component and add new components relative to it.
For example, assuming you have two-column and heading components and the two-column layout has been added to the page, you can click on it and ask the agent to do the following tasks:
The Page Builder has a more sophisticated set of tools because it needs to understand the existing page state before adding anything. The main tools used are:
This is how the agent passes the component structure to the set_component_structure tool.

The operations array consists of individual operations. Each operation corresponds to a component assembly at a specific area of the page. The first operation should be read as: 'Place the heading component above the component with UUID 7238-xxxx-xxxx in the content region.' The agent uses the 'inside' placement, as seen in the third operation, to add components to an empty region or empty slot.
Watch this video to see the page builder in action
At the time of writing this blog, the Template Builder Agent is not yet merged into the main module. If you want to try it out, you can pull the merge request from this issue. If the Page Builder is about sections, the Template Builder is about entire pages. This agent creates complete page layouts from top to bottom. By default, it generates the main content area, that is, everything between your header and footer. But if you explicitly ask for it, the agent can also create headers and a footer.
The Template Builder uses all the tools used by the Page Builder except set_component_structure, such as get_current_layout, get_component_context, get_page_data, canvas_metadata_generation_agent, and canvas_title_generation_agent. Additionally, it uses the set_template_data tool to generate the template structure and add it to the page.
This is how the agent generates the template structure and passes it to the set_template_data tool.

Each top-level key corresponds to a region in your theme. By default, Drupal Canvas only supports the 'content' region, which is where all the page content will be placed. This region is specific to each page you create in Canvas. Components added to the content region of a page won't appear when you create or edit another page.
It is also possible to enable other regions in your theme in Drupal Canvas. This can be done from your theme's settings page (e.g., for Olivero: /admin/appearance/settings/olivero).
Select the 'Use Drupal Canvas for page templates in this theme.' option and choose the regions you want to enable.

Beware that these additional regions are 'global regions.' Any components added to these regions will be visible across all pages. The template builder can add components to global regions as well. For example, when you ask the agent to generate a template for a library website with a proper header and footer, it checks the available regions to see if there are dedicated header and footer regions, and if present, it will add the components for building the header to the header region and the footer to the footer region. If dedicated regions are not present, it will add all components to the content region.
A dedicated configuration form is available in Configuration -> AI -> Canvas AI Theme Region Settings to give proper instructions to the agent on how to use each of the regions. This is particularly useful when you have regions like 'Footer top' and 'Footer bottom' instead of a single footer region. In that case, you can use this form to inform the agent about what to add in each of these regions. For example, you can add a description like 'Add Site name, logo, and menu links (Using button components) to this region' for the 'Footer top' region and 'Add social media links and copywriting text in this region' for the 'Footer bottom' region. These kinds of descriptions are critical for the agent to generate a reliable template.

Both the page builder and template builder rely on components present on your site for generating output. Here's something really important to understand: These agents can't actually see your components. They don't know what a component looks like visually. They only understand components through their metadata: props, slots, and descriptions. This means you need to provide good descriptions for your components. There's a configuration form at Configuration -> AI -> Canvas AI Component Description Settings where you can add metadata for Blocks, SDCs, and JavaScript components.
You should include things like:
This metadata becomes the context the agent uses to make decisions. If your hero component description says "use this for the top section of a page to grab attention," the agent knows to use it when you ask for a hero section. If the hero component contains a title and image prop, those are self-sufficient, and you don't need to give any extra description for those props. But if there is a design or variation prop that completely changes the design of the component, you should give content around when to use each of those values. For example: Variation one renders an image and title side-by-side, so keep the title character length to 60 characters max. Variation 2 renders the image below the title, so give it a big title. Variation 3 changes the title colour to white, so use it only when the hero banner is placed in a container component with a theme prop value set to 'dark,' etc. If you don't provide these descriptions, the agent might not use the component properly.
The downside? More components mean longer context, which means more tokens are being used, and the costs are higher. It can also reduce output quality if the context gets too large and the agent gets confused by too many options. So make sure the metadata you are adding is optimal.
If no metadata is given from this form, the agent will use the default descriptions available from the component.yml files of SDCs. For JavaScript components and blocks, the agent would just see the name of the component, its props, and its slots. The purpose of the component description configuration form is to give an easy-to-use UI for site builders to override the component descriptions. The form can also be used to control what components can be passed as context to the agent (Should it use only SDCs, SDCs and blocks, or SDCs, Blocks, and code components?). For example, disabling Blocks from here would be a better idea if you don't want the agent to use blocks in generating templates or building page sections. This would help to reduce the context as well.

Watch this video to see template generation in action with the Starshot demo design system theme.
What makes Canvas AI interesting is how it’s been woven into Drupal’s existing logic. Each agent plays a clear role, translating prompts into structured actions instead of loose suggestions. Together, they show how a content management system can evolve without changing what makes it reliable.
The design of Canvas AI feels deliberate. The separation between agents, the orchestration layer, and the reliance on component metadata all point toward a system that values control and transparency as much as convenience. It’s a reminder that progress in CMS design doesn’t always come from adding new interfaces but from finding better ways for tools to work together.
In Drupal, building and managing pages has often meant working hand in hand with developers. Content teams could swap out text or images, but creating new layouts or landing pages usually sat in a queue. Campaigns slowed down, costs crept up, and organisations struggled to move at the pace they needed.
Drupal Experience Builder changes that rhythm. With a visual, low-code interface, editors and marketers can design, structure, and publish pages themselves. Developers still play a role in extending the system with custom components, but everyday page building no longer depends on them. The payoff is faster launches, consistent design, and fewer bottlenecks.
The first stable release will be announced at DrupalCon Vienna in October 2025, though teams can already begin exploring what Experience Builder makes possible today.
Currently, the Experience Builder module primarily supports the Article content type out of the box. To use Experience Builder with Articles, you first need to enable its sub-module, Develop XB on top of the Standard install profile(xb_dev_standard).
However, this sub-module is located under the ‘tests’ directory, so it won't be visible on the Extend page by default.
To make it discoverable, you must first allow Drupal to find test modules. For that, add the following line to your settings.php file,
web/sites/default/settings.php:
$settings['extension_discovery_scan_tests'] = TRUE;
Note: Experience Builder setup currently uses developer/test modules such as xb_dev_standard. These modules may change after launch.
Now, to enable the module

After the module is installed, create a new Article or navigate to an existing one. You will now see a new link in the admin toolbar: Experience Builder: [Article Title].

Clicking this link will launch the Experience Builder interface for that piece of content.

When the xb_dev_standard module is enabled, it automatically adds a new field named XB demo to the Article content type. This field is responsible for storing the data and structure of the components you add. It uses a dedicated Field Formatter, Render SDC tree, to ensure the components are rendered correctly on the page.

The UI is mainly divided into 4; Top bar, Left and Right sidebars, and the canvas where the live preview of the page is rendered.
The top bar consists of the following elements.

This is where the forms to update the page or component fields appear.

This is a region that lists mainly two things

Note: The demo Single Directory Components (SDCs) are provided through a test module (xb_test_sdc) and are intended for exploration only. Availability may differ after launch.
To begin adding content, click the + icon in the left sidebar. This opens the component library, which displays all the elements you can place on your page.

The component library contains the following sections
On a fresh Drupal installation, your component library might be showing only a single Teaser component provided by the default Olivero theme.
To see a richer set of examples, you can enable the Experience Builder Test SDC (xb_test_sdc) module that ships with Experience Builder. This is another test module that contains several demo SDCs. Enable it from the Extend page, then return to the Experience Builder UI. You will now see a variety of demo components available to use. A live preview of each component can be seen hovering over its name.

In Experience Builder, a "component" can be a Single Directory Component (SDC) defined in your theme or module, a standard Drupal Block, or a custom React component. When Experience Builder detects any of these items, it creates a corresponding Component configuration entity in the Drupal backend.
You can manage these component entities by navigating to Appearance > Components in the admin menu.

Here, components are organised into two sections:
This interface also allows you to manually disable any component, giving you full control over which items are available in the UI. Similarly, the Audit option provides a detailed overview of each component's usage across your site, helping you track where and how every component is used.

Components can be added to the canvas either by clicking their name in the library or by dragging and dropping them into a highlighted content region. Go ahead and click the Heading component to add it to the page.

As soon as the component is added, its configuration form will appear in the right sidebar. This form displays the component's editable fields, known as props, which are defined in its corresponding YAML file.
experience_builder/tests/modules/xb_test_sdc/components/simple/heading/heading.component.yml

Try it out: change the heading text to "Experience Builder is AWESOME!" As you type, you will see the preview on the canvas update in real-time.

Next, let's work with a component that uses slots. From the component library, add the Two Column component to the canvas, placing it either above or below your existing Heading.

You'll notice that the Two Column component doesn't render any visible content by default. Instead, it provides two empty placeholders: Column One and Column Two. These are slots. Slots are designated areas within a parent component where other components can be nested.
To place a component into a slot, simply drag it from the library (or from elsewhere on the canvas) and drop it into the target slot. Let's try it:

You can see the hierarchical "tree" view of all your components in the Layers panel.
This panel not only displays the nested structure of your page but also allows you to reorder elements with a simple drag-and-drop action. By default, all components are placed within the main Content region.

Right-clicking on a component, either directly on the canvas or within the Layers panel, opens a context menu with several useful options.

This menu supports common operations like Duplicate, Copy, and Paste, complete with standard keyboard shortcuts. You will also find a Move option, which allows you to precisely reposition a component above, below, or nested inside any other component on the page.
Our two-column layout containing a Drupalicon and a heading is a useful combination. If you want to reuse this structure in other places, you can save it as a pattern.
To do this, select the parent component (in this case, the Two Column layout) and right-click it to open the context menu. Select Create Pattern. When prompted, give your pattern a descriptive name and click Add to library.

Your new pattern will now be available under the Patterns tab in the component library. You can add it to any page just like a regular component. Each time you use the pattern, you create a new, independent instance, allowing you to change its content without affecting the original saved pattern.

When you are ready, click the Preview button in the top toolbar to see how your content will look on the live site. This feature includes options to simulate how the page will render on different devices, such as tablets and mobile phones.

To publish, click the Review Changes button. This opens a screen that lists all pending updates across every page updated. The required changes can be selectively published.

When you update a page using Experience builder, the component data is not immediately saved to the node's XB Demo field. Instead, the entire page layout is converted into a JSON format and stored in Drupal’s private TempStore. To understand this structure in detail, you can review the official data model documentation. Only when the node is published is this data retrieved from the tempstore and permanently saved to the field.
Now that your page is published, you can designate it as your site's homepage directly from the Experience Builder interface.


By default, Experience Builder can only access the ‘content’ region, which constructs the main body of a page. However, it is also possible to enable other global theme regions, such as Header, Footer, etc.
To enable global regions, follow these steps:

Once enabled, you'll see these global regions available within the Experience Builder UI. To edit one, simply double-click the region or click the three-dot menu (...) next to its name and select ‘Edit Global Region’. This focuses the editor on that specific area, allowing you to add new components just as you would in the main content region.

To return to editing your page's main content, just click the region name in the top bar or the left-hand sidebar. Similarly, you can move an existing component from the main content area directly into a global region by using the component's ‘Move to global region’ option.
This flexibility pairs well with Decoupled Drupal, especially where design and delivery teams need faster control of page elements.

Currently, Experience Builder supports the following permissions:
Experience Builder lets you create components for your page directly from the UI. These are known as code components. Code components are created using React and should use Tailwind CSS for styling. They make Experience Builder usable for people who have no prior experience with Drupal or Single Directory Components.
Let's create a small Button component to see how it works. To do this, click ‘Add new’ from the Component Library.

Enter the name ‘Button’ and click Add. This will open the code editor, which consists of four main sections:

The code editor consists of 4 main sections
Update the boilerplate code with this
const Button = ({
text = "Button",
url = "#",
}) => {
return (
<a
href={url}
className="inline-block px-4 py-2 bg-gray-800 text-white text-base rounded hover:bg-gray-700"
>
{text}
</a>
);
};
export default Button;
Our button component uses two props, text and url. We need to be able to change these whenever the component is placed on a page. To do this, the props must be defined in the UI.

The code component won't get added to the component library by default. To make the component available in the library, click ‘Add to component’. The Button component will now be listed in the Component Library.

Click or drag the component to place it on the canvas. The component's props form will appear in the sidebar, where you can change the text and URL.

If you publish the page where the button component was placed and view it as an anonymous user, you will notice that the styles are not rendered. To render the styles, the assets must be explicitly published. To do this, go to the "Review Changes" section, select the asset, and click "Publish."

Read the official documentation to understand more advanced features of code components, such as data fetching
Experience Builder creates config entities for managing Page regions, Patterns, Assets, Code components, etc., just like Components.
We are now in the era of AI, and Experience Builder also comes with many AI features. These are still in active development, but you could still try some of them. To try out the AI features, enable the xb_ai submodule. Remember, you have to set up an AI provider and install the AI Agents module (version 1.1) to try out these features.
Once the module is enabled, click the AI panel icon to open the chat widget.

Code components can be created using a prompt or by uploading an image. Try the following prompt:
“Create a banner component with a black background, white text, and green rounded borders. Add a prop for the banner text.”

The component will be created, and the prop for the banner text will also be added. The same chat interface can be used to modify the created component as well, like changing colours, adding extra props, etc..
Experience Builder also supports AI-assisted page building using available components. For this to work properly, we first have to provide proper information about all the available components so the AI agent can understand how to use them. To do that:

Now, open a page and try the following prompt:
Add four button components to the page with the names of four programming languages and URLs pointing to their official documentation
The AI agent should add four button components (the code component we created earlier). It should also add the sparkle emoji ✨ after the button text, as we instructed in the component description form.

Depending on the available components, you could also try prompts such as:
“Create an ‘Our Specialities’ section for a restaurant page” or “Add a hero banner suitable for the homepage of a pizza shop.”
Note: AI-assisted page building is only supported in ‘XB page’ entities. It will not work with articles.
AI can also be used to generate titles and descriptions for pages. Try the following prompt:
“Add a suitable title and description for a blog page about the role of AI in programming.”

Note: This is also only supported in ‘XB page’ entities and will not work with articles.
These tools sit alongside other projects like Exploring Drupal’s AI Agents and AI-powered semantic search in Drupal.
Drupal Experience Builder gives teams a practical way to cut the delay between ideas and execution. Page updates that once required a developer can now be handled directly by content teams, keeping work moving without extra steps.
Its real impact will be seen in how organisations manage growth. As sites expand, the ability to reuse patterns, align layouts across regions, and publish quickly can reduce overhead and keep performance consistent.
The future is not about replacing developers but letting them focus on higher-value work while editors and marketers handle day-to-day changes. For organisations, that means faster delivery, fewer bottlenecks, and sites that stay aligned with business goals.
Can I use Drupal Experience Builder today?
Yes. It can already be enabled for Articles, with a stable release expected after DrupalCon Vienna in October 2025.
Does it work with global regions like headers and footers?
Yes. Global regions can be enabled in your theme settings and edited in the Experience Builder UI.
Do non-technical users need developer support to use it?
No. Editors and marketers can create and publish pages directly without waiting for developers.
How is it different from Layout Builder?
Layout Builder is developer-oriented. Experience Builder provides a cleaner interface with reusable patterns, designed for editors and marketers.
Is it suitable for nonprofits or smaller teams?
Yes. Nonprofits and smaller organisations benefit by reducing IT effort and publishing faster. They can also combine it with Drupal AI translation modules to reach multilingual audiences.
In a multilingual digital world, keeping your website content translated, consistent, and fresh can be a challenge.
That’s where Drupal’s AI-powered translation modules come in.
With the rise of Large Language Models (LLMs), Drupal developers now have access to powerful tools that make content translation faster and easier.
Two key modules that streamline AI-based translation in Drupal are:
Let’s explore both:
The AI Translate module is part of the AI module suite and integrates directly with Drupal’s content translation system, which allows content editors to generate translations for nodes using AI providers (like OpenAI or others) with a single click.
Key features:
Prerequisites:
Enable modules:
Steps:




The AI TMGMT (Translation Management) module serves as an AI-based translator plugin for the Translation Management Tool (TMGMT) project. It leverages the AI module to support a wide range of providers, including OpenAI, Ollama, and other paid or free/local options. This ensures you can always access the latest, most cost-effective models for accurate and automated content translation.
Key Features:
Enable Modules:
Steps:
Once enabled, the module provides the Translation menu item in the navigation.



Now you are allowed to select multiple items from the list to translate together. You can see the title, columns for each language. Against each content, there are symbols under each language. The home symbol indicates original translation, the cross symbol represents no translation available for that language, and the green check implies there is translation available for that particular language.




You can view the translation status of each content in the job items page and the status of each group of translation in the jobs page.


From here, you can manage or review the translations and complete them as appropriate.
If you want to avoid the process of review of translations, you can enable the Auto accept finished translations field in admin/tmgmt/translators/manage/ai?destination=/admin/tmgmt/translators
Drupal’s AI-powered translation modules, AI Translate and AI TMGMT, bring speed, flexibility, and scalability to multilingual content workflows. Whether you’re translating a single node on the fly or managing complex, large-scale translation jobs, these tools empower site editors and administrators to harness the capabilities of modern AI models like OpenAI, Ollama, and more.
By integrating AI seamlessly into Drupal’s translation ecosystem, these modules help reduce manual effort, improve consistency, and deliver translated content faster without sacrificing editorial control.
As LLMs evolve, these tools will continue to grow, offering even more efficient and intelligent ways to manage multilingual experiences in Drupal.
https://www.drupal.org/project/ai_tmgmt
https://www.drupal.org/project/ai
https://project.pages.drupalcode.org/ai/1.1.x/modules/ai_translate/

Automation is at the heart of modern web development, allowing websites to streamline operations, enhance user experience, and reduce manual intervention.
Drupal, being a powerful CMS, has long supported automation through modules like Rules in Drupal 7.
However, with Drupal 8+ transitioning to Symfony and modern object-oriented programming, the Rules module struggled to keep up. To fill this gap, the ECA (Event-Condition-Action) module was introduced as a no-code automation framework that offers a flexible, graphical, and user-friendly way to define workflows.
ECA stands for Events - Conditions - Actions, and it follows a simple paradigm:
ECA allows site builders to configure complex workflows without writing a single line of code, making it a game-changer for automation in Drupal.
Before ECA, the Rules module was widely used in Drupal 7 to set up automated workflows. However, with the architectural changes in Drupal 8 and beyond, Rules struggled with compatibility and performance.
As a result, ECA was introduced as a modern, flexible alternative that integrates seamlessly with Drupal’s API and object-oriented architecture.
ECA provides multiple workflow modellers, allowing users to design automation visually. The available modellers include:
A JavaScript-based BPMN (Business Process Model and Notation) modeller integrated directly into the Drupal admin UI. It offers an intuitive drag-and-drop interface for defining workflows.
A desktop-based modeller that allows users to create BPMN workflows externally and import them into Drupal. Useful for complex workflows requiring offline editing.
A form-based workflow modeller that uses Drupal Core’s Form API. Best suited for developers who prefer configuration-driven workflow automation.
The Event-Condition-Action (ECA) module in Drupal allows you to create automated workflows based on user actions. In this guide, we will walk through setting up a simple ECA model using the BPMN.iO modeller. This model will display a thank-you message whenever a new article is created.

The main ECA interface consists of:











This simple ECA model demonstrates how you can automate workflows in Drupal using the ECA module. You can extend this model by adding more conditions or actions to customise its behaviour further.
Drupal’s Event-Condition-Action (ECA) module, combined with BPMN.io, is shifting from visual automation to AI-powered decision-making. Site builders can create no-code workflows that use models like GPT to generate summaries, improve metadata, and flag moderation issues automatically and in real time.
Used on over 8,000 sites, BPMN.io workflows are gaining traction in Europe with developers like LN Webworks and Code Enigma. They are applying AI-enhanced ECA for content strategy, personalisation, and quality assurance, especially in sectors with multilingual needs or lean teams.
This is not just a trend. Drupal is building modular, intelligent systems where AI becomes part of how websites operate. More on The Drop Times.
For more help, check out these resources:
AI in Drupal has come a long way in a short time. With version 1.1 of the AI Agents module, it's now much simpler to create your AI agents right from the admin interface. No coding is needed, and setup is quick.
These agents can do more than just chat. They can help users find content, assist with form submissions, or support your editorial team with routine tasks.
For example, you could build an agent that guides visitors through your blog, finds related articles, and summarises content so readers get the main points faster.
In this blog, we’ll walk through how to create your own AI agents in Drupal and show what they can do to make your site more helpful and efficient.
First, you'll need to install and enable the required modules, which are
Next, you'll need to set up the AI Provider OpenAI module. The best place to find the latest instructions for this is on the module's project page.
Finally, navigate to Configuration -> AI -> AI Default Settings. Here, you need to select a model for the ‘Chat with Tools/Function Calling’ operation.


We'll begin with a simple agent designed to suggest five taxonomy terms for any given topic. To set this up, you just need to add the following details:
Now for the most important part: the instructions. Under the Usage details section, paste the following prompt into the Agent instructions field.
“You are a smart AI assistant integrated with a Drupal website. Suggest 5 taxonomy terms that are specific instances or subtypes of the given topic. Prioritise concrete examples commonly used for categorisation, not abstract concepts or related fields. Return ONLY comma-separated terms (no explanations, numbering, or extra text).”
Once you're done, click Save.
To see our new agent in action, go back to the agent settings page (config/ai/agents) and click the Explore link next to your "Taxonomy term generator" agent. (Note: this link will only be visible if you have the AI Agents Explorer module installed).

In the explorer interface, type any topic into the prompt field and click Run agent. You'll see the output appear in the Progress section.

Congratulations! You've just built your first AI Agent!
Tools are what give agents their real power. They are specific functions that help an agent perform actions beyond just generating text. A tool can be:
Let's see how an AI agent can use tools. The AI Agents module provides a built-in tool named Modify taxonomy term, which can be used to create or edit taxonomy terms. We're going to update our "Taxonomy term generator" agent to use this tool, automatically saving the suggested terms into our "Tags" vocabulary.
But first, let's test the tool on its own. Edit the "Taxonomy term generator" agent you just created, find the "Modify Vocabulary" tool in the list and click the Test this tool option. You'll need to have the AI API Explorer module enabled to see this option.


The tool requires several arguments, like vid, tid, and name. Let's give it a try:
You should see a message like, "The term Earth was successfully created/edited," and you'll find the new term in your "Tags" vocabulary.
If you were to look at the source code for this tool, you'd see it's just a standard function for creating a taxonomy term. There's no "AI" inside the tool itself. The magic is that our agent can figure out how to call this tool with the correct arguments. The tool does the work and returns a success or error message back to the agent. That, in a nutshell, is how tool calling works
Replace the prompt of the ‘Taxonomy term generator’ agent with the following
“You are a smart AI assistant integrated with a Drupal Website. Your task is to suggest 5 taxonomy terms that are specific instances or subtypes of the given topic. Prioritise concrete examples commonly used for categorisation, rather than abstract concepts or related domains. Once the terms are identified, use the modify_taxonomy_term tool to save them.”
Next, scroll down to the Tools section and select the Modify taxonomy terms tool. Once you select it, a new Detailed tool usage section will appear on the form. Expand the Property restrictions element to see the options.

This is where we can control the arguments passed to the tool. For example, our agent should add the taxonomy terms only to the ‘tags’ vocabulary. One way to enforce this is to add something like the following to the agent instructions.
"When using the modify_taxonomy_term tool, always use 'tags' as the value for the 'vid' parameter."
While this would probably work, a better and more reliable method is to enforce the value using the ‘Restrictions for property vid’ field. The default value for this section is ‘Allow all’. Change that to ‘Force value’ and enter ‘tags’ in the ‘values’ field.
If you select ‘Force value’, an additional checkbox, ‘Hide property’, will become available. This feature prevents the property from being sent to the LLM altogether, which is ideal for fields that store sensitive information like API keys.

Now, save the agent and click the Explore button again to test our changes.

You'll probably see something interesting. The agent tries to call the tool, but the final response says ‘Not solvable’. And if you check your "Tags" vocabulary, you'll see the new terms haven't been created.
So what's going on? This happens because of the Max loops setting. Remember how we set it to 1 earlier? With a max loop of 1, the agent can only communicate with the LLM once. In that single step, the LLM decides which tool to use and what arguments to pass. But agent doesn't have a chance to actually run the tool and confirm the result. For that, it needs a second loop.
Go back and edit the agent, change Max loops to 2, save it, and try again. This time, it should work perfectly! The agent will use the tool, and the new terms will appear in your vocabulary.

Let's try to improve the functionality of our taxonomy generator agent. Instead of adding all the terms to the "Tags" vocabulary, our agent should be able to create vocabularies that don't exist yet (like "Planets" or "Fruits") and then add terms to them. To do this, we'll need to give it a few more tools:
Update the prompt of our agent as follows
You are a taxonomy manager agent integrated into a Drupal 11 website. You help to provide information about existing vocabularies and terms, as well as adding new terms and vocabularies. You are a looping agent, meaning you can run multiple times till the task is completed.
You have the following tools available
1. list_bundles: Provides the information about currently existing vocabularies.
2. modify_vocabulary: Can be used to create new vocabularies.
3. list_taxonomy_term: Can give the existing terms present in a vocabulary
4. manage_taxonomy_term: Can be used to add new terms to a vocabulary/modify existing terms.
Before adding terms, make sure that the vocabulary exists. Also, make sure you do not add any existing terms to any vocabulary, unless explicitly requested by the user
Next, you'll need to configure the agent to use these new tools.
Once you've saved the agent, test it again with a prompt like: Create a fruits vocabulary and add 4 terms.’

Our agent is now smart enough to use its full suite of tools to handle the entire request.
In our previous example, you might have noticed that our agent ran multiple times, perhaps 4 loops, just to create the "Fruits" vocabulary and add the terms. Each loop increases both the response time and token usage. One of the key tools our agent had to use was list_bundles, simply to get a list of existing vocabularies.
What if we could give the agent this information upfront, as part of its initial instructions? This is exactly what the Default Information Tools section is for. It lets you pre-load information for the agent, making it more efficient.
Let's try it out:
vocabularies:
label: Vocabularies
description: 'The existing Vocabularies on the system'
tool: 'ai_agent:list_bundles'
parameters:
entity_type: taxonomy_term
Now, save the agent and test it again with the prompt: Create a fruits vocabulary and add 4 fruits.

If you run this after the vocabulary has already been created, you'll see a much faster response. The agent will likely tell you that the "Fruits" vocabulary already exists without ever explicitly calling the list_bundles tool.
This happens because the tool was invoked automatically in the background, and its output (the list of vocabularies) was sent to the LLM as part of the agent's initial context. The agent had the information it needed from the very beginning.
Now let's build a chatbot that allows users to interact with our new taxonomy agent. The first thing you'll need to do is enable the AI Chatbot module.
To use a chatbot, first, an AI Assistant has to be created.
Always delegate the task to the 'Taxonomy term generator' agent. Whatever response the agent provides, return it to the user. You are just a router — you do not perform any actions.
With our assistant ready, the final step is to place the chatbot block on the site.


And there you have it! In just a few steps, we went from a simple idea to a fully functional AI agent that can understand a request, use multiple tools to interact with our site, and even power a user-facing chatbot. If you've followed along, you've already mastered the core concepts. I encourage you to dive in and start experimenting. Don't be afraid to try different prompts, combine new tools, and see what you can create. You might be surprised at how easy it is to build an AI assistant that makes your Drupal site smarter and your workflow easier.
By now, you've seen how powerful and flexible AI Agents in Drupal can be. Starting with a simple term suggestion agent, we gradually added more functionality, allowing it to create vocabularies, avoid duplicates, and even respond through a chatbot.
What's exciting about this setup is how easy it is to extend. If you want to automate more content tasks, just add another agent. If you need smarter results, tweak the prompts. You are not locked into one use case, and you don’t need deep AI or coding knowledge to start seeing real results.
Everything you need is already in place. The interface is ready, the features are powerful, and the possibilities are wide open. So go ahead, explore and experiment. You might be surprised by how quickly you can build something truly useful.
If you get stuck or want to learn more, the Drupal community is always there to help.
This post is part of our AI CKEditor Integration series. If you haven’t read the previous blog on setting up the AI CKEditor module, we suggest starting there to understand the basics.
The built-in features like translation, tone adjustment, and text completion offer a strong starting point. But the real strength of the module comes from creating custom plugins that match your specific content workflows.
In this blog, we’ll walk through how to build those plugins. You’ll learn how to define custom behaviour, connect it with the editor interface, and shape AI assistance around your editorial needs.
While the AI CKEditor module ships with a variety of powerful tools such as translation, tone change, and summarisation, there are many scenarios where teams need functionality tailored to their content workflows. This is where custom plugins shine.
Here are a few reasons you might want to build a custom plugin:
Custom AI CKEditor plugins work by:
Create a custom module or use an existing one. Your plugin file should be placed in:
src/Plugin/AiCKEditor/{YourPluginName}.php/custom_module/
├── custom_module.info.yml
└── src/
└── Plugin/
└── AiCKEditor/
└── ImproveClarity.php
Every custom AI CKEditor plugin should extend the AiCKEditorPluginBase class. To make your plugin discoverable by Drupal, decorate the class with the #[AiCKEditor(...)] attribute, which provides metadata such as id, label, and description. This is essential for your plugin to appear in the AI Tools list within CKEditor.:
<?php
namespace Drupal\my_custom_module\Plugin\AICKEditor;
use Drupal\ai_ckeditor\AiCKEditorPluginBase;
use Drupal\ai_ckeditor\Attribute\AiCKEditor;
/**
* Plugin to do something custom.
*/
#[AiCKEditor(
id: 'custom_feature',
label: new TranslatableMarkup('My Custom Feature'),
description: new TranslatableMarkup('This is my custom feature for AI CKEditor.'),
)]
final class MyCustomFeatureCKEditor extends AiCKEditorPluginBase {
}
/**
* {@inheritdoc}
*/
public function buildConfigurationForm(array $form, FormStateInterface $form_state): array {
$options = $this->aiProviderManager->getSimpleProviderModelOptions('chat');
array_shift($options);
array_splice($options, 0, 1);
$form['provider'] = [
'#type' => 'select',
'#title' => $this->t('AI provider'),
'#options' => $options,
"#empty_option" => $this->t('-- Default from AI module (chat) --'),
'#default_value' => $this->configuration['provider'] ?? $this->aiProviderManager->getSimpleDefaultProviderOptions('chat'),
'#description' => $this->t('Select the AI provider to use.'),
];
return $form;
}
public function buildCkEditorModalForm(array $form, FormStateInterface $form_state, array $settings = []) {
$storage = $form_state->getStorage();
$selected_text = $storage['selected_text'] ?? '';
$editor_id = $this->requestStack->getParentRequest()->get('editor_id');
$form = parent::buildCkEditorModalForm($form, $form_state);
// Your form elements here
$form['response_text'] = [
'#type' => 'text_format',
'#title' => $this->t('AI Response'),
'#prefix' => '<div id="ai-ckeditor-response">',
'#suffix' => '</div>',
'#allowed_formats' => [$editor_id],
'#format' => $editor_id,
];
return $form;
}
ajaxGenerate(): Handles the AI processing when users click "Generate".
public function ajaxGenerate(array &$form, FormStateInterface $form_state) {
$values = $form_state->getValues();
try {
$prompt = $this->buildPrompt($values);
$response = new AjaxResponse();
$response->addCommand(new AiRequestCommand(
$prompt,
$values["editor_id"],
$this->pluginDefinition['id'],
'ai-ckeditor-response'
));
return $response;
}
catch (\Exception $e) {
// Handle errors appropriately
$this->logger->error("Error in custom AI plugin: " . $e->getMessage());
return $form['plugin_config']['response_text']['#value'] = "An error occurred.";
}
}
Here is a plugin to improve the clarity of the selected text:
<?php
namespace Drupal\custom_module\Plugin\AICKEditor;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\ai_ckeditor\AiCKEditorPluginBase;
use Drupal\ai_ckeditor\Attribute\AiCKEditor;
use Drupal\ai_ckeditor\Command\AiRequestCommand;
/**
* Plugin to improve the clarity of selected text.
*/
#[AiCKEditor(
id: 'improve_clarity',
label: new TranslatableMarkup('Improve Clarity'),
description: new TranslatableMarkup('Rewrite selected text to improve readability and clarity.'),
)]
final class ImproveClarity extends AiCKEditorPluginBase {
/**
* {@inheritdoc}
*/
public function defaultConfiguration(): array {
return [
'provider' => 'NULL',
];
}
/**
* {@inheritdoc}
*/
public function buildConfigurationForm(array $form, FormStateInterface $form_state): array {
$options = $this->aiProviderManager->getSimpleProviderModelOptions('chat');
array_shift($options);
array_splice($options, 0, 1);
$form['provider'] = [
'#type' => 'select',
'#title' => $this->t('AI provider'),
'#options' => $options,
"#empty_option" => $this->t('-- Default from AI module (chat) --'),
'#default_value' => $this->configuration['provider'] ?? $this->aiProviderManager->getSimpleDefaultProviderOptions('chat'),
'#description' => $this->t('Select the AI provider to use.'),
];
return $form;
}
/**
* {@inheritdoc}
*/
public function submitConfigurationForm(array &$form, FormStateInterface $form_state): void {
$this->configuration['provider'] = $form_state->getValue('provider');
}
/**
* {@inheritdoc}
*/
public function buildCkEditorModalForm(array $form, FormStateInterface $form_state, array $settings = []): array {
$storage = $form_state->getStorage();
$editor_id = $this->requestStack->getParentRequest()->get('editor_id');
if (empty($storage['selected_text'])) {
return ['#markup' => '<p>' . $this->t('Please select some text before improving clarity.') . '</p>'];
}
$form = parent::buildCkEditorModalForm($form, $form_state);
$form['selected_text'] = [
'#type' => 'textarea',
'#title' => $this->t('Selected text'),
'#default_value' => $storage['selected_text'],
'#disabled' => TRUE,
];
$form['actions']['generate']['#value'] = $this->t('Improve Clarity');
return $form;
}
/**
* {@inheritdoc}
*/
public function ajaxGenerate(array &$form, FormStateInterface $form_state) {
$values = $form_state->getValues();
try {
$prompt = 'Rewrite the following text to improve clarity and make it easier to understand without changing the meaning:' . PHP_EOL . '"' . $values["plugin_config"]["selected_text"] . '"';
$response = new AjaxResponse();
$response->addCommand(new AiRequestCommand($prompt, $values["editor_id"], $this->pluginDefinition['id'], 'ai-ckeditor-response'));
return $response;
}
catch (\Exception $e) {
$this->logger->error("There was an error in the Improve Clarity plugin: @message", ['@message' => $e->getMessage()]);
return $form['plugin_config']['response_text']['#value'] = "An error occurred during AI processing.";
}
}
}
Once you've created your custom AI CKEditor plugin, enabling it follows the same process as the built-in plugins:




Creating custom AI CKEditor plugins gives you the flexibility to shape content workflows around real editorial needs.
Whether it’s refining tone, automating structure, or guiding writers with contextual prompts, each plugin can bring meaningful improvements to the way content is created and managed.
Start with a clear use case, build in small steps, and adjust based on real feedback.
Drupal’s plugin architecture, combined with the AI CKEditor module, provides a strong foundation for developing tools that feel native to your workflow and make everyday writing faster, more focused, and more consistent.
Artificial intelligence is changing how content gets created, reviewed, and published, and Drupal is keeping up.
The AI CKEditor Integration module brings the capabilities of large language models (LLMs) directly into the content editing experience. Instead of jumping between external tools or copying drafts back and forth, editors can now work smarter within the CKEditor interface itself.
From translating content to checking spelling and grammar, adjusting tone, and completing sentences, the module makes everyday tasks faster and more consistent. It supports editors in maintaining quality, staying on message, and saving time, right where content is written.
By embedding AI features directly into CKEditor, this integration simplifies content workflows and gives teams the kind of intelligent assistance that keeps pace with modern publishing demands.
The AI CKEditor Integration module is a powerful extension that seamlessly integrates AI capabilities into Drupal's CKEditor 5.
AI CKEditor Integration is a submodule available in AI Core module that provides plugins that integrate with CKEditor 5. Rather than switching between different tools or applications, content creators can access AI-powered features directly within their text editor, streamlining the content creation process.
Before diving into the setup, ensure you have the following modules installed and configured:
First, enable the AI CKEditor Integration module through Drupal's admin interface or using Drush:
drush en ai_ckeditor



The Tone plugin requires a custom taxonomy to define available tones:

Similar to the Tone of Voice plugin, the Translation feature requires a taxonomy:

Once configured, using AI tools is straightforward:





The AI CKEditor Integration module marks a meaningful upgrade in how content is created and edited in Drupal. By embedding AI features directly into the CKEditor interface, it removes the need for context switching and makes capabilities like tone adjustment, grammar correction, translation, and text completion accessible to everyone: from site editors to content strategists.
This module works within Drupal’s existing editorial workflow, so teams don’t need to learn new tools or disrupt their publishing process. With a simple setup and thoughtful defaults, you can start improving content quality immediately.
Looking ahead, the potential for deeper AI integration is just beginning. From content summarization and image generation to accessibility checks and editorial analytics, future enhancements could transform CKEditor into a true intelligent assistant for web publishing.
As the Drupal ecosystem continues to adopt AI-powered modules, this integration sets the foundation for a smarter, more efficient content creation experience, built right into your CMS.
In today's digital landscape, Search Engine Optimisation (SEO) plays a vital role in ensuring online visibility. Whether you're a small business or a large enterprise, SEO directly influences how easily users can find your content. With AI (Artificial Intelligence) transforming industries, automating SEO processes in platforms like Drupal can significantly improve efficiency and results.
Drupal, a powerful content management system (CMS), offers flexibility and scalability for building websites. When paired with AI tools, Drupal can streamline and automate many aspects of SEO, making it easier for website owners and administrators to optimise their sites without requiring extensive manual intervention.
In this blog, we will explore how AI can be utilised to automate SEO in Drupal, as well as the tools and techniques that can help you achieve better search rankings.
Before diving into the specifics of AI, it's important to understand why automating SEO is essential. SEO is a multifaceted and time-consuming process that requires constant attention. From keyword research to content optimisation, backlink management, and technical SEO, there’s a lot to manage. Here’s why automation is crucial:
The AI SEO module is a contributed Drupal module that leverages AI services (e.g., OpenAI) to automate and assist with SEO tasks. It’s part of the broader AI Core ecosystem and integrates with your content types to generate:
Whether you're publishing articles, landing pages, or product descriptions, this module can help ensure that your content meets SEO best practices without extra manual effort.
When you edit content, AI SEO analyzes your text and suggests improvements like better keyword use, clearer headlines, or restructuring paragraphs for SEO effectiveness.
The module generates contextually relevant:
This helps editors focus on writing content while AI handles the technical SEO layers.
AI reads your images (file names and optionally visual description via prompts) and generates meaningful alt text, which improves accessibility and helps search engines index image content.
Using Natural Language Processing (NLP), AI SEO identifies important keywords from the content and recommends additional terms that could boost search relevance.
AI SEO provides a Drush command for optimizing multiple nodes at once, making it perfect for retrofitting existing content.
You'll need:



When editing a content node, the module provides an "Analyse SEO" tab on the sidebar or as a local task tab. This tab allows users to analyse the node’s current content, including title, summary, and body fields, and generate a comprehensive SEO report.
Step 1: Create or Edit a Node
Navigate to Content > Add Article or edit an existing one.
Step 2: Click on the "Analyse SEO" Tab
You will see a tab titled "Analyse SEO" while editing the content. Click it to start the process.
Step 3: SEO Report Generation
Once clicked, the module:
This report includes:

The AI SEO module for Drupal brings AI intelligence directly into the CMS, allowing editors to create search-optimized content without needing to switch between tools. Using this module, teams can generate meta descriptions, titles, alt text, and concise summaries directly in the edit screen, then refine them with real-time keyword and structure suggestions that follow the guidance in Google’s SEO Starter Guide.
Drupal’s modular architecture lets publishers scale content creation while keeping precision and consistency intact, which is crucial for large, content-heavy sites. The result is faster publishing, fewer manual errors, and stronger search performance.
Looking ahead, AI in Drupal SEO will open fresh possibilities. Expect automatic detection of content decay, AI-suggested rewrites for underperforming pages, topic prioritisation based on live search trends, and smarter internal linking and semantic clustering that adapt to competitor moves and user signals. For content-rich websites aiming to grow organic visibility, AI-driven SEO has shifted from nice-to-have to strategic imperative, and Drupal is positioned to lead this evolution.