by Yanick Witschi

Recap of the second Contao Core Developers Meeting 2025

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

Yanick Witschi

About Yanick Witschi

Yanick is Contao's caching and resolver hero and is partly responsible for making your coffee break a lot shorter since the switch to Composer 2. He was co-founder and the first president of the predecessor of the Contao Association. As a core developer, he puts a lot of heart and soul into Contao. At terminal42, he regularly takes off with clients. He also loves cooking, basketball, tennis, politics, the African continent and astrophysics.

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

Please calculate 1 plus 1.