Current
Maintained
release-2025-05
May 2025 Release

To get an overview about new functionality, read the Release Notes. To learn about the necessary actions to update Livingdocs to release-2025-05, read on.

Attention: If you skipped one or more releases, please also check the release-notes of the skipped ones.

Webinar

System Requirements

Suggested

NameVersion
Node22
NPM10
Postgres16
Elasticsearch8.x
OpenSearch2.3.0
Redis7
Livingdocs Server Docker Imagelivingdocs/server-base:22
Livingdocs Editor Docker Imagelivingdocs/editor-base:22
Browser SupportEdge >= 92, Firefox >= 90, Chrome >= 92, Safari >= 15.4, iOS Safari >= 15.4, Opera >= 78

Minimal

NameVersion
Node20.19
NPM10
Postgres13
Elasticsearch7.x
OpenSearch1
Redis6.2
Livingdocs Server Docker Imagelivingdocs/server-base:20:10
Livingdocs Editor Docker Imagelivingdocs/editor-base:20:10
Browser SupportEdge >= 92, Firefox >= 90, Chrome >= 92, Safari >= 15.4, iOS Safari >= 15.4, Opera >= 78

Deployment

Before the deployment

No pre-deployment steps are required before rolling out this release.

Rollout deployment

Migrate the Postgres Database

No migrations are required for this release.

After the deployment

No post-deployment steps are required after rolling out this release.

Rollback

No rollback steps are required for this release.

Breaking Changes 🔥

server/editor Operations

Update Minimal Node Version v20.19 🔥

The minimal supported Node.js version is now v20.19.0. This version allows us to require esm modules within commonjs.

server Integrations

Removal of Desk-Net in favor of Kordiam 🔥

Desk-Net rebranded as Kordiam. To align Livingdocs with this change, we previously introduced corresponding Kordiam properties, features, and plugins. With this release, we are removing the superseded Desk-Net functionality:

  • Feature li-desknet and li-desknet-integration, including all server APIs

  • Server config desknet, integrations.desknet, and hugo.print.desknetMetadataFields

  • Project config settings.desknet, settings.integrations.desknet, and contentTypes.[*].desknet

  • Function parameter desknetApi of Desk-Net/Kordiam functions

  • desknet property in the return objects of projectApi.getProject() and systemApi.config()

  • Metadata plugins li-desknet-global, li-desknet-integration, and li-desknet-schedule

  • li-kordiam-schedule config property desknetExternalElementIdMetadataPath

  • The public API endpoints of the 2025-05 do not support desknet in the path anymore

    That means the /desknet-integration sub-path is removed in /api/2025-05 and now only supports /kordiam-integration:

    /api/2025-05/desknet-integration/statuses
    /api/2025-05/kordiam-integration/statuses

    The api versions v1 till 2025-03 are not affected:
    /api/v1/desknet-integration/statuses
    /api/2025-03/desknet-integration/statuses

    But we suggest to migrate to the new versions that use kordiam in the path:
    /api/2025-03/kordiam-integration/statuses
    /api/2025-05/kordiam-integration/statuses

For instructions on how to migrate, please refer to our Desk-Net to Kordiam migration guide.

server Menu Tool

Removal of Menu Tool 🔥

The Menu Tool has been removed.

  • Menu items {liItem: 'menus'} are no longer supported. Please remove them from the project config.
  • Public API GET /api/:apiVersion/menus/:channelHandle? has been removed.
  • Feature li-menus has been removed including all its server APIs.
server Metadata plugin

Removal of config.contentTypes 🔥

The deprecated shorthand property config.contentTypes in the li-document-search metadata plugin was now removed. Use config.contentType instead.

server Data Sources

Removal of params.documentId in Data Sources 🔥

The params.documentId is no longer included in data source requests originating from the editor. If your integration depends on this parameter, please reach out to your customer solutions manager to discuss alternative solutions.

Facebook and Instagram oEmbed Providers Now Require Credentials 🔥

