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


This release consists of the following new versions of the livingdocs-server and the livingdocs-editor:


Livingdocs Server

How to require the server in your package.json:

"dependencies": {
  "@livingdocs/server": "v83.2.11",

Livingdocs Server Patches

  • v83.2.11: bump framework includes componentConversion match all flag and links are correctly copied
  • v83.2.10: fix(request-logger): extend with user id through verified token
  • v83.2.9: fix(add-pagination-config): add pagination config for document-lists
  • v83.2.8: fix: correctly pass userId for copied articles
  • v83.2.7: fix(render_pipeline): passing renditionNames to beforeRender hook
  • v83.2.6: fix(document-api): Re-introduce the accidentally removed path query support in documentApi.findOne
  • v83.2.5: chore: improve test naming for copy-controller
  • v83.2.4: chore: rotate npm token
  • v83.2.3: prevent group membership assignment from overwriting
  • v83.2.2: Disable Netlify feature flag
  • v83.2.1: Update livingdocs-framework for release-management
  • v83.2.0: webhooks via channel config

Livingdocs Editor

How to require the editor in your package.json:

"dependencies": {
  "@livingdocs/editor": "v39.2.31",

Livingdocs Editor Patches

  • v39.2.31: bump framework includes componentConversion match all flag and links are correctly copied
  • v39.2.30: fix(collaboration): Fix the user names that are shown when another user edits a document
  • v39.2.29: fix(compare-toggle): reset diffService selection

Revisions must be reset before compare started again

  • v39.2.28: fix(sortable-js): use version 1.9.0

because 1.10.0 doesn’t work with current version from angular-legacy-sortablejs-maintained

  • v39.2.27: fix: Migrate to the newer dependency injection syntax

  • v39.2.26: fix: finishing proofreading forces a new revision

  • v39.2.25: fix(search): Fix last publication date on search result

  • v39.2.24: chore: retrigger ci

  • v39.2.23: fix(history): always display published event

  • v39.2.22: chore: re-run ci

  • v39.2.21: fix(proofreading): improve dashboard card sorting

  • v39.2.20: fix(revision): Spacing

  • Fixed left spacing on revision items

  • Linted some lines

  • v39.2.19: fix(styling): display deleted articles warning red

  • v39.2.18: fix: dedicated element for dot for windows compat

  • v39.2.17: fix(ABAC): correctly access for multiple groups

  • v39.2.16: fix(tasks): show tasks in publish panel on the sidebar

  • v39.2.15: fix: increase the delay from 400 to 800 ms when leaving a document

  • v39.2.14: fix: set bowser version to 2.5.2 to prevent building problems

  • v39.2.13: fix(filter): allow notContentType in dashboard filters to be a value or an array

  • v39.2.12: fix(styleguide): adapt wording

  • v39.2.11: fix(proofreading): show truck status

  • v39.2.10: fix(lists): don’t always hide the delete button

  • v39.2.9: tasks: respect policy for priority updates

  • v39.2.8: track changes polishing

  • v39.2.7: show fast-truck icon always in the same size

  • v39.2.6: dashboard: handle errors when an item has no metadata config

  • v39.2.5: crop-size: use image size as max value for crop

  • v39.2.4: resolve filter properly when query string is set in url on a custom dashboard

  • v39.2.3: fix ‘load more articles’ computation

  • v39.2.2: add default label for tasks

  • v39.2.1: correctly initiate lock-mode from history

  • v39.2.0: fix: show modified components in the diff view


Track Changes (Differ) 🎉

We now have the much anticipated Track Changes feature as official version in the editor 🎉. Track Changes shows you all the changes between two versions of a document e.g.

  • added and removed components
  • added and removed text
  • modified components (style changes, image change, embed changes)

Every change is labeled by the user who did the change. You are also able to configure the color palette of the changes to match your design. Changed component are marked with colored and labled boxes. In the history sidebar you can switch between the compare and the revision selection mode. All the existing functionality for show a specific version or revert to it are still there. The task events are now also showed in the history. Track Changes can be found in the History menu of the editor.

We removed the beta version config option diffViewEnabled because track changes are now included in the history.



Custom Realtime Proofreading Task Dashboard 🎁

In the last few sprints, we worked on different aspects of the editor to improve the proofreading process and to make parts of it customisable. This guide shows you, how you can set up your own proofreading dashboard with your own design card.

Pin Component Feature 🎁

Components can now be pinned which prevents both deletion and moving of the component. In the sidebar you can see a pin icon in the sidebar when a component is focused. Clicking it pins the component according to the rules:

  • if it is alone in a container it can not be moved, deleted nor can anything be moved or inserted before or after it (perfect for a fixed article header)
  • if it is next to other components, it can not be moved nor deleted, but other components can be moved or inserted around it

Enable the pin feature in the editor:

pinComponents: {
  isEnabled: true

You can read more about the feature in the references section.


Prefill Author 🎉

Allow the author on the metadata screen to be prefilled from the currently logged in user. This requires setting up data-records for users and some metadata configuration in contentTypes.


Breaking Changes 🔥

Migrate the database

# run grunt migrate to update to the newest database schema
# migration - 118-add-configs-table.js
#   create config_indexes + config_properties table
# migration - 119-migrate-channel-configs.js
#   migrate channel configs
livingdocs-server migrate up

Document API Refactoring

For the next version of access management (hooks for now), we need to refactor the documentApi. By removing complex and not much used queries, it’s easier to restructure the API and make the queries much more performant (less database calls).


documentApi.findOne experienced these changes:

  • ♻️ returns now all possible data from the model (before we filtered the object)in there.
  • 🔥 removed options.fields parameter (has no effect anymore).
  • 🔥 removed first_publication
  • 🔥 removed revision_user
  • 🔥 removed owner
  • ➕ added revision.user_id
  • ➕ added first_publication_id
  • ➕ added last_publication_id

Needed Actions 🔥

  • 🔥 check if the removed fields from the changes are used in the downstream and replace them.

Upgrade to Node 10

We’re dropping support for node 8. Please use node 10 from now on.

Needed Actions 🔥

  • 🔥 To upgrade the node version in your Docker files, please change all occurences of livingdocs/server-base:8 in your project to livingdocs/server-base:10.0.
  • ♻️ We now use a more secure imagemagick policy by default. If you need to overwrite our imagemagick policy, please use such a declaration in your Dockerfile to use the default policy
FROM livingdocs/server-base:10.0
RUN cp /etc/ImageMagick-7/policy.original.xml /etc/ImageMagick-7/policy.xml

Update Elasticsearch Index

We now only store the reference to a user (userId) instead of the whole user object in Elasticsearch to prevent a reindexing when user info like the name changes. This release keeps the old properties on the Elasticsearch mapping to allow a smooth migration without the need to drop the old index.


These properties were added/deprecated from the document index (please migrate your code. In one of the next releases we will remove the deprecated properties)

  • 🔥 deprecate last_publication
  • ➕ added published_at (the last publish date as date type)
  • ➕ added published_by (the user id as keyword type, this replaces the last_publication.user object)
  • 🔥 deprecate revision
  • ➕ added updated_by (the user id as keyword type, this replaces the revision.user.first_name and revision.user.last_name properties)
  • 🔥 deprecate layout_name (got replaced by content_type some time ago)

Needed Actions 🔥

  • 🔥 Check and update your code to not use deprecated fields
  • 🔥 The mapping should update automatically during server start. If indexing fails for some reason, please run grunt search-index:documents:update-mapping
  • optionally reindex calling livingdocs-server search-index

Update Project Builders

Extracts the code of “Project Builders” from li-registration into it’s own feature li-project-builders. This allows to apply registered builders when creating a new project at any time.

Needed Actions 🔥

Change Builder Registration

  • 🔥 moved registrationApi.registerProjectBuilder to projectBuildersApi.registerBuilder


// Before
const registrationApi = liServer.features.api('li-registration')
  handle: 'awesome-project',
  builder: ({userId}, builderConfig, callback) => {
    buildMyAwesomeProject({userId}, builderConfig, callback)

// Now
const projectBuildersApi = liServer.features.api('li-project-builders')
  handle: 'awesome-project',
  async builder ({userId}, builderConfig) {
    const project = await buildMyAwesomeProject({userId}, builderConfig)
    return project

Change Builder Configuration

  • 🔥 moved/refactored server config registration to projectBuilders


// Before
registration: {
  defaultProjectBuilders: ['awesome-project'],
  projectBuilders: [
      handle: 'awesome-project',
      config: {}
      handle: 'another-project',
      config: {}

// Now
projectBuilders: {
  enabled: true,
  defaultBuilders: ['awesome-project'],
  builders: [
      handle: 'awesome-project',
      config: {}
      handle: 'another-project',
      config: {}

You can read more about the changes in the Project Builder PR

Rewrite Channel Config

You can skip this section when you are a business customer which configures the channel-config via files. This change replaces the event stream implementation with a simpler config properties store that makes it easier to add and test additional configurations. Also draft support is considered from the beginning. In the next release we will introduce new configuration and design workflows which base on this new implementation and will significantly ease working with and testing designs. And we will also gradually introduce new configuration options which can be defined per project instead of for the whole server (it will become possible to configure many options per project which currently can only be configured either in the editor or server configuration)

Breaking Changes in the ChannelConfig API

  • 🔥 removed channelConfigApi.execCommands()
  • 🔥 removed channelConfigApi.createChannelConfig()
  • 🔥 removed channelConfigApi.importConfig()
  • 🔥 removed channelConfigApi.linkConfig()
  • 🔥 removed channelConfigApi.importStaticConfigs()
  • 🔥 removed channelConfigApi.applyConfig() // only used by tests
  • :recycle changed return value for channelConfigApi.plan()
  • ➕ added channelConfigApi.createConfig()
  • ➕ added channelConfigApi.updateConfig()
  • ➕ added channelConfigApi.plan()

Needed Actions 🔥

  • 🔥 migrate the db with livingdocs-server migrate up
    • If there are problems with the automatic db migration you can skip it with EXPORT SKIP_DB_MIGRATION_119=true
    • There is also a manual migration that will migrate projects individually in ./node_modules/@livingdocs/server/db/manual-migrations/005-migrate-channel-config-streams.js
  • 🔥 Check and update your code to not use removed functions

You can find a much more detailed description of the rewrite in the Rewrite Channel Config PR.

Update Supported Browser Versions

This change removes supported browser versions to natively support ES2015 features.

  • 🔥 remove support for chrome 49-54
  • 🔥 remove support for safary 10
  • 🔥 remove support for firefox 52
  • 🔥 remove support for edge 12-15

Beta Versions

You can use and test beta features. Your feedback is highly appreciated. As long as a feature is in beta phase, we will sometimes change it’s UX, design or config if needed.

Attribute Based Access Management (ABAC) 🎉

We have implemented a first version of Attribute Based Access Management (ABAC). At the moment only 2 Policies are implemented: a dashboard.get and a document.metadata.update Policy. If you want to know more, you can check these PRs:

Desk-Net Integration 🎉

In collaboration with Mainpost we developed a first version of a Desk-Net integration into Livingdocs. In the next weeks we will decide how to improve and how to continue with the Desk-Net integration.

The current integration will connect a Livingdocs channel with a Desk-Net account.

  • Any “stories” created in Desk-Net will also create a related article in Livingdocs.
  • Desk-Net and Livingdocs title will be synced automatically.
  • Any changes to the publication status in Desk-Net or Livingdocs will also result in a publication (or a status change in case of Desk-Net) on the related entity.
  • Articles created from a Desk-Net signal in Livingdocs will have additional read-only metadata fields in the publication form.

Other Changes