Install
To start a new Drupal project with version 12.0.0-beta1@beta:To update your site and all dependencies to the latest version of Drupal:
To update your site to this specific release:
Using Composer to manage Drupal site dependencies
Downloads
Release notes
This is a beta release for the next major version of Drupal. Drupal 12 beta releases are intended for site owners and module or theme authors to test compatibility and upgrade paths for Drupal 12.0. Beta releases are not intended for production. Refer to Preparing your site to upgrade to a newer major version for tools you can use to check the Drupal 12 compatibility of modules, themes, and sites. For more information on 12.0.x development, see [meta] Release Drupal 12 in 2026. The 12.0.x branch also includes all the latest commits that will be backported to 11.5.x and earlier branches. 12.0.x will be nearly identical to 11.5.x except that:
- Deprecated code will be removed, including entire deprecated modules and themes.
- Dependencies will be updated to new major versions as appropriate.
Important changes
Platform requirements changes
PHP requirements
- Drupal 12 requires PHP 8.5.
- The default password hashing algorithm was switched to argon2id in Drupal 12. For the rare case where this is not desirable - or argon2 is not available - it can be switched to the PHP default algorithm (bcrypt) using kernel parameters.
Database requirements
The requirements for the database drivers supported by Drupal 12 are:
- The MySQL database driver requires MySQL 8.0.
- The MariaDB database driver requires MariaDB 10.11.
- The PostgreSQL database driver requires PostgreSQL 19.
- The SQLite database driver requires SQLite 3.45 with the json1 extension.
Web server
See the web server support policy for more information.
Browser support changes
See the browser support policy for more information.
Windows in production environments
Support for hosting Drupal directly on Windows in production environments is deprecated. Windows is not a well supported environment, we do not have an automated Windows test environment and there are few developers who can test on Windows. Therefore, sites wanting to use Windows servers in production should plan to use Linux on Windows.
Support for Windows in development environments will continue.
Sites should update to the latest release of Drupal 11 prior to updating to Drupal 12
Sites should always update to the latest release of Drupal 11 prior to updating to Drupal 12. Updates added prior to Drupal 11.3.0 have been removed and Drupal's update system will refuse to update from Drupal 11.2 or earlier. However we recommend updating to at least Drupal 11.4 (or 11.5 once it is available) in order to ensure the smoothest possible upgrade path between versions.
The Syndicate block (RSS feed icon) was deprecated in Drupal 11.2.0 with no replacement. The block plugin has been removed in Drupal 12.0.0. Any configured placement of the Syndicate block is removed when updating to Drupal 12.0.0.
Migrate Drupal and Migrate Drupal UI have been removed from core and not moved to a contributed project
Sites can continue to migrate from Drupal 6 or Drupal 7 to Drupal 11, and then update from Drupal 11 to Drupal 12 using the usual update process. Drupal 6 reached end of life in February 2016 and Drupal 7 reached end of life in January 2025.
The Migrate API remains in core.
Changes to site-owner-managed files
-
The setting
update_fetch_with_http_fallbackthat allows sites to fall back to HTTP when HTTPS requests to updates.drupal.org failed has been removed. If your site relies on this setting because HTTPS connections to updates.drupal.org are failing, resolve the underlying SSL/TLS issue instead.
New administration theme
The new Default Admin theme, which was added as experimental in Drupal 11.4, has now been marked stable, and replaces Claro as Drupal's admin theme. Claro has been moved to a contributed project.
Multiple core extensions have been removed from core and moved to contributed projects
Nine modules and three themes have been removed from Drupal core and moved to contributed projects. In many cases, the removed extensions have little to no impact on site development.
Sites should check their installed modules against the following list, and either uninstall the extension or require the contributed version prior to upgrading to Drupal 12. If a removed extension is required for a site's functionality, the contributed version should be added to the Composer requirements prior to upgrading. Do not uninstall the extension, since this would destroy the extension's configuration and data.
Drush may bypass warning and error messages on update.php related to missing extensions. The status report will display errors about missing extensions after upgrading.
- Ban
- Contact
- Field Layout
- History
- Search
- Settings Tray
- Shortcut
- Telephone
- Toolbar
- Claro
- Stable 9
- Olivero
API and behavior changes
- The allowed HTML configuration for Filter plugins is now sorted alphabetically. Site administrators should expect to see this change in the diff when exporting configuration.
-
Drupal core now replaces a set of dangerous characters (for example shell metacharacters) in filenames with underscores for security reasons.
Backend (PHP) dependency changes
Updated PHP dependencies
- PHPUnit has been upgraded from 11.5 to 12.5. Using PHPUnit attributes instead of annotations is now required. Test developers should read how to identify annotations for conversion. Drupal no longer supports versions of PHPUnit less than 12.0.
- Guzzle 8 has been updated from 7.1 to 8.0.
- Coder has been upgraded to v9, which includes some minor backward compatibility breaks. Users of PHP_CodeSniffer may need to upgrade their configuration files to match.
-
Support has been dropped for the following older versions of dependencies:
- micheh/phpcs-gitlab: v1.1
- doctrine/lexer: ^2
- egulias/email-validator: ^3.2.1
- guzzlehttp/guzzle: ^7.10
- guzzlehttp/psr7: ^2.8.0
- justinrainbow/json-schema: ^5.2
- sebastian/diff: ^4 || ^5 || ^6
Frontend (CSS and JavaScript) dependency changes
Core JavaScript dependencies have been updated to their latest applicable release.
Removed frontend dependencies
- The Backbone and Underscore third party JavaScript libraries have been removed. They have not been offered as a library by Drupal core since Drupal 10. JavaScript that depends on these libraries should manage these dependencies themselves.
Added frontend dependencies
-
twig/html-extrato provide support for Class Variance Authority (CVA) for Twig templates. - Twig-CS-Fixer for ensuring Twig templates match coding standards.
Updated frontend dependencies
- htmx has been upgraded from 2.0 to 4.0. Sites with custom code should htmx now uses version 4 to learn about the backward-incompatible changes.
All changes since Drupal 12.0.0-alpha1
- task: #3626470 Review Drupal 12 and 11.x composer dependencies for allowed versions with CVEs
- docs: #3623242 Drupal\Core\Config\StorageInterface::readMultiple() @return docs don't say what the array is keyed by
- task: #3507570 Allow recipe to add multiple buttons to CKEditor toolbar
- task: #3465228 Twig disallows dashes in variable names, so SDC should disallow it in prop names and slots
- task: #3624454 Reduce CPU request for linting jobs
- fix: #3625969 Twig's 3.30 TypeError: Twig\Runtime\EscaperRuntime::escape(): Argument #4 ($autoescape) must be of type bool, null given
- task: #3620707 Skip the download caches job on weekly/daily pipelines
- task: #3581349 Remove Syndicate block config
- fix: #3625553 Use MAJOR.x-dev for generated dev-main aliases so release branches don't break BuilderTest
- task: #3621277 Update JavaScript dependencies for 12.0.0-beta1
- fix: #3625547 CurrentPathStack keeps every Request it has seen, so long-running processes leak memory
- build: Branch alias of main should still be 12.x-dev.
- ci: Update PHPStan baseline.
- fix: Set COMPOSER_ROOT_VERSION for 12.0.x.
- fix: #3095257 Option for _none is removed once a field has a value and can cause accidental data corruption
- task: #3037054 Deprecate drupal_static_reset() and drupal_static()
- Fix branch aliases in the plugins.
- Fix pinned dev deps metapackage which was not updated correctly and prevents d.o release node for the branch from working.
- Drupal 12.0.x-dev
- task: #3625308 Update postcss, and postcss-import for Drupal 12
- task: #3067979 Exclude test files from release packages
- task: #3623089 Delete unused core icons
- fix: #3618586 default_admin loses the footer group on forms that set #tree, silently unpublishing entities on save
- task: #3624455 Update caniuse browserlist
- task: #3584639 Remove the Claro theme
- task: #3516706 Disallow dangerous filenames e.g. command injection characters
- task: #3622931 Update Nightwatch
- task: #3586217 Remove the Search module
- fix: #3622419 EntityQuery AND condition groups do not work for fields with unlimited cardinality after #2875033
- task: #3595089 (followup) Remove the Olivero theme
- task: #3621326 Update to PHPStan 2.2.14
- task: #3595089 Remove the Olivero theme
- task: #3576670 Deprecate Claro theme
- fix: #3623708 Update main and 11.x to latest CKE release
- task: #3621198 Change remaining usages of Claro
- task: #3624359 Remove 'lifecycle: experimental' from Admin's info.yml
- fix: #3618140 Improve the accessibility of focus outlines
- task: #3624072 Remove claro from database dumps
- fix: #3622541 Add missing claro/classy templates to Admin theme
- task: #3623927 Remove Olivero from database dumps
- task: #3623051 Clean up references to moved Search plugins
- task: #3623168 Update deprecation notices in ajax.js
- fix: #3506333 Improve the perceptibility of contextual link buttons
- task: #3623097 Remove remaining Gin and Claro implementation names from Default Admin theme, part 2
- fix: #3621109 Skip link in dark mode has low color contrast
- fix: #3583516 Breadcrumb separators are exposed to the accessibility tree
- task: #3621993 Update Cspell
- task: #3617556 convert GenericModuleTestBase (and empty child classes) to a kernel test
- fix: #3623407 Broken tabledrag UI when uploading multiple files in Admin theme
- fix: #3623385 Admin theme's status report styling is off
- fix: #3623388 Details summary summary has low contrast
- task: #3607173 Update prettier
- task: #3623843 Remove Backbone.js and Underscore.js, not used in core anymore
- task: #3595083 Deprecate the Olivero theme
- fix: #3623728 Node.js v24 upgrade fails all Nightwatch test runs
- task: #3622600 Remove remaining uses of Olivero in tests
- task: #3620803 Update minimum Node version to 24
- task: #3582101 Make Admin the default theme in profiles and recipes
- task: #3617523 Remove Olivero from comments
- fix: #3621244 Navigation mobile sidebar close button in dark mode has low color contrast
- task: #2876298 Remove scaffolded csslint and eslint config
- task: #3586211 Remove the Toolbar module
- fix: #3612323 Do not use strong element for vertical tabs titles
- task: #3619512 Remove custom weights from default_admin.libraries.yml
- task: #3622941 Copy icons into toolbar
- task: #3582098 Update core/tests that use Claro to Admin
- fix: #3562543 FileEventSubscriber::sanitizeFilename() does not check for invalid UTF-8 chars
- task: #3623094 Move new install command to the correct namespace
- refactor: #3619763 Clean up UpdateMessageTrait::getText return type
- test: #3250999 Remove all code/tests to database drivers living in the directory DRUPAL_ROOT/drivers
- task: #3560123 Deprecate the Toolbar module
- task: #3575461 Cleanup any remaining deprecations
- task: #3582093 Convert Unit and Kernel tests that use Claro to Admin
- fix: #3615455 Ensure database drivers really are installed first
- task: #3622756 Use Admin theme for the update page
- task: #3618746 Move Toolbar uses in Announcement, User, Contextual to Toolbar
- task: #3582153 Update Functional tests in modules that use Claro to Admin
- task: #3582098 Update core/tests that use Claro to Admin
- fix: #3622446 DrupalConsoleLogger throws incorrect exception
- task: #3622220 Use Admin theme in installer related tests
- task: #3391683 Convert initial functions in update.inc file to a class
- task: #3035343 Deprecate drupal_attach_tabledrag(). Move its logic in Table form element
- Revert "task: #3621326 Update to PHPStan 2.2.13"
- feat: #3182064 Allow min & max exposed numeric/date filters to be configured
- fix: #3622031 Content Translation shows a confusing set of warnings even when config is syncing
- task: #3620407 Add missing HTMX 4 morph attributes
- fix: #3621016 text_update_12001 fails to load text_with_summary
- task: #3620802 Update jQuery UI to 1.14.2
- task: #3621326 Update to PHPStan 2.2.13
- fix: #3407067 message.js should work with whitespace in empty message wrappers
- task: #941970 Rebuild router only when something related to routing changes
- task: #3618971 Use Admin theme in installer
- task: #3621981 Remove admin-custom.css
- task: #3618449 Change uses of Olivero in core/tests and core/profiles
- task: #3617584 Change tests using Olivero
- task: #3618256 Adjust tests using olivero_test test module
- task: #3620812 Move toolbar support from Workspaces to Toolbar
- task: #3585957 Prevent the navigation sidebar being rendered via big pipe
- task: #3620746 Remove deprecated methods and functions tagged for 12.0.0
- task: #3620747 Remove deprecated method arguments tagged for 12.0.0
- fix: #2660338 Deprecate locale_get_plural
- task: #3620912 Deprecate user.module cancel methods
- task: #3594334 Add a module and theme install command
- fix: #3614602 Modules required by an active theme can be uninstalled
- fix: #3613607 Add RecipeRunner::isApplying() to determine if a recipe is being applied, without confusing it with a config sync
- task: #3619804 Remove unused templates from the Admin theme
- Revert "fix: #3621016 text_update_12001 fails to load text_with_summary"
- fix: #3621016 text_update_12001 fails to load text_with_summary
- fix: #3612458 Show all dependent modules on module confirm form for each chosen module
- task: #3561302 Register equivalent updates on site install
- test: #3608939 Move/split remaining parts of StandardPerformanceTest and StandardJavascriptTest
- task: #3621275 Update Composer dependencies for 12.0.0-beta1
- task: #3452493 Remove images that have been replaced with svg files
- feat: #3531854 Add a Design Tokens & CSS variables API
- task: #2025089 Deprecate user_role_grant_permissions(), user_role_revoke_permissions() and user_role_change_permissions()
- fix: #3120298 Add test coverage of alter hooks when there is no base alter
- task: #3620800 Update to Yarn 4.18.0
- Revert "fix: #2865710 Dependencies from only one instance of a widget are used in display modes"
- fix: #3615455 Address test mysqli test failures
- fix: #3611957 Improve InvalidComponentException by including the parent/calling Twig template path
- fix: #2865710 Dependencies from only one instance of a widget are used in display modes
- fix: #2638250 The label "Member for" on user profiles is hardcoded markup that is different from other user fields
- test: #3585774 rename xpath() methods in tests
- docs: #3618255 FormValidator refers to self::METHODS() which don't exist
- fix: #3614246 Media library grid items without a preview thumbnail collapse and hide the item name
- test: #3620770 [random test failure] EmphasisTest::testEmphasis
- task: #3580705 followup - Update the change record links
- task: #3580705 Deprecate update.compare functions
- feat: #3586688 Add support for generated columns to the DB Schema Definition API
- task: #3605702 Remove remaining Gin and Claro implementation names from Default Admin theme
- task: #3620216 Add loadOverrideFree and loadMultipleOverrideFree to ConfigEntityBase
- fix: #3617875 Better Dark Mode Support for Disabled Elements
- fix: #3619155 Forced-colors problems with admin theme's sidebar toggle button
- fix: #3619974 A view in a workspace shows default revision values for non-translatable entity types
- task: #3620804 Remove search references from Umami theme
- task: #3565781 Deprecate the Search module
- fix: #3440225 ESLint v9 broke the commit script
- task: #3620801 Remove search references from default_admin
- task: #3440225 Update to ESLint v9 with standard rules
- refactor: #3315265 Improve support of native MERGE with RETURNING merge_action()
- refactor: #3615415 Remove using preg_replace() on every query for PostgreSQL
- test: #3590777 Add kernel test coverage for FileReferenceResolver
- test: #3616193 Rationalise cache warming in OpenTelemetryPerformanceTest
- test: #3585455 Fix return types and baselined errors of core/tests/ Unit code - round 6
- feat: #3555916 Update to htmx 4
- fix: #3610122 Field data for multiple cardinality fields are not populated on entity load
- task: #3549134 Move text_with_summary to its own module