The Facebook and Instagram oEmbed providers are enabled by default when using the upstream oEmbed service. These providers require credentials to function correctly. Previously, missing credentials caused these providers to fail silently.

Livingdocs now throws an error if the credentials for Facebook or Instagram are not provided. Either define the credentials or disable the providers by excluding them from the oembed.allowedCoreProviders array.

Deprecations

There have been no deprecations since the last release.

Features

server/editor Exposure Boosting

Exposure Boosting 🎁

When using algorithmic teasers, the order of the documents is determined by a sort criteria. Oftentimes, this is the latest publication date. By activating the exposure boost for a document, it will appear before all non-boosted documents returned by an algorithm. This is useful, in scenarios where algorithms receive high frequency updates and important topics would get pushed down quickly. The effect will go away automatically after a certain time.

  1. Add the li-exposure-boost plugin to your content type metadata

    {
      handle: 'article',
      // ...
      metadata: [
        // ...
        {
          handle: 'exposureBoost',
          type: 'li-exposure-boost',
          config: {
            index: true
          }
        }
      ]
    }
    
    • handle: Make sure to use the same handle for all content types where the plugin is configured
    • indexing: The config option index needs to be enabled for it to work
  2. Generally allow exposure boosting for certain teasers in their service params schema

    {
      name: 'someTeaserService',
      paramsSchema: [
        // ...
        {
          handle: 'someTeaser',
          type: 'li-teaser',
          config: {
            // ...
            algorithm: {
              // ...
              allowExposureBoost: true
            }
          }
        }
      ]
    }
    
  3. Show the exposure boost UI on a Table Dashboard (optional)

    {
      handle: 'someDashboard',
      // ...
      columns: [
        // ...
        {
          label: 'Boost',
          minWidth: 100,
          growFactor: 0,
          priority: 1,
          metadataPropertyName: 'exposureBoost',
          editable: true
        }
      ]
    }
    

Visit the li-exposure-boost plugin page for more information.

Editor Document Inbox

Document Inbox for Data Records 🎁

The Document Inbox is now also supported for documents of type Data Record. It offers the same functionality as with other document types, including the ability to store images and documents, and organize them into groups.

One particular use case we had in mind is the use with Pitch documents, modeled as Data Records, to collect ideas for stories. The Document Inbox allows users to gather images or related stories that may prove useful when writing the final piece later on. If the document is transformed, the contents of the inbox are preserved and carried over to the resulting document.

To enable the inbox for a Data Record, configure which types of documents and media can be added to it.

{
  handle: 'pitch',
  documentType: 'data-record',
  ...
  inbox: {
    contentTypes: ['regular'],
    mediaTypes: ['image']
  }
}
server/editor Media Center

Media Center Image Editing 🎁

Journalists are sometimes required to redact areas of an image, such as license plates or faces, or to perform color corrections, such as adjusting brightness, contrast, or saturation. To simplify this task and eliminate the need for external tools, we are adding support for basic image editing.

Image Editor Button

We added a new image editor to Livingdocs. Users can open the editor by clicking the edit button in the media center detail view. It allows users to adjust brightness, contrast, or saturation, as well as blur parts of an image. The original image is always preserved and can be restored at any time. Users can also continue editing an image or selectively undo specific adjustments at a later point.

Image Editor

Image editing is currently supported for jpg, png, and webp formats when use2025Behavior is enabled. Accordingly, images must be requested via the public API endpoint GET /api/2025-03/mediaLibrary/serve-image/{key} for the modifications to be applied. The edited image will be delivered in place of the original. The original version remains stored and can be restored in the editor.

To avoid performance bottlenecks, ensure you place a CDN or image proxy in front of Livingdocs, retrieving images via the new API. This prevents excessive load on the Livingdocs Server.

Whenever an asset gets modified, we emit the mediaLibraryEntry.update server event. This event can be used to purge a CDN or other image service.

server/editor Integrations

PEIQ Integration - Agency Report Import 🎁

