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": "release-2019-12",

Livingdocs Server Patches

  • v91.0.12: fix: Enable package-lock.json file to fix shrinkwrap with optional dependencies
  • v91.0.11: chore: remove bluewin downstream tests from drone.yml
  • v91.0.10: chore: Update the npm token
  • v91.0.9: fix(tasks): remove interactive -y question to show the help when no parameter has been passed
  • v91.0.8: migration: validate a livingdocs after the file migration and not before
  • v91.0.7: index: allow to reindex by contentType or documentType
  • v91.0.6: hugo-import: Allow import of articles with missing images
  • v91.0.5: indexing: add delay when elastic cpu passes threshold / reindex newest documents first
  • v91.0.4: localAuth: correctly delete all identities
  • v91.0.3: setup-project: start downstream with config
  • v91.0.2: includes: add label to schema
  • v91.0.1: Use a new yargs instance instead of the global one to prevent conflicts with downstreams

Livingdocs Editor

How to require the editor in your package.json:

"dependencies": {
  "@livingdocs/editor": "release-2019-12",

Livingdocs Editor Patches

  • v42.9.50: fix(resolve-conflicts): check only on content, document.version and userId
  • v42.9.49: test(conflict): add tests
  • v42.9.48: fix: add allow-downloads flag to support chrome 83
  • v42.9.47: fix(collaboration): when a expired softlock is in the metadata
  • v42.9.46: fix: correctly reset filter sets
  • v42.9.45: fix(editor): pass editableConfig to framework again
  • v42.9.44: fix(date-picker): never set null when date reset
  • v42.9.43: refactor(livingdoc): do not pass editable config anymore
  • v42.9.42: fix(image-crop): Reset originalWidth/Height on upload

Fixes: An uploaded image might use the wrong dimensions of a previously selected image when calculating crop.

  • v42.9.41: fix: update framework to 13.2.7
  • v42.9.40: fix(image): take processedUrl from image service instead of originalUrl for image cropping
  • v42.9.39: fix: iframe scan regex
  • v42.9.38: fix: Use package-lock.json file to generate the shrinkwrap to fix the optional dependencies
  • v42.9.37: chore: update mocha from v5 to v7
  • v42.9.36: fix: npm package
  • v42.9.35: chore: drone/docker issue
  • v42.9.34: chore: trigger ci
  • v42.9.33: fix(icons): re-add timetable icon
  • v42.9.32: fix(memory-leaks): save bind to use in off function
  • v42.9.31: fix(documentProxy): Fix an issue where an empty list of documents throws
  • v42.9.30: refactor(undefined-array): use understandable language patterns
  • v42.9.29: fix(idle-user): if user didn’t push since 2 cylces
  • v42.9.28: fix(multi-select-deletion): use draft instead of document
  • v42.9.27: fix(update-error): show error and go into read-only
  • v42.9.26: fix(insert): on read-only don’t show insert components
  • v42.9.25: fix(print-modal): use lodash clonedeep
  • v42.9.24: fix: stop updating document in history mode
  • v42.9.23: fix(http): Disable http2 by default as it’s causing a crash streams that are cancelled before they ended
  • v42.9.22: fix(print-preview): setup print preview in workspace
  • v42.9.21: fix(unlock-timeout): on lockComponent otherwise it will flicker
  • v42.9.20: fix(embeds-loading): rename activateEmbeds
  • v42.9.19: fix(metadata): update metadata correctly
  • v42.9.18: fix(component-lock): lock component on crop screen
  • v42.9.17: fix(metadata-update): metadata text_form_controller update on changes
  • v42.9.16: fix(edit-mode): don’t open interactive view twice
  • v42.9.15: fix: ensure message for overwritten metadata shows
  • v42.9.14: fix(package.json): update the framework to 13.2.0
  • v42.9.13: fix(real-time): listen on html and data changes on component
  • v42.9.12: fix(package): downgrade monaco editor due to failing package
  • v42.9.11: drag-and-drop: Cancel drop if no target channels configured
  • v42.9.10: hugo: Use / as huGO image source field delimiter
  • v42.9.9: correctly resolve document publishers name
  • v42.9.8: component-styles: update styles selection on update
  • v42.9.7: config: Add sourcePolicy to channel config settings
  • v42.9.6: add missing downstream icon
  • v42.9.5: correctly return tasks from dashboard model
  • v42.9.4: conflicts: only show message if it is a shown metadata property


Real Time Collaboration 🎉

The users can now work on the same document at the same time. The editor will update automatically to the newest version and shows where the other users are editing.

  • Content and metadata are synchronized with other users

    • When a new version of a document is saved to the server through another user the document in the editor is updated without blocking.

    • When a user is editing on a component the other user will see on which component a user is working and can’t edit this component during that time concurrentEditing

    • When metadata are changed through another user this changes will also be automatically synchronized

    • when a comment is created it will be also synchronized

    • when a user is on the publish screen and another is updating the content it will show a message on the publish screen that the content is updated publishscreen_updatecontent

  • conflict handling

    • if the content is updated with the server version and there were changes on the same component the conflict mode is opened and a user can solve the conflicts conflictMode

    • if the same metadata property is changed the version from the server will be taken and a message is shown that the local version is overwritten.

  • all users which are on the document are shown

    • it shows which users are viewing the document
    • it shows which users are editing
    • the same information is also shown on the publish screen
  • In the history the moves of a component will be also marked


Server and Project Administrator Improvements 🎉

For the December release we worked on several improvements for Admins. Here is a summary of the changes:

  • A server admin can reactivate an archived user #2977 🎁.
  • A server admin can create a user with an optional lifespan #2967 🎁.
  • A project admin can initiate a design migration (design bump) #2811 🎁.
  • A project admin can invite a user which already existed in another project #2641 🪲. The invitation was only possible for new users and is now fixed.

Desk-Net Integration 🎉

We previously released a MVP for the Desk-Net integration. With the December release we went from MVP to fully supported feature.

The additions:


Breaking Changes 🔥

Migrate the database 🔥

The database migration is expected to be fast, easy and without issues. The fields channels.disabled_versions and channels.available_versions are deleted, but were not used in the last release.

# run grunt migrate to update to the newest database schema
# migration - 125-add-group-member-list-table.js
#   fix the migration script for the group_project_members table
# migration - 126-migrate-scope-column-to-text.js
#   migrating the scope column on the group_projection_v3 table from a varchar(255) to a text type
# migration - 127-remove-channel-disabled-design-version.js
#   remove not used 'channel.disabled_versions' and 'channel.available_versions'
livingdocs-server migrate up

Drop Support for Node 8 🔥

All our services and customers are already using node 10, but in case you’re on an old version, make sure that you’re either using our base images livingdocs/server-base:12.0 for node 12 or livingdocs/server-base:10.0 for node 10.


Drop Support for Elasticsearch <6.x 🔥

Drop support for Elasticsearch < v6.x. Please upgrade your metadata mapping and configure the server config search.apiVersion to 6.x. As reference, we’ve introduced Elasticsearch 6 in #2017.


Removed Functions and Properties from the channelApi 🔥

We removed all functions related to the available versions and disabled versions that were previously stored on channel records. These function were not used as far as we know and had an inconsistent API.

The following functions are removed from the channelApi:

  • 🔥 channelApi.removeDesignVersion()
  • 🔥 channelApi.addDesignVersion()
  • 🔥 channelApi.enableDesignVersion()
  • 🔥 channelApi.disableDesignVersion()
  • 🔥 channelApi.isDesignEnabled()
  • 🔥 channelApi.isDesignVersionDisabled()
  • 🔥 channelApi.isDesignVersionAvailable()

The following functions are removed from the channel_model:

  • 🔧 channelModel.isCurrentDesignVersion()


Editor: Introduce Draft and DraftStorage to Workspace 🔥

The workspace internals got a big refactoring so we can support realtime-collaboration.

If you have custom code in you livingdocs-editor search your project for the following accessors:

  • workspace.document: replaced by the new workspace.draft. The draft offers most properties that were available on the document (but mind that is now workspace.draft.documentId). The loaded document now is readOnly and is internally stored in draft.remoteDocument. Also any changes through draft.livingdoc, draft.metadata and draft.changeTitle() are monitored and it should not be necessary to call autosave.informOfChanges() anymore.
  • workspace.metadata: use workspace.draft.metadata instead
  • workspace.autosave: now lives in workspace.draftStorage.autosave. But it is better to not access autosave directly but use draftStorage directly.


Show correct components in the editor for legacy group definitions in the design 🔥

🔥If you still define component groups within layouts in your design then groups defined on the top level of the design json will be ignored now.

But we recommend to upgrade your design config and define the allowed components, the default content and the wrapper directly on the contentType and define the component groups once in the design without using the layouts config at all.


livingdocs-server tasks 🔥

The livingdocs-server commands have been overhauled.

  • updated all descriptions for better comprehensibility
  • renamed commands where necessary
  • add -y flag to execute a script to make a destructive command more secure

🔥 🔥 🔥 When you integrate this pull request, please also search and replace the commands in your scripts/documentation/wiki 🔥 🔥 🔥

livingdocs-server database delete
- 🔥require '-y' to run the script

livingdocs-server database create
- 🔥require '-y' to run the script

livingdocs-server database create
- 🔥require '-y' to run the script

livingdocs-server search-index
- 🔥renamed from 'search-index' to 'es-search-reindex'
- 🔥require '-y' to run the script

livingdocs-server delete-document-index
- 🔥renamed from 'delete-document-index' to 'es-search-delete-index'
- 🔥require '-y' to run the script

livingdocs-server reindex-asset-index
- 🔥renamed from 'reindex-asset-index' to 'es-media-reindex'
- 🔥require '-y' to run the script

livingdocs-server delete-asset-index
- 🔥renamed from 'delete-asset-index' to 'es-media-delete-index'
- 🔥require '-y' to run the script

livingdocs-server cleanup-documents
- 🔥require '-y' to run the script
- 🔥removed '--before' parameter

livingdocs-server cleanup-migrations
- 🔥require '-y' to run the script
- 🔥removed '--before' parameter

livingdocs-server cleanup-metadata
- 🔥require '-y' to run the script

livingdocs-server setup-projects
- 🔥renamed from 'setup-projects' to 'project-seed'
- 🔥require '-y' to run the script

livingdocs-server project-delete
- 🔥require '-y' to run the script

livingdocs-server create-admin-user
- 🔥renamed from 'create-admin-user' to 'user-create-admin'
- 🔥require '-y' to run the script

livingdocs-server create-admin-users
- 🔥renamed from 'create-admin-users' to 'user-create-admins'
- 🔥renamed parameter --source to --file
- 🔥require '-y' to run the script

livingdocs-server redis-flushdb
- 🔥require '-y' to run the script

livingdocs-server project-reset
- 🔥renamed from 'project-reset' to 'project-truncate'
- 🔥require '-y' to run the script

livingdocs-server group-add-user
- 🔥renamed from 'group-add-user' to 'user-assign-group'
- 🔥require '-y' to run the script

livingdocs-server add-design
- 🔥require '-y' to run the script

livingdocs-server transform-to-configurable-channel
- 🔥require '-y' to run the script

livingdocs-server  parse-channel-config-v1-to-v2
- 🔥require '-y' to run the script


  • Overhaul of existing commands #2284
  • Add new command npx livingdocs-server group-add-user #2603 🎁

Other Changes