Neos and Flow 7.1 "Dormouse" released

Welcome Neos and Flow 7.1 "Dormouse" to the release family!

This version brings a couple of improvements to the usability of Flow and Neos and builds upon the stones that were layed with "Seven".

The Dormouse

"Twinkle, twinkle, little bat!
How I wonder what you're at!"

This little release has been a brave endeavour in those demanding times for everyone around the world. Still a whole couple of very useful additions have made it into Flow and Neos and can proudly stand their ground, thanks to the effort of last, but not least, a few community members that we'd like to mention:


Concept Art by Michael Kutsche
The Dormouse sat between the March Hare and the Mad Hatter.

PHP 8 support

Flow 7.0.6 and 7.1 are now working with PHP 8 and you can take advantage of the performance and language improvements when building your Flow application. Neos will still need some work, so stay tuned for any updates in that regard.

Support for PHP 8 attributes hasn't yet made it into this release, but will come with Flow 7.2

Thank you and farewell, EmberJS!

EmberJS has been the framework of choice for Neos' backend UI a couple of years back. While it has served well in the beginning, at some point it led to hard to maintain modules and the journey to the new rewritten Neos.UI based on React started.
While the transition to the new UI has been successful, there were still a couple of leftovers from the EmberJS times and it has been an ongoing effort to remove those since Neos 5.0.
Finally, with 7.1 this process can be considered finished and the UI has become quite a bit slimmer due to that. For example, the user management module:


  • 1270 kb in neos 7.0
  • 182 kb in neos 7.1


  • 250 kb in neos 7.0
  • 201 kb in neos 7.1


In version 7.1 we now use the Noto Sans as webfont instead of the true type. So we save 420 kb for all Noto-Sans files.


From the beginning there were Javascript APIs to localize texts dynamically or to output information as FlashMessages in the backend modules.

The Notification and I18n API was implemented with emberJS and had to be rebuilt. We decided for a framework agnostic solution and rewrote the APIs in Vanilla JS. But we didn't stop at this point - besides the two known APIs there is now also the Configuration API.

Additionally, some small useful functions can be used via the NeosCMS.Helper namespace, which we also use in our backend modules.

Example call of the Configuration API

Example for getting all available languages in the Neos backend modules

Show information about roles and privileges

This feature improves the policy selection in the account editing by making use of the labels and descriptions added to roles and privileges with Neos 7.0.

Privileges for roles are listed in user management

You'll no longer have to look up the granted privileges in the code before assigning roles to users!

Fusion based kickstarted Flow applications

With the addition of Atomic.Fusion, making it the new best practice templating and the Site Kickstarter creating AFX in Neos 7, Fluid became only an optional dependency in Flow. So it was due to have some scaffolding for a Flow+Fusion setup as well.

With 7.1 you can now generate a basic Flow application layout with Fusion.AFX to get you started quickly.

./flow kickstart:actioncontroller --generate-related --generate-actions --generate-fusion Acme.MyProject Business

An example command to generate a basic Flow CRUD application with Fusion AFX templates.

Add Fluid namespaces via configuration

Even though Fusion is taking the lead as the templating language, that does not mean we are dropping Fluid like a hot potato! It is still a very useful templating language for less dynamic pages and is used widely.

Until now it has been necessary to add custom Fluid namespaces for ViewHelpers to every single template to use them. The reason was to keep templates and partials as self-contained as possible. Still, there are cases where you just want to have your own collection of application level ViewHelpers available in every template without having to repeat the same namespace imports. Also, we already broke that self-containment with the automagic import of the "f" Fluid namespace alias and automatic registering of installed packages.

        - 'Acme\My\Package\ViewHelpers'

And you'll be able to use all ViewHelpers living in the Acme\My\Package\ViewHelpers namespace with the "my" namespace alias.

More Neos 7.1 Highlights


Neos Fusion Forms 2.0 has landed

Neos 7.1 comes with the brand new Version 2.0 of the Neos.Fusion.Form Package which
adds runtime functionality for single- and multi step forms together with customizable actions.

Other than the existing Neos.Form package the Fusion runtime forms are configured 
and controlled by Fusion which makes node properties & settings as conveniently 
accessible as the submitted data.

