Changes Report

Last modified by Vincent Massol on 2026/09/02 19:04

Move to jakarta.inject

It's now possible to use the jakarta alternatives of javax.inject.* APIs (used mainly to manipulate components). javax.inject.* is still supported for now, but it's now recommended to move to jakarta.inject.* classes and annotations.

New Jakarta Servlet bridge

To help with the transition between javax.servlet and jakarta.servlet, this version of XWiki introduces a bridge to convert classes between the two versions. The main entry point is org.xwiki.jakartabridge.servlet.JakartaServletBridge which is located in the org.xwiki.commons:xwiki-commons-jakartabridge-servlet modules.

Redirect resolved by XWiki

By default, XWiki is now taking care of resolving the relative redirect URL to absolute ones instead of letting the application server take care of this. This means that less setup might be required in some cases.

New Blob Store API

A new blob store API has been introduced for storing blobs of data. By default, this data is stored in the file system in the data directory, but admins can configure XWiki to store the data on S3, which makes the data centrally available on clustered XWiki instances. Extensions should use this API as a replacement for permanent file storage. By choosing appropriate store names or customizing the storage location, it is possible to switch from plain file system access to the blob store API without any data migration. XWiki supports automatically migrating between the configured store and a migration store, allowing for automatic migration of the existing file system data to S3 when configured.

New picker for DocumentTree and Children macro

A new picker has been implemented to ease the configuration of some parameters of Document Tree macro and Children macro, such as the root parameter. This allows for most types to use a suggester to select the node. For some specific type, users still have to enter a specific reference but this should be only for advanced usages. Check the documentation for more details.

Better Table Handling in PDF Export

Table handling in PDF export had been improved:

  • there is now a lower limit enforced on the column widths, in order to avoid having very thin columns that fit only a single character
  • tables that overflow the print page width are scaled down, first by reducing the font size and then by applying a CSS transformation
  • rowspan and colspan attributes are removed before printing in order to avoid problems with splitting such tables across multiple print pages; in order to maintain a consistent table layout we insert empty table cells matching the values of the rowspan and colspan attributes. This changes the table layout a bit, from what you see in view mode, but it prevents missing table rows in the generated PDF.

See the PDF Export Application for more information.

PDF Outline

We changed the headless Chrome Docker image used to perform the PDF export in order to be able to use the latest version of Chrome. This allowed us to activate two features provided by Chrome:

  • generation of PDF outline (bookmarks), simplifying the navigation within the PDF
  • generation of tagged PDFs, which is supposed to make the generated PDFs more accessible

You need to configure the PDF Export Application to use the Chrome Docker Container as generator, if you want to try these features.

Realtime clustering support

Experimental clustering support has been added for the realtime editors. You don't need to do anything to enable it, but it hasn't been tested much yet, so don't hesitate to report problems you may encounter.

Local Undo / Redo for Realtime Editing

You can now undo / redo only your own changes while editing in realtime, as long as there is no conflict between your changes and the changes made by other collaborators (e.g. like if someone else modifies the content you add). Checkout the Realtime WYSIWYG Editor documentation for more information.

Pasted Images are Uploaded as Attachments

If you copy images using the browser's Copy Image context menu or by selecting content (HTML) from the web that includes images, and paste them into the editor those images will be uploaded as attachments to the edited wiki page. You can prevent this by closing the notification message that is displayed before the images are uploaded. Note that it's not always possible to download the external images that were pasted (i.e. if they were copied from a different domain that has not configured CORS access), in order to upload them as attachments. In this case the external image will be referenced, so your content will depend on the availability of the external server. See the WYSIWYG editor documentation for more information.

Added CSS property alternatives to LESS variables

Added a whole set of CSS properties to allow styling interfaces without LESS. Those CSS properties are still subject to change, but the system should be used and updated for any new UI implementation in XWiki Standard.

Mark macro executions as isolated for better performance

When macros are executed, until now, the whole XDOM tree needed to be re-scanned for the next macro to execute. This led to slow rendering times for pages with thousands of macros. It is now possible to mark the execution of macros and wiki macros as isolated if their execution won't modify the XDOM, which avoids this costly scan. As this can significantly improve the rendering time, e.g., from eight to one second (concrete improvements depend on the exact page content), macro developers are advised to mark their macros as isolated if their execution is actually isolated.

Resize panel column handles

When panels are displayed on the right and left of instances, a handle can be dragged to resize them. The size of the panel is stored at the browser level, meaning that navigating to a new page on the same wiki will not lose this preference, but moving to another machine will. Read more about the panel layout and how this new handle interacts with the existing system.

Expand nodes in DocumentTree macro

A new parameter has been added to the DocumentTree macro: expandToLevel allows to define to which level automatically expand the tree when displaying it: indicating 1 would automatically open top level nodes, 2 would also open their immediate nested nodes, etc. Default value is 0 so nothing is automatically expanded.

Root parameter in Children macro

The Children macro now has a root parameter allowing to display the children to a given document, instead of displaying the children of the current document.

Toggle panel columns

When panels are displayed on the right and left of the page, a toggle appears on hover. Interacting with the toggle will either hide or show the panel column. Hiding a panel column will also reset the preference for this column width. The state of the columns is synchronized across tabs. This preference is stored at the browser level, meaning that navigating to a new page ont he same wiki will not lose this preference, but moving to another machine will. Read more about the panel layout and how this new toggle interacts with the existing system.

Live Data components store

With the migration to Vue 3, a new mechanism was required to register additional components (in addition to the ones already registered by default).
In addition, even components registered by default are now dynamically loaded. For instance, if a Live Data is only displayed cells of type text, only the text displayer will be loaded on the page.

Example:

import { componentStore } from "xwiki-livedata";

// Dynamically register a new "toggle" displayer component.
componentStore.register("displayer", "toggle", async () => {
  return (await import("./components/DisplayerToggle.vue")).default;
});

Improved support for webjar built using node

Building the artifacts of a webjar using node is becoming a pattern we use more and more frequently.

To simplify this usecase, the webjar-node packaging type has been introduced.

Using this packaging type allows for more concise pom definitions, ensure a standard projects structures, commons node and npm version, and a default build lifecycle.

yjs websocket endpoint

A new Yjs WebSocket endpoint is now available. This WebSocket endpoint allows editors with Yjs-based real-time collaboration features (e.g., Blocknote, Tiptap) to use XWiki as the server to synchronize changes between editors.

Warning

The endpoint does not provide a mechanism to authenticate to the endpoint from another domain (see https://jira.xwiki.org/browse/XWIKI-23367).
Therefore, the endpoint is currently only usable when the client code is used in the same domain as the endpoint.

Sorting behavior of document trees can be configured

The ordering of special characters in document trees like the navigation panel can be configured to control how different kinds of characters like accented characters are sorted. This makes it possible to, e.g., sort "Ä" directly after "A" instead of after "Z".

Get Connected