The Livingdocs integration with PEIQ has been enhanced to enable the import of agency reports. Users can now drag and drop an agency report from PEIQ into a Livingdocs dashboard to initiate the import.

The user experience may vary depending on the report’s contents and Livingdocs configuration:

  • If the agency report has no attached images and no paramsSchema is configured, the document is created and opened immediately. No user input is required.
  • If the agency report has no images but a paramsSchema is configured, users must complete the paramsSchema form before the document is created and opened.
  • If the report includes images but no paramsSchema, the media upload center opens to collect required metadata before creating and opening the document.
  • If both a paramsSchema and images are present, users first complete the paramsSchema form, then proceed to the media upload center before the document is created and opened.

At any point during this process, users can abort the import, in which case no document is created.

To enable this functionality, begin by configuring the settings.agencyReportImport property in your project configuration:

  • peiqFunctionHandle: The handle of a PEIQ function registered in your server
  • paramsSchema: An optional schema prompting the user to provide additional data after dropping an agency report into a dashboard
  • defaultParams: Default values to prefill the paramsSchema form
  • context: Optional additional data passed to the PEIQ function, useful when reusing a function
agencyReportImport: {
  peiqFunctionHandle: 'create-from-agency-report',
  paramsSchema: [
    {
      handle: 'category',
      type: 'li-category'
    }
  ],
  defaultParams: {},
  context: {
    contentType: 'regular'
  }
}

Next, register your PEIQ function. It will be called when an agency report is imported and must return a document object. The function receives the following arguments:

  • agencyReport: The raw agency report data returned by the PEIQ API
  • mediaLibraryEntries: If the report includes images, they are imported into the Media Library and passed to the function in this array
  • params: If a paramsSchema is defined, the submitted user values are passed here
  • context: The configured context from agencyReportImport is forwarded to the function
  • userId: The ID of the user performing the import
  • projectConfig: The project configuration
liServer.registerPeiqFunction({
  handle: 'create-from-agency-report',
  action({agencyReport, mediaLibraryEntries, params, context, userId, projectConfig}) {
    return {title, contentType, metadata, metadataSource, translations, content}
  }
})
editor Media Center

Media Center - Delete language metadata set 🎁

When using the multi-language metadata feature for media types, users can now not only add new translation languages but also remove existing translations if they are no longer needed. To support this, we’ve added a new button to a translated metadata set that allows users to delete a language from a media library entry.

Remove Metadata Translations Button
editor Table Dashboards

Table Dashboards - Support All Metadata Cells 🎁

In earlier iterations of the Table Dashboards, metadata plugin support was limited. However, as the feature has become more widely adopted inconsistencies across plugin behaviour became confusing and problematic.

This release addresses that gap by adding support for a broader range of metadata plugins in table dashboards, improving completeness and consistency across the system. Newly supported plugins include:

  • li-datetime, li-system-datetime
  • li-date, li-system-date
  • li-enum, li-system-enum
  • li-document-references
  • li-target-length
server oEmbed

Additional oEmbed Providers Bluesky, Pinterest and Reddit 🎁

We’ve added support for three new oEmbed providers:

  • Bluesky
  • Pinterest
  • Reddit

Using allowedCoreProviders is strongly recommended to configure these providers due to a breaking change introduced regarding Facebook and Instagram providers.

{
  oembed: {
    allowedCoreProviders: [
      {name: 'li-bluesky'},
      {name: 'li-pinterest'},
      {name: 'li-reddit'},
      ...
    ]
  }
}

No additional configs are required as the providers do not support any customisations.

editor Clipboard

Added Clipboard Context

This release enhances clipboard usability for nested components. Previously, when copying or cutting nested components, the clipboard displayed only the component name, with no descriptive context making it difficult to distinguish between components, especially those with identical names. The clipboard preview now includes the content of the first descendant as a description, providing better context and improving the overall editing experience.

editor Teaser Sidebar

Clickable Titles in Teaser Sidebar

Teaser titles are now clickable, allowing editors to directly open the linked article in a new window without needing to navigate to it manually. This enables more efficient workflows for all those roles that work with the teaser sidebar.