The documentation for this package with references, tutorials and examples can 
be found in the package readme. In the future the documentation will be integrated into the main Neos Documentation, but this will take some time.

prototype(Vendor.Site:Content.ContactForm) < prototype(Neos.Neos:ContentComponent) {
    renderer = Neos.Fusion.Form:Runtime.RuntimeForm {
	    namespace = "contact"
	    process {
	        content = afx`
	            <Neos.Fusion.Form:FieldContainer"firstName" label="First Name">
	                <Neos.Fusion.Form:Input />
	            <Neos.Fusion.Form:FieldContainer"lastName" label="Last Name">
	                <Neos.Fusion.Form:Input />
	            <Neos.Fusion.Form:FieldContainer"email" label="EMail">
	                <Neos.Fusion.Form:Input />
	        schema {
	            name = ${Form.Schema.string().isRequired()}
	            email = ${Form.Schema.string().isRequired().validator('EmailAddress')}
	            message = ${Form.Schema.string().isRequired()}
	    action {
	        message {
	            type = 'Neos.Fusion.Form.Runtime:Message'
	            options.message = afx`<h1>Thank you {data.firstName} {data.lastName}</h1>`
	        email {
	            type = 'Neos.Fusion.Form.Runtime:Email'
	            options {
	                senderAddress = ${q(node).property('mailFrom')}
	                recipientAddress = ${q(node).property('mailTo')}
	                replyToAddress = ${}
	                subject = ${q(node).property('mailSubject')}
	                text = afx`Thank you {data.firstName} {data.lastName}`
	                html = afx`<h1>Thank you {data.firstName} {data.lastName}</h1>`              

Show the default asset-collection in the sites listing

The default asset collection for each site is now shown in the sites management module.

Default asset collection shown in sites listing

Add missing translation to flash messages

Translations to all flash messages have been added, so they no longer need to appear in the hardcoded language. Head over to our crowdin, pick your language of expertise and translate them for everyone to benefit!

The following example shows the backward compatibility of the javascript code. So if you extended the UI, for instance, you could still use that for older Neos versions and, of course, the new version seven!

// current behavior that will return the singular
const actual = registry.translate('Neos.Neos:Main:pluralLabel', undefined, undefined, 'Neos.Neos', 'Main');

// With quantity parameter will return the plural
const plural = registry.translate('Neos.Neos:Main:pluralLabel', undefined, undefined, 'Neos.Neos', 'Main', 1);

Add Neos.Fusion:Link.Action and Link.Resource prototypes

Linking to an action or a resource from Fusion was already possible via the UriBuilder and ResourceUri prototypes respectively. However, their usage in AFX was a bit cumbersome and unintuitive. Therefore, those two new prototypes have been added, which behave like normal anchor HTML tags, but their href attribute behaves like the before mentioned UriBuilder/ResourceUri.

<Neos.Fusion:Link.Action class="action-link" target="_blank" href.action="show" href.controller="SomeOther" href.arguments={{ object: myObjectValue }}>Link text</Neos.Fusion:Link.Action>
<Neos.Fusion:Link.Resource class="download-link" href.path="resource://Some.Package/Public/Images/SomeImage.png">Download</Neos.Fusion:Link.Resource>

Fusion match object

This change adds a new Fusion object to replace many situations where the Case object was used just to return a value based on a string.

The idea is based on the new match method in PHP 8.

rowClass = Neos.Fusion:Match {
    @subject = ${q(node).property('columns')}
    one = 'd-flex col-12 col-md-6 col-lg-12'
    two = 'd-flex col-12 col-md-6 col-lg-6'
    three = 'd-flex col-12 col-md-6 col-lg-4'
    four = 'd-flex col-12 col-md-6 col-lg-3'

Fusion debug to browser console

With this new Fusion object it’s possible to debug to the browser console via an inserted script tag instead of showing a big dump that breaks the layout.

It optionally allows setting a title, method and additional arguments.

renderer.@process.debug = Neos.Fusion:Debug.Console {
    value = '%cfoo'
    method = 'table'
    color = 'color: green'

Add node label helper

With this helper it’s easier to define custom node label schemas in nodetypes:

# Use properties as label with fallback chain (replaces the previous default)
  label: "${Neos.Node.labelForNode(node).properties('title', 'text')}"

# Show number of elements in a multicolumn next to its label
  label: "${Neos.Node.labelForNode(node).postfix(' (' + q(node).children().children().count() + ' elements)')}"

# Use override, prefix and postfix:
  label: "${Neos.Node.labelForNode(node).prefix('The ').override('child of').postfix(' ' + q(node).parent().get(0).label)}"

# Adjust cropping:
  label: "${Neos.Node.labelForNode(node).crop(20, ' - - -')}"

Further changes

  • Add favicons and app icons for backend modules
  • Allow http image urls as login wallpapers
  • Set text/html as default content type in the Fusion Page prototype

Of course, this is just an abstract of the many changes included in this release, thanks to all the outstanding contributors.
See Neos 7.1 and Neos UI 7.1 change logs for a list of all changes and further details.

More Flow 7.1 Highlights


URL Rewriting enabled by default

Enabling URL Rewriting was already a default in our provided Apache .htaccess file and there are probably few reasons to not enable it in your setup. However, for any other server setup, you always needed to specify the FLOW_REWRITEURLS=1 environment variable to avoid ending up with weird /index.php/my/actual/path URLs.

With this release, this is no longer needed and the rewriting mode is enabled by default. If you actually depended on the non rewritten URL paths, for example because your webserver didn't support rewriting URLs, you now need to specify the FLOW_REWRITEURLS=0 environment variable.

Add RFC 6750 BearerToken

This little addition makes it easier to extract tokens from the Authorization header matching the RFC 6750 specification.

Authorization: Bearer mF_9.B5f-4.1JqM

This is mostly used when building APIs with Flow and until now you had to manually extract the authorization token. You still need to build a custom Provider that uses the BearerToken and authenticates the provided token, since this could be either a static or persisted token or even something like a JWT. The RFC only specifies the transportation of such a token.

Configurable rendering of request in exception logs

Until now every exception log has contained a rendering of the HTTP request that was received, including the URL and headers. While this is very useful for debugging errors, in some cases it might be a liability to store potentially personally identifiable information in logs. With this it is now possible to disable the rendering of the request into the exception logs by changing the Neos.Flow.log.throwables.renderRequestInformation setting to false.

Expose array_values in Array EEL helper

Just a minor convienience addition, but with 7.1 (and also 7.0.3+ as it was backported) you can use Array.values(array) to return the numerically indexed values of any array or traversable structure.

Support nested Fluid variables

Until now it was not possible to nest variables inside Fluid and when you needed e.g. dynamic array access, you were required to write a custom ViewHelper for this.

This is actually not a feature introduced with Flow 7.1, but a BUGFIX that allows to use a feature that TYPO3Fluid (partially) allowed. It is still mention worthy as it adds new possibilities. Hence with Flow versions 5.3.26, 6.0.23, 6.1.17, 6.2.12, 6.3.9, 7.0.6 and up, including 7.1.* it is possible to do this directly in Fluid at least one level deep:


Fluid allows to nest variables one level deep now.

Possibility to flush caches based on annotations

Unfortunately, the features that required this did not make it into the 7.1 release — namely Route and Privilege annotations — but still the ability to flush caches when a class with specific annotations is compiled is now available.

While this is not useful in itself for typical use cases, it might open up some more possibilities for annotations that improve the developer experience by declaring e.g. configurable features closer to the code they affect.

Further changes

  • Cli ProgressBar is public accessible

Of course, this is just an abstract of the many changes included in this release thanks to all the outstanding contributors.
See Flow 7.1 change log for a list of all changes and further details.

Documentation and Support


The detailed upgrading process for Neos 7.1 is explained in the upgrade instructions and Release Notes.

For Flow related upgrade instructions please refer to the Flow 7.1 Release Notes.


See the Neos 7.1, Neos UI 7.1 and Flow 7.1 change logs for all changes and further details.

Support for Neos and Flow 7.1

As shown in our release roadmap, Neos 7.1 and Flow 7.1 will get bug fixes until April 2023 and security fixes until April 2024.

Thank you!

Thanks to all core team members and the community for your valuable contributions and sponsorships. Especially during this difficult time in which a lot of people have many private topics on their mind and less time to contribute.

Also, a big thank you to the families of all the team members, that allow them to still put all of this effort into the project!

Take care of everyone and stay healthy ❤️