Drupal Planet
Drupal blog: Drupal 11.3.0 is now available
The third feature release of Drupal 11 is here with the biggest performance boost in a decade. Serve 26-33% more requests with the same database load. New native HTMX support enables rich UX with up to 71% less JavaScript. Plus, enjoy the new stable Navigation module, improved CKEditor content editing, native content export, and cleaner OOP hooks for themes.
New in Drupal 11.3 Biggest performance boost in a decadeDatabase query and cache operations on both cold and warm caches have been significantly reduced. Our automated tests show that the new optimization for cold caches is about one third and on partially-warm cache requests by up to one fourth. Independent testing shows even bigger improvements on complex sites.
The render and caching layers now combine database and cache operations, notably in path alias and entity loading. BigPipe also now uses HTMX on the frontend, leading to a significant reduction in JavaScript weight.
Read more about performance improvements in Drupal 11.3.0.
Native HTMX: Rich UX with up to 71% less JavaScriptDrupal 11.3.0 now natively integrates HTMX, a powerful, dependency-free JavaScript library. HTMX dramatically enhances how developers build fast, interactive user interfaces. It enables modern browser features directly in HTML attributes, significantly reducing the need for extensive custom JavaScript.
Read more about HTMX support in Drupal 11.3.0.
Navigation module is now stableThe Navigation module is now stable, offering a superior and more modern experience than the old Toolbar. While it is an experience worth installing on all sites, it is most useful for sites with complex administration structures. While not yet the default, we strongly encourage users to switch and benefit from its improvements.
Improved content editingCKEditor now natively supports linking content on the site by selecting it from an autocomplete or dropdown (using entity references).. CKEditor also has new, user-friendly options for formatting list bullets and numbering.. Finally, a dedicated Administer node published status permission is introduced to manage publication status of content (which does not require Administer nodes anymore).
Object-oriented hooks in themesThemes can now use the same #[Hook()] attribute system as modules, with theme namespaces registered in the container for easier integration. This change allows themers to write cleaner, more structured code. Themes' OOP hook implementations are placed in the src/Hook/ directory, similarly to modules'. Themes support a defined subset of both normal and alter hooks.
Native support for content exportDrupal core now includes a command-line tool to export content in the format previously introduced by the contributed Default Content module. Drupal can export a single entity at a time, but it is also possible to export the dependencies of the entity automatically (for example, images or taxonomy terms it references).To use the export tool, run the following from the Drupal site's root:
php core/scripts/drupal content:export ENTITY_TYPE_ID ENTITY_ID
New experimental database driver for MySQL/MariaDB for parallel queriesA new, experimental MySQLi database driver has been added for MySQL and MariaDB. It is not yet fully supported and is hidden from the user interface.
While the current default drivers use PDO to connect to MySQL or MariaDB, this new database driver instead uses the mysqli PHP extension. MySQLi is more modern and allows database queries to be run in parallel instead of sequentially as with PDO. We plan to add asynchronous database query support in a future Drupal release.
Core maintainer team updatesSince Drupal 11.2, we reached out to all subsystem and topic maintainers to confirm whether they wished to continue in their roles. Several long-term contributors stepped back and opened up roles for new contributors. We would like to thank them for their contributions.
Additionally, Roy Scholten stepped back from his Usability maintainership and Drupal core product manager role. He has been inactive for a while, but his impact on Drupal since 2007 has been profound. We thank him for his involvement!
Mohit Aghera joined as a maintainer for the File subsystem. Shawn Duncan is a new maintainer for the Ajax subsystem. David Cameron was added as a maintainer of the Link Field module. Pierre Dureau and Florent Torregrosa are now the maintainers for the Asset Library API. Finally, codebymikey is the new maintainer for Basic Auth.
Going forward, we plan to review core maintainer appointments annually. We hope this will reduce the burden on maintainers when transitioning between roles or stepping down, and also provide more opportunities for new contributors.
Want to get involved?If you are looking to make the leap from Drupal user to Drupal contributor, or you want to share resources with your team as part of their professional development, there are many opportunities to deepen your Drupal skill set and give back to the community. Check out the Drupal contributor guide.
You would be more than welcome to join us at DrupalCon Chicago in March 2026 to attend sessions, network, and enjoy mentorship for your first contributions.
The Core Leadership Team is always looking for new contributors to help steward the project. As recently various new opportunities have opened up. If you are looking to deepen your Drupal skill set, we encourage you to read more about the open subsystem and topic maintainer roles and consider stepping up to contribute your expertise.
Drupal 10.6 is also availableThe next maintenance minor release of Drupal 10 has also been released, and will be supported until December 9, 2026, after the release of Drupal 12. Long-term support for Drupal 10 gives more flexibility for sites to move to Drupal 11 when they are ready while staying up-to-date with Drupal's dependencies.
This release schedule also allows sites to move from one long-term support version to the next if that is the best strategy for their needs. For more information on maintenance minors, read the previous post on the new major release schedule.
Drupal Core News: Drupal 11.3.0: Biggest performance boost in a decade
Drupal 11.3 includes a number of significant performance improvements, altogether making it the most significant step forward for Drupal performance in the last 10 years (since the Drupal 8.0.0 release).
These improvements have been driven by enhancements to Drupal's render and caching layers in 11.2.x, notably taking advantage of Fibers, a new PHP feature added in PHP 8.1. By rendering more parts of the page in placeholders, we have enabled similar database and cache operations that used to occur individually to be combined, with particular improvements in path alias and entity loading. We have also learned from Drupal's automated performance testing framework, allowing us to identify and execute several optimizations during Drupal's hook and field discovery processes, to significantly reduce database and cache i/o, and memory usage on cold caches.
On the front end we have converted Drupal's BigPipe implementation to use HTMX, reducing JavaScript weight significantly. We also intercept placeholders with warm render caches prior to BigPipe replacement, so that BigPipe's JavaScript is not loaded at all on requests that will be served quickly without it, allowing BigPipe to be used more widely for the requests that do need it. These changes may also allow us to enable BigPipe for anonymous site visitors in a future release.
Combined, these changes reduce database query and cache operations on cold cache requests by around one third, with smaller but still significant improvements when caches become warmer, up to and including dynamic and internal page cache hits.
Drupal's automated performance tests show many of these improvements, and will ensure that we continue to build and maintain on these gains over time.
Drupal Umami demo’s anonymous cold cache front page requestLet's look at an example. These are the changes in Drupal core's included Umami demo's anonymous cold cache front page request performance test between 11.2.x and 11.3.x.
11.2.0 11.3.0 Reduction SQL Query Count 381 263 31% Cache Get Count 471 316 33% Cache Set Count 467 315 33% CacheTag Lookup Query Count 49 27 45% Estimated ms (assuming 1ms per operation) 1368 921 33%Particularly notable is the benefit for requests to pages with partially warmed caches, where site-wide caches are full, but page-specific caches are invalid or empty. In core's performance test for this scenario, we saw an almost 50% reduction in database queries. Requests like this make up a large percentage of the slowest responses from real Drupal sites, and core now provides a much lower baseline to work against. Medium to large sites often hit constraints with the database first, because it is harder to scale than simply adding webservers, and these improvements reduce load when it is at its most constrained.
Drupal Umami demo’s anonymous node page with partially-warmed cache 11.2.0 11.3.0 Reduction SQL Query Count 171 91 47% Cache Get Count 202 168 17% Cache Set Count 41 42 -2% CacheTag Lookup Query Count 22 22 0% Estimated ms (assuming 1ms per operation) 436 323 26%While different sites, and even different pages on the same site, will show different results, we would expect all Drupal sites to see a significant reduction in database and cache i/o per request once they've updated to Drupal 11.3.
Independent testing and further improvements with ParagraphsIndependent testing by MD Systems on their internal Primer Drupal distribution shows even better improvements with Drupal 11.3, especially for complex pages. This is also thanks to further improvements enabled and inspired by Drupal 11.3 in the Entity Reference Revisions module which resulted in considerable performance improvements for Paragraphs. Their results show a dramatic reduction in database and cache operations across different cache states. Their cold cache total query count dropped by 62% (from 1097 to 420), and total cache lookups decreased by 47% (from 991 to 522) compared to Drupal 11.2. At the same time their partially-warm cache total query count dropped by 61% (from 696 to 274) and total cache lookups decreased by 34% (from 562 to 373).
Even more technical detailsFor further details on how these improvements happened, check out some of the core issues that introduced them, or watch Nathaniel Catchpole's DrupalCon Vienna presentation.
#1237636: Lazy load multiple entities at a time using fibers
#2620980: Add static and persistent caching to ContentEntityStorageBase::loadRevision()
#3496369: Multiple load path aliases without the preload cache
#3537863: Optimize field module's hook_entity_bundle_info() implementation
#3538006: Optimize EntityFieldManager::buildBundleFieldDefinitions()
#3526080: Reduce write contention to the fast and consistent backend in ChainedFastBackend
#3493911: Add a CachedPlaceholderStrategy to optimize render cache hits and reduce layout shift from big pipe
#3526267: Remove core/drupal.ajax dependency from big_pipe/big_pipe
#3506930: Separate hooks from events
#3505248: Ability to preload frequently used cache tags (11.2.x)
If you'd like to help 11.4 become even faster yet, check out core issues tagged with 'performance' and try to help us get them done. We have multiple issues in progress that didn't quite make it into 11.3.0 but could form the basis of another significant set of improvements in 11.4.0.
Drupal Core News: Native HTMX in Drupal 11.3.0: Rich UX with up to 71% less JavaScript
Drupal developers always face the dilemma of building classic multi-page applications or headless solutions with a modern JavaScript stack. Especially when they need to build UIs that feel fast and are highly reactive. While there were some Drupal specific solutions for parts of this need (Form State API, AJAX API and BigPipe), these were dated, only solving very specific use cases and comparatively heavy in implementation.
HTMX is a tiny, dependency-free, and extensible JavaScript library that allows you to access modern browser features directly from HTML, rather than using extensive amounts of JavaScript. It essentially enables you to use HTML to make AJAX requests, CSS transitions, WebSockets, and Server-Sent Events (SSE) directly.
As a replacement for Drupal's mostly home grown solutions, this reduced the loaded JavaScript size by up to 71% for browser-server interactions, including HTML streaming with BigPipe. While enabling a whole set of new functionality at the same time!
HTMX was originally created by Carson Gross. The motivation was to provide a modern, yet simple, way to build dynamic user interfaces by leveraging the existing capabilities of HTML and the server-side architecture, effectively offering an alternative to the complexity of heavy, client-side JavaScript frameworks. By sending less data (HTML fragments instead of large JSON payloads and complex client-side rendering logic), HTMX often results in faster perceived performance and less bandwidth consumption. It is being adopted by developers across diverse ecosystems.
Principles of HTMXHTMX operates on a few core, simple principles, all expressed via HTML attributes. While pure HTMX does not require the data- prefix, Drupal uses it to achieve valid HTML. That is how you'll see it used in Drupal, so we'll use that notation in this post.
- Any Element Can Make a Request: Unlike standard HTML forms and anchors, HTMX allows any element (a <div>, a <span>, a <button>) to trigger an HTTP request. All five HTTP verbs are available.
- Attributes: data-hx-get, data-hx-post, data-hx-put, data-hx-delete, data-hx-patch.
- Any Event Can Trigger a Request: You are not limited to click (for anchors/buttons) or submit (for forms). Requests can be triggered by any JavaScript event, such as mouseover, keyup, or a custom event.
- Attribute: data-hx-trigger.
- Any Target Can Be Updated: By default, HTMX replaces the inner HTML of the element that triggered the request. However, you can use a CSS selector to specify any element on the page to be updated with the response HTML.
- Attribute: data-hx-target.
- Any Transition Can Be Used: HTMX allows you to define how the new content is swapped into the target element (e.g., replace, prepend, append, outerHTML) and works with the new View Transition API.
- Attribute: data-hx-swap.
This Drupal-independent example demonstrates how to fetch and swap new content into a div when a button is clicked, without writing any custom JavaScript.
<!-- The button that triggers the request --> <button data-hx-get="/clicked" data-hx-target="#content-area" data-hx-swap="outerHTML"> Load New Content </button> <!-- The area that will be updated --> <div id="content-area"> This content will be replaced. </div>In this code example, when the button is clicked:
- A GET request is made to the server at the URL: /clicked
- The server responds with a fragment of HTML (e.g., <div>New Content Loaded!</div>)
- The HTML content of the #content-area element is replaced (outerHTML) by the response.
HTMX was added as a dependency to Drupal core in 11.2, but is now fully featured in 11.3. A new factory class is provided for developers building or extending render arrays. The Htmx class provides methods that build every HTMX attribute or response header, therefore documenting and exposing the HTMX API to Drupal.
Drupal 11.3 also extends the FormBuilder class to support dynamic forms built with HTMX. When a form is rebuilt from an HTMX request, all the form values will be available to the form class for dynamically restructuring the form. Here’s an example of both features:
function buildForm(array $form, FormStateInterface $form_state) { $make = ['Audi', 'Toyota', 'BMW']; $models = [ ['A1', 'A4', 'A6'], ['Landcruiser', 'Tacoma', 'Yaris'], ['325i', '325ix', 'X5'], ]; $form['make'] = [ '#title' => 'Make', '#type' => 'select', '#options' => $make, ]; $form['model'] = [ '#title' => 'Models', '#type' => 'select', '#options' => $models[$form_state->getValue('make', 0)] ?? [], // We'll need that later. '#wrapper_attributes' => ['id' => 'models-wrapper'], ]; return $form; } (new Htmx()) // An empty method call uses the current URL. ->post() // We select the wrapper around the select. ->target('#models-wrapper') // And replace the whole wrapper // not simply updating the options in place, // so that any errors also display. ->select('#models-wrapper') // We replace the whole element for this form. ->swap('outerHTML') ->applyTo($form['make']);In this form, whenever the make selector is changed, the models selector will be updated.
Drupal 11.3 also adds a dedicated renderer and associated wrapper format that can be used to keep the response to an HTMX request as small as possible. This render only returns the main content and its CSS/Javascript assets. There are two ways to take advantage of this renderer.
One is to add an attribute to the HTMX enhanced element, which will cause the wrapper format to be used:
(new Htmx()) ->post() ->onlyMainContent() ->target('#models-wrapper') ->select('#models-wrapper') ->swap('outerHTML') ->applyTo($form['make']);There is also a new route option that can be used when creating a route specifically to service HTMX requests. This route option will also be useful with the dynamic routes in Views as we refactor to use HTMX.
demo.route_option: path: '/htmx-demo/route-option' defaults: _title: 'Using _htmx_route option' _controller: '\Drupal\module_name\Controller\DemoController::replace' requirements: _permission: 'access content' options: _htmx_route: TRUE Drupal is still committed to supporting decoupled architecturesHTMX is an excellent solution for progressive enhancement and dynamic front-ends. It is a powerful tool in the core toolkit, not a replacement for the flexibility offered by a fully decoupled backend. Drupal remains committed to supporting decoupled and headless architectures, especially where necessary, such as mobile applications, client-side state management, deep offline capabilities, etc.
LostCarPark Drupal Blog: Advent Calendar day 17 – Curious Findings
For today’s door of the Drupal Advent Calendar, we are joined by John Picozzi, who wants to share the keynote from this year’s New England Drupal Camp. John writes…
What sparks curiosity? This is the question my friend Jason Pamental tackled in this year’s keynote talk, “Curious Findings.” Jason invites us to approach design and digital experiences not as a set of fixed goals, but as a journey guided by questions, hunches, and open-ended exploration. As we follow along, we see how embracing uncertainty — and giving ourselves permission to poke around the edges of the unknown — can unlock…
TagsFreelock Blog: Can Everyone Hear You? Captions and Sign Language
Last week, the Trump administration argued in court that providing ASL interpretation at White House briefings "would severely intrude on the President's prerogative to control the image he presents to the public." The National Association for the Deaf has sued to restore real-time ASL interpretation.
Read More