We are happy to announce the release of CKEditor 5 v48.3.0.
Release highlights
⭐ Programmatic API for CKEditor AI
Until now, using CKEditor AI meant mainly going through its built-in UI. This release extends the programmatic APIs and opens the door to more custom AI workflows. Integrators can trigger AI from their buttons, process documents automatically in the background, or run AI server-side with no editor interface at all using the Server-side Editor API.
- AI Document Processing: Run any custom, document-level prompt entirely from code with no UI involved, for automated jobs like summarizing, reformatting, or enriching content in the background.
- AI Review: Trigger built-in or custom review commands, such as proofreading, clarity, or tone, from code so you can build automated quality gates into your editing workflow.
- AI Translate: Translate a document into a target language on demand, with or without the translation UI.
See the Using CKEditor AI programmatically guide for details.
⭐ AI-generated suggestions in track changes
When AI and people edit the same document, reviewers need to know who proposed what. AI suggestions can now be visually marked as AI-generated, so teams can give machine-proposed changes the right level of scrutiny, keep a clear audit trail of where content came from, and meet editorial or governance policies that require disclosing AI involvement.
The feature is opt-in, and you can choose between a pill view or AI author view. Read more in the Marking AI-generated suggestions guide.
⭐ Multi-root and multiple editors support for CKEditor AI is now stable
Editors that split content into separate areas, such as email layouts, structured documents, or CMS templates with distinct regions, can now use CKEditor AI with full production confidence.
We promoted multi-root and multi-instance support to stable so AI Chat and Review consistently read context from and act on the correct region. Adding or removing editor instances at runtime, including the empty "no editors" state, is handled robustly, keeping every AI request scoped to the root the user is working in.
Other improvements and fixes
- Images in inline roots. Images are now supported in inline roots. A block image that cannot be placed at a given position, for example when pasting, dropping, or loading data into an inline root, now degrades to an inline image instead of being dropped. The image type, caption, and style controls adapt to what the position allows.
- Keyboard-accessible media embed resizing. Media embeds now include a keyboard-accessible resize UI: a toolbar dropdown and standalone buttons for predefined sizes, plus a balloon-hosted input for custom widths.
- AI Chat and AI Review fixes. This release resolves a range of AI Chat and Review issues affecting both reliability and presentation, including suggestions that did not appear or apply, crashes on certain historical or marker-heavy content, and rendering glitches in Safari. Preview content is now selectable for direct copying, long text and URLs wrap cleanly in the feed, and several commands are translated in non-English interfaces.
- Paste from Office and Excel Online. Word footnotes are no longer malformed when the Footnotes plugin is enabled, pasting a list followed by a paragraph aligned to an earlier list's margin no longer throws an error, and ranges pasted from Excel Online no longer insert the clipboard's CSS
<style>block as visible text. - Footnotes. Fixed the first footnote reference disappearing with a starting value of
0under numbering styles that do not support it, and aligned references with the list when using roman numbering at counter values of 4000 or above. - Emoji. The plugin no longer blocks editor startup, resulting in noticeably faster load times, and multiple editors sharing the same
definitionsUrlwith differentuseCustomFontsettings no longer interfere with each other's emoji data. - Accessibility. Comment thread accessible names now include the first comment's text and announce reply counts, and AI-proposed track changes suggestions now state their AI origin in their accessible name.
- Type around buttons on touch devices. Tapping the buttons that insert a paragraph above or below a selected widget now works on Android and iOS. Previously, these taps did not insert a paragraph. Thanks to @ELHart05 for contributing this fix.
MINOR BREAKING CHANGES ℹ️
-
ai: Changed the signature of
AIGateway.apply().applyMethodis now a property of the second argument (an options object) instead of a positional string: replaceapply( result, 'suggest' )withapply( result, { applyMethod: 'suggest' } ). -
ai: Tightened the return types of several AI Chat and AI Review getters and methods to
ReadonlyArray/ReadonlyMap. They now return copies of the original collections to prevent accidental mutation of internal state.Updated methods are:
AIChatContext#getPendingContextItems(),AIChatContext#getSentContextItems(),AIReviewRunResult#affectedBlocksandAIGateway#mergeChangesIntoContent(). -
ai: Fixed a CSS specificity conflict that made the AI Chat balloon width depend on stylesheet import order. The AI Chat balloon now sizes to its content without conflicting with default dialog styles.
-
ai: Changed the CSS selector used to set the AI Chat balloon width from
.ck-ai-chat-balloonto.ck-ai-chat-balloon-main. Custom styles that set the AI Chat balloon width by targeting.ck-ai-chat-balloonmay no longer take effect and should target.ck-ai-chat-balloon-maininstead.
Features
- ai, track-changes: Suggestions created using AI features can now be visually marked as AI-generated to be distinguished from manual edits. See
config.trackChanges.showAISourceandconfig.trackChanges.aiAuthor. - ai: Introduced a programmatic API for AI Document Processing. See the Using CKEditor AI programmatically documentation for details.
- ai: All AI features now report their errors through a single pipeline. Applications can monitor AI failures across chat, chat history, actions, and review, and forward them to their own error-tracking tools.
- ai: Introduced a programmatic API for the AI Translate plugin. See the Using CKEditor AI programmatically documentation for details.
- ai: Introduced a headless programmatic API for the AI Translate plugin. See the Using CKEditor AI programmatically documentation for details.
- collaboration-core: Added the
PillViewUI component, which displays a pill with an icon, label, and tooltip. See the API documentation for details. - image: Images are now supported in inline roots. A block image that cannot be placed at a given location (for example, when pasting, dropping, or loading data into an inline root) now degrades to an inline image instead of being dropped. The image type change, caption, and style controls now adapt to the allowed conversion and become unavailable when that conversion is not allowed at the current position.
- media-embed: Introduced a keyboard-accessible resize UI for media embeds: a toolbar dropdown or standalone buttons for predefined sizes and a balloon-hosted input for custom widths.
Bug fixes
-
collaboration-core, track-changes: Fixed a redundant keyboard tab stop on the "AI-generated" pill shown for AI suggestions. The AI origin it signals visually is conveyed to assistive technologies through the suggestion's accessible name.
-
ai: Pasting spreadsheet or word-processor content into the AI Chat prompt input now keeps the cell text instead of attaching the accompanying preview image.
-
ai: Fixed an issue where AI-suggested insertions generated by AI Chat were not displayed in the chat feed and were not applied to the content in some scenarios.
-
ai: Made AI-generated content displayed in the AI Quick Actions balloon and the AI Chat suggestion preview selectable for direct copying.
-
ai: Roots added at runtime with
MultiRootEditor#addRoot()were sent to the AI service without a title or description, which could cause area-scoped AI Chat requests to target the wrong root.Now the AI features read each editor root's title and description from the root's attributes if available, and fall back to the editor configuration otherwise.
-
ai: Improved the HTML output of the AI Quick Actions suggestion preview. Completed previews no longer contain temporary streaming elements.
-
ai: The tooltip displayed when hovering over an AI Chat context chip now wraps long URLs.
-
ai: Long text and URLs displayed in the AI Chat feed now wrap and no longer overflow the message container.
-
ai: Fixed an AI Chat crash when loading a historical conversation containing changes for an editor that was never created in the current session.
-
ai: The conversation title animation is no longer played when opening a chat from history. The animation is now shown only when the AI generates a title for the first time.
-
ai: The mini toolbar in the AI Actions dialog no longer overlaps the vertical scrollbar.
-
ai: The AI Review programmatic API no longer switches the editor to the review tab when a review run fails validation (for example, an unknown command or a missing model). A failed call now leaves the previously active tab in place.
-
ai: Fixed an editor crash that occurred when AI Chat processed responses for document content that included comment or suggestion markers. This was most often reproducible with the General HTML Support plugin enabled.
-
ai: The balloons in the AI Chat context chips row are now rendered above the AI overlay backdrop instead of behind it.
-
ai: Fixed an issue where toggling AI Review or AI Translate tabs would reset their state.
-
ai: Switching tabs while the AI plugin is toggled no longer duplicates views.
-
ai: The AI Review mode "Adjust length" and "Adjust tone and style" commands, along with their dropdown options, are now translated when a UI language other than English is used.
-
ai: AI Chat and Review suggestions now render in Safari when the AI panel is toggled while the request is being processed or after quickly switching between AI panels.
-
collaboration-core: Removed the misplaced
affectsDataproperty from theCollaborationOperationinterface. The property is specific toMarkerOperation. Cast toMarkerCollaborationOperationto access it. -
comments: The accessible name of a comment thread now includes the text of its first comment. Single-reply threads now announce the reply count instead of repeating the author name.
-
core: Replaced a cryptic
multi-root-editor-root-initial-data-mismatcherror thrown whenconfig.rootsis an object with a custom prototype or a class instance. The editor now throws a dedicatededitor-create-roots-not-plain-objecterror with a clear message. -
core: An invalid tag name passed to
config.root.elementorconfig.roots.<rootName>.elementnow throws a clearCKEditorErrorwith codeeditor-wrong-element-nameinstead of a crypticInvalidCharacterErrorfrom the browser renderer. -
emoji: Reduced editor startup time by preventing the emoji plugin from blocking editor initialization.
-
emoji: Fixed an issue where multiple editor instances on the same page could interfere with each other's emoji data when they shared the same
definitionsUrlbut used differentuseCustomFontsettings. Depending on which editor initialized first, some editors could display a restricted emoji list when a full one was expected, or the other way around. -
engine: Fixed incorrect ordering of
markerToElementboundary elements when multiple markers share the same end position. The closing elements are now inserted in reverse opening order to preserve nesting in the output. Closes #20173. -
footnotes: Fixed the first footnote reference disappearing when the footnote list's starting value is set to
0and the active numbering style, for examplelower-alphaorlower-roman, does not support that value. -
footnotes: Fixed a mismatch between footnote references and the footnote list when using
lower-romanorupper-romannumbering with counter values of 4000 or above. Both now consistently fall back to decimal numbering, as required by the CSS counter style specification. -
paste-from-office: Pasting content from MS Office with footnotes no longer results in malformed footnotes when the
Footnotesplugin is enabled. -
paste-from-office: Pasting content from MS Office no longer throws an error when a list is followed by a paragraph aligned to the margin of an earlier list.
-
paste-from-office: Pasting content from Excel Online no longer inserts the clipboard's CSS
<style>block as visible text. Closes #20188. -
real-time-collaboration: In multi-editor setups using a
Contextmechanism, an individual document can now be flushed on the server without affecting other editors. Previously, all editors within theContextinstance turned read-only. Now only the editor connected to the flushed document becomes disconnected, while the remaining editors stay connected and editable. -
table: Upcasting table content with scoped header cells into a context that does not allow tables, for example an inline editor root, no longer throws an error.
-
track-changes: When a track changes suggestion comes from AI, its accessible name now states that it was proposed by AI.
-
widget: The widget type around buttons now insert a paragraph when tapped on touch devices. Previously, taps on the buttons were ignored on Android and iOS, and only selected the widget. Closes #20103.
Thanks to @ELHart05.
Other changes
- core: Values provided via the
root.descriptionandroot.titleconfiguration options are now stored in the model as the$descriptionand$titleattributes of the$rootelement and persist through collaboration sessions. See #10327, #10285, #10333. - track-changes: Marked
Suggestion#isExternalas read-only, matchingComment#isExternal. Changing this property should not have been possible and could lead to errors. - ui: The custom
positioncallback inDialogDefinitionnow receives both the visible DOM rootRectand the general DOM rootRect, making it possible to position the dialog even when the DOM root element is off the screen or cropped by an overflowing ancestor. Added thegetRootName()option toDialogDefinitionto control which DOM root the dialog is positioned relative to, improving positioning in multi-root editor setups.
Released packages
Check out the Versioning policy guide for more information.
Released packages (summary)
Minor releases (contain minor breaking changes):
- @ckeditor/ckeditor5-ai: v48.2.0 => v48.3.0
Releases containing new features:
- @ckeditor/ckeditor5-track-changes: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-collaboration-core: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-image: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-media-embed: v48.2.0 => v48.3.0
Other releases:
- @ckeditor/ckeditor5-adapter-ckfinder: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-alignment: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-autoformat: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-autosave: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-basic-styles: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-block-quote: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-bookmark: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-case-change: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-ckbox: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-ckfinder: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-clipboard: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-cloud-services: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-code-block: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-comments: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-core: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-document-outline: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-easy-image: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-editor-balloon: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-editor-classic: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-editor-decoupled: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-editor-inline: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-editor-multi-root: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-email: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-emoji: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-engine: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-enter: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-essentials: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-export-inline-styles: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-export-pdf: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-export-word: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-find-and-replace: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-font: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-footnotes: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-format-painter: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-fullscreen: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-heading: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-highlight: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-horizontal-line: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-html-embed: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-html-support: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-icons: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-import-word: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-indent: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-language: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-line-height: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-link: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-list: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-list-multi-level: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-markdown-gfm: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-mention: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-merge-fields: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-minimap: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-operations-compressor: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-page-break: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-pagination: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-paragraph: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-paste-from-office: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-paste-from-office-enhanced: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-real-time-collaboration: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-remove-format: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-restricted-editing: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-revision-history: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-select-all: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-show-blocks: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-slash-command: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-source-editing: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-source-editing-enhanced: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-special-characters: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-style: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-table: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-template: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-typing: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-ui: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-undo: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-upload: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-uploadcare: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-utils: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-watchdog: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-widget: v48.2.0 => v48.3.0
- @ckeditor/ckeditor5-word-count: v48.2.0 => v48.3.0
- ckeditor5: v48.2.0 => v48.3.0
- ckeditor5-premium-features: v48.2.0 => v48.3.0