Contribute to this guide

guideCKEditor 5 changelog

This is the CKEditor 5 changelog guide. Here you will find information about the most important changes introduced in the release, new features, and bug fixes.

Information about both major and minor breaking changes is available, too, if the release introduces them. You can read more about breaking changes in CKEditor 5 in the Versioning policy guide.

You can find more information about each release in the blog posts linked at the start of each entry.

This guide provides the changelog information for the 3 latest releases of CKEditor 5. For older releases, refer to the release notes on GitHub.

# CKEditor 5 43.1.0 release

We are happy to announce the release of CKEditor 5 v43.1.0.

# Release highlights

This release includes important bug fixes and enhancements for the editor:

  • Block merge fields: In contrast to regular, inline merge fields, the block merge fields are designed to represent complex, block-level structures, such as a dynamically generated table, a row of products, or a personalized call-to-action segment. Block merge fields are supposed to be replaced by arbitrary HTML data when the document template is post-processed or exported to a PDF or Word file.

  • Nested dropdown menus: this release introduces a new UI component: nested dropdown menus. They can be used by feature developers to easily provide an advanced user interface where UI elements are organized into a nested menu structure.

  • Customizable accessible label: You can now configure the label for the accessible editable area through the editor settings, ensuring it fits your system’s needs.

  • Improved table and cell border controls: It is now easier to manage both table and cell borders. The table user interface now clearly indicates the default border settings, allowing you to set “no borders” (None) for tables and cells without any additional configuration.

    ⚠️ In some cases this update may lead to data changes in the tables’ HTML markup when the editor loads them. However, visually nothing will change, and the experience will be the same.

The full list of enhancements can be found below.

# MINOR BREAKING CHANGES

  • Reverted config.sanitizeHtml. In v43.0.0 we made a decision to move config.htmlEmbed.sanitizeHtml to a top-level property config.sanitizeHtml. However, we realized that it was a wrong decision to expose such a sensitive property in a top-level configuration property. Starting with v43.1.0 you should again use config.htmlEmbed.sanitizeHtml and/or config.mergeFields.sanitizeHtml. The editor will throw an error if config.sanitizeHtml is used. See the migration guide for additional context behind this decision.
  • ai: The structure and presentation of the list of AI commands in the toolbar have changed (a flat filtered list is now a nested menu). Additionally, if your integration customizes this user interface, please ensure your integration code is up-to-date.
  • ui: The default [aria-label] provided by InlineEditableUIView is now 'Rich Text Editor. Editing area: [root name]' (previously: 'Editor editing area: [root name]'). You can use the options.label constructor property to adjust the label.

# Features

  • comments: Added [data-author-id] to suggestion and comment markers in editing for easier integration and styling.
  • media-embed: Added support for new Twitter domain (x.com) and Instagram Reels. Closes #16435. (commit)
  • merge-fields: Introduced block merge fields. They are a new type of merge fields which are treated as block content in the editor editing area.
  • track-changes: Added [data-author-id] to suggestion and comment markers in editing for easier integration and styling.
  • ui: Introduced nested menu component for dropdowns. Closes #6399. (commit)
  • ui: Added support for the balloon toolbar in the multi-root editor. Closes #14803. (commit)
  • Allowed to configure the accessible editable area label via the config.label property. Closes #15208, #11863, #9731. (commit)

# Bug fixes

  • cloud-services: The refreshing mechanism (from the Token class) should retry after a failure to limit the chance of the user getting disconnected and data loss in real-time collaboration. (commit)
  • comments: The TrackChangesData#getDataWithAcceptedSuggestions() method will no longer throw errors when there are suggestions containing multi-range comments in tables.
  • document-outline: Editor no longer crashes during initialization when the TableOfContents and ImageBlock plugins are enabled. Closes ckeditor/ckeditor5#16915.
  • editor-classic: The widget toolbar no longer covers editor’s sticky toolbar when scrolling. Closes #15744. (commit)
  • editor-multi-root: The selection is no longer lost while clicking an editable containing only one block element. Closes #16806. (commit)
  • engine: Prevent from editor crashes when trying to style a long paragraph. Closes #16819. (commit)
  • html-support: The <hgroup> and <summary> elements should work with the source editing feature. Closes #16947. (commit)
  • list: A to-do list should preserve the state of the checked items on the data load. Closes #15602. (commit)
  • table: Changed default table and table cell properties to match the content styles. It fixes a problem with setting [border=none] on the table. Closes #6841. (commit)
  • table: Larger tables are no longer truncated in print mode. Closes #16856. (commit)
  • track-changes: The TrackChangesData#getDataWithAcceptedSuggestions() and TrackChangesData#getDataWithDiscardedSuggestions() methods will no longer throw errors when used in asynchronous load and save integration type.
  • ui: Nested menus in the menu bar and dropdowns should not get their panels focused when the main button is clicked. Closes #16857. (commit)
  • ui: Restored the ability to pin balloons to text nodes in the DOM tree. Closes #16958 #16889. (commit)
  • ui: The focus outline should remain visible upon closing a menu bar using the Esc key during keyboard navigation. Closes #16719. (commit)
  • ui: Balloon Editor toolbar no longer sticks out of the limiter element while scrolling. Closes #17002. (commit)