Vulnerability Patches

We are constantly patching module vulnerabilities for the Livingdocs Server and Livingdocs Editor as module fixes are available. Below is a list of all patched vulnerabilities included in the release.

Livingdocs Server

This release we have patched the following vulnerabilities in the Livingdocs Server:

No known vulnerabilities. 🎉

Livingdocs Editor

This release we have patched the following vulnerabilities in the Livingdocs Editor:

We are aware of the following vulnerabilities in the Livingdocs Editor:

  • CVE-2023-44270 vulnerability in postcss, it affects linters using PostCSS to parse external Cascading Style Sheets (CSS). It is not exploitable in the editor as we don’t load untrusted external CSS at build time.
  • CVE-2023-26116, CVE-2023-26118, CVE-2023-26117, CVE-2022-25869, CVE-2022-25844 are all AngularJS vulnerabilities that don’t have a patch available. We are working on removing all AngularJS from our code and vulnerabilities will go away when we complete the transition to Vue.js.

Patches

Here is a list of all patches after the release has been announced.

Livingdocs Server Patches

  • v276.3.11: fix(migrations): Remove li-metadata-translations presence check

  • v276.3.10: fix(media-center): Fix mediaLibrary.images.variantsStorage config check when cloudinary is configured

  • v276.3.9: fix(LIFEAT009): in-memory dashboard filter caching in liEmbedTeaserIncludeModal

  • v276.3.8: fix(migrations): Change the documentWriteModel.version correctly after persisting migration changes

  • v276.3.7: fix(deps): update dependency @livingdocs/framework from 32.7.7 to v32.7.8

  • v276.3.6: fix(deps): update dependency @livingdocs/framework from 32.7.6 to v32.7.7

  • v276.3.5: fix: Convert gif images to webp when rendering in the editor

  • v276.3.4: fix: Support downloading images from /serve-image endpoint

  • v276.3.3: fix(queue): Execute redis streams cleanup only on worker

  • v276.3.2: fix(data-migration-run): Parse argument –filter-by-id to integers

  • v276.3.1: fix(peiq-agency): Improve handling of empty property image_ids

Livingdocs Editor Patches

  • v117.6.22: fix(LIFEAT009): in-memory dashboard filter caching in liEmbedTeaserIncludeModal

  • v117.6.21: fix(drop-handler): Support undefined params on include teaser drop

  • v117.6.20: chore(metadata): Clear li-video-reference poster image state

  • v117.6.19: fix(document search): prioritize activeFilters param over cached filters

  • v117.6.18: fix: scroll focused component into view after iframe size has stabilized

  • v117.6.17: fix(media-library): Pass valid mediaLibraryEntry on tooltip select

  • v117.6.16: fix(deps): update dependency @livingdocs/framework from 32.7.7 to v32.7.8

  • v117.6.15: fix(deps): update dependency @livingdocs/framework from 32.7.6 to v32.7.7

  • v117.6.14: fix(image-editing): Show image editor button also if it is the only action

  • v117.6.13: fix: Disable supportsVideoConversion in rendering image service

  • v117.6.12: fix: dont disable metadata button

  • v117.6.11: fix(deps): Update Pintura to v8.92.14

  • v117.6.10: fix: Compute clipboard image URL with rendering image service

  • v117.6.9: fix: Remove non-existent linked Pintura package from downstream tests

  • v117.6.8: fix(ticker): Prevent component blur when clicking on component area

  • v117.6.7: fix: Download images from /serve-image endpoint

  • v117.6.6: fix(login): Show login errors correctly. Do not prune the hash part if it doesn’t include a token parameter

  • v117.6.5: fix(properties-panel): Always show “Has local changes” for documents

  • v117.6.4: fix(drag-drop): Clear up markers after dragend event

  • v117.6.3: fix(core): Replace app when registering project settings components

  • v117.6.2: fix(properties-panel): Hide edit local version when empty


Icon Legend

  • Breaking changes: 🔥
  • Feature: 🎁