Changes Report
Docker Test Improvement
![]()
Add the ability to install the XS Flavor and WAR, instead of generating a minimal XWiki instance. Useful, for example, inside XS Flavor Docker tests, or when developing a feature, if the dev wants to take screenshots with a full XS UI, while being inside the docker tests of a specific module.
Clarify original and target pages during replace dialog



When moving a child page to a location where there's already content, the popup form has been made clearer.
Disabled users not listed in User picker


When defining a "List of Users" property (e.g. in an AWM application), it's now possible to decide if disabled users will be proposed in the suggest picker or not. The default has changed for listing all users, to now listing only active users.
Annotation changes create minor revisions
![]()
Creating, modifying and deleting annotations now generate minor revisions, similar to what happens for comments (they used to create major revisions which was not consistent with comments).
Skip recycle bin when deleting pages
![]()
It's now possible to skip the recycle bin when deleting a page (or a translation of a page).
Delete Job update
![]()
The Delete Job doesn't restrict skipping the recycle bin to advanced users anymore. This was a mistake since the advanced users verification should only be used for choosing what to display in the UI and it's not a permission.
Logs in Docker distribution
![]()
XWiki logs can now be found by default in the XWiki permanent directory, under logs/*.
Location picker actions as buttons

Action controls of the location picker UIs have been updated to look like buttons (see screenshot). In addition they now have proper text alternatives. More information about this UI
Redesign of the comment tab in the document footer

- Added a "View thread" button with the number of answers. Pressing it expands or collapses the thread of a comment.
- New look for quotes.
- Comment actions are displayed in larger buttons that fit more the current UI.
- Annotations and comments have now one unified look.
Apply all the changes in one go when migrating objects of a modified XClass
![]()
When a document defining an XClass is deleted or modified, instances of this XClass (and in particular their properties) are updated. This is now done in one go instead of property per property, hopefully improving performance a bit by removing the need for saving each document multiple times.
Working group update and new overwrite parameter when using the group output filter stream
![]()
By default, the output instance filter stream updates groups. This was somewhat already the existing behavior in older XWiki versions, but it didn't work well. One can now decide to overwrite groups using the overwrite parameter.
New ExtensionSCM tag
![]()
org.xwiki.extension.ExtensionSCM#getTag() has been introduced to expose the tag that can be found in Maven pom files.
Improved contrast on background for the quick actions hint in the editor

Made it italic so that it could still be identifiable easily as different from regular text content. More about the quick actions.
New random string APIs in $stringtool
![]()
The $stringtool velocity tool now provides a new API allowing to create secure random Strings, by reusing RandomStringUtils API:
public String nextAlphanumeric(final int count)Non-existing documents are not showed in the Recently visited documents panel
![]()
The recently visited panel now checks if a document exists before displaying it.
UserAuthenticatedEventNotifier
![]()
A new UserAuthenticatedEventNotifier component has been introduced to make easier to send notifications about newly authenticated users. It's especially important for custom authenticators which support older versions of XWiki, for which the component is provided as part of User Authenticated Event Backport.
New layout for LiveData card view

Live Data Card View now has a new content layout with all fields and descriptions aligning to the left.
New script APIs to execute and render UI extensions
![]()
A common pattern for rendering UI extensions using scripting (Velocity) is:
#foreach($uix in $services.uix.getExtensions("org.xwiki.platform.html.head", {'sortByParameter' : 'order'}))
$services.rendering.render($uix.execute(), 'html/5.0')
#endThe problem with this is that the specified output syntax, html/5.0, is not taken into account when executing the UI extension. It is used only to control how the result of the execution is rendered. This may seem enough, but when a template-based or wiki-based UI extension produces a raw block, this is labeled with the syntax from the rendering context, which is not necessarily the target syntax specified by the script (e.g. when the page holding the script is accessed with ?outputSyntax=plain). Such a UI extension can thus be excluded from the output because an HTML renderer will ignore non-HTML raw blocks (same as a plain text renderer will ignore HTML raw blocks).
This problem doesn't manifest when using {{uiextension}} or {{uiextensions}} macros, which is why we recommend using them when wiki syntax is available. But we still have a lot of UI extension points in Velocity-only templates. For this we introduced the following new script service APIs to execute and render UI extensions in a given syntax:
$services.uix.render($uix, 'html/5.0')
$services.uix.renderExtensions('org.xwiki.platform.template.header.after', 'html/5.0')
$services.uix.renderExtensions('org.xwiki.platform.html.head', 'html/5.0', {'sortByParameter': 'order'})Checkout the documentation for more information.
Count the distinct XWiki instances behind the Active Installs pings
![]()
The Active Installs script service could only count pings, and an instance sends many of them — one a day, plus one on every restart — so counting the instances themselves meant post-processing the pings by hand. Two new methods count instances directly: countDistinctInstalls returns the total, and countDistinctInstallsByExtension returns the breakdown by extension, computed in a single query rather than one query per extension. Both are experimental for now.
See Active Installs Script Service for the signatures, the precision limits and query examples.