Insightful stories that revolve around technology, culture, and design

All blogs

Topics
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Introduction to Drupal recipes
Category Items

Introduction to Drupal recipes

Drupal recipes make web development more efficient and reliable. Learn what are Drupal recipes, and how to implement them in new projects.
5 min read

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?

What are Drupal recipes

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.

The foundation of recipes

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

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.

Why Drupal recipes matter

Streamlining development

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.

Ensuring best practices

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.

Encouraging reusability

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.

How to use Drupal recipes

Now that we understand the significance of Drupal recipes and what they are, let's explore how to utilize them effectively.

Crafting a recipe

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.

Installation process

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.

Create a Drupal project

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:


composer create-project drupal/recommended-project my-drupal-site

This will create a new Drupal site in a directory named "my-drupal-site."

Now, navigate to your new Drupal site's directory:


cd my-drupal-site

Install Drupal using Drush (Drupal Shell):


composer require drush/drush
vendor/bin/drush site-install minimal

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


"patches": { "drupal/core": { "Allow recipes to be applied": "https://git.drupalcode.org/project/distributions_recipes/-/raw/patch/recipe.patch" } },

Step 2


composer require oomphinc/composer-installers-extender:2.0.1

Step 3


"installer-types": ["drupal-recipe"], "installer-paths": { // existing entries omitted... "docroot/recipes/contrib/{$name}": [ "type:drupal-recipe" ] }

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.

A sample recipe

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.


name: 'Drupal Base'
description: 'A recipe tailored to best practices for kickstarting a new Drupal 10 project.'
type: 'Site'

install:
  - config
  - node
  - user
  - text
  - link
  - filter
  - block
  - block_content
  - ckeditor5
  - contextual
  - menu_link_content
  - datetime
  - block_content
  - editor
  - image
  - menu_ui
  - options
  - path
  - dynamic_page_cache
  - big_pipe
  - taxonomy
  - dblog
  - toolbar
  - field_ui
  - media
  - media_library
  - views
  - views_ui
  - automated_cron
  - claro
  - gin
  - gin_login
  - gin_toolbar
  - config_ignore
  - pathauto
  - memcache
  - redirect
  - robotstxt
  - menu_block
  - csp
  - metatag
  - metatag_open_graph
  - metatag_verification

config:
  import:
    dblog: '*'
    image: '*'
    media: '*'
    media_library: '*'
    pathauto: '*'
    redirect:
      - redirect.settings
      - system.action.redirect_delete_action
      - views.view.redirect
    node:
      - views.view.content
    user:
      - views.view.user_admin_people
    gin:
      - gin.settings
      - block.block.gin_breadcrumbs
      - block.block.gin_content
      - block.block.gin_local_actions
      - block.block.gin_messages
      - block.block.gin_page_title
      - block.block.gin_primary_local_tasks
      - block.block.gin_secondary_local_tasks
  actions:
    block.block.gin_admin:
      simple_config_update:
        status: false
    block.block.gin_branding:
      simple_config_update:
        status: false
    block.block.gin_local_actions:
      simple_config_update:
        region: content
        weight: -10
    block.block.gin_local_tasks:
      simple_config_update:
        status: false
    block.block.gin_page_title:
      simple_config_update:
        region: header
        weight: -10
    block.block.gin_primary_local_tasks:
      simple_config_update:
        region: header
        weight: -5
    block.block.gin_tools:
      simple_config_update:
        status: false
    node.settings:
      simple_config_update:
        use_admin_theme: true
    user.settings:
      simple_config_update:
        register: admin_only
    automated_cron.settings:
      simple_config_update:
        interval: 0
    system.theme:
      simple_config_update:
        admin: 'gin'
        default: 'stark'

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.


name: 'Example recipe'
description: "An example Drupal recipe description"
type: 'Content type'
install:
  - gin
  - gin_login
  - gin_toolbar
config:
  import:
    gin:
      - gin.settings
      - block.block.gin_breadcrumbs
      - block.block.gin_content
      - block.block.gin_local_actions
      - block.block.gin_messages
      - block.block.gin_page_title
      - block.block.gin_primary_local_tasks
      - block.block.gin_secondary_local_tasks
  actions:
    block.block.gin_admin:
      simple_config_update:
        status: false
    block.block.gin_branding:
      simple_config_update:
        status: false
    block.block.gin_local_actions:
      simple_config_update:
        region: content
        weight: -10
    block.block.gin_local_tasks:
      simple_config_update:
        status: false
    block.block.gin_page_title:
      simple_config_update:
        region: header
        weight: -10
    block.block.gin_primary_local_tasks:
      simple_config_update:
        region: header
        weight: -5
    block.block.gin_tools:
      simple_config_update:
        status: false

Next, command to run the recipe script.


php core/scripts/drupal recipe recipes/contrib/drupal-base

Customization and expansion

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.

Useful resources

Exploring the New “Recipes” Feature in Drupal 10

The Recipes Initiative

Github next-drupal-starterkit

Conclusion

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!

How to access a local Lando site on other devices
Category Items

How to access a local Lando site on other devices

Check out this elaborate guide on how to access a local Lando site on any device within the same network with a few changes in the Lando's config file.
5 min read

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. 


Make changes to access your site on mobile devices in the same network

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.

Access Local Lando Site-1

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


{
# Bind my exposes services to all interfaces
bindAddress: "0.0.0.0"
}
Access Local Lando Site-2

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: 

Access Local Lando Site-3

As soon as you are done with it, find your IPv4 address.


Links to find your private IP address (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>

Access Local Lando Site-4

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

Access Local Lando Site-5

iPhone and iPad

Access Local Lando Site-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

Other References:

  1. Accessing Lando from Other Devices on Your Local Network
  2. Security
  3. Global Config


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.

Claro & Olivero: uncovering new themes in Drupal 10
Category Items

Claro & Olivero: uncovering new themes in Drupal 10

Claro and Olivero are the new default admin and front-end themes in Drupal 10. Explore the various features and how they enhance digital experiences.
5 min read

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. 

Drupal UI: The past and the present

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: New default administration theme in Drupal 10

Claro - New default admin theme in Drupal 10

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: Features and guidelines

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:

  • Cheerful colors
  • Precise shapes
  • Accessible contrasts
  • Clear objective for each element
  • Clear hierarchy between elements
  • Rational use of white space
  • Optimal readability

Olivero: New default front-end theme in Drupal 10

Olivero - New default front-end theme in Drupal 10

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: Features and guidelines

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:


Color Palette

With a bright blue base color and neutral grays for balance, Olivero highlights a bright and modern look that aligns with Drupal branding.


Header & Navigation

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.


Buttons

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.


Typography

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.


Messages

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.


Forms

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.


Sidebar

Olivero provides a single sidebar instead of two to help highlight additional content. The sidebar region floats right next to the primary content.


Breadcrumbs

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. 

Claro & Olivero: Enhancing intuitive experiences

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.

Decoupled Drupal: Everything you need to know
Category Items

Decoupled Drupal: Everything you need to know

Decoupled Drupal separates content and presentation for faster digital delivery.
5 min read

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. 

What is a headless or decoupled CMS?

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).
 

Decoupled Drupal

What are the various ways in which you can decouple Drupal? 

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.

  • Progressively Decoupled Drupal: Progressively decoupled architecture adds a JavaScript layer to the front-end delivering some or all the components of the webpage. The back-end CMS remains on Drupal, whereas the front-end uses JavaScript to render interactive web experiences. 

    In a progressively decoupled Drupal architecture, the developer holds more control over the experience end-users will get. Whereas in the traditional monolithic Drupal framework, it is the editors of the website who control the experience end-users will get. 
  • Fully Decoupled Drupal: A fully decoupled approach in Drupal, as the name suggests, completely releases the front-end from the back-end. In this complete separation, Drupal serves as the data layer providing content to JavaScript or other front-end layers creating dynamic user experiences. 

    The front-end of the web experience interacts with the back-end via APIs which connect the two in a seamless and flexible manner. This, although leaves the editors of the website at the whims of the developers, gives end users a captivating and interactive web experience. 
     

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.

Front-­end defining how content is displayed in the digital application 

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.  

Few front-end options to decouple Drupal with

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. 

  • Drupal with React: JavaScript offers one of the best front-end solutions in the web development market. React is one such solution which is a JavaScript library that enables the creation of interactive user experiences. 

    It is a highly powerful front-end technology in the market, and the best part, it is supported and backed by Facebook. With React, the developers have the capability to split the code into corresponding components which can be reused saving developer’s time and effort.  

    Drupal is perfect in itself, but when decoupled and interlaced with React, it becomes even better. Though it is a bit tough to get the hang of it, but when the two forces combine, a skilled developer can create magical user experiences which leave lasting impressions. 
     
  • Drupal with GatsbyJS: Another great tool to render an immersive digital experience is GatsbyJS. GatsbyJS is an open source framework that enables the creation of interactive and performant front-end experience by integrating technologies such as GraphQL. GatsbyJS makes use of pre-configured templates to create static sites with blazing fast speeds.  

    When it comes to offering exceptional digital experiences at a minimal cost, GatsbyJS and Drupal are great options since both of these frameworks are open source. 

    GatsbyJS comes with all the components required for a modern website. Performance is enhanced in a framework such as Gatsby because it renders pre-configured pages thus reducing the loading speed drastically. 

Essential ingredients to deliver a complete omnichannel digital experience

In a decoupled framework, there are multiple components interacting and working collaboratively to create an immersive digital experience. Listed below are these components. 

  • Front-end framework: The front-end framework of the website is responsible for delivering the end-user facing component of the website. This is the portion of the system that the end users see and interact with. 
     
  • CMS: CMS or the content management system of the website is responsible for holding the data and content repository of a decoupled system that interacts with the front-end via APIs. 
     
  • Personalized content delivery: Another important aspect of delivering an omnichannel decoupled experience is the level of personalisation that can be achieved with decoupling. In a decoupled Drupal approach, the user experience can be tailored for each specific user.
     
  • Customer journey mapping: One more essential component of delivering an omnichannel experience is customer journey mapping. When you can see and track how your customers are moving through their journey, it will be easier for you to move them towards conversion. 
     
  • Integrations with virtual assistants: Because of its API-first approach, Drupal comes with a lot of APIs out-of-the-box. Drupal serves as the content repository for the front-end delivering content to any virtual assistant, be it on mobile or desktop. Some of the virtual assistants supported with Decoupled Drupal are: Alexa, Cortana, Google Assistant, and Siri.
     
  • API-first approach: In a decoupled system, the front-end, back-end and other layers interact with each other through APIs. This is why Drupal is great for having a decoupled system because of its API-first approach. 

Business cases for decoupled Drupal

Decoupled Drupal solves many of the challenges that enterprises face on a daily basis. Some of those challenges are listed below:

  • A powerful CMS: Drupal with all of its capabilities, rises to the top as the most powerful content management system out there. Drupal provides immense customisation and personalisation capabilities that modern enterprises require. It also provides state-of-the-art tools to create, manage and analyze content which when coupled with a beautiful front-end, can create digital experiences which are extraordinary. 
  • Omnichannel support: Drupal is one of the few options out there that can provide content to an unlimited number of front-ends, thus creating an ecosystem of digital experience. Not limited to the parent site, Drupal also has a multi-site approach out of the box which can cater for the content needs of multiple geographies simultaneously. 
  • Hyperlocalization: Apart from multi-site, Drupal is also multi-lingual which means you can serve up content in the local language as per the needs of the audience. All of this can be presented through the front-end of your choice with the use of decoupled Drupal. 
  • Enhanced loading speed: With the use of Drupal, one can create static websites with blazing fast speeds. This reduces the bounce rate on a website and increases conversion. 

Industries in which Decoupled Drupal outshines every other CMS 

  • Manufacturing: Manufacturing companies have a plethora of needs when it comes to their websites. With Decoupled Drupal one can fulfill these needs at a fraction of the cost. This saves time and effort and increases sales for businesses.  
  • Ecommerce: Drupal being a great CMS for building e-commerce websites, it allows the business owners and developers to create intuitive product pages on the front-end of their choice which delivers a great user experience resulting in higher conversions. 
  • Higher education: Quite often, higher education institutions have to serve content across multiple geographies to attract international students. In such a scenario, a decoupled Drupal architecture gives immense scope and flexibility to serve content, all the while maintaining the institution's brand consistency because all the content is coming from a single Drupal back-end. 
  • Fintech: With the rise of Fintech companies, has also risen the need for personalising the content across delivery channels to cater to the needs of the audience. Drupal back-end gives enough scope and room for personalising content tailored around the end-user’s requirements. 

What decoupled Drupal means for various aspects of your business

  • Marketers: For marketers, the Drupal back-end offers a great content authoring experience offering the flexibility to create, publish and edit content for any and every platform simultaneously and seamlessly. It also allows the markets to personalise content according to the needs of the specific user, delivering it all on a beautiful front-end technology. 
  • Your website: Decoupling your front-end using Drupal at the back-end can result in an exceptional user experience because of the enhanced speed of your website, resulting in better conversion for your business. 
  • Your budget/site revamps: A decoupled Drupal approach will reduce your total cost of ownership while increasing your return-on-investment. A decoupled approach will also let you build mobile applications and can also be used to provide content to modern interfaces like voice, chatbots etc.
  • Your digital experiences: Without a doubt, decoupled Drupal elevates your digital experience by delivering an omnichannel and personalised user experience and gives your end-users something to look forward to. 

Reasons for you to use Drupal as decoupled 

  • Free the developer’s time: Using decoupled Drupal, you can free the developers to focus on innovation. Since developers have the liberty to work on the front-end and the back-end independently, it results in saving the time of the developers.  
  • Omnichannel delivery: Using Drupal’s ‘create once, publish anywhere’ approach, you can cater to the content needs of various regions, geographies and platforms.    
  • Improves reliability and performance: Decoupled Drupal becomes the ideal platform for your web experience requirements since it drastically improves performance and makes your site highly reliable. 
  • Saves time: Using decoupled Drupal, you are not just saving up developer’s time and efforts, but the efforts of the entire organisation. Since you can create once and publish it anywhere, Drupal saves the time of editors, content creators and marketers. 

How to decide if Decoupled Drupal is best for you

Here are the scenarios in which decoupled can create magic for your digital experience: 

  • When your content is to be displayed on multiple different platforms. 
  • When you have clearly defined the data roles in your organisation and you have a great team to work with.
  • When you want multiple websites in multiple local languages.
  • When you have the necessary resources and can invest in decoupled development.  

QED42 with Decoupled Drupal

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. 

shop the area screengrab

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.

The world’s top non-profits chose Drupal to build impactful digital experiences
Category Items

The world’s top non-profits chose Drupal to build impactful digital experiences

Why Nonprofits Choose Drupal.
5 min read

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 – providing equal opportunity to underprivileged children globally

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 Drupal website

What makes the digital platform stand out?

  • An intuitive and visually pleasing page layout - EOCI leveraged Drupal features that facilitate well-structured and effortless content authoring.
  • Simplified navigation with the highlighted call to action buttons - The placement of the call to action buttons is prominent making the visitors navigate better.
  • Compelling storytelling - The design and empathetic content contribute to building a trusted online community.

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 – defending human rights worldwide

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 Drupal website

What makes the digital platform stand out?

  • User-centered digital experience - Focused on readability, it delivers an impactful digital experience to its visitors.
  • Personalization - The digital platform ****shows personalized content based on the user’s region by analyzing and learning from the user taxonomy.
  • Optimization - Sharing tools and promoting most-shared content enabled to amplify the reach

Human Rights Watch’s Drupal platform is scalable for handling traffic spikes and allows content editors to publish content seamlessly.

Habitat for Humanity – building homes worldwide

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 Drupal website

What makes the digital platform stand out?

  • Personalized experience - The user-friendly web architecture tops the chart in providing a personalized experience to their global audience.
  • Dynamic call-to-action buttons - Drupal’s Paragraph-based page layout enables the content editors to place dynamic CTA’s to increase online donations.
  • Translation and localization of content - The user’s taxonomy triggers automatic translation and localization of the content.

Habitat for Humanity’s digital presence is future-focused with Drupal’s scalable and robust web architecture.

Doctors Without Borders – saving lives globally

Doctors Without Borders is an international, independent medical humanitarian organization providing medical assistance to people affected by conflict, epidemics, disasters, etc.

Doctors without Borders Drupal website

What makes the digital platform stand out?

  • Brand/UI consistency - Doctors Without Borders has been using Drupal since 2016 for its multi-site functionality, integrating independent country sites with the brand language.
  • Transparent information - Information transparency on the digital platform educates donors on how the money is being used and builds trust in the community.
  • An intuitive design - Drupal’s web architecture has enhanced fluidity, efficacy, and reliability.
  • Localization and translation - Drupal’s multilingual feature helps in rolling out communication campaigns in each region.

Built on Drupal, the non-profit’s digital presence has become fast, and responsive which has resulted in better reach.

UNICEF - Benefitting youth and children worldwide

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.

UNICEF Drupal website

What makes the digital platform stand out?

  • Centralized content management - The new platform serves as a centralized system for efficiently managing a wealth of essential information, including company profiles, investments, and donations.
  • Transaction system - The platform tracks all transactions, including investments and donations. It displays all investments and allows filtering by solutions, companies, regions, early-stage funding, and growth-stage funding.
  • Speed and responsiveness - The platform ensures optimal speed and responsiveness when handling substantial assets, delivering a seamless and engaging user experience.

The digital solution brings several remarkable enhancements, offering a seamless content authoring experience, and enabling users to craft compelling narratives effortlessly.

Conclusion

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.

Optimising digital experiences with Acquia and VWO integration
Category Items

Optimising digital experiences with Acquia and VWO integration

Acquia and VWO together enable continuous testing, personalisation, and optimisation to improve digital performance and conversion outcomes.
5 min read

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.

What is Acquia VWO?

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.

Why organisations use Acquia with VWO

Improve conversion performance

Testing landing pages, forms, content layouts, and calls to action helps identify which variations generate stronger engagement and conversion outcomes.

Personalise with greater precision

Audience segments can receive relevant experiences based on behavioural signals, geography, or device usage, improving both engagement and customer retention.

Reduce decision-making based on assumptions

Real-time experimentation data helps teams make informed optimisation decisions with measurable confidence.

Accelerate optimisation cycles

Experiments can be launched and adjusted quickly, allowing teams to iterate without disrupting broader development priorities.

Extend the value of Acquia investments

For organisations already using Acquia, VWO adds an additional layer of measurable optimisation without requiring major platform changes.

Key features of the integration

Visual editor

Marketers can create and manage experiments without relying heavily on development resources.

Split URL testing

Different page versions can be tested against each other to compare performance across full-page experiences.

Heatmaps and session recordings

User interaction data provides visibility into click patterns, scrolling behaviour, and friction points.

AI-powered insights

Winning variations can be identified faster through automated statistical analysis.

Personalisation engine

Experiences can be tailored dynamically based on visitor attributes and behavioural signals.

Connecting Drupal with Acquia VWO

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.

Is Acquia and VWO the right fit for your organisation?

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

Conclusion

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.

Create your own AI agents for Drupal Canvas
Category Items

Create your own AI agents for Drupal Canvas

Build a custom AI agent in Drupal Canvas to score news article engagement and suggest readability improvements.
5 min read

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.

What we are going to build

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.

Prerequisites

Before we begin, ensure you have the following:

  • Drupal Canvas & Canvas AI: Install the Drupal Canvas project and enable the canvas_ai sub-module. Once enabled, you will see the chatbot interface within Canvas.
  • AI provider: Should support tool calling (See: https://project.pages.drupalcode.org/ai/1.1.x/providers/matris/ for the available providers and their capabilities)
  • SDC components: You’ll need Single Directory Components (SDC) that can display headings and paragraphs. If you don't have any, try creating them as code components using the Canvas AI chatbot first!

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:

  1. Creating a new AI Agent (or tool) that performs the specific task.
  2. Attaching that Agent as a tool to the Orchestrator.
  3. Updating the Orchestrator’s prompt with instructions on when and how to use this new tool.

Step 1: Creating the "Readability Analyser" Agent

Navigate to Configuration -> AI -> AI Agent and add a new agent.

  • Name: Analyse Readability
  • Description: Evaluates page content for reader engagement potential. Returns a score (1-5) and up to 5 improvement suggestions for pages scoring below 4.

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:

  • Headline: Is it compelling, clear, and curiosity-inducing?
  • Opening: Does the first paragraph hook the reader immediately?
  • Structure: Is it scannable with strong subheadings and varied paragraph lengths?
  • Narrative: Does it tell a story or present information in an engaging way?
  • Value: Does it deliver on its promise and leave readers satisfied?

Output format:

  1. Score: [1-5]
  2. Rationale: 1-2 sentences explaining the score.
  3. Improvements: (Only if score < 4) List up to 5 specific, actionable suggestions.

Article to evaluate:[canvas_ai:layout]

AI agent

Save the agent.

Step 2: Informing the Orchestrator

Now that our sub-agent exists, we need to tell the Orchestrator about it.

  1. Edit the orchestrator agent: Go to your AI Agent configuration and edit the Orchestrator agent.
  2. Assign tool: In the "Tools" section, select your newly created Analyse readability agent.
    • Note: If the agent doesn't appear in the list, try clearing the Drupal cache.
Orchestrator
  1. Update prompt: Find the section in the Orchestrator’s instructions labelled “## Available Tools” and add the details of the  new tool:
    • analyze_readability(prompt: str): Evaluates page content for reader engagement potential. Returns a score (1-5) and up to 5 improvement suggestions.
Orchestrator

Step 3: Testing the feature

Let’s see it in action:

  1. Create a new Canvas page.
  2. Add a news article using a heading component and several paragraph components.
  3. Open the Canvas AI chatbot and type: "Check the contents of the current page and give me a readability score."

The Orchestrator will recognise the intent, call the Analyse Readability tool, and present the feedback directly in the chat interface.

Drupal canvas

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."

Conclusion

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.

Inside Drupal Trivandrum’s 25th anniversary meetup
Category Items

Inside Drupal Trivandrum’s 25th anniversary meetup

A recap of Drupal Trivandrum’s 25th anniversary meetup celebrating Drupal and Wikipedia, community stories, student participation, and the future of open source.
5 min read

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!

25th anniversary of Drupal & Wikipedia

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.

Trivandrum Drupal meetup

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:

  1. Drupal in a day, announced by Anish A from the Drupal TVM group, focused on introducing Drupal to college students in a simple, hands-on, and approachable way.
  1. Wiki Loves Drupal, announced by Kala Jayan from the Drupal TVM group, focused on improving the quality, depth, and accuracy of Drupal-related content on Wikipedia.

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. 

Drupal Turns 25: Highlights from the January 2026 Pune Meetup
Category Items

Drupal Turns 25: Highlights from the January 2026 Pune Meetup

Celebrating 25 years of Drupal with the Pune community, sharing memories, milestones, and conversations about what’s next.
5 min read

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!

EventHorizon: the Drupal code intelligence app that changes how we analyse codebases
Category Items

EventHorizon: the Drupal code intelligence app that changes how we analyse codebases

Analyze Drupal codebases smarter with EventHorizon, a code intelligence app that delivers deep insights, faster audits, and better maintainability.
5 min read

Stop drowning in legacy code. Start understanding it

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.

EventHorizon.

The problem nobody talks about

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:

  1. Open a module file
  2. Grep for function names
  3. Open another file
  4. Lose track of where you started
  5. Draw something on a whiteboard
  6. Repeat for 3 days straight
  7. Still not confident you understand the whole picture

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.

What EventHorizon actually does

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:

  • Visualises your entire module architecture as an interactive, force-directed dependency graph
  • Automatically scans for performance anti-patterns and security vulnerabilities
  • Analyses Drupal-specific caching implementations with actionable recommendations
  • Validates your configuration structure and identifies orphaned entities, broken references, and circular dependencies
  • Provides AI-powered insights through a context-aware chatbot that actually understands your specific codebase
  • Generates exportable reports in CSV and Excel formats for stakeholder communication

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.

EventHorizon

Getting projects into EventHorizon

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 upload process

  1. On the homepage, click on the upload button
  2. In the pop-up that follows: 
    • Fill in the project name (whatever you want to call it), 
    • Enable/Disable the checkbox that asks if the project is AI-compliant. (Note: even if you choose to keep the AI features disabled, you would be able to do the complete static analysis of the project with all the available tools)
  3. Browse and select your ZIP file and click Upload
Uploading project

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.

What to include in your ZIP

Required:

  • The zip should include the following folder structure:
Project structure
  • Nothing else is required. 

The AI compliance checkbox (and why it matters)

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?"

 AI compliance checkbox

If you check this box, only then EventHorizon will:

  • Index your codebase for RAG (Retrieval Augmented Generation)
  • Enable the AI chatbot with context-aware responses about your specific code
  • Allow AI-powered best practices analysis

If you leave it unchecked, EventHorizon will:

  • Run all static analysis features (performance, security, caching, configuration)
  • Generate all visualisations and reports
  • Never send your code to any AI/LLM service

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.

The complete feature breakdown

Let me walk you through every tool EventHorizon provides. Each of these would typically require a separate tool or hours of manual work.

1. Project dashboard

1. Project dashboard

The dashboard is your command centre. At a glance, you see:

KPI cards:

  • Total Modules: Breakdown by custom, contrib
  • Performance Health Score: 0-100, calculated using a penalty-based system (High severity: 10 points, Medium: 3, Low: 1)
  • Vulnerability Health Score: Same calculation, focused on security issues
  • Complexity Score: Based on connections, services, functions, and hook diversity

Visual analytics:

  • Performance Health Treemap (issues visualised by module)
  • Vulnerability Posture Treemap
  • Module Distribution Chart

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.

2. Interactive dependency mindmap

Interactive dependency mindmap

This is the feature that makes architecture discussions actually productive.

The mindmap is a force-directed graph where:

  • Nodes represent modules (sized by complexity)
  • Edges represent dependencies (styled by connection type)
  • Colours indicate module type: Custom (green), Contrib (blue), Core (gray)

Three visualisation modes:

Module view: See how modules interconnect. Identify those highly-coupled modules that everyone's afraid to touch.

Interactive dependency mindmap

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:

  • Search for specific modules or functions
  • Zoom and pan
  • Drag nodes to reposition
  • Filter by module type
  • Click nodes for detailed metadata

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.

3. Circular dependency function mindmap

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:

Circular dependency function mindmap

Severity Levels:

  • Low: 2-3 functions in cycle (minor concern)
  • Medium: 4-6 functions (moderate technical debt)
  • High: 7+ functions (critical refactoring target)

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).

Circular dependency function mindmap

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

4. Dependency info page

Dependency info page

The Dependency Info page gives you hard numbers on module coupling:

Summary metrics:

  • Total circular dependencies
  • Severity breakdown
  • Function with most dependencies
  • Most coupled modules

Per-module metrics:

  • Outgoing function calls (cross-module)
  • Incoming function calls
  • Total dependencies
  • Coupling score (0-100)
  • Circular dependency count

Coupling score interpretation:

  • 0-20: Loosely coupled (excellent)
  • 21-50: Moderate coupling (good)
  • 51-80: Highly coupled (concerning)
  • 81-100: Extremely coupled (needs immediate attention)

When I'm planning a refactoring sprint, this page tells me exactly where to focus and gives me measurable targets.

5. Performance analysis

Performance analysis

EventHorizon scans your codebase for performance anti-patterns using pattern-based detection:

What it catches:

  • N+1 query patterns
  • Uncached database queries
  • Missing query tags
  • Inefficient entity loading
  • Debug code left in production
  • Heavy computation in hooks
  • Slow file operations

Report structure:

  • Issues grouped by severity (High/Medium/Low)
  • File paths with exact line numbers
  • Issue counts per pattern
  • Expandable details for each finding

You can export to CSV or Excel for sprint planning.

6. Vulnerability scan

Vulnerability scan

Security scanning that understands Drupal-specific patterns:

Detection categories:

  • Missing XSS protection
  • Unescaped Twig output
  • SQL injection risks
  • Insecure query construction
  • Missing permission checks
  • Debug mode in production
  • Exposed sensitive data

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.

7. Caching analysis

Caching analysis

Drupal's caching system is powerful but notoriously tricky to implement correctly. EventHorizon provides context-aware caching analysis:

What it detects:

  • Missing render cache metadata
  • Missing cache tags
  • Missing cache contexts
  • Absent max-age declarations
  • User-specific content without user context
  • Early rendering problems
  • BigPipe opportunities

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."

8. Configuration validation

Configuration validation

If your project includes a config sync directory, EventHorizon validates your Drupal configuration structure:

What it validates:

  • Broken references: Fields pointing to non-existent content types
  • Orphaned entities: Paragraphs defined but never used anywhere
  • Circular dependencies: Paragraph types referencing each other in loops
  • Consolidation opportunities: Duplicate structures that could be simplified

Severity levels:

  • Critical: Breaks functionality (paragraph references non-existent field)
  • Warning: Causes confusion/inefficiency (orphaned paragraph consuming resources)
  • Info: Optimisation opportunity (missing field descriptions)

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.

9. Best practices analysis

Best practices analysis

Evaluation of your codebase against Drupal coding standards:

5 Core categories:

  1. Code organisation & structure: Namespace usage, service container implementation, plugin architecture
  2. Security best practices: Input sanitisation, output escaping, and access control
  3. Performance optimisation: Render caching, query efficiency, static caching
  4. Code Quality & maintainability: Documentation, complexity, naming conventions
  5. Drupal API usage: Proper APIs, deprecated functions, and hook standards

Each category gets a 0-100 score with specific recommendations that include:

  • Exact file paths and line numbers
  • Code examples from your actual codebase (not generic advice)
  • Priority and effort estimation
Best practices analysis

10. AI Chat assistant (RAG-Powered)

AI Chat assistant (RAG-Powered)

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:

  1. Converts your question into a semantic embedding
  2. Searches the vector database for relevant code chunks
  3. Retrieves the most relevant functions, services, and configurations
  4. Generates an answer using that specific context

Example questions you can ask:

  • "What functions handle user authentication in this project?"
  • "How is field_user_profile used in custom code?"
  • "What are the high-severity performance issues?"
  • "Explain the dependencies for the checkout module"
  • "What hook implementations exist for form alterations?"
AI Chat assistant (RAG-Powered)

The responses include source attribution, so you can verify the information and click through to the actual code.

Multi-LLM support:

  • Google Gemini (fast, cost-effective)
  • OpenAI GPT-4 (high quality)
  • Anthropic Claude (excellent reasoning)
  • Ollama (free, local, no API required)

11. Settings & management

Settings & management

The settings page handles:

Project management:

  • Add/remove projects
  • Clear all data

AI model configuration:

  • Configure API keys for different providers
  • Select preferred models
  • Test different models for quality comparison

Usage logs:

  • Track which analysis pages are most used
  • View AI query history with response times
  • Export logs for analysis
  • Monitor team usage patterns

The RAG implementation: why semantic chunking matters

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.

The problem with naive chunking

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.

EventHorizon's Semantic entity-based chunking

Instead of arbitrary text splitting, EventHorizon chunks code by semantic entities:

Chunk Type Granularity What's Included
Function 1 function = 1 chunk Complete code, docblock, metadata, caller/callee relationships
Service 1 service = 1 chunk Class definition, dependencies, public methods
Module 1 module = 1 chunk Metadata, function count, service count, connections
Field 1 field = 1 chunk Configuration, usage locations, code snippets where it’s accessed
Content Type 1 content type = 1 chunk All fields, view modes, form displays
Paragraph 1 paragraph = 1 chunk Fields, usage locations
Finding Issue group = 1 chunk Performance and security findings with context

Code integrity preservation

Functions are extracted using a bracket-matching algorithm that ensures complete code extraction:

def extract_function_body(file_path, function_name, line_number):
    brace_count = 0
    for line in code_lines:
        for char in line:
            if char == '{':
                brace_count += 1
            elif char == '}':
                brace_count -= 1
        # Function complete when all braces closed
        if brace_count == 0:
            break
    return complete_code

No broken functions. No orphaned closing braces. No split conditionals.

Why this approach?

  1. Semantic Coherence: Each chunk is a complete, meaningful unit
  2. No Partial Code: Functions and services are never split mid-implementation
  3. Contextual Richness: Includes metadata, relationships, and actual code
  4. Query Precision: When you ask about a function, you get the whole function
  5. Drupal-Specific: Aligns with Drupal's architecture (hooks, services, config entities)

The embedding model (all-MiniLM-L6-v2) is lightweight and fast, indexing 1000+ functions in seconds. ChromaDB provides persistent storage with hybrid search capabilities.

Who benefits from EventHorizon?

For developers

  • Faster onboarding: Understand a new codebase in hours, not weeks
  • Confidence in changes: See exactly what depends on what before you refactor
  • Pattern discovery: Learn how existing code handles similar problems
  • AI assistance: Ask questions about the code and get project-specific answers

For tech leads & architects

  • Objective metrics: Health scores and coupling metrics replace gut feelings
  • Visual communication: Show architecture to stakeholders without whiteboard gymnastics
  • Technical debt quantification: "We have 12 high-severity circular dependencies affecting 3 custom modules"
  • Sprint planning: Prioritise issues based on severity and module criticality

For presales & business teams

  • Client presentations: Visual health scores and treemaps that non-technical people understand
  • Risk communication: "Current codebase has a security health score of 72. Here's what needs attention."
  • Budget justification: "Resolving these 15 security issues requires approximately X developer-days"
  • Progress tracking: Compare scores over time to demonstrate improvement

For QA teams

  • Test prioritisation: Focus on high-risk modules with the most issues
  • Coverage planning: Identify tightly coupled code requiring integration tests
  • Regression targets: Know which modules are most likely to break others

For DevOps

  • Performance insights: Identify bottlenecks before they hit production
  • Cache optimisation: Understand caching requirements for infrastructure planning
  • Resource planning: Complexity scores help estimate deployment requirements

The time savings are real

Let me put some rough numbers on this.

Traditional code analysis:

  • Manual dependency mapping: 8-16 hours
  • Performance audit: 4-8 hours
  • Security review: 8-16 hours
  • Configuration validation: 2-4 hours
  • Documentation: 4-8 hours
  • Total: 26-52 hours (and likely incomplete)

With EventHorizon:

  • Upload project: 30 seconds
  • Wait for analysis: 2-5 minutes (depends on project size)
  • Review dashboard and reports: 1-2 hours
  • Generate exports for stakeholders: 5 minutes
  • Total: ~2 hours (comprehensive, repeatable)

That's not an exaggeration. That's the difference between a week of work and a few hours in the morning.

The bigger picture

EventHorizon

I didn't build EventHorizon because I wanted another side project. I built it because I was tired of the friction.

Tired of spending days understanding code that should have been documented. Tired of missing vulnerabilities because manual review doesn't scale. Tired of explaining architecture with hand-waving and hoping people understood.

Every Drupal developer, architect, and project manager I've talked to has the same stories. The inherited project has no documentation. The security audit found issues in year-old code. The refactoring that broke everything because nobody realised how interconnected things were.

All of this friction comes from not seeing the full picture.

EventHorizon gives you that picture.

EventHorizon won't write your code for you. But it will help you understand the code you're working with. And that understanding is the foundation of every good decision you'll make as a developer.

Transform your Drupal codebase from complexity to clarity.

EventHorizon

Built with nearly 9 years of Drupal experience and countless hours of "I wish this tool existed."

Inside Drupal Canvas AI: Agents that build pages
Category Items

Inside Drupal Canvas AI: Agents that build pages

Explore how Drupal Canvas AI Agents transform simple prompts into fully functional web pages, enhancing automation, speed, and creative control.
5 min read

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.

Understanding AI agents

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."

AI agents

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."

LLM

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:

  •    They have a system prompt that guides their behaviour.
  •    They have access to specific tools they can use.
  •    They operate in a loop, meaning they can use tools multiple times.
  •    They keep going until the task is actually completed.

AI agents

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.

Installation and setup

AI features are integrated into their own module, canvas_ai, which comes as a sub-module of Canvas. To set it up:

  • Download and install the Drupal Canvas module
  • Install Canvas AI module
  • Additionally, set up an AI provider that supports tool calling. The complete list of Providers can be found here.

Once done, click on the AI panel icon to launch the chatbot.

Drupal Canvas module

AI agents in Canvas AI

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:

  • Component Generation Agent
  • Title Generation Agent
  • Metadata Generation Agent
  • Page Builder Agent
  • Template Generation Agent
AI agents in Canvas AI

Each of these agents has its own set of tools that let it do its job. Let's look at what each one does.

Drupal Canvas component Agent

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.

 CTA component.

Watch this video to see a demo of the code component agent

Drupal Canvas title generation Agent & Drupal Canvas metadata generation 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:

Title Agent Metadata Agent
get_entity_information: Get the context around
the page being created,
such as its entity_type, ID and contents.
get_entity_information: Get the context around
the page being created
such as its entity_type, ID and contents.
edit_field_content: To edit the current title
• Arguments: field_name, value
add_metadata: Adds metadata to the page
• Arguments: value
create_field_content: To add value to the title field.
• Arguments: field_name, value

Here is a demo of title and metadata generation in action.

Drupal Canvas page builder Agent

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:

  1. Using the page builder tool, add a heading with the text 'Hello world' above and below this component. (The agent understands that 'this' refers to the clicked component).
  2. Using the page builder tool, add a heading with the text 'Hello world' to each slot of this component.

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:

  • get_current_layout: This tool returns the current structure of the page, including what components are placed where, so it knows what's already on the page.
  • get_component_context: The agent uses this tool to retrieve information about all the components available in your site, including SDCs, Code components, and Blocks. The agent uses this to decide which components best fit what you're asking for.
  • get_page_data: Used to get the current title and metadata of the page. If the title and metadata are empty when the Page Builder Agent is invoked, it will add an appropriate title and metadata.
  • canvas_metadata_generation_agent and canvas_title_generation_agent: If the Page Builder notices your page doesn't have a title or metadata, it can invoke these agents to add them while building the section.
  • set_component_structure: This is the tool that actually does the work. After the agent has figured out what components to use and how to arrange them, this tool places them on the page in the right positions with the correct configuration.

This is how the agent passes the component structure to the set_component_structure tool.

Drupal Canvas page builder Agent

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

Drupal Canvas template builder Agent

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.

Drupal Canvas template builder Agent

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.

Drupal Canvas for page templates

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.

Drupal Canvas for page templates

How Does the AI Know What Components to Use?

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:

  • How to use the component (Standalone or within the slot of another component)
  • When to use it
  • What components work well in its slots (can it contain buttons, cards, images?)
  • What the props do (How the component behaves for different prop combinations?)

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.

Drupal Canvas for page templates

Watch this video to see template generation in action with the Starshot demo design system theme.

Wrapping up

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.

Drupal Experience Builder: setup and key features
Category Items

Drupal Experience Builder: setup and key features

Get started with Drupal Experience Builder. Explore the setup process, key features, and AI tools that make building and customising websites faster and smarter.
5 min read

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

  •    Navigate to the Extend page in your Drupal admin UI (/admin/modules).
  •    In the filter box, search for ‘XB’.
  •    Check the box for Develop XB on top of the Standard install profile (xb_dev_standard) and click Install.

 Drupal admin UI

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]

