Changes Report
Notification Messages HTML support
![]()
The notifications now only support HTML in their text message when it is explicitly allowed. To do so, an optional textHtml boolean parameters (default value: false) is available.
Example:
new XWiki.widgets.Notification('This is <strong>bold</strong>','done', { textHtml: true});Change to ModelReferenceHandler's API
![]()
Two new methods have been added to ModelReferenceHandler's API: getParentDocumentReference and getParentSpaceReference. These provide backend-specific utilities to obtain parent references from an existing Cristal reference.
start_xwiki.bat refresh
![]()
The Windows version of the start scripts used in the XWiki Jetty package have been updated to benefit from the same features as the .sh ones, including ##-h## which give the new documentation.
Docker External Solr
![]()
The XWiki docker images now support correctly setting up an external Solr instance.
Repository improvements

- the concept of project was added to the Repository application, see Repository Application for more details
- the update of extension with a lot of versions is now much faster (only missing version are added, it assumes existing one are correct)
Macros can be inserted/edited through the formatting toolbar


When selecting a range of text in the BlockNote editor, the formatting toolbar will now show a macro icon which opens the macro editor.
When selecting an existing macro block, the formatting toolbar will now show an edition icon. Clicking on it will open the macro editor.
UI elements for editors can be disabled based on the document's syntax
![]()
Features can now be enabled/disabled automatically based on the syntax: When editing a document within the BlockNote editor (or any future editor), all unsupported syntax elements will be automatically disabled in the UI.
Relevant types are defined in the @xwiki/platform-syntaxes-config package.
UI improvements of the attachment uploader

Updated the design of the attachment uploader to fit better in today's XS interface. The new UI looks simpler for regular users, while keeping all the info of the former one for advanced users. Learn more about the attachment feature.
BlockNote Syntax
![]()
A new JSON-based rendering syntax, called BlockNote, is available. It provides both a parser and a renderer, and it is currently used only by the BlockNote WYSIWYG editor.
New link insertion/edition UI for BlockNote




In BlockNote, links insertion and edition now use the new UI, which adapts automatically to the design system. This new UI also exposes new options, such as creating links to email addresses.
Reproducible builds
![]()
XWiki's Maven build is now configured to produce reproducible artifacts by setting project.build.outputTimestamp to the time of the release. This means that for most release artifacts, it should be possible now to obtain byte-identical versions by rebuilding the sources. This also affects all extensions with a parent version of at least 18.7.0. Extensions can explicitly set their own timestamp to override the fixed timestamp of the parent when desired, or set it to a value like "X" to explicitly disable reproducible builds if it should cause any issues. We have also fixed several modules that were not reproducible before. We're aware that some class files in many legacy modules (those are included in the released WAR) still contain absolute paths of the build environment, and the WAR, XIP and Debian packaging as well as the pre-installed demo distribution are also not reproducible for additional reasons. You can track XWIKI-24698 for the progress towards a fully reproducible build.
LiveTable New Row Naming Strategy
![]()
When creating a new row for a Live Data using a livetable source, the XWiki instance needs to create a new document. Naming this new document automatically requires a naming strategy, which can be customized by implementing a new LiveTableNewRowNamingStrategy.
Design System CSS Variables
![]()
The Flamingo Design System now declares the CSS variables of the Abstract Design System, deriving them from the style variables of the skin. Code styled with them follows the Color Theme, and stays portable to the other implementations of the Design System.
Improvements to panel titles and navigation items

News styles for panel titles
Panel titles now have a more compact view by default
Pages featured in the navigation panel now span 100% of the width of the panel. This should make easier to navigate to pages with short names using the navigation panel
BlockNote realtime sessions save automatically
![]()
Content edited with the BlockNote editor in a realtime collaboration session is now saved automatically, about once a minute while there are unsaved changes. This closes the "there is no auto-save" limitation announced when BlockNote realtime collaboration was introduced.
Only one of the collaborators' browsers performs each save, so the session adds a single version per save instead of one version per participant. That version records the summary "Auto-saved during real-time collaboration", the same summary a CKEditor realtime session uses. Saving by hand keeps working and takes precedence over the automatic save.
The save status ("Unsaved", "Saving", "Saved") that the realtime toolbar displays is not shown in the BlockNote action bar yet, so there is currently no on-screen indication of when the automatic save happens. We plan to add it in the next version.
Configure Syntaxes


It's now possible to easily configure the markup syntaxes that you wish to be made available to your users when writing pages, directly from the Admin UI.
Blog Post Template

You now have the option to create a blog post from anywhere inside the Blog page (or one of its children) by simply using the + (create page) button and selecting Blog Post as your new page's type
Temporary Resource API
![]()
A new API is available to create temporary resources. Here's an example of how you can use it:
// (1) Create the temporary resource reference.
String moduleName = "chart";
List<String> resourcePath = Arrays.asList("pie", "issuesByReporter.png");
EntityReference owningEntityReference = new DocumentReference("wiki", Arrays.asList("Path", "To"), "Page");
TemporaryResourceReference temporaryResourceReference =
new TemporaryResourceReference(moduleName, resourcePath, owningEntityReference);
// (2) Create the temporary file.
InputStream content = new ByteArrayInputStream("content".getBytes());
File tempFile = this.temporaryResourceStore.createTemporaryFile(temporaryResourceReference, content);
// (3) Obtain the URL that can be used to access the above temporary file.
String temporaryResourceURL =
this.urlTemporaryResourceReferenceSerializer.serialize(temporaryResourceReference).serialize();Ratings on Extensions Repository home page

Rating is now displayed in the Repository App's home page livetable.
Active Installs for Extensions

The number of active installs is displayed for each extension in the Repository App's home page livetable and in the extension page.