# Other changes

  • ai: The AI Assistant pre-defined commands toolbar dropdown will now use a new nested menu component instead of the flat list component.
  • comments: Moved Ctrl+Shift+E and Esc key handling code from individual features to the Annotations plugin to simplify the logic.
  • core: Reverted recent change to move config.htmlEmbed.sanitizeHtml to a top-level config property (config.sanitizeHtml). config.sanitizeHtml is no longer available and using it will throw an error.
  • html-embed: Reverted recent change to move config.htmlEmbed.sanitizeHtml to a top-level config property (config.sanitizeHtml). Starting from v43.1.0 config.htmlEmbed.sanitizeHtml is no longer deprecated.
  • merge-fields: Introduced config.mergeFields.sanitizeHtml config property. Use it instead of config.sanitizeHtml. config.sanitizeHtml is no longer available and using it will throw an error.
  • track-changes: Moved Ctrl+Shift+E and Esc key handling code from individual features to the Annotations plugin to simplify the logic.
  • typing: The package exports now the TextTransformationConfig type. (commit)
  • Updated translations. (commit)

# CKEditor 5 43.0.0 release

We are happy to announce the release of CKEditor 5 v43.0.0.

# Release highlights

# Merge fields

The new merge fields feature is a game-changer for creating document templates and other kinds of personalized or dynamic content. Thanks to this feature, you can insert placeholders into your content, indicating where actual values should go. These places are marked in the final content in a distinctive way, making it easy to later process the template and fill it with the actual values. The feature supports a preview mode too - you can define preview data sets, and see how the content will look like when real values are used directly in the editor. The plugin is highly customizable to fit various applications and scenarios. Finally, merge fields are fully integrated with our Export to Word, Export to PDF, and Import from Word features, both when they are used from the editor and via REST API.

We are extremely happy to share with you this highly demanded feature, and we cannot wait to listen to your feedback!

Make sure to visit our builder or documentation to learn more about the feature.

# Export to Word V2 as the default version

The V2 version of the export to Word feature introduced significant improvements, optimizations, and fixes. This update enhances the overall performance, making the export process faster and more reliable, especially for large documents. Key improvements include better handling of table borders, automatic detection of Word styles from CSS, and support for more text-related CSS properties, ensuring your documents maintain their intended formatting.

Starting this version, the V2 configuration becomes the default in the ExportWord plugin. Make sure to migrate your configuration if you are using it.

# Improved sidebar accessibility and navigation

We have introduced multiple enhancements to make the sidebar more accessible. Among other improvements, you can now use the Shift+Ctrl+E keystroke to move focus from the editor marker to the active annotation. When your comment reply is ready, you can quickly submit it using the new Ctrl+Enter shortcut. Also, navigation from one annotation to another is now possible by using arrow keys.

The full lists of keyboard supported actions can be reviewed in our Accessibility support guide.

# Important bug fixes and improvements

This release brings notable bug fixes and improvements to enhance your editing experience.

  • Several improvements have been made to typing in the editor, especially for Android IME and Safari. On Android, issues like duplicated characters and reverse writing effects have been resolved. In Safari, the reverse typing effect after focus change has been fixed.
  • A couple of UI improvements:
    • We replaced the visual indication of the selected option in dropdowns (blue background) with the checkbox marks to better indicate selected options, aligning visual cues across the toolbar and menu bar.
    • All editor types now support the menu bar.
    • Additionally, the special characters UI has been moved from a dropdown to a dialog. This unifies the action between the menu bar and toolbar, and also gives content creators quicker access to the always-on-top dialog.
  • We have improved the drawing of page break line algorithm to address the pagination feature issues. We also improved the performance of the plugin.

