Sulu releases 2.6.26 and 3.0.9: TOTP, AI disclosure, and Symfony 8 support
We have published two new patch releases: 2.6.26 and 3.0.9. Both branches gain two features: two-factor authentication with an authenticator app and AI disclosure information for media. Sulu 3.0.9 also adds Symfony 8 support, widens the columns for slugs and webspace keys, and fixes several routing and navigation issues.
Your second factor no longer depends on a mailbox
Sulu has supported two-factor authentication for a while, but in practice most teams stopped at the email method. It works, and it protects your admin account with a mailbox that often sits behind exactly one password itself.
Both releases make the authenticator app a real option. Pick Authenticator app (TOTP) in your profile and a guided setup opens with a QR code. Nothing switches on until you confirm the first generated code, so you cannot lock yourself out halfway through. Generate backup codes for every active method, and when someone loses their phone, reset their setup from the user's permissions tab or from the console.
The code came from adesso. The Sulu partner hit this requirement in a customer project, built the feature properly, and offered it upstream instead of keeping it in a fork. It has been running in production there since.
New features normally go to the current major only. We made an exception because 2.6 is the long-term support release for existing projects, and this is exactly the kind of security requirement those projects still need to meet. Telling those teams to upgrade a major version just to use an authenticator app is not a useful answer. A separate post walks through the setup, the backup codes and the administrative reset.
Origin and AI disclosure for media
The EU AI Act introduces transparency requirements for certain AI-generated and AI-modified content. We covered what that means for content teams in a separate post. Both releases now add fields to record and disclose the origin of media, contributed by MassiveLevi of Sulu partner MASSIVE ART. Every file version carries an origin of human created, AI generated, AI modified or unknown. Selecting one of the two AI values reveals a disclosure section with a text and a label icon. What the regulation means for content teams in practice is the subject of a separate post.
The feature adds columns to me_file_versions and me_file_version_meta. For Sulu 2.6.26, the required database changes are documented in UPGRADE-2.x.md, on Sulu 3.0.9 they ship as a Doctrine migration. Existing media default to unknown origin.
Symfony 8 support in Sulu 3.0.9
Sulu 3.0.9 now supports Symfony 8. Much of the work behind it is invisible. Across the admin, media, contact, and other bundles, request data is now read through the specific parameter bags instead of the removed Request::get(). Service definitions, security voters, and commands have also been updated for Symfony 8 compatibility. Parts of that groundwork were contributed by mamazu.
The release also allows doctrine/doctrine-migrations-bundle 4.0 and guzzlehttp/promises 3.0.
Deprecations in the REST and persistence components
Both releases deprecate the last remnants of the REST abstraction Sulu once built on FOSRestBundle, along with the repository helpers of the persistence component. A plain Symfony controller with the services you actually need, and a repository built directly on Doctrine, are simpler and do not tie your code to Sulu internals. Nothing breaks with these releases. The affected APIs are only marked as deprecated. The affected classes and their replacements are listed in UPGRADE-2.x.md.
Fixes for editors
Searching a list by a non-text column, such as an ID or UUID, failed on PostgreSQL and now works in both releases. In Sulu 3.0.9, indexing no longer merges words that are separated only by an HTML tag, which previously made everything after the first word unfindable. Existing content benefits after a reindex with php bin/console cmsig:seal:reindex --drop. hual7 contributed that fix, along with a fix that prevents the resource locator from marking a form as dirty when a field is focused but left unchanged.
Clearing a link field now clears the complete value instead of leaving stale sub-properties such as target and anchor behind. The archive action also shows its icon again.
In Sulu 3.0.9, setting a parent company on an account no longer breaks the field after reloading. This fix was contributed by steeven-th.
Clearer Sulu.ai error messages
The writing assistant reports why the AI platform could not process a request down. Rejected credentials, exhausted credits and an inactive subscription each get their own message and lock the input, while genuinely temporary failures keep offering to try again.
For the full changelog, see the release notes for Sulu 2.6.26 and Sulu 3.0.9.
What is next?
We continue improving Sulu 3.0 while keeping Sulu 2.6 stable for existing projects. Work on the first Sulu 3.1 features continues in parallel.
Outside the core, the Sulu MCP Bundle, which connects AI assistants such as Claude, ChatGPT and Codex directly to a Sulu installation, has reached 1.0.0-RC1. Fixes and improvements towards a stable 1.0 release are already underway.
Your feedback helps shape these releases. Report bugs or request features on GitHub, connect with us on Slack, or reach out through our website. We're listening.