Experience Builder

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

Experience Builder

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.

Getting to know the Experience Builder UI

Experience Builder UI

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.

Top bar

The top bar consists of the following elements.

Top bar

  1. Close Experience builder UI
  2. Undo/Redo changes
  3. View the page in different viewports
  4. Create/Edit pages: Note: When you use the Create New option in Experience Builder, it creates an ‘XB Page’ entity, not an Article node — even if Experience Builder is enabled for the Article content type.If you want to use Experience Builder with another Article page, you must manually create a new one by going to Content → Add content → Article. Then, open that article and click the Experience Builder – {article name} link in the toolbar to access it in Experience Builder.
  5. Scale to fit
  6. Change zoom level
  7. Preview the page
  8. Review and publish changes

Right side bar

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

Right side bar

Left side bar

This is a region that lists mainly two things

  • The component library, which can be opened by clicking the + button
  • Layers: Which shows an overview of components placed on the page
Left side bar

The component library

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

The component library contains the following sections

  • Add new: Allows you to create your own custom React components directly from the browser.
  • Patterns: Reusable layouts that can be created by combining one or more components into a single, cohesive unit.
  • Components: Contains all the available Single Directory Components (SDCs) defined in your themes and modules, as well as custom code components.
  • Code: Lists the React components you have created directly within the UI.
  • Dynamic components: Includes Blocks. Yes, Experience Builder supports native Drupal Blocks!

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.