# React and Vue integrations updates

We have released new major versions of the React and Vue integrations. In both of them, we have migrated to JavaScript modules (ESM) and rewritten large parts of the codebases to support the latest versions of these frameworks and to follow the latest recommendations for writing the components.

We strongly recommend that you follow the release highlights to update to the latest versions:

# MAJOR BREAKING CHANGES

  • ckeditor5: Global name for the ckeditor5 package in the UMD builds has been changed to CKEDITOR.
  • ckeditor5-premium-features: Global name for the ckeditor5-premium-features package in the UMD builds has been changed to CKEDITOR_PREMIUM_FEATURES.
  • export-word: Export to Word V1 configuration format is deprecated, V2 is set as default. The exportWord.converterOptions configuration should be adjusted to new API. See the migration guide.
  • export-word: The auto_pagination configuration option in exportWord.converterOptions is set to false by default.

# MINOR BREAKING CHANGES

  • ckbox: The CKBoxUtils#getWorkspaceId() and CKBoxUtils#getToken() methods now return a promise instead of a resolved value.
  • comments: AnnotationView#focus() will focus the first view in the content collection instead of the view DOM element.
  • comments: Sidebar#addAnnotation() will expect the annotation view to meet the FocusableView interface (previously any UI View).
  • engine: Schema callbacks added through addChildCheck() will no longer add event listeners with high priority and will no longer stop checkChild event. Instead, these callbacks are now handled on normal priority, as a part of the default checkChild() call. This also means that listeners added to checkChild event on high priority will fire before any callbacks added by checkChild(). Earlier they would fire in registration order. This may impact you if you implemented custom schema callback using both addChildCheck() and direct listener to checkChild event. All above is also true for addAttributeCheck() and checkAttribute event and callbacks.
  • html-embed: HTML Embed plugin configuration value sanitizeHtml was moved from the htmlEmbed space to top-level configuration space. config.htmlEmbed.sanitizeHtml is now deprecated. It will still be used if it set, however we recommend updating the configuration as this property may be removed in upcoming releases.
  • real-time-collaboration: The size of avatars in the user presence list has been changed, which may affect integrations that depend on their dimensions. In addition, a focus border has been added to these avatars, which extends beyond the editor container. Please refer to the styling guide to learn how to change the look of the list.
  • real-time-collaboration: The collaboration user presence list dropdown now has a conditional overflow: scroll style (previously the style was permanent).
  • special-characters: Special characters plugin now uses a dialog (instead of a toolbar dropdown).
  • theme-lark: The --ck-list-button-padding custom property has been removed from the codebase.
  • track-changes: A substantial part of the SuggestionThreadView template was moved to a new view SuggestionView. It may affect you if you provided customization for suggestions annotations through an extended SuggestionThreadView or BaseSuggestionThreadView class. Please review updated API documentation for SuggestionThreadView#getTemplate() and SuggestionView#getTemplate(). You can extend SuggestionView the same way as SuggestionThreadView and BaseSuggestionThreadView, and provide the extended class through the newly added configuration property TrackChangesConfig#SuggestionView.
  • ui: We changed styles for “active” items inside menu bar and dropdowns lists. Previously, an active (chosen, enabled, opened, etc.) item was highlighted with a blue background. Now, the active element has a checkmark icon on the left.

