| category | meta-title | menu-title | order | modified_at |
|---|---|---|---|---|
update-guides |
Update to version 47.x | CKEditor 5 Documentation |
Update to v47.x |
77 |
2026-03-04 |
You may try removing the `package-lock.json` or `yarn.lock` files (if applicable) and reinstalling all packages before rebuilding the editor. For optimal results, ensure you use the most recent package versions.
Released on 4 March, 2026. (See full release notes)
This release introduces a potential breaking change related to iframe handling in the editing view.
By default, iframe sandboxing is now enabled. The htmlSupport.htmlIframeSandbox configuration option responsible for this behavior defaults to true, which means an empty sandbox="" attribute is automatically added to all iframes rendered in the editing view.
Previously, iframes were not sandboxed by default and had full access to the surrounding page context. With this change, iframes are now restricted unless explicitly configured otherwise.
If you want to preserve the previous behavior (unsandboxed iframes with full access), you must explicitly disable this feature by setting the configuration option to false.
Besides true or false, the htmlSupport.htmlIframeSandbox configuration option accepts an array of strings. For example, if you want to allow only specific features, set it to allow-scripts. In this scenario, we will ensure that allow-scripts is the only value in the sandbox attribute. If the iframe already has other sandbox values, they will be removed; if it has no sandbox attribute, we will add sandbox="allow-scripts".
The srcdoc attribute is no longer rendered in the editing view.
Unlike iframe sandboxing, this change is permanent and cannot be disabled via configuration. Any iframe content provided through srcdoc will be ignored in the editing view going forward.
We have introduced a new ordered list style: the arabic-indic numerals. To use them, you need to explicitly activate the style in the {@link features/lists#enabling-specific-enumerators feature configuration}.
The same style is also available in the {@link features/footnotes#the-footnotesproperties-contextual-balloon footnotes} feature for numbering footnote markers.
The block indentation feature now supports applying visual indentation to list containers and list items. When the Indent, IndentBlock, and List plugins are all loaded, you can indent top-level lists using the toolbar buttons or keyboard shortcuts. The editor also recognizes margin-left styles on <ol>, <ul>, and <li> elements during data loading. See the {@link features/indent#indenting-lists Indenting lists} documentation for details.
The {@link features/export-pdf export to PDF} feature now supports {@link features/export-pdf#mirror-margins mirror margins} for book-like layouts. When enabled, left and right margins are treated as inner and outer margins that swap between odd and even pages, making it easy to prepare documents for double-sided printing or binding.
When using content tables together with layout tables, the <figure> element is stripped from tables in both cases by default. This version introduces a new flag {@link module:table/tableconfig~TableLayoutConfig#member-stripFigureFromContentTable stripFigureFromContentTable} which allows to change the behavior and preserve the <figure> element.
{@link features/ckeditor-ai-overview CKEditor AI} is now available as an on-premises deployment, giving you full control over the AI service by running it on your infrastructure. The on-premises version supports everything the cloud option offers, plus:
- Custom AI models and providers – use your models from OpenAI, Google Cloud, Microsoft Azure, or self-hosted solutions.
- MCP (Model Context Protocol) support – extend the AI with custom external tools by connecting MCP servers, enabling use cases like searching internal knowledge bases or querying company databases directly from the AI chat.
Learn more about {@link features/ckeditor-ai-deployment deployment options} and {@link features/ckeditor-ai-mcp MCP support}.
The {@link features/ckeditor-ai-review AI Review} feature now supports custom review commands defined by integrators. Until now, the review was limited to built-in commands like proofreading, clarity, readability, and tone adjustment. With this release, you can create review commands tailored to your editorial guidelines, brand voice, or domain-specific quality standards.
Custom commands are registered via config.ai.review.extraCommands and made visible in the UI through config.ai.review.availableCommands. The same option lets you reorder, filter, or shorten the list of built-in commands to match your needs. See the {@link features/ckeditor-ai-review AI Review documentation} for details.
We are introducing AI Chat Shortcuts, a new opt-in plugin that displays configurable shortcut buttons in the {@link features/ckeditor-ai-chat AI Chat} panel before the first message is sent. Shortcuts provide clear, actionable entry points that guide users toward the most useful AI capabilities – from launching a predefined prompt to starting a specific review or translation flow to navigating directly to the Review or Translate tab.
Integrators define shortcuts with a name, icon, and an action. Each shortcut can also configure which AI capabilities (model, web search, reasoning) are active for the prompt. Learn more in the {@link features/ckeditor-ai-chat#chat-shortcuts AI Chat Shortcuts documentation}.
We upgraded @aws-sdk/client-bedrock-runtime to the latest version to address a recently disclosed security vulnerability in the fast-xml-parser dependency. This update is marked as a minor breaking change due to the use of dynamic imports in one of the underlying packages, which may impact certain build environments.
If you use webpack to build an editor bundle, configure it to bundle dynamic imports eagerly:
module: {
parser: {
javascript: {
dynamicImportMode: 'eager'
}
}
}If you do not use CKEditor AI with a dedicated bundle, no action is required.
-
ai: Simplified the default greeting message shown when starting a new AI Chat conversation. To restore the previous message content, set
config.ai.chat.welcomeMessageto the following:"Hi, I'm your AI assistant. Think of me as your writing buddy, reviewer, or research partner. I can suggest changes to your document, help generate ideas, offer feedback, discuss attached files, and much more!"
-
ai: Updated
@aws-sdk/client-bedrock-runtimeto version3.994.0. This update introduced dynamic imports in a dependency, which may affect some build environments.
Released on 11 February, 2026. (See full release notes)
The {@link features/ckeditor-ai-translate AI Translate feature} of CKEditor AI allows users to translate entire documents on the go. It provides a user interface similar to AI Review, but with translation-specific actions to streamline the process. The translation view displays the final translated document, with original snippets shown on the side for review and comparison.
The DOM structure of the {@link features/ckeditor-ai-chat CKEditor AI Chat} suggestions in conversation has changed, which may affect integrations that customized the UI and rely on specific CSS selectors.
Please make sure to update your integrations to use the new DOM structure.
Notable changes:
- "Apply all" and "Suggest all" buttons are now separate buttons instead of a dropdown.
- The toolbar with bulk "Apply" and "Suggest" ("Apply all" and "Suggest all") buttons belongs to the
.ck-ai-suggestion__bodyelement (previously in.ck-ai-chat__feed__item). - The
.ck-ai-suggestion__body__content-part__contenthas been replaced by.ck-content.ck-ai-suggestion-streamable-content.
Old DOM structure
div.ck-ai-chat__feed__item.ck-ai-chat__feed__ai-suggestion
├── div.ck-ai-suggestion__container.ck-rounded-corners
│ ├── div.ck-ai-suggestion__header
│ │ ├── span ("Change N" label)
│ │ └── button.ck-button.ck-ai-suggestion__header__show-changes-toggle
│ └── div.ck-ai-suggestion__body
│ └── div.ck-ai-suggestion__body__content-parts
│ ├── div.ck-ai-suggestion__body__content-part.ck-ai-suggestion__body__content-part_pending
│ │ ├── div.ck-ai-suggestion__body__content-part__title
│ │ │ ├── span.ck-ai-suggestion__body__content-part__title__label
│ │ │ └── div.ck-toolbar
│ │ │ └── div.ck-toolbar__items (Toolbar with "Preview", "Insert as suggestion", "Reject" buttons)
│ │ │ ├── button.ck-button
│ │ │ └── ...
│ │ └── div.ck-content.ck-ai-suggestion__body__content-part__content
│ │ └── (Content of the suggestion part)
│ └── ... Other changes suggested by the AI ...
└── div.ck-ai-chat__feed__ai-suggestion__actions
└── div.ck-splitbutton.ck-ai-chat__feed__ai-suggestion__actions (Dropdown with "Apply all", bulk "Suggest", and "Preview" buttons)
├── button.ck-button.ck-splitbutton__action
└── button.ck-button.ck-splitbutton__arrow
New DOM structure
div.ck-ai-chat__feed__item.ck-ai-chat__feed__ai-suggestion
└── div.ck-ai-suggestion__container.ck-rounded-corners
├── div.ck-ai-suggestion__header
│ ├── span ("Suggestion N" label)
│ └── button.ck-button.ck-ai-suggestion__header__show-changes-toggle
└── div.ck-ai-suggestion__body
├── div.ck-ai-suggestion__body__content-parts
│ ├── div.ck-ai-suggestion__body__content-part.ck-ai-suggestion__body__content-part_pending
│ │ ├── div.ck-ai-suggestion__body__content-part__title
│ │ │ ├── span.ck-ai-suggestion__body__content-part__title__label
│ │ │ └── div.ck-toolbar.ck-ai-suggestion-content-part-toolbar
│ │ │ └── div.ck-toolbar__items (Toolbar with "Apply change", "Add as suggestion", and "Reject change" buttons)
│ │ │ ├── button.ck-button
│ │ │ └── ...
│ │ └── div.ck-content.ck-ai-suggestion-streamable-content
│ │ └── (Content of the suggestion part)
│ └── ... Other changes suggested by the AI ...
└── div.ck-ai-chat__feed__ai-suggestion__actions (Separate buttons for bulk "Apply" and "Suggest")
├── button.ck-button.ck-ai-button-primary
└── button.ck-button.ck-ai-button-secondary
The DOM structure of the {@link features/ckeditor-ai-chat CKEditor AI Chat} suggestion {@link features/ckeditor-ai-chat#previewing-changes preview dialog window} has changed, which may affect integrations that customized the UI and/or rely on specific CSS selectors.
Please make sure to update your integrations to use the new DOM structure.
Old DOM structure
div.ck-dialog.ai-balloon.ai-balloon-rotator
├── div.ck-form__header
│ ├── button.ck-button.ck-off (Previous suggestion button)
│ ├── h2.ck-form__header__label (Suggestion title)
│ ├── button.ck-button.ck-off (Next suggestion button)
│ └── button.ck-button.ck-off (Close button)
└── div.ck-dialog__content
└── div.ai-balloon-content
├── div.ck-ai-suggestion__container.ck-rounded-corners
│ └── div.ck-ai-suggestion__body
│ ├── div.ck-ai-suggestion__body__content-parts
│ │ └── div.ck-ai-suggestion__body__content-part.ck-ai-suggestion__body__content-part_pending.ck-ai-suggestion__body__content-part_active
│ │ └── div.ck-content.ck-ai-suggestion__body__content-part__content
│ │ └── (Content of the suggestion)
│ └── div.ck-toolbar.ck-ai-mini-toolbar
│ └── div.ck-toolbar__items
│ └── button.ck-button (Show changes button)
├── div.ck-ai-balloon__disclaimer
│ └── p.ck-ai-balloon__disclaimer-content
└── div.ck-toolbar.ck-ai-balloon__toolbar
└── div.ck-toolbar__items
├── button.ck-button.ck-ai-button-primary ("Apply" button)
└── button.ck-button.ck-ai-button-secondary ("Suggest" button)
New DOM structure
div.ck-dialog.ck-ai-balloon.ck-ai-chat-balloon
├── div.ck-form__header
│ ├── button.ck-button.ck-off (Previous suggestion button)
│ ├── button.ck-button.ck-off (Next suggestion button)
│ ├── h2.ck-form__header__label (Suggestion title)
│ └── button.ck-button.ck-off (Close button)
└── div.ck-dialog__content
└── div.ck-ai-chat-balloon-main.ck-ai-chat-balloon-main_state_pending
├── div.ck-content.ck-ai-suggestion-streamable-content
│ └── (Content of the suggestion)
└── div.ck-ai-chat-balloon__toolbar-container
├── div.ck-toolbar.ck-ai-suggestion-content-part-toolbar
│ └── div.ck-toolbar__items
│ ├── button.ck-button ("Apply change" button)
│ ├── button.ck-button ("Add as suggestion" button)
│ └── button.ck-button ("Reject change" button)
├── div.ck-ai-suggestion__content-part-state.ck-ai-suggestion__content-part-state_pending.ck-hidden
│ └── span.ck-ai-suggestion__content-part-state__label
└── div.ck-toolbar.ck-ai-mini-toolbar
└── div.ck-toolbar__items
└── button.ck-button ("Show changes" button)
We improved how multiple changes proposed by the {@link features/ckeditor-ai-chat AI Chat} feature are presented. Suggested changes now appear as cards that can be previewed in the content and applied consistently in both single-change and multi-change scenarios. This release also includes several under-the-hood improvements.
The {@link features/export-pdf export to PDF} feature now supports version 2 of the HTML to PDF converter API, bringing several {@link features/export-pdf#html-to-pdf-converter-features powerful enhancements} to document generation.
Advanced header and footer configurations allow for different content on first, odd, and even pages, with support for images. Page sizes can now be set using predefined formats or custom width and height values. The new converter API also enables editing of PDF metadata fields such as title, subject, and author.
Security capabilities have been expanded with owner password protection for controlling permissions and digital signature support using PKCS#12 certificates for authenticity verification. Additional improvements include compression control for specific use cases and more precise rendering options.
Please note that the old installation methods will no longer be available with CKEditor 5 v48.0.0, which is planned for release at the beginning of Q2 2026. For more timeline details, refer to the dedicated GitHub issue.
In CKEditor 5 v42.0.0 in June 2024, we introduced new installation methods designed to improve and simplify the developer workflow. Soon, they will be the only available paths to install and use CKEditor 5.
If your project still relies on old installation methods, now is a good time to plan your next steps. We recommend choosing between these two options:
- {@link updating/nim-migration/migration-to-new-installation-methods Migrate to the new installation methods}, which are the recommended path for most users. The new installation methods provide a cleaner setup, easier upgrades, and better alignment with future CKEditor 5 releases.
- Consider CKEditor 5 Long-Term Support (LTS). If migrating in the near term is not feasible, you can extend support for legacy installation methods.
Please refer to the {@link updating/update-to-42 update guide} to learn more about these changes.
-
ai: The
ai.reviewMode.translationsconfiguration option has been moved toai.translate.languages. Theai.reviewModeconfiguration namespace has been removed.Together with the introduction of AI Translate feature and a separate translation tab, the configuration option to define a custom language list has been moved to a related
ai.translatenamespace. -
ai: The
AIEditorIntegrationplugin is now required to preview the changes suggested by the AI Chat feature in a dialog window. Previously, this functionality was enabled by just loading the mainAIChatplugin. Please make sure your integration loads theAIEditorIntegrationplugin in order to use this functionality. -
ai: The DOM structure of the AI Chat suggestions in conversation has been changed, which may affect integrations that customized the UI and/or rely on specific CSS selectors.
Please make sure to update your integrations to use the new DOM structure. Learn more about the changes in the migration guide provided in the project documentation.
-
ai: The DOM structure of the AI Chat suggestion preview dialog window has been changed which may affect integrations that customized the UI and/or rely on specific CSS selectors.
Please make sure to update your integrations to use the new DOM structure. Learn more about the changes in the migration guide provided in the project documentation.
-
ai:
AIChat#sendMessage()takesattributes: Record<string, unknown>as one of its parameters now, in place of formerquickActionData. This affects you only if you provided some customizations for the CKEditor AI chat feature. -
ai: Already existing chat conversations, which were created through AI Quick Action (e.g. "Explain" or "Summarize"), when loaded from chat history, will now display a full prompt instead of the short version. This affects only already created conversations.
-
ai: Replaced
ai.chat.models.modelSelectorAlwaysVisibleconfiguration option withai.chat.models.showModelSelector. The behavior has also been slightly updated. When set totrue(default), the model selector dropdown is shown (when multiple models are available), or the model name is displayed (when only one model is available). When set tofalse, the selector is hidden, regardless of the number of available models. -
ai: The model's configuration options have been moved from
config.ai.chat.modelstoconfig.ai.modelsto ensure consistent model configuration across all AI features. The model configuration is now applied uniformly in both AI Chat and AI Review Mode.
Released on 14 January, 2026. (See full release notes)
This is a minor update focused on improving content editing workflows and data compatibility. We are introducing better visualization for table borders, enhanced image alignment handling, and several improvements to AI and email features.
We are introducing an experimental {@link module:table/tablecellproperties/tablecellpropertiesutils~TableCellType tableCellTypeSupport} flag that enables changing table cell types between data and header cells (th). This feature provides more flexibility when working with complex table structures. To enable this functionality, you need to set experimentalFlags.tableCellTypeSupport to true. You can then use TableCellPropertiesEditing and TableCellPropertiesUIExperimental to manage the feature.
ClassicEditor
.create( document.querySelector( '#editor' ), {
plugins: [
Essentials,
Paragraph,
Table,
- TableProperties,
- TableCellProperties
+ TablePropertiesEditing,
+ TablePropertiesUIExperimental,
+ TableCellPropertiesEditing,
+ TableCellPropertiesUIExperimental
],
experimentalFlags: {
// ... other experimental flags ...
+ tableCellTypeSupport: true
}
} )
.then( /* ... */ )
.catch( /* ... */ );
The fully functional editor UI for cell type support will be available with the next major CKEditor 5 version.
Hidden table borders visualization
We are introducing a new {@link features/tables-styling#helper-lines-when-border-style-is-set-to-none config.table.showHiddenBorders} configuration option (enabled by default) that helps editors work with tables that have hidden borders. When the editor detects inline border:none or border-style:none declarations on table and cell elements, it renders dashed helper borders in the editing view. This makes it easier to see the table structure while editing without affecting the output data. This visualization can be disabled for strict WYSIWYG scenarios where you want the editing view to match the output exactly.
We improved the email styles transformation with better appearance of resized inline images in classic Outlook clients. Additionally, the new optional useFigureToTableFallback flag in the email styles transformers can replace figure (block images) with tables to improve alignment and width handling in older email clients with limited CSS support.
The Emoji plugin can now utilize the Emoji v17.0 dataset, available on the CKEditor CDN. This update does not change the default emoji version used by CKEditor 5.
To use the new dataset, download the Emoji json database from the CKEditor 5 CDN. Place the downloaded file in your application’s assets folder, for example public/emoji/en.json (The specific location may vary depending on your framework and setup). Update the configuration option definitionsUrl to point to the URL of your assets, for example:
ClassicEditor
.create( document.querySelector( '#editor' ), {
// ... Other configuration options ...
emoji: {
definitionsUrl: 'https://example.com/emoji-definitions.json'
}
} )
.then( /* ... */ )
.catch( /* ... */ );- Fixed multiple issues in the AI features, including improved tooltips for web search sources in AI Chat, proper handling of Quick Actions when opening the AI Chat panel, resolved loading state issues in the AI Review sidebar, and others.
- The editor now recognizes CSS
floatstyle on images (e.g.,style="float: left"orstyle="float: right") and automatically maps it to left/right image alignment. This works for both inline and block images, improving compatibility when pasting content from external sources or loading legacy content. If custom image styles are configured, they take precedence over the float style.
Please note that the old installation methods will only remain available up to CKEditor 5 v48.0.0, which is planned for release at the beginning of Q2 2026. For more timeline details, refer to the dedicated GitHub issue.
In CKEditor 5 v42.0.0 in June 2024, we introduced new installation methods designed to improve and simplify the developer workflow. Soon, they will be the only available paths to install and use CKEditor 5.
If your project still relies on old installation methods, now is a good time to plan your next steps. We recommend choosing between these two options:
- {@link updating/nim-migration/migration-to-new-installation-methods Migrate to the new installation methods}, which are the recommended path for most users. The new installation methods provide a cleaner setup, easier upgrades, and better alignment with future CKEditor 5 releases.
- Consider CKEditor 5 Long Term Support (LTS). If migrating in the near term is not feasible, you can extend support for legacy installation methods.
Released on 3 December, 2025. (See full release notes)
Finding a specific AI Quick Action in a long list with multiple groups can be difficult. To improve this, we are adding a filter input that lets users search for quick actions directly within the dropdown.
Visibility of the input can be easily configured using the config.ai.quickActions.isSearchEnabled configuration option.
This release also brings several minor but significant enhancements and fixes:
- Track Changes markers not related to AI suggestions are now displayed in gray in the AI balloon text preview, consistent with the behavior of AI chat.
- When retrying a specific AI Review, we are now ensuring the latest version of the document is used.
- We also improved error handling across CKEditor AI, making it easier to debug backend-related issues by including more detailed error messages.
We keep our LTS version promise: no breaking changes until the Active LTS moves to Maintenance LTS phase (April 2026). It also means that introducing larger features can be challenging if someone is waiting for specific improvements.
To address this, we are introducing experimental flags and experimental plugins. These options allow you to preview and test upcoming changes.
-
New table alignment options
Enable
config.experimentalFlags.useExtendedTableBlockAlignmentand load the experimental UI pluginsTablePropertiesUIExperimentalandTableCellPropertiesUIExperimentalfor upcoming improvements to table block alignment.The
TablePropertiesandTableCellPropertiesplugins already include their standard UI counterparts (TablePropertiesUIandTableCellPropertiesUI). To avoid conflicts, when using experimental UI plugins, you must load the editing plugins (TablePropertiesEditing,TableCellPropertiesEditing) and the experimental UI plugins separately, instead of using the "glue" plugins.New options allow setting left and right table block alignment without text wrapping and resolve issues such as #3225. We also improved table properties and cell properties balloon interfaces. This change will be the default in version 48.0.0.
-
Improved table border normalization
Setting
config.experimentalFlags.upcastTableBorderZeroAttributesenables support for the normalization of HTML tables that useborder="0". This change will be the default in version 48.0.0. -
Better deep schema validation
After enabling the
config.experimentalFlags.modelInsertContentDeepSchemaVerificationflag, the editor performs deep schema verification duringmodel.insertContent()operations. This ensures that the inserted content fully follows the editor’s schema, even in complex or nested structures. This change will be the default in version 48.0.0. -
Configuration
ClassicEditor
.create( document.querySelector( '#editor' ), {
plugins: [
Table,
TablePropertiesEditing,
TableCellPropertiesEditing,
TablePropertiesUIExperimental,
TableCellPropertiesUIExperimental,
// Other plugins.
// ...
],
experimentalFlags: {
useExtendedTableBlockAlignment: true,
upcastTableBorderZeroAttributes: true,
modelInsertContentDeepSchemaVerification: true
}
} )
.then( /* ... */ )
.catch( /* ... */ );Released on 5 November, 2025. (See full release notes)
This release introduces expanded CKEditor AI feature, new Footnotes features and several improvements.
We are introducing {@link features/ckeditor-ai-overview CKEditor AI}, a powerful writing assistant that brings AI-powered content creation directly into CKEditor 5. It helps users create, review, and refine content without switching between tools, making the editing experience faster and more productive.
CKEditor AI includes three core capabilities:
- Chat: a conversational AI assistant for multi-turn interactions that supports context setting and model selection. All conversations are tracked in a persistent chat history, and suggestions are reviewable before being applied.
- Quick actions: one-click transformations for selected text, including rewriting, simplifying, expanding, summarizing, or adjusting tone. Changes appear inline with preview capabilities.
- Review: automatic quality assurance that checks grammar, tone, clarity, and style across the document. Suggested changes are presented in a visual review interface where users can accept or reject individual edits or apply all approved suggestions in bulk.
Power users can select their preferred model during sessions (GPT-5, Claude 3.5, Gemini 2.5, and more), while integrators maintain control over access rules and usage tiers.
Built as a plugin for CKEditor 5, it integrates quickly into existing applications with minimal configuration, and all AI interactions are fully observable via audit logs and optional APIs.
CKEditor AI is available as a premium add-on to all paid CKEditor 5 plans with a transparent subscription-plus-usage pricing model. A 14-day trial is available with access to all premium features.
A brand-new {@link features/footnotes Footnotes} feature is here! It lets users insert and manage footnotes directly in their content, keeping references organized and readable. Footnotes stay linked to their source text and update automatically when edited, ideal for academic, legal, or technical writing. You can also customize the numbering, including the starting number and numbering style, to match your document’s formatting needs.
{@link features/restricted-editing Restricted editing} now supports block-level restrictions, not just inline ones. This makes it easier to protect the entire content while still allowing controlled edits where required. A common use case is unlocking for editing template sections like paragraphs, tables, or structured document parts, and protecting the rest of the content. to do
The version introduces new toolbar items for the {@link features/restricted-editing restricted editing} feature. The new available toolbar ites are restrictedEditingException:dropdown (for both inline and block types of editing fields), restrictedEditingException:inline, and restrictedEditingException:block.
To retain full backwards compatibility, we have provided an alias toolbar item: restrictedEditingException. It is the old toolbar button call and it defaults to inline restricted editing field button. There is no need to change your configuration if you only want to use inline fields type. If you want to use both the block and inline type fields, please {@link features/restricted-editing#configuring-the-toolbar update your toolbar configuration}.
We are extending the sunset period for old installation methods (#17779) to the end of Q1 2026. It is a good moment to consider switching to the {@link getting-started/setup/using-lts-edition LTS edition} for long-term stability and an additional 3 years of support for the old installation methods.
This release also brings several smaller but important enhancements and fixes:
- View engine stability: Fixed a bug where placeholders could remain visible after view changes, such as moving or replacing elements.
- Downcast reliability: The
elementToStructurehelper now handles nested structures and list elements more consistently, ensuring correct reconversion and structure maintenance.
Released on 16 October, 2025. (See full release notes)
This release introduces a minor stability update, featuring focused fixes and UX improvements.
Breaking changes in CKEditor AI are permitted during the Active phase of an LTS release. {@link getting-started/setup/using-lts-edition#features-excluded-from-the-no-breaking-changes-guarantee-v47x Learn more}.-
ai: Simplified CSS for the CKEditor AI integration in a sidebar mode (
config.ai.container.type: 'sidebar') by removing default layout constraints:- Removed the default
min-heightfrom.ck-ai-chat, - Removed the default
heightfrom.ck-tabs, - Removed the default
widthfrom.ck-ai-tabs.
Also, the
--ck-tabs-panels-container-widthcustom property has been removed from the codebase. - Removed the default
Released on 1 October, 2025. (See full release notes)
We are introducing {@link features/ckeditor-ai-overview CKEditor AI}, a set of versatile AI-powered features that integrate directly into CKEditor 5. It brings generation, summarization, correction, contextual chat help, reviews, and many other capabilities, right into the editor. With CKEditor AI, users will no longer need to switch between the editor and AI tools.
Three features are available in this early access phase:
- Chat: a conversational AI for dynamic, multi-turn interactions that support various context sources, model selection, which can perform changes directly on the document.
- Quick actions: one-click transformations and instant insights for selected text.
- Review: automatic checks for grammar, tone, correctness, style, and more, with UX optimized for performing full-document review.
Each feature is powered by our state-of-the-art AI service, available in the Cloud today and coming soon for on-premises deployments. This makes CKEditor AI a true plug-and-play solution that works out of the box, eliminating the need for months of custom development.
CKEditor AI is available as part of our free trial in early access.
We are introducing the CKEditor 5 LTS (Long-term Support) Edition, giving teams up to 3 years of stability with guaranteed updates.
The first LTS release is v47.0.0 (October 2025). It will receive 6 months of active development with new features and fixes, then 2.5 years of maintenance with security and critical compatibility updates.
For v47.x, the Maintenance phase starts in April 2026. From then the next versions in the v47.x line will be available only under a commercial LTS Edition license. Therefore, starting in April, integrators without an LTS license should migrate to v48.x (the next regular release).
If you need long-term stability, contact sales or read more about the {@link getting-started/setup/using-lts-edition CKEditor 5 LTS Edition}.
Starting with version v41.3.0, we have disabled the default browser tab behavior for cycling nested editable elements inside the editor. Read more about it in the #updated-keyboard-navigation section of Update to 41.x in {@link updating/updating-from-older-versions updating from older versions guide}. We decided back then that the Tab (and Shift+Tab) keystroke should navigate to the next focusable field or element outside the editor so the users can quickly navigate fields or links on the page.
There was one exception to this Tab behavior, however. When a user selected a widget, the Tab key would move the selection to the first nested editable, such as the caption of an image. Pressing the Esc key while inside a nested editable will move the selection to the closest ancestor widget, for example, moving from an image caption to selecting the whole image widget.
The above exception was limited as it supported only the first nested editable in a widget (the table widget was an exception that had custom Tab support implemented).
The current release extends the Tab (and Shift+Tab) handling to include all nested editable areas in the editor content. It also includes the content between block widgets as a separate editable area. Thanks to this, the original behavior of jumping away from the editor while pressing Tab inside an image caption is now tuned to jump just after that image. This way, the flow of Tab behavior is more linear and predictable to the user. Also, the custom widgets with multiple nested editable elements are now handled out of the box and require no custom code for Tab handling.
Please make sure that if you had a custom Tab handling implementation in your editor, it does not collide with the default one. Note that generic Tab (and Shift+Tab) handlers are registered on the low priority bubbling event in the context of widgets and editable elements. For more details on bubbling events and contexts, please see the {@link framework/deep-dive/event-system#listening-to-bubbling-events bubbling events} guide.
The {@link framework/deep-dive/event-system#listening-to-bubbling-events bubbling events} now trigger all event handlers according to the registered priorities, even if multiple custom callback contexts are provided. Previously, not all custom callback contexts were evaluated for a given element. The custom callback contexts were also triggered after the view element name handlers. Now those are all triggered according to the registered priority, regardless of context: element name-based or callback-based.
This release also brings several smaller but important enhancements and fixes:
- UI: dialogs in custom features can now be positioned programmatically with more flexible options (
Dialog#show()). - Comments: confirmation views for deleting comments and threads now use simplified CSS selectors (
.ck-confirm-view). You may need to adjust custom styles accordingly.
With the release of {@link features/ckeditor-ai-overview CKEditor AI}, the ai.* configuration structure has changed. Until now, the configuration object was used for the former AIAssistant feature.
Now, this configuration space is used for all AI related features. Configuration for the AIAssistant was moved. The changes are:
* ai.aiAssistant -> ai.assistant,
* ai.useTheme -> ai.assistant.useTheme,
* ai.aws -> ai.assistant.adapter.aws,
* ai.openAI -> ai.assistant.adapter.openAI.
- table, widget: The Widget feature implements the default handling for
Tab/Shift+Tabto navigate nested editable elements in the editor content. Closes #19083. The listeners are registered on thelowpriority bubbling event in the context of widgets and editable elements. Please verify if your customTab/Shift+Tabhandling does not collide with the default one. - ai: The internal structure of the package has changed. Importing
AIAssistantfrom the source should be done via@ckeditor/ckeditor5-ai/src/aiassistant/aiassistant.jspath instead of the previous@ckeditor/ckeditor5-ai/src/aiassistant.js. - comments: Changed the CSS selectors used to style the confirmation view displayed when attempting to remove a comment or an entire comment thread. For now, CSS classes will be more generic, for example:
.ck-confirm-viewinstead of.ck-thread__remove-confirm. If you override styles for these components, you will need to update the selectors. - undo: The
UndoCommandRevertEventtype was renamed toUndoRedoBaseCommandRevertEventand moved to thebasecommand.tsfile. Adjust your code if you have used this type in your custom integration. See #19168. - Updated to TypeScript 5.3.