Experience builder

Understanding components

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.

Experience builder component

Here, components are organised into two sections:

  • Enabled Components: These are the components that are compatible with Experience Builder and will appear in the component library.
  • Disabled Components: This section lists all components that Experience Builder has detected but determined to be incompatible. Crucially, the system logs the exact reason for the incompatibility next to each entry. If an SDC from your theme is not appearing in the UI, this is the first place you would have to check.

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.

Experience builder component

Adding components to the page

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.

 Highlighted content region

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

YAML file

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.

Experience Builder

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.

Experience Builder

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:

  1. Drag the Heading component you already created and drop it into the Column Two slot.
  2. Now, add a Drupalicon component from the library and place it inside the Column One slot.
Experience Builder

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.

Experience Builder

Editing placed components

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

Placed Components

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.

Creating patterns

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.

Drupalicon

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.

Experience builder

Preview and publish

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.

Experience builder

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.

Experience builder

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.

Setting the page as the homepage

Now that your page is published, you can designate it as your site's homepage directly from the Experience Builder interface.

  1. From the top bar, click the dropdown menu that contains the page name, and then click the ellipsis (...) icon next to the page title.
  2. A new menu will appear, providing several page-level options:
    • Duplicate the page along with its components
    • Set the page as the homepage
    • Delete the page