# Features

  • ckbox: The image upload and edit buttons are now disabled if the user has no permission to upload an asset. (commit)
  • ckbox: Added more configuration options passed down to the CKBox. Closes #3695. (commit)
  • collaboration-core: Introduced the AriaDescriptionView class that brings aria-describedby functionality to any view.
  • collaboration-core: Introduced the LateFocusButtonView and LateFocusDropdownButtonView classes that are specific buttons, for which focus event is fired after mouseup instead of mousedown. This delays all focus-related actions until the button action is performed.
  • comments: Introduced keyboard navigation and screen reader support to the annotations sidebar.
  • editor-balloon: Added support for the menu bar. Closes #16571. (commit)
  • editor-inline: Added support for the menu bar. Closes #16571. (commit)
  • engine: Schema#addChildCheck() and Schema#addAttributeCheck() can now register a callback for a specific item or attribute, which should improve performance when using custom callback checks. Callback checks should be added only for specific item or attribute if possible. See the API reference. Closes #15834. (commit)
  • export-word: Added config.exportWord.converterOptions.language configuration property to set the language of the exported Word document. The editor’s content language will be used by default.
  • heading: Simplify TypeScript types of the Heading plugin configuration. (commit)
  • image: The image upload and edit buttons are disabled if the user has no permission to upload any asset. (commit)
  • import-word: The comments and suggestions imported from Word documents will preserve the original dates respecting the local timezone.
  • List: The list styles can be enabled for selected list types. Closes #15554. (commit)
  • merge-fields: Introduced the merge fields feature.
  • real-time-collaboration: Made the real-time collaboration user presence list accessible to screen reader users.
  • special-characters: Added menu bar integration for special characters. New component menuBar:specialCharacters is now by default added in “Insert” menu. Closes #16501. (commit)
  • track-changes: Introduced keyboard navigation and screen reader support to the annotations sidebar.
  • ui: Introduced keystroke handler options in FocusCycler#constructor() to allow for fine-tuning of the class behavior. (commit)
  • ui: Implemented a new FocusCycler#chain() method to connect multiple focus cyclers and provide seamless keyboard navigation across complex user interfaces. (commit)
  • ui: Redesigned “active state” style for menu bar dropdown items. Closes #16572. (commit)
  • utils: Introduced events filtering in KeystrokeHandler#set() to allow for fine-tuning of the helper’s behavior. (commit)

# Bug fixes

  • ai: Opening AI Assistant with a selection containing an empty line will no longer cause a crash.
  • ai: AI Assistant will now correctly handle selected content containing empty lines.
  • ckbox: Use a safer way to convert numbers to strings to avoid issues with some bundlers. Closes #16040. (commit)
  • comments: The user had to click the annotation button twice to execute an action as the first click focused the annotation and caused it to move away, which prevented the click.
  • engine: Schema#checkChild() will now correctly check custom callback checks for each item in the context. (commit)
  • engine: insertcontent-invalid-insertion-position exception is no longer thrown after pasting content containing block element + non-paragraph + block element elements. Closes #16321. (commit)
  • engine: Predictive text should not get doubled while typing. Closes #16106. (commit)
  • engine: The reverse typing effect should not happen after the focus change. Closes #14702.Thanks, @urbanspr1nter!. (commit)
  • engine: Typing on Android should avoid modifying DOM while composing. Closes #13994, #14707, #13850, #13693, #14567. Closes: #11569. (commit)
  • engine: Formatting should not get lost on a text with a marker in a table cell during upcast. (commit)
  • export-word: The author name of suggestions from an imported Word document will be correctly persisted after exporting and importing this document again.
  • find-and-replace: Allow to pass searchTerm when using findCallback in find command. (commit)
  • link: Creating a link in sentences containing an empty line will no longer cause a crash. Closes #16660. (commit)
  • list: Text nodes directly inside <ul> or <ol> should not be removed while loading editor data. Closes #16450. (commit)
  • mention: Escape mentions markers when building regular expression to prevent crashes when markers like '' are used. Closes #16818. (commit)
  • pagination: No longer generate an extra empty page after placing a page break after an element with a margin.
  • pagination: Should not apply additional styles on pageBreak element.
  • pagination: The pagination feature no longer skips pages when handling large tables. Closes https://github.com/ckeditor/ckeditor5/issues/14426.
  • pagination: The pagination renders pages differently depending on user selection.
  • real-time-collaboration: The deleted comment thread will no longer be brought back after restoring a revision in which it existed.
  • table: Horizontal split button no longer splits larger table cell spans into more than two parts. Closes #14658. (commit)
  • theme-lark: Addressed a regression in the height of buttons displayed inside lists (such as buttons in annotation menus). (commit)
  • track-changes: The user had to click the annotation button twice to execute an action as the first click focused the annotation and caused it to move away, which prevented the click.
  • track-changes: Fixed editor crash when accepting or discarding a replace suggestion with multiple parts including adding or merging a block element (paragraph, etc.).
  • typing: Predictive text should not get doubled while typing. Closes #16106. (commit)
  • typing: Typing on Android should avoid modifying DOM while composing. Closes #13994, #14707, #13850, #13693, #14567. Closes: #11569. (commit)
  • ui: Hide the pinned balloon panel view when the pin target is no longer visible. Closes #16739. (commit)
  • ui: Block toolbar button no longer remains fixed in the same position while scrolling the editable content. Closes #5460. (commit)
  • ui: The user should be able to move the focus back to where it came from upon Esc key press while navigating the menu bar. Closes #16683. (commit)
  • ui: Add /* #__PURE__ */ comments before mixin calls to properly tree-shake unused classes. Closes #16651. (commit)
  • ui: Improve accessibility of toggleable menu bar items by marking them as menucheckbox aria roles. (commit)
  • ui: Fixed element tag name from <label> to <span> in the color picker component to improve the accessibility. (commit)
  • ui: Changed the place of restricted editing buttons in the menu bar to correct ones. Closes #16609. (commit)
  • UI: The aria-live views will no longer violate the a11y aXe rule: landmarks should be unique. Closes #16544. (commit)

