Every year, the Contao Core development team meets twice for a short code sprint of three days.
This time, we met again at the Unperfekthaus in Essen.
Traditionally, the developer meeting starts on Sunday, but this time we extended it a bit:
Instead of heading home on Wednesday as usual, we stayed until Thursday.
That meant three full days packed with Contao power – even more time for our favorite CMS!
Therefore, the obligatory reminder is more important than ever: The developer meetings are crucial for the further development of Contao and
therefore, as always, I call attention to the fact that the Contao Association funds these meetings. As a
Supporter you can do your part.
Once again, the project team thought of us and prepared a small care package.
A big thank you to Marcus for organizing and putting it together!
Especially the "Twig" idea instantly boosted everyone’s mood – a lovely tradition that by now belongs to the developer meeting just as much as the heated discussions that the chocolate sometimes helps smooth over. Photos attached.
Contao 5.7 LTS and Contao 6
The main topic at this meeting was, of course, the upcoming Contao 5.7 LTS - the next long-term support version,
which will accompany us until 2030. 2030 - wow 🤯
This means that 5.7 is not just another release, but also the last big chance to adjust things that will then
stay with us for another four years.
We expect to raise the minimum PHP requirement to PHP 8.3, and as always with our LTS releases, the latest Symfony
version 7.4 LTS, which will be released in November 2025, will form our foundation.
We also discussed the possible release date for Contao 6. Anyone who regularly checks our roadmap knows that,
according to this roadmap, there will be no Contao 5.8, but rather Contao 6.0.
However, this is not yet set in stone. We want to make the final decision at the next developer meeting in spring 2026. A decisive factor here will be how far we get with input encoding – more on this in the next section.
Important: As you all know, we strictly adhere to Semantic Versioning. This means that as soon as there are API
breaks, we must give the CMS a new major version.
However, this does not mean that everything will change when switching from Contao 5 to Contao 6. As before, we will carefully
consider which breaks to introduce and which not to. Example: No one is forcing us to remove support for Contao 3 modules (system/modules). The BC layer has been in place since version 4.0, is manageable in terms of maintenance, and there is currently no reason to remove it. Just because we can doesn't mean we have to.
So don't be put off by the "6". It's not a revolution, but rather a clean break for the future - just like Contao
5 was.
Input Encoding
One topic that has been with us for years is input encoding. Contao has been working with this concept for
almost 20 years now, and with each new version we try to get closer and closer to clean output encoding.
A glance at the OWASP Top 10 shows why this is important: A03 Injection — which also includes
XSS — is still one of the top 3 most common attack vectors. Missing or faulty output encoding plays a
central role in this.
A crucial building block on our path away from input encoding is Twig. Twig comes with output encoding
as standard and is therefore the key to making Contao secure in the long term. But that also means:
We must rely entirely on Twig and remove our old html5 templates. There is no way around this if we want to
continue to be considered a secure CMS.
Martin and Moritz revisited this topic in depth during the developer meeting and achieved a major
breakthrough: They found a way to rewrite all (!) templates from html5 to Twig in the core — without breaking
any existing customizations in Contao 5.7. For example, a mod_article.html5 customized in the application would
not suddenly be ignored. This is an extremely important step towards clean output encoding!
One possible idea we discussed is that Contao 6 could consist purely of the switch from input to output
encoding. This would mean:
- The data in the database would have to be migrated.
- Only Twig templates would be supported.
But, and this is important: There are still some questions open here, and nothing has been definitely decided.
Nevertheless, the general advice is: Anyone who is still writing html5 templates should stop doing so immediately
and start working with Twig.
Removal of front end modules
At the last developer meeting, we decided that front end modules will eventually be replaced by content elements.
I already wrote about this in detail at the time.
One major problem with the changeover is that many of the database fields currently available in the modules (over
80!) are not yet part of tl_content, but only of tl_module. If we were to simply adopt these, we would quickly
encounter the familiar "row size" problems – because databases cannot process tables with an unlimited number of columns.
I already tried to build an approach with a JSON data type at the 2023 developer meeting. The
idea back then was to store multiple fields in a single JSON column, thereby reducing the number of columns.
At the time, however, I failed due to various limitations – both conceptual and technical.
This time, we have revised the requirements so that these fields cannot be filtered or searched and cannot serve as
subpalette triggers. In addition, we now have new technical possibilities (e.g., DataContainer::getCurrentRecord())
. Fritz has therefore made a new attempt, and as of today, we are confident that we will finally (!) be able to
deliver a solution for "virtual DCA fields" in Contao 5.7!
At the same time, Dave used the entire developer meeting to consistently rewrite additional front end modules
as content elements — an important step that is not just a matter of "copy & paste", but is also used to
modernize the corresponding elements (e.g., Symfony Forms for forms, etc.).
Pagination
While we're on the subject of modern elements and Twig templating, there's another topic we can't leave out: the
good old Pagination class. It's been around for ages and, to be honest, is getting pretty old. Until now,
it simply spits out a finished HTML string at the end – without the option of specifically controlling individual
components such as "previous", "next", or the page numbers in the template.
Fritz has taken on this task and designed a completely new pagination. This makes it possible to
use the individual components much more flexibly in the template, ensuring clean, modern markup.
In his pull request, he has already replaced all uses in the core with the new implementation. And that was a lot of
work, because pagination is used in many places – including the feed reader, the gallery content element, the
back end lists, all list front end modules, comments, and much more.
Row Wizard
Sebastian and Andy have jointly developed a new widget called Row Wizard. Many developers
in the community may be familiar with the "MultiColumnWizard" (or "MCW" for short), which allows the definition of
arbitrary widgets and the duplication of rows. The Row Wizard is its modern replacement for most use cases and will
be available directly in the core from Contao 5.7 onwards.
The previous "Key-Value Wizard" is essentially a Row Wizard with two fields (namely key and value) and will
therefore become redundant. We are deprecating it accordingly and will remove it from Contao at some point. Migration to
the new Row Wizard is straightforward and only requires an adjustment in the DCA. The existing format in
the database is fully compatible, so data migration is not necessary.
Expansion of the back end search
My personal new baby is the back end search introduced in Contao 5.5, which I have now significantly expanded for
Contao 5.7. Starting with Contao 5.7, it can now be faceted! This means that you can no longer just search for a
keyword, but can now also narrow down the search results by type — for example, to display only search hits of the type
news or article.
In the case of files, this goes one step further: you can also filter by file extension and, for example, display
only PDF files.
Much of the work was already done before the meeting: In recent months, I have expanded both Loupe and SEAL to support facets.
The implementation in Contao 5.7 is now, so to speak, the harvest of this long preparatory work.
A big thank you also goes to Sebastian, who more than made up for my lack of styling skills and took care of the
beautiful presentation in the back end.
Attachments for the new jobs framework
While I'm writing about my humble self, I'd like to add that the jobs framework introduced in Contao 5.6 will be
expanded to include attachments in 5.7. This will allow any attachments to be added to a job and then downloaded by a user via
the back end. I have also started to convert the current implementation of the crawler in system maintenance to the
new job framework in order to guarantee a consistent UX.
User Experience – many small and large steps for better usability
While we're on the subject of UX, I'd like to take this opportunity to mention a few improvements that we've
been working hard on.
Two of them stand out in particular, although many others are just as important.
Twig and Ace
Ace is our editor in Twig Template Studio. It basically supports syntax highlighting for Twig, but the rule
set used there is hard-coded and not always up to date. But even if this rule set did reflect the current Twig
version, it would still know nothing about all the Contao-specific functions — or about Twig functions, filters,
and tags that are added through extensions. Good examples are our own slot concept or functions such as figure() and attrs().
Moritz solved this problem by developing a dynamic set of rules that extracts the information directly from
our Twig environment. This means that in future, all Contao-specific Twig functions, filters, and tags will be
automatically recognized and correctly highlighted in the editor. This makes working in the Template Studio
noticeably more pleasant!
Referrer Management
Contao has always had an internal "back" logic. There is the "Back" button at the top right, as well as
operations such as "Save and close" or "Save and back". Until now, these functions were based on
quite complex logic that attempted to record where a user originally came from in the session. This often led to
inconsistent behavior and made it almost impossible to reproduce errors. In some cases, after performing an action,
you would even end up on seemingly completely unrelated pages.
We therefore decided to overhaul the entire referrer management system. Instead of the previous dynamic logic, we
will now rely on hierarchical navigation links. This makes navigation behavior deterministic and traceable. All
links in the back end will no longer contain ref parameters, resulting in a much more consistent UX. Martin has
worked intensively on this issue, and I can tell you, it already feels so much better! There may still be a few
special cases that we will have to adjust later, but in any case, we will then know why the link points where it
points, and it will no longer be the case that it can be different for user A than for user B. That alone is an
absolute win for Contao and a consistent UX!
Further UX improvements
In addition, there were many other changes and conceptual ideas aimed at improving the usability of Contao:
- Sebastian worked with Andy to revamp the toolbar functions. Favorites will now be moved to the breadcrumb,
and functions such as the dark/light mode switch will be moved to the profile dropdown. Everything is designed so
that the most important functions remain quickly accessible.
- Andy also played around with the idea of a new operation in the "Parent Views", which makes inserting
new elements between existing elements much more convenient.
- A large part of his work also went into the file manager: permissions and operations, and thus also the context
menu, should behave consistently with the rest of the back end in the future.
- Speaking of the context menu: we are not yet completely satisfied with the current state of affairs in Contao 5.6
and have been working on concepts for revising the operations for Contao 5.7.
- Sebastian and Andy have also transferred many functions back to Stimulus. This has enabled us to further reduce our
dependence on MooTools — we are now down to just a few percent compared to the total JavaScript share in the
back end. The complete removal of MooTools is now within reach. At the same time, this conversion also brings
advantages in terms of component reusability. For example, it will now be possible to select multiple checkboxes
at once in the checkbox wizard (e.g., for user permissions) by holding down the Shift key. In addition, you can
now select records for the "Edit multiple" mode without reloading the page and even conveniently using a keyboard shortcut.
- Thanks to Sebastian, the preview toolbar in the front end is now located in the shadow DOM, which leads to fewer
unexpected side effects. We have also experimented with page transitions in the back end to achieve a smoother "app
feel".
- Leo has given the back end a fresher look and feel. The left column no longer has a separate background,
spacing and
border-radius values have been standardized, and the back end looks much more airy overall. His to-do
list also includes revamping the popups, which are also a bit outdated.
All in all, these are many small steps that together result in a noticeably more modern and consistent UX—and Contao
5.7 is guaranteed to feel even more polished.
Miscellaneous
As with every developer meeting, there was once again a series of tasks to complete, which may not sound
particularly exciting but are nevertheless extremely important in ensuring that Contao remains stable and
future-proof in the long term.
Among other things, we updated PHPUnit to the current version 12 and, in preparation for the upcoming
Symfony version 7.4, already raised all dependencies to Symfony 7.3. This ensures that we can switch as smoothly as
possible when 7.4 is published.
And last but not least: we fixed over 30 bugs during the meeting. Many of which were minor issues, others were more
tricky corners (e.g., the page title problem in the breadcrumb) – overall, a big step towards making Contao even more stable.
Last but not least, I would like to remind everyone about the Contao Conference on September 25-26, 2025, in
Düsseldorf. I hope as many of you as possible will make your way to the Rhine and celebrate our achievements with us!
That's all Folks, see you in two weeks!
– Yanick
Comments
Comment by Marcus Lelle |
Wow, Yanick, what a long report! As always nice to read and full of information.
Contao always gets so much care by all of you. I am looking forward to seeing you in Düsseldorf and am so keen on welcome Contao 5.7 in February 2026.
Add a comment