Update to CKEditor 5 v47.x
When updating your CKEditor 5 installation, ensure all the packages are the same version to avoid errors.
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 1 October, 2025. (See full release notes)
We are introducing 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 CKEditor 5 LTS Edition.
Starting with version 41.3.0, we have disabled the default browser tab behavior for cycling nested editable elements inside the editor. 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 bubbling events guide.
The 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 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+Tab
to navigate nested editable elements in the editor content. Closes #19083. The listeners are registered on thelow
priority bubbling event in the context of widgets and editable elements.
Please verify if your customTab
/Shift+Tab
handling does not collide with the default one. - ai: The internal structure of the package has changed. Importing
AIAssistant
from the source should be done via@ckeditor/ckeditor5-ai/src/aiassistant/aiassistant.js
path 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-view
instead of.ck-thread__remove-confirm
. If you override styles for these components, you will need to update the selectors. - undo: The
UndoCommandRevertEvent
type was renamed toUndoRedoBaseCommandRevertEvent
and moved to thebasecommand.ts
file. Adjust your code if you have used this type in your custom integration. See #19168. - Updated to TypeScript 5.3.