Experience Builder interface
  1. Click on ‘Set as homepage’.
  2. This action does not update the site's configuration immediately. Instead, the change is staged. This is a safety feature to prevent accidental modifications to your live site.
  3. To complete the process, you must navigate to the ‘Review’ section and explicitly publish this staged change. Once published, your page will officially become the new homepage.
Experience Builder interface

Enabling global regions

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:

  1. Navigate to your theme's administration page at Appearance > [Your Theme Name] > Settings.
  2. Locate and check the option: ‘Use Experience Builder for page templates in this theme.’
  3. Once checked, a list of your theme's available regions will appear. Select all the regions you wish to manage.
  4. Click Save configuration.
Enabling Global Regions

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.

Enabling Global Regions

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.

Enabling Global Regions

Experience Builder permissions

Currently, Experience Builder supports the following permissions:

  • Publish Experience Builder content: Allows users to publish changes made using Experience Builder.
  • Administer patterns: Grants permission to create and edit patterns.
  • Administer page templates: Grants permission to update global regions when enabled.
  • Administer content templates: Grants permission to create and update content templates, which allow Site Builders to define pre-structured layouts for specific types of content. This feature is still in development.
  • Administer components: Grants permission to manage all component entities.
  • Administer code components: Grants permission to create and edit code components.
  • Create/Edit/Delete permission for XB page entities.