# Other changes

  • autoformat: The blockAutoformatEditing and the inlineAutoformatEditing are now exported from the package index. Closes #16815. (commit)
  • ckbox: The plugin no longer slows down the editor startup because it fetches the token in the background instead of during the editor’s initialization. Closes #16760. (commit)
  • ckeditor5: Global name for the ckeditor5 package in the UMD builds have been changed to CKEDITOR. Closes #16798. (commit)
  • ckeditor5-premium-features: Global name for the ckeditor5-premium-features package in the UMD builds have been changed to CKEDITOR_PREMIUM_FEATURES.
  • engine: Introduced Schema#trimLast(). (commit)
  • engine: The Model#insertContent() method should keep inline objects in the same auto paragraph as text nodes and other inline objects. See #16321. (commit)
  • engine: The Schema#checkMerge() method should return false if one of the elements is a limit element. See #16321. (commit)
  • export-word: Set export word v2 as default.
  • html-embed: HTML Embed plugin configuration value sanitizeHtml was moved from the htmlEmbed space to top-level configuration space. config.htmlEmbed.sanitizeHtml is now deprecated.
  • page-break: No longer generate an extra empty page after placing a page break after an element with a margin. (commit)
  • pagination: Enhance the performance of rendering large documents when the pagination plugin is enabled.
  • special-characters: Special characters plugin now uses a dialog (instead of a toolbar dropdown). (commit)
  • track-changes: Part of the SuggestionThreadView template was moved to a new view SuggestionView.
  • track-changes: Configuration property SuggestionView was added to enable the SuggestionView class customization.
  • track-changes: Made the track changes icon more in line with other icons in the icon set.
  • ui: Added the LabelWithHighlightView and ButtonLabelWithHighlightView components to the UI library. (commit)
  • ui: Added the filterGroupAndItemNames() helper to the UI library. (commit)
  • ui: The SearchTextView#reset() method will also reset the scroll of its filteredView to the top. (commit)
  • Updated translations. (commit, commit, commit, commit)

# CKEditor 5 42.0.2 release

We are happy to announce the release of CKEditor 5 v42.0.2.

# Release highlights

This is a patch release that includes the following bug fixes for new installation methods introduced in v42.0.0:

  • Fixed type definitions for the imports used in the optimized build (see #16684).
  • Fixed minor issues with the ckeditor5-editor.css, ckeditor5-content.css, and other optimized style sheets (see #16703).
  • Fixed issues with installing and loading the CKEditor 5 packages using Yarn PnP (see #16646).
  • Fixed issues with loading CSS and translation files with older bundlers, such as Vite 2 and Vite 3 (see #16638).

Additionally, we fixed some performance issues in the track changes plugin. The editing experience was heavily affected if there were many (hundreds or more) suggestions in the document. This was a regression introduced in v41.0.0.

# Bug fixes

  • ckeditor5: Changed the path to the types in the package.json. See #16684. (commit)
  • ckeditor5: Updated the exports field in package.json to fix issues with loading CSS and translations in older bundlers. See #16638. (commit)
  • ckeditor5-premium-features: Changed the path to the types in the package.json.
  • ckeditor5-premium-features: Updated the exports field in package.json to fix issues with loading CSS and translations in older bundlers.
  • Added dependencies used in the new dist folder as production dependencies instead of devDependencies. Related to #16646. (commit)

# Other changes

  • track-changes: Performance fixes for scenarios where hundreds of suggestions exist in the document.