Code components

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. 

Creating a code component

Let's create a small Button component to see how it works. To do this, click ‘Add new’ from the Component Library.

Code components

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

Code components

The code editor consists of 4 main sections

  1. A CodeMirror editor for writing the code.
  2. Options for importing and using other created code components.
  3. A preview section that renders a live preview of the component.
  4. A section to add props and slots for the component.

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;

Adding props to code components

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.

  1. Click ‘Add’ in the Component Data section.
  2. Use the same prop names as defined in the component code: text and url.
  3. For the text prop, select ‘Text’ as the type and add a default value.
  4. For the URL prop, select ‘Link’ as the type.

Adding props to code components

Promoting our component to the component library

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.

Adding props to code components

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.

Adding props to code components

Publishing the assets

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."

Adding props to code components

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.

AI features in Experience Builder

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.

AI features in Experience Builder

Creating code components using AI

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.”

AI features in Experience Builder

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..

Page building with Experience Builder using AI

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:

  1. Go to Configuration >> AI >> Xb AI Component Description Settings.
  2. By default, the AI agent will use all the available components (Blocks, SDCs, Code components). You can restrict this by enabling components from a specific source.
  3. Expand each component and provide proper descriptions for the component, its props, and its slots (e.g., when to use it, whether it's a standalone component or must be used in the slot of another component, best prop combinations, ideal components to place in slots, etc.).

Page Building with Experience Builder Using AI

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.

Page Building with Experience Builder Using AI

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.

Adding page title and description using AI

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.”

AI features in Experience Builder

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.

Conclusion

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.

FAQs

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.


Drupal AI translation modules: a smarter way to translate content
Category Items

Drupal AI translation modules: a smarter way to translate content

Make translating your Drupal content easier and smarter with AI-powered modules. Reach global audiences faster with accurate, automated translations.
5 min read

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:

  • AI Translate – Ideal for quick, inline, single-node translations using AI.
  • AI TMGMT – Suited for bulk, workflow-based translation jobs with AI integration.

Let’s explore both:

AI translate module

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:

  • One-click AI translation from the node “Translate” tab.
  • Language-specific prompt configuration for better quality output.
  • Automatically generates and saves translated content.
  • Requires AI Core + AI provider (e.g., OpenAI).
  • Uses Drupal’s core Content Translation module.

Configuration

Prerequisites:

  • Configure Drupal content translation modules.
  • Enable and set up api key for any AI provider

Enable modules: 

  • AI Core
  • AI Translate
  • Any AI providers(eg., OpenAI)

Steps:

  • Navigate to admin/config/ai/settings
  • Under Translate Text, choose the Default Provider and Default Model
Configuration
admin/config/ai/settings
  • Navigate to admin/config/ai/ai-translate
  • Enable Use AI Translate as the default to translate content
  • In Translate to {{language}} choose a provider model(provider_model) for AI model used for translating to {{language}} 
  • Edit the Translation prompt for translating to {{language}} if required, or use the default prompt. You can refer to the Prompt suggested by the module maintainers for customising the prompts.
  • Do the same for all the languages that require AI translation.
  • Under Entity reference translation, choose the entity for translation(eg., Taxonomy term, Paragraph)
  • Save configurations.
Configuration
admin/config/ai/ai-translate

  • Edit any of your content and go to the Translate tab to find a new column, AI Translations. Here you can find Translate using {{provider_model}} against each language that does not have a translation for that content.
  • Click on Translate using {{provider_model}} and a batch process will run to translate the content. 
Drupal AI
node/{{id}}/translations
  • Once done, you will get the translated content.
Drupal AI
Content post AI translation


AI TMGMT Module

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:

  • Quickly translate content using AI, with the flexibility to customize translation style.
  • Seamlessly integrates with the AI Translate sub-module, enabling language-specific model selection and prompt customisation.
  • Translate one or multiple content items effortlessly with just a few clicks.
  • Leverage a powerful translation job management interface to submit, track, and review AI-generated translations.
  • Fully supports all the robust features offered by the TMGMT module,such as a detailed review workflow, support for various content sources, and more.

Configuration

Enable Modules: 

  • Translation Management Core
  • AI Translator
  • Content Entity Source

Steps: 

Once enabled, the module provides the Translation menu item in the navigation.

Configuration
admin/tmgmt
  • Navigate to admin/tmgmt/translators - Providers
  • Here you can see the Drupal AI provider. Click on Edit to connect the AI provider.
  • Give a proper label and description for the provider. (available by default)
  • Enable Auto accept finished translations if you want to skip the reviewing process and automatically accept all translations as soon as they are returned by the translation provider.
  • Choose the Provider plugin as AI
  • In AI plugin settings under Translation configuration, choose Use the configuration from the "AI Translate" module to use the configuration from the AI Translate module. 
  • Choose Use the configuration from this module in case you want to use the configuration from the module.
  • Select the Tokeniser counting model and Chat translator model
  • Click on Connect.
  • If you get successfully connected! message: The AI provider is connected properly. Otherwise, check if your AI API key is valid and try again.
  • Check if the Remote language mappings are proper and save the form.
  • Once this is done, you can use the tmgmt module as it is, and the translation will work using the AI provider.
Drupal AI
Edit Drupal AI provider
  • Now navigate to the admin/tmgmt/sources to view the content overview 
  • Here you can choose the content source as content to view all the content available in the website. Same in case of other content entities.
Edit Drupal AI provider
admin/tmgmt/sources

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. 

  • So now you can select multiple contents to be translated
  • Choose the source language and Target language to translate
  • Click on Request translation
Drupal AI
admin/tmgmt/sources after before request translation
  • Once done, you land on the source page with yellow triangle icons against content you tried to translate. This indicates you need to review the translations and save them.
Drupal AI
admin/tmgmt/sources after request translation
  • Click on the yellow triangle to navigate to the review page.
  • Review each translated field content and approve it by clicking the check buttons.
admin/tmgmt/items/1 while review
  • Once done, click on Save as completed.
  • Once saved, you land again on the source page and find that the yellow triangle against the content has changed to a green tick, indicating the translation is saved and available. 
  • Do the same for other content as well. 
admin/tmgmt/sources after save as completed

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.

at admin/tmgmt/job_items
Drupal AI
at admin/tmgmt/jobs

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

Conclusion

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.

  • Use AI Translate when you need quick, inline translations directly from the content interface.
  • Use AI TMGMT when your workflow requires batch translation, review processes, and detailed management of translation jobs.

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.

Reference

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/ 

Automating workflows in Drupal with ECA (Event-Condition-Action)
Category Items

Automating workflows in Drupal with ECA (Event-Condition-Action)

This blog covers how Drupal’s ECA module enables no-code automation using events, conditions, and actions. Includes step-by-step setup with BPMN.io and examples of real-world use across content and user workflows.
5 min read

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.

What is ECA?

ECA stands for Events - Conditions - Actions, and it follows a simple paradigm:

  • Event → A trigger, such as a user logging in, submitting a form, or creating new content.
  • Condition → A check that determines whether an action should be executed (e.g., verifying user roles or content types).
  • Action → The task to be performed, such as sending an email, redirecting a user, or modifying content.

ECA allows site builders to configure complex workflows without writing a single line of code, making it a game-changer for automation in Drupal.

History of ECA

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 modellers

ECA provides multiple workflow modellers, allowing users to design automation visually. The available modellers include:

1. BPMN.iO (recommended modeller)

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.

2. Camunda modeller

A desktop-based modeller that allows users to create BPMN workflows externally and import them into Drupal. Useful for complex workflows requiring offline editing.

3. ECA classic modeller

A form-based workflow modeller that uses Drupal Core’s Form API. Best suited for developers who prefer configuration-driven workflow automation.

Simple ECA model in Drupal

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.

Step 1: Access the ECA module

  1. Navigate to Configuration > Workflows > ECA in your Drupal admin dashboard.
  2. You will see an overview of all existing ECA models.
  3. Click the "Add new model" button to create a new model.
Configure ECA

Step 2: Understanding the ECA interface

The main ECA interface consists of:

  • A graphical modeller powered by BPMN.iO.
  • Events, conditions, and actions represented by different shapes:
    • Event (StartEvent) – Circle
    • Condition (Gateway) – Diamond
    • Action (Task) – Rounded rectangle
    • Sequence Flow – Arrows connecting events to actions
  • Note: Sequence flows can be used with conditions or without conditions
  • A property panel on the right-hand side to configure settings
ECA interface

Step 3: Naming your model

  1. In the property panel, enter a name for the model, such as "Display a message to user editors when a new article is created.".
ECA interface

Step 4: Creating an event

  1. Drag a circle (StartEvent) onto the canvas.
ECA interface
  1. Name the event "Article has been created" in the property panel.
  2. Click "+Select" next to "Template."
ECA interface
  1. Choose "Insert content entity (After a new entity has been saved)" from the dropdown.
ECA interface
  1. In the property panel, limit the content entity type to "Article".

Step 5: Creating an action

  1. Click the small rectangle connected to the event.
ECA interface
  1. Name the action "Display a message" in the property panel.
  2. Click "+Select" next to "Template" and choose "Display a message to the user".
ECA interface
  1. In the Custom properties section, enter the message text: "Thank you for  [node: title]".
  2. Since [node: title] is a token, select "Yes" for Replace tokens.

Step 6: Creating condition

ECA interface
  1. Click on the sequence flow (arrow connecting the event and action).
  2. Name the condition "Show a message only to users with the editor role" in the property panel.
ECA interface
  1. Click "+Select" next to "Template" and choose "Role of the current user"

ECA interface
  1. In the property panel, select the user role as "Content Editor". This ensures only users with this role see the thank-you message.

Step 7: Saving and testing

  1. Click "Save" to store your model.
  2. Create a new article in Drupal.
Saving and testing ECA
  1. After saving, a message "Thank you for [node: title]" should appear on the website.

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.

Conclusion

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:

Build smarter sites with Drupal’s AI Agents
Category Items

Build smarter sites with Drupal’s AI Agents

Discover how Drupal’s AI Agents can streamline site building. A practical guide for site builders to enhance workflows with intelligent automation.
5 min read

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.

Install modules and configure your AI provider

First, you'll need to install and enable the required modules, which are

  • AI Agents
  • AI Agents Explorer
  • AI API Explorer
  • AI Provider OpenAI (Or any other provider that supports Tool calling)

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.

AI Default Settings

Creating our first AI Agent

  • Go to Configuration -> AI -> AI Agents Settings
  • Click on ‘Add AI Agent’
AI agents settings

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:

  • Label: Taxonomy term generator
  • Description: This agent suggests 5 taxonomy terms for a given topic.
  • Swarm orchestration agent / Project manager agent: Leave both of these options unchecked for now.
  • Max loops: Change this to 1.

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).

AI Agents Explorer

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.

AI Agents Explorer

Congratulations! You've just built your first AI Agent!

Tools: the infinity stones of Agents

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:

  • Another AI agent (known as a sub-agent)
  • A Drupal Core Action
  • An AIFunctionCall Plugin (allowing you to write custom tools with code)

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.

Modify taxonomy term

Modify taxonomy term

The tool requires several arguments, like vid, tid, and name. Let's give it a try:

  • For vid, enter tags.
  • For name, enter Earth.
  • Click Run Function.

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

Adding the tool to our Agent

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.

Detailed tool usage

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.

Detailed tool usage

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

Detailed tool usage

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.

AI agent explorer

Adding multiple tools

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:

  • List bundles: To check the currently available vocabulary names.
  • List taxonomy term: To get the terms that already exist in a vocabulary (useful for preventing duplicates).
  • Modify vocabularies: To create new vocabularies if they don't exist.
  • Modify taxonomy term: The tool we used before to create or edit terms.

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.

  1. In the Tools section, select all four of the tools listed above.
  2. Remove the hardcoded tag value from the ‘Detailed tool usage’ section that we set up earlier.
  3. For the ‘List bundles’ tool, find the ‘Restrictions for property entity_type’ field and set taxonomy_term as the forced value. 
  4. Finally, before saving, change the ‘Max loops’ value to 10. This gives the agent enough attempts to check for a vocabulary, create it if needed, and then add the terms.

Once you've saved the agent, test it again with a prompt like: Create a fruits vocabulary and add 4 terms.’

Multiple tools

Our agent is now smart enough to use its full suite of tools to handle the entire request.

Default information tools

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:

  • First, edit your agent and uncheck the List bundles tool from the main Tools section. We no longer need the agent to decide to call it on its own.
  • Next, scroll down to the Default Information Tools section and add the following YAML configuration:
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.

Practical guide

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.

Create a chatbot for our Agent

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.

Step 1: Create the AI Assistant

  1. Navigate to Configuration > AI > AI Assistants and click Add AI Assistant.
  2. Give it the name: Taxonomy assistant.
  3. For the Instructions, enter the following. This tells the assistant to simply pass the user's request directly to our agent.


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.

  1. Under the Agents enabled section, select our Taxonomy term generator agent.
  2. Click Save.

Step 2: Place the Chatbot Block

With our assistant ready, the final step is to place the chatbot block on the site.

  1. Go to Structure > Block layout.
  2. Select the Content region of the Olivero theme and click Place block.
  3. Search for and place the AI DeepChat Chatbot block.
  4. In the block configuration form, select your newly created Taxonomy assistant from the ‘AI Assistant’ dropdown.
  5. Click the save block, and you're all set! You can now visit any page to interact with your agent.
Configure block
AI chatbot

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.

Wrapping Up

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.

Building custom AI CKEditor plugins for Drupal: a developer's guide
Category Items

Building custom AI CKEditor plugins for Drupal: a developer's guide

A practical guide for developers to build custom AI-powered CKEditor plugins in Drupal for smarter, efficient content editing.
5 min read

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.

Why create custom AI CKEditor plugins?

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:

  • Business-specific use cases: You may want to generate product descriptions in a specific format, suggest metadata, or summarise legal content with a custom tone, needs that generic tools don't fully support. Brands may need custom plugins that align with brand values and styles.
  • Workflow automation: Automate repetitive editorial tasks like cleaning up input from clients, converting text to a brand-specific tone, or inserting dynamic content placeholders.
  • Dynamic features: Some plugins can dynamically adjust based on user roles, entity types, or content fields, allowing a smarter integration between CKEditor and your Drupal backend.

Understanding the architecture

Custom AI CKEditor plugins work by:

  1. Taking input (selected text, form fields, or nothing)
  2. Processing that input through an AI model
  3. Returning formatted HTML output
  4. Allowing users to edit the result before inserting it into the editor

Setting up Your development environment

Create a custom module or use an existing one. Your plugin file should be placed in:

src/Plugin/AiCKEditor/{YourPluginName}.php

Module structure

/custom_module/ 
├── custom_module.info.yml
└── src/ 
└── Plugin/ 
└── AiCKEditor/
 └── ImproveClarity.php

Basic plugin structure

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 {


}

Key methods to implement

Configuration methods

  1. buildConfigurationForm(): This method is responsible for rendering the configuration form users see when setting up the plugin.

    If your plugin requires no custom settings, and you’ve extended the base plugin class, you can safely skip this method. However, if your plugin needs to allow users to choose an AI provider or model, this is where you'll implement that logic.

    For example, let’s say your plugin uses the AIRequestCommand and you want to give users the ability to choose from available providers. Here's how you might set up a provider selection dropdown in the form:
/**
  * {@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;
 }

  1. submitConfigurationForm(): Handles saving configuration data.
  2. defaultConfiguration(): Set up the default configuration before the initial setup is done.

User Interface Methods

  1. buildCkEditorModalForm(): This method defines the form that end users interact with inside the CKEditor AI modal when they use the plugin.
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;
}

Processing methods

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.";
  }
}

Real-world example

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.";
   }
 }
}

See your plugin in action

Once you've created your custom AI CKEditor plugin, enabling it follows the same process as the built-in plugins:

  • Clear cache to ensure Drupal discovers your new plugin
  • Navigate to Administration Configuration Content authoring Text formats and editors
  • Select and configure your text format (e.g., Full HTML → Configure)
  • Find your custom plugin in the "AI tools" section under "CKEditor 5 plugin settings"
Plugin in action
  • Enable and configure your plugin as needed
Plugin in action

  • Your custom plugin will now appear in the AI Tools dropdown when users click the ✨ button in CKEditor, ready to enhance content with your specialized AI functionality.

Plugin in action

Plugin in action

Conclusion

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.

Smarter content editing in Drupal: exploring the AI CKEditor module
Category Items

Smarter content editing in Drupal: exploring the AI CKEditor module

Explore how the AI CKEditor module enhances content editing in Drupal with intelligent suggestions, automation, and improved editorial efficiency.
5 min read

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.

AI CKEditor integration module

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.

Prerequisites and dependencies

Before diving into the setup, ensure you have the following modules installed and configured:

  1. AI Core Module: The foundation that handles AI interactions
  2. AI Provider Module: Such as the OpenAI Provider, Ollama ,etc, which connects to your chosen AI service
  3. CKEditor 5: Drupal's default rich text editor (included in Drupal core)

Installation and configuration

Step 1: Enable the Module

First, enable the AI CKEditor Integration module through Drupal's admin interface or using Drush:

drush en ai_ckeditor

Step 2: Configure text formats

  1. Navigate to Administration → Configuration → Content authoring → Text formats and editors (/admin/config/content/formats)
  2. Select the text format you want to enhance (e.g., "Basic HTML")
  3. Click Configure next to your chosen format
Configuration text formats

Step 3: Add the AI tools button

  1. In the CKEditor toolbar configuration, locate the AI Stars ✨ widget
  2. Drag it from the "Available buttons" section to your "Active toolbar"
  3. Position it where you want it to appear in the editor toolbar
AI tools button

Step 4: Configure AI tools

  1. Scroll down to CKEditor 5 plugin settings
  2. Find the AI tools section
  3. Configure each available tool according to your needs:
    1. Enable or disable individual tools
    2. Select the appropriate AI model for each tool
    3. Set specific parameters for each feature
Configuration AI tools

Special plugin configurations

Setting up the tone plugin

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

Step 1: Create a taxonomy vocabulary

  • Go to Structure → Taxonomy (/admin/structure/taxonomy)
  • Add a new vocabulary (For example, name it  "Tone of voice")

Step 2: Add tone terms

  • Create terms for different tones: "Friendly", "Professional", "Casual", "ELI5 (Explain Like I'm 5)", "Academic", etc.
  • Optionally, add detailed descriptions for each tone in the term's description field

Step 3: Configure the plugin

  • In the CKEditor AI tools configuration, select the vocabulary created in step 1.
  • Enable "Use term description for tone description" if you want to use the detailed descriptions
CKEditor AI tools configuration

Setting Up the Translation Plugin

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

  1. Create a taxonomy vocabulary. For example, name it “Languages”
  2. Add language terms: "Spanish", "French", "German", "Japanese", etc.
  3. Configure the plugin to use your Languages vocabulary
Setting Up the Translation Plugin

Let us see our AI-powered CKeditor in action

Once configured, using AI tools is straightforward:

  1. Open your content editor (node add/edit form with CKEditor)
  2. Select a field that uses CKEditor
AI-powered CKeditor
  1. Click the AI Assistant button (✨) in the toolbar
  2. Choose your desired AI feature from the dropdown menu
AI-powered CKeditor
  1. Provide any prompt needed in the modal that appears
AI-powered CKeditor
  1. Click "Generate" to process your request
AI-powered CKeditor
  1. Review and edit the AI-generated content
AI-powered CKeditor
  1. Click "Save changes to editor" to insert the content into your document

Conclusion

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.

Using AI to automate SEO in Drupal
Category Items

Using AI to automate SEO in Drupal

Discover how to use AI to automate SEO in Drupal, streamline content optimization, and boost search rankings with minimal manual effort.
5 min read

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.

Why automate SEO?

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:

  1. Efficiency: SEO requires consistent effort. Automation saves time and ensures tasks are done correctly and on time.
  2. Data-driven insights: AI can process vast amounts of data and deliver actionable insights that can inform your SEO strategy.
  3. Consistency: AI tools provide consistency across your entire website. Once set up, they ensure that your content and technical SEO elements are always optimized without needing constant adjustments.
  4. Stay competitive: Search engine algorithms are constantly evolving. AI can help keep you ahead of these changes by adapting your SEO strategy based on up-to-date trends.

Introducing the AI SEO Drupal module

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:

  • Meta titles and descriptions
  • Alt text for images
  • Keyword suggestions
  • Semantic improvements

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.

Key features of the AI SEO module

1. Content analysis & suggestions

When you edit content, AI SEO analyzes your text and suggests improvements like better keyword use, clearer headlines, or restructuring paragraphs for SEO effectiveness.

2. Meta tag generation

The module generates contextually relevant:

  • Meta titles (to improve CTR on search engines)
  • Meta descriptions (to summarise page content)

This helps editors focus on writing content while AI handles the technical SEO layers.

3. Image Alt text generation

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.

4. Keyword suggestions

Using Natural Language Processing (NLP), AI SEO identifies important keywords from the content and recommends additional terms that could boost search relevance.

5. Bulk optimization via Drush

AI SEO provides a Drush command for optimizing multiple nodes at once, making it perfect for retrofitting existing content.

How to use the AI SEO module in Drupal

1. Install required modules

You'll need:

  • AI Core
  • AI SEO
  • AI Provider (e.g., OpenAI)

2. Configure API access

  • Go to: /admin/config/system/keys
  • Paste your OpenAI API key (or other supported providers)
Configure API access
  • "Select the OpenAI key from the AI Providers dropdown at /admin/config/ai/providers/openai."
Setup AI authentication
  • Save the OpenAI key
  • Go to: ‘/admin/config/ai/seo’
  • Choose the Provider and Model used for SEO analysis.
  • Configure the SEO prompt
AI SEO analyzer

3. How the AI SEO module works

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.

4. How to generate an 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:

  1. Sends the content data (title, summary, body) to your AI provider
  2. Analyses factors like:
    1. Keyword presence
    2. Meta description quality
    3. Heading structure
    4. Readability score
    5. Keyword density
  3. Returns a report with scores and suggestions

This report includes:

  • Good Practices: Lists what's working well
  • Suggestions: What can be improved (e.g., "Consider using the keyword in your H1 heading")
  •  AI Suggestions: AI-generated content rewrites or meta tags

Extra features

  • Multilingual support: The report adapts to the content language
  • Field mapping: You can configure which fields are analysed
  • AI Generation Mode: The module can also auto-generate meta tags and summaries using AI, based on your content
  • Below is an example of the SEO report generated by the module.
SEO Analyzer

Why use AI SEO?

  • Save Time: No more jumping to external tools like Yoast or SEMrush
  • Consistency: Enforce uniform content quality across editors
  • Smart Enhancements: AI suggestions help even non-SEO experts write better content

Conclusion

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.

Higher-Ed
Healthcare
Non-Profits
DXP
Podcast
BizTech
Open Source
Events
Quality Engineering
Design Process
JavaScript
AI
Drupal
Culture