Search Docs
Loading...
Skip to content

Changelog

Explore the recent changes made to CreativeEditor SDK.

Our release notes contain more details on features and changes.

Download the full changelog as a plain text file.

Recent Releases

Version v1.79.0 Changelog July 17, 2026

Breaking Changes

  • Engine/Swift, Editor/iOS, Camera/iOS: Packages for Apple platforms are now built with Xcode 26.4.1 and Swift 6.3.1, which are the new minimum requirements for using them.

Non Breaking Changes

  • Editor/Web: Added the following new keyboard shortcuts:

    • F6 / Shift+F6 — cycle focus forward / backward through the main editor regions (canvas, inspector bar, canvas menu).
    • Alt+1 / Alt+2 / Alt+3 — move focus directly to the canvas, the inspector bar, or the canvas menu.
    • Escape — dismiss the tooltip that is currently shown.
  • Engine: Added asset source faceting. findAssets accepts a facets request (property paths groups, tags, or meta.<key>) and returns value distributions with counts over the matched set. Local asset sources compute these automatically; custom sources can return them from their findAssets callback.

  • Engine/Android: Added the structured filter and facets parameters to asset queries and facet distributions on query results.

  • Engine/Swift: Added the structured filter and facets parameters to asset queries and facet distributions on query results.

  • Editor/Web: The typeface library’s language filter now derives its options from typeface meta.languages via asset facets, instead of groups.

  • Editor/Web: Added the UI for clip-to-clip transitions. Add one between two adjacent clips on the timeline, choose a type from the library (cross fade, cross blur, wipe, push, slide, and more), tune its settings with a live canvas preview, and apply or remove transitions across a whole track at once.

  • Engine: Added clip-to-clip transitions — a new API (createTransition, setTransition, removeTransition, getTransition, supportsTransition), exposed in the Web, Android, iOS, and Node.js bindings, with a catalog of transition types (none, cross-fade, cross-blur, cross-spin, cross-zoom, cross-warp, push, slide, stack, splice, diagonal-splice, fade, fade-to-white, fade-to-black, wipe, line-wipe, clock-wipe, color-wipe, gradient-fade, chop, two-stripes). Transitions overlap adjacent clips with a clamped duration, cross-fade audio automatically, and expose editable properties (duration, direction, color, slices, and a morph flag) via generic block setters; when morph is enabled, position, rotation, scale, and shape are interpolated between the outgoing and incoming clip.

  • Editor/Web: Added keyboard shortcuts that mirror pointer/drag gestures on the canvas and the video timeline, so both can be driven from the keyboard for accessibility.

    • Canvas transforms (selected block): nudge the crop area with the arrow keys, rotate with Alt+arrows, and resize with Mod+arrows (or Mod+Alt+arrows to resize from the opposite edge). Hold Shift for a larger step.
    • Video timeline (selected clip): move a clip earlier/later with the arrow keys, insert it into a gap while pushing later clips with Mod+arrows, move it to the track above/below or to a new track with Mod(+Shift)+ArrowUp/ArrowDown, and trim its in/out points with Alt(+Shift)+arrows. Hold Shift for a larger step.
    • Playhead: skim frame-by-frame with ,/., jump further with Shift+,/Shift+., and jump to the start/end with Home/End.

    See the Keyboard shortcuts guide for the full list.

  • Engine: Added the text/useContextualAlternates and caption/useContextualAlternates boolean properties to enable or disable the OpenType contextual alternates (calt) feature during text shaping. Contextual alternates remain enabled by default. Disabling them keeps a font’s context-dependent glyph substitutions (such as the connected t swashes in Caveat) from being applied, so identical characters render with identical glyphs.

  • Editor/Android: The asset library now refreshes automatically when a source’s contents change via engine.asset.assetSourceContentsChanged(sourceId=_). Any open library showing that source re-queries and updates in place.

  • Editor/Web: Fixed the Bold/Italic and Underline/Strikethrough toggles being unresponsive on caption blocks in the video editor. These controls now apply to the selected caption, matching their behavior for text blocks. The inspector bar’s font weight/style dropdown is now also available for captions.

  • Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView.

  • Editor/iOS: The “Could not create View for …” error messages shown when the Dock, Canvas Menu, Inspector Bar, Navigation Bar, or an editor component fails to build are now localizable (and ship with German translations), matching the rest of the editor UI. Previously they were hardcoded in English.

  • Editor/iOS: Fixed the sheet dismiss button rendering a doubled circle under iOS 26 Liquid Glass.

  • Engine/Node: @cesdk/node no longer probes the browser localStorage global during initialization on Node.js. On Node 22.4+ the experimental Web Storage global is a getter that typeof evaluates, which printed an ExperimentalWarning (Node 22.x) or threw ERR_INVALID_ARG_VALUE (Node 23+/24) when --localstorage-file was not provided. Headless Node has no browser Web Storage, so the engine now short-circuits this feature detection there. Browser detection is unchanged.

  • Editor/Web: Fixed the “Resize Page” panel rendering completely empty when no page preset sources are configured. The page size inputs are now always shown and only the preset library section is omitted.

  • Engine: Rendering a block with a broken fill, effect, or frame reference (e.g. from a corrupt scene file) now flags the block with an error state instead of crashing the render loop.

  • Engine: Loading blocks or templates whose serialization contains references to missing elements now removes those references and flags the affected blocks with an error state, instead of leaving the references pointing at unrelated blocks, which could corrupt rendering.

  • Engine: Added the block error code BROKEN_BLOCK_REFERENCE, reported when a broken block reference is removed on load or encountered during rendering.

  • Editor: Fixed snapping guides appearing for hidden blocks and pages.

  • Engine: Fixed a crash when rendering text whose font resource had been evicted under memory pressure, e.g. while generating page thumbnails for the page overview. Text now falls back to the default font while the evicted font reloads and switches back automatically once it is ready.

  • Editor/Web: Fixed timeline duration formatting to zero-pad single-digit minutes when hours are present (e.g. 2:01:51.7 instead of 2:1:51.7).

  • Editor/Web: Fixed the typeface library panel collapsing an expanded typeface’s variants when a search was typed just before expanding it. Search mode now activates as you type instead of after the debounced query settles, so the list is no longer torn down under an in-progress interaction.

  • Engine: Loading a video whose codec is not supported (e.g. AV1 video or Opus audio in an MP4) now fails with a clear, actionable error naming the actual codec fourcc and the supported codecs to re-encode to, instead of a generic “OTI=0” message. The failure is surfaced as a distinct VIDEO_CODEC_UNSUPPORTED / AUDIO_CODEC_UNSUPPORTED error code so it can be distinguished from a generic decode failure.

  • Editor/Web: Fixed video clip thumbnails in the timeline sometimes not updating after replacing a video, and sometimes staying stuck on the loading indicator.

  • Engine: Per-character and per-word text animations that fade each glyph (Pan, Fade, Blur, Zoom, …) now play back smoothly on large text blocks, including curved text

  • Engine: Underlines and strikethroughs now animate together with the text during per-character and per-word in and out animations, instead of only appearing once the animation finishes

Version v1.78.0 Changelog July 17, 2026

Breaking Changes

Non Breaking Changes

  • Editor: Engine error dialogs across Web, iOS, Android, Flutter, and React Native now show customer-facing, localizable copy keyed off the structured engine error code, falling back to the engine’s English message when no copy is authored — so a dialog never shows a blank or a raw code. You can override this copy per error code and resolve it yourself in custom error handlers. See the Custom Error Messages guide for authoring copy and the Error Catalog for the full list of structured error codes.
  • Editor/iOS: EngineSettings(baseURL:) now accepts an optional URL and falls back to the default CE.SDK CDN when nil, so you can pass an optional base URL directly without branching.
  • Editor/Web: The color picker for line shapes now supports gradients.
  • Engine: Movement constraints now keep text on the page by its visible letters, not just its text box, so letters that stick out past the box no longer spill off the page when moving or resizing. On by default; toggle it with the features/movementConstraintsRespectTextOverhang setting.
  • Editor/Web: Added a Path control for text blocks to place text on a curve (Circle, Arch, Wave) with adjustable position, direction and offset, plus Edit Path for a custom baseline. Gated by the new ly.img.text.path feature (with per-control sub-features).
  • Plugins/Web: The AI generation “Generate” button now stays disabled until every required input is provided. Previously, filling a single required input (e.g. the prompt) enabled it even when another required input (e.g. an image) was still missing, which could trigger a failed generation request.
  • Engine/Android: Fixed a crash during export teardown when an engine event stream was collected after Engine.stop().
  • Engine: Fixed a crash (RuntimeError: unreachable) in block.saveToArchive when a text block referenced a font whose bytes were not yet resident (e.g. an unresolved remote font).
  • Engine: Fixed the editor freezing when importing large caption/subtitle (SRT/VTT) files or styling large caption tracks. Style changes now spread across a caption track in linear time instead of quadratic.
  • Engine: Fixed corner-handle resizing of blocks whose width or height is sized as a percent of their parent (for example captions on the video canvas).
  • Engine: Fixed content-aware resize emitting a degenerate “double-flip” transform (both scale axes negative combined with a multiple-of-2π rotation) for page-filling images. Such images now get a clean, axis-aligned transform, so cropping them after resizing no longer moves the crop frame off the canvas.
  • Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView.
  • Editor/iOS: The asset library now refreshes automatically when a source’s contents change via engine.asset.assetSourceContentsChanged(sourceID:). Any open library showing that source re-queries and updates in place, matching the web editor.
  • Editor/iOS: Fixed the sheet title bar and close button overlapping the content of compact effect sheets (Filter, Effect, Blur, Animation) when the iOS 26 Liquid Glass design is enabled.
  • Editor/Web: Keep the text being edited visible above the on-screen keyboard on mobile web. The canvas reserves the keyboard area and pans the camera to the text cursor.
  • Engine/Node: @cesdk/node now bundles the engine-level font-fallback files (fonts/) and emoji font (emoji/NotoColorEmoji.ttf) in the npm package, so default font fallback and emoji rendering work out of the box without reaching the IMG.LY CDN. The @cesdk/node self-hosting asset bundle (imgly-assets.zip) now also includes the fonts/ and emoji/ directories; previously they were missing, which broke the documented self-hosting path.
  • Engine/Web: Fixed video export freezing on Safari when the project contained an uploaded video. Safari treats OPFS read handles as exclusive per file, so the export worker could not read an upload the editor was already reading. OPFS is now disabled on Safari and uploads fall back to in-memory blob URLs.
  • Engine: Fixed movement constraint capping block resizing too early. The cap now follows the block’s axis-aligned bounding box in page space, so resizing — including rotated blocks — can grow to the size the constraint actually permits.
  • Engine: Fixed a crash when loading a scene or block archive whose fetched data is not a valid zip.
  • Editor/Web: Fixed the shape options dropdown in the inspector bar not being keyboard accessible. Opening it now moves focus into the panel, keeps focus contained while navigating its controls, restores focus to the trigger on close, and dismisses on Escape.
  • Editor/Web: Fixed snapping guides ignoring movement constraints when moving or resizing.
  • Engine: Fixed setEditMode('Text') so that setTextCursorRange and other text-cursor APIs work synchronously immediately after, without an intermediate engine update.
  • Engine/Web: Fixed an issue where the on-screen keyboard would not open on iOS when entering text edit mode programmatically inside a user gesture.
  • Engine: A text block placed on a path now returns to automatic sizing when the path is removed, instead of staying at the fixed size adopted for the curve.
  • Engine: A text block placed on a path now keeps a stable set of editable points when re-entering path editing, instead of re-subdividing the path each time.
  • Engine: Fixed a video fill whose source failed to load (for example because of a CORS or network error) being re-fetched on every render frame with no limit. A failed video load now keeps its error state like image fills do; use forceLoadResources/forceLoadAVResource to explicitly retry it.
  • Editor/Web: The typeface library now fetches font previews lazily as rows scroll into view and renders typeface names immediately in a fallback font, keeping the font picker responsive on slow networks and low-end devices. The live per-font preview is preserved and arrives progressively.
  • Engine: Fixed text on curved paths to respect paragraph-level horizontal alignment.
  • Editor: Fixed caret placement for empty aligned text on curved paths.
  • Editor: Fixed caret hit testing, pointer selection, and selection highlights for text on curved paths that wrap across the start or end of an open path.
  • Editor: Fixed overlapping selection highlights on curved text from rendering darker where selection geometry intersects.
  • Engine/Web: @cesdk/engine again publishes its default asset sources (ly.img.*) to the CDN, fixing asset resolution failures during initialization for custom-UI integrations that rely on the default baseURL.
  • Engine/Web: @cesdk/engine and @cesdk/cesdk-js now bundle the font-fallback and emoji files in their npm packages, so text and emoji render without reaching the IMG.LY CDN.
  • Engine/Node: @cesdk/node’s imgly-assets.zip now includes the full asset content library (ly.img.*), so self-hosting the default asset sources works. Previously it shipped only the engine core, fonts, and emoji.
  • Engine: Fixed text on a curve ignoring the automatic horizontal text alignment. Right-to-left text with Auto alignment now aligns to the end of the path, matching regular text frames.
  • Engine: Fixed underline and strikethrough lines on text on a curve bridging the gap between the end and the beginning of the text when a path offset wraps the text around the path.
  • Engine: Fixed the text cursor of right-aligned text on a curve sometimes jumping to the start of the path when placed at the end of the text.
  • Editor/Web: Fixed the text “Styles” button staying active in Preview for placeholders that do not allow character changes. It is now hidden when the text/character scope is disallowed, matching the other style controls.
  • Editor/Web: Fixed the show/hide toggle in a line’s color panel. It now hides and shows the line, for solid colors and gradients alike, instead of doing nothing or dismissing the gradient.
  • Engine: Fixed a hidden line becoming visible again after the scene was saved and reloaded.
  • Engine: Fixed a hidden line with a gradient rendering a stray triangle instead of nothing.
  • Editor/Android: Fixed the resize sheet unexpectedly closing when selecting a page size preset.
  • Engine: Fixed onActiveChanged not being triggered when loading the same scene or applying the same template twice in a row.
  • Engine/Web: Fixed a crash when saving a scene to an archive that references a font which was never loaded (for example an unused typeface variant). Such resources are now left as external references instead of being bundled.

Version v1.77.1 Changelog July 9, 2026

Breaking Changes

Non Breaking Changes

  • Engine/Web: @cesdk/engine again publishes its default asset sources (ly.img.*) to the CDN, fixing asset resolution failures during initialization for custom-UI integrations that rely on the default baseURL.
  • Engine/Web: @cesdk/engine and @cesdk/cesdk-js now bundle the font-fallback and emoji files in their npm packages, so text and emoji render without reaching the IMG.LY CDN.
  • Engine/Node: @cesdk/node’s imgly-assets.zip now includes the full asset content library (ly.img.*), so self-hosting the default asset sources works. Previously it shipped only the engine core, fonts, and emoji.
  • Engine: Improved performance when transparentClickThroughEnabled is enabled

Version v1.77.0 Changelog July 2, 2026

Breaking Changes

Node.js Support

  • Engine/Node: Raised the minimum supported Node.js version to 22. Node.js 20 no longer receives security updates as of May 2026, we strongly recommend updating to a supported version.

Asset Sources & Registration

  • Engine (Swift + Android): Several built-in asset source IDs were renamed or merged — update any hardcoded IDs: ly.img.vectorpathly.img.vector.shape, ly.img.colors.defaultPalettely.img.color.palette, and ly.img.filter.lut + ly.img.filter.duotonely.img.filter (one source for both LUT and duotone). Because addDefaultAssetSources / addDemoAssetSources still iterate the old IDs, the four renamed/merged IDs are skipped silently against the default asset base URL — shapes, the default palette, and filters go missing until you re-register with the new IDs via addLocalAssetSourceFromJSON (Swift) / addLocalSourceFromJSON (Android). The default starter kits now also register ly.img.text, ly.img.text.styles, ly.img.text.curves, and ly.img.text.components.
  • Editor/iOS: Filter selection now uses a single ly.img.filter source covering both LUT and duotone effects, detected at runtime via asset metadata. Shape and sticker group identifiers are simplified (e.g. "filled" instead of "//ly.img.cesdk.vectorpaths/category/filled"); update any hardcoded group identifiers.
  • Editor/Android: Filter selection now uses a single ly.img.filter source covering both LUT and duotone effects, detected at runtime via asset metadata.
  • Editor/iOS + Android: Starter kits now register ly.img.text (basic text presets) and ly.img.caption.presets (caption styles) alongside the existing default sources.
  • Editor/Flutter + React Native: The default baseUri now resolves to the updated asset content. If you self-host, copy the assets/ directory from https://cdn.img.ly/packages/imgly/cesdk-<flutter|react-native>/<version>/imgly-assets.zip and point baseUri at your hosted location.
  • Migration guide: Migrating to v1.77 (iOS, Android) covers the full old → new asset source ID mapping and how to register sources. For Web, the Migrating to v1.77 guide covers the corresponding text source changes.

Camera & Capture Modes

  • Camera/Android: Added photo and mixed (photo + video) capture modes. CameraConfiguration gains captureType (Photo/Video/Mixed), captureCount (Single/Multi), photoClipDuration, and showsPhotoPreview; results now arrive as CameraResult.Captures(List<Capture>) (with Capture.Photo(uri, clipDuration) / Capture.Video(recording)) via a new CaptureMedia ActivityResultContract. CaptureVideo / CaptureVideo.Input are renamed to CaptureMedia / CaptureMedia.Input (old names @Deprecated(level = ERROR)) and CameraResult.Record([Recording]) is @Deprecated(level = ERROR) — extract recordings with the new List<Capture>.videos extension, and swap the is CameraResult.Record -> arm for is CameraResult.Captures -> in exhaustive whens.
  • Camera/iOS: Added photo and mixed capture modes via captureType (.photo/.video/.mixed) and captureCount (.single/.multi); captures arrive as a new Capture enum (.photo(Photo) / .video(Recording)) through CameraResult.capture([Capture]), and dual-camera mode now captures both cameras (Photo.images carries one or two images). CameraResult.recording([Recording]) is now @available(*, unavailable, renamed: "capture") — extract recordings with the new [Capture].videos extension and swap the .recording arm for .capture in exhaustive switches. (The deprecated Result<[Recording], CameraError> callback initializer is unaffected.)
  • Camera/ReactNative: The bridge no longer emits CameraRecordingResult — pure-video sessions return a CameraCaptureResult with captures: Capture[], and Photo changed from { uri, duration } to { images: PhotoImage[], duration }. Replace result.recordings.forEach(...) with result.captures.forEach(...) switching on each Capture’s photo / video field; replace photo.uri with photo.images[0].uri.
  • Camera/Flutter: The bridge no longer emits CameraRecording — pure-video sessions return a CameraResult with a populated capture: CameraCapture, and Photo changed from { uri, duration } to { images: List<PhotoImage>, duration } (with a typed Rect). Read result.capture?.captures and pattern-match each Capture’s photo / video field.
  • Editor/Android: The IMG.LY camera dock now launches in Mixed/Multi from a video editor (captured photos become timeline image-fill blocks using each photo’s clipDuration) and in Photo/Single from a non-timeline editor (design, photo, apparel, postcard). The design starter-kit dock button now opens the IMG.LY camera (Dock.Button.rememberImglyCamera()) instead of the system camera.
  • Editor/iOS: When opened from a video editor the camera launches in .mixed/.multi (captured photos become timeline image-fill blocks whose duration matches CameraConfiguration.photoClipDuration, 5 seconds by default; dual-camera photos lay out as a PIP); in non-timeline editors it launches in .photo/.single. The design starter-kit dock now uses Dock.Buttons.imglyCamera() instead of the system UIImagePickerController flow.

Background Removal

  • Editor/iOS: BackgroundRemovalPlugin now takes a BackgroundRemovalConfiguration and defaults to the IMG.LY IS-Net backend (VisionBackgroundRemovalConfiguration restores the previous Apple Vision behavior). The Options struct is removed, and the package ships as four library products so unneeded targets can be excluded.
  • Editor/Android: ly.img:plugin-background-removal is now the base package; add a concrete implementation (ly.img:plugin-background-removal-imgly or ly.img:plugin-background-removal-google). Dock.Button.rememberBackgroundRemoval now requires a config parameter, and dockModifier receives BackgroundRemovalConfig.

Error Handling

  • Engine: Error message wording was standardized across the SDK. If you branch on error message substrings (e.g. error.message.includes(…)), switch to the stable error.code — existing substring matches may no longer match. See the Error Catalog for the full list of structured error codes.
  • Engine: Calling addAsset, removeAsset, or applyAssetProperty on a custom asset source that does not implement the operation now throws an error carrying the matching BINDING.ASSET_SOURCE_ADD_UNSUPPORTED, BINDING.ASSET_SOURCE_REMOVE_UNSUPPORTED, or BINDING.ASSET_SOURCE_APPLY_PROPERTIES_UNSUPPORTED code — previously addAsset/removeAsset silently did nothing and applyAssetProperty never completed. Implement the operation or catch the error if you are probing for support.

Keyboard Shortcuts

  • Editor/Web: Keyboard shortcuts are now a public, customizable registry via cesdk.shortcuts, and the listener binds to the editor container instead of the document — shortcuts only fire when focus is inside the editor. Restore page-wide behavior with cesdk.shortcuts.setRoot(...), or disable the layer with cesdk.shortcuts.setEnabled(false). The registry exposes set, get, list, remove, has, clear, setEnabled, addScope, and setRoot; each shortcut is an object with keys (a chord like 'Mod+z' or a sequence array), run (an action id or a function), scope, and optional when, description, category, and sequenceTimeout. See the Migrating to v1.77 guide for details.
  • Engine/Web: The same keyboard-shortcut registry is available on the engine layer at engine.shortcuts, so any @cesdk/engine integration gets shortcuts without the editor UI (same methods).

Editor Configuration

  • Editor/Android: Editor configuration composition was fixed so component lambdas that explicitly return null override parent components instead of falling back to them.

Deprecations

All items below remain functional this release; migrate before they are removed.

  • Engine (Swift + Android): The asset-source helper layer — DefaultAssetSource, DemoAssetSource, populateAssetSource(...), addDefaultAssetSources(...), addDemoAssetSources(...) — is deprecated. Register sources directly via addLocalAssetSourceFromJSON (Swift) / addLocalSourceFromJSON (Android) pointing at each source’s content.json.
  • Engine (Swift + Android): Asset-source URL constants (Engine.assetBaseURL / Engine.Companion.assetBaseUri) are deprecated and will be removed in a future version. Build your own baseURL from bundled assets — for example Bundle.main.url(forResource: "IMGLYAssets", withExtension: "bundle") on iOS. The IMG.LY CDN is for development and evaluation only; self-host for production.
  • Editor/Android: AppearanceAssetSourceType.LutFilter and DuoToneFilter still resolve but are deprecated — migrate to AppearanceAssetSourceType.Filter.
  • Editor/iOS: TextAssetSource is deprecated. The default text library now uses the split text sources (ly.img.text, ly.img.text.styles, ly.img.text.curves, ly.img.text.components); register and use those instead.
  • Editor/Android: TextAssetSource and AssetSourceType.Text are deprecated. Use the split text sources (AssetSourceType.TextPlain, TextStyles, TextCurves, TextComponents) instead.
  • Engine: The control-gizmo flags showMoveHandles, dynamicMoveHandleVisibility, showResizeHandles, showScaleHandles, and showRotateHandles are deprecated (still functional) — use the new controlGizmo/*HandleVisibility settings instead.
  • Plugins/Web: convertToPDFX3 is now a deprecated alias of convertToPDFX.

New Features

AI Image Generation

  • Editor/Android: Added the AIImageGenerationPlugin plugin that provides image generation features using AI.
  • Editor/iOS: Added AI Image Generation plugin (IMGLYPluginAIImageGeneration)

Text on a Path (Curved Text)

  • Engine: Added text-on-curve support. Six new public API methods (setTextOnPath, getTextOnPath, setTextOnPathOffset, getTextOnPathOffset, setTextOnPathFlipped, getTextOnPathFlipped) let text blocks follow a validated SVG baseline path. Three new properties (text/pathOffset, text/pathFlipped, text/pathExternalRef) control proportional path offset, flipped placement, and the active curve asset reference. The existing vertical alignment (text/verticalAlignment) controls the text’s vertical orientation relative to the curve: Top places the bottom of the glyphs on the curve (text above it), Center centers the glyphs on the curve, and Bottom places the top of the glyphs on the curve (text below it).
  • Engine/Web/Android/iOS: The new text-on-path API methods are available on all platforms, e.g. engine.block.setTextOnPath, engine.block.getTextOnPath.
  • Engine: Style presets can now place text on a curve. The baseline path lives in the preset’s flat properties map like any other key: text/path (a virtual property routed through setTextOnPath, inheriting its SVG validation and path-bounds sizing; an explicit null clears the path) alongside the reflected text/pathOffset and text/pathFlipped properties.
  • Engine: Added the Circle, Arch, Wave, and Elevate curve presets to the ly.img.text.curves asset source, applied like any other style preset.
  • Editor/Web: Text-on-curve presets appear as the Curved Text section of the Text library, backed by the ly.img.text.curves asset source.
  • Editor/Android: Added a UI for placing text on a path. The new inspector bar button InspectorBar.Button.rememberTextOnPath(...) — included in the default inspector bar for text blocks — opens the new sheet SheetType.TextOnPath(style) with a grid of preset curves backed by the ly.img.text.curves asset source, plus path position, direction, and offset controls.
  • Editor/iOS: Added a UI for placing text on a path. The new inspector bar button InspectorBar.Buttons.textOnPath(...) — included in the default inspector bar for text blocks — opens the new sheet SheetType.textOnPath(style:) with a grid of preset curves backed by the ly.img.text.curves asset source, plus path position, direction, and offset controls.

Text Presets & Library

  • Editor/Web: Reworked the built-in text presets into reusable style presets that apply a complete look (font, color, outline, background, shadow, and animations) in a single step. The default Text library (ly.img.text) groups them into sections — Plain Text (Default / Elegant / Modern Tech themes), Text Styles (outline, glow, neon, …), Text Combinations (pre-designed text layouts), and Curved Text (text-on-path) — backed by the ly.img.text, ly.img.text.styles, ly.img.text.components, and ly.img.text.curves asset sources. The TextAssetSource and TextComponentAssetSource plugins wire all of these into the single ly.img.text entry. The text “Styles” inspector button restyles a block from the same library minus Text Combinations (text designs create new blocks and aren’t valid restyle targets).
  • Editor/Web: cesdk.ui.setReplaceAssetLibraryEntries now accepts { entry, excludeSourceIds } objects alongside plain entry IDs, letting you hide specific asset sources from a replacement panel without affecting how that entry behaves on insert.
  • Editor/Web: Added new caption style presets. The CaptionPresetsAssetSource plugin provides them through the ly.img.caption.presets asset source and applies them via the engine’s declarative style-preset mechanism, so captions and text now share the same one-step styling.
  • Editor/Android: Added InspectorBar.Button.rememberTextPresets() — a “Presets” inspector-bar button for text blocks that opens a restyle picker offering Plain Text, Text Styles, and Curved Text presets; tapping one restyles the selected block in place via the engine’s style-preset apply path. The button appears once any of the ly.img.text, ly.img.text.styles, or ly.img.text.curves sources is registered.
  • Editor/Android: The default asset library “Text” tab now offers four sections — Plain Text, Text Styles, Text Combinations, and Curved Text — each backed by its own asset source (ly.img.text, ly.img.text.styles, ly.img.text.components, ly.img.text.curves). Plain Text drills into its Default, Elegant, and Modern Tech themes. Tapping a preset creates a pre-styled text block. In the Elements tab these appear as a single “Text” group whose preview mixes all of the text sources. Custom asset libraries can compose these sections via LibraryContent.Section.
  • Editor/Android: Added LibraryContent.Section.groupTitleKeyPrefix — sections expanded from asset groups can derive each group section’s title from a localization key (<prefix><group>), falling back to a humanized group name.
  • Editor/iOS: Added InspectorBar.Buttons.textPresets() — a “Presets” inspector-bar button for text blocks that opens a restyle picker offering Plain Text, Text Styles, and Curved Text presets; tapping one restyles the selected block in place via the engine’s style-preset apply path. The button appears once the ly.img.text.styles source is registered.
  • Editor/iOS: The default asset library “Text” tab now offers four sections — Plain Text, Text Styles, Text Combinations, and Curved Text — each backed by its own asset source (ly.img.text, ly.img.text.styles, ly.img.text.components, ly.img.text.curves). Plain Text drills into its Default, Elegant, and Modern Tech themes. Tapping a preset creates a pre-styled text block. In the Elements tab these appear as a single “Text” group whose preview mixes all of the text sources. Custom asset libraries can compose these sections via AssetLibrarySection.

Typeface Library & Language Groups

  • Editor/Web: Introduced a new typeface library panel (browse every source, search, filter by language/source) replacing the fonts dropdown.
  • Editor/Android + iOS: Every typeface in the ly.img.typeface source now declares the language groups it covers (for example latin, cyrillic, greek, hebrew) via the asset groups field — query them with engine.asset.getGroups(sourceId) (Android) / getGroups(sourceID:) (iOS) or narrow font queries with group-filtered findAssets. The umbrella version in every source’s content.json moves to 7.0.0; no sources are added, renamed, or removed and no source IDs change, so no registration changes are required. If you self-host, copy the assets/ directory from the platform’s imgly-assets.zip.
  • Editor/Flutter + React Native: Typefaces in the default asset content now declare the language groups they cover via the asset groups field. No source IDs change.
  • Engine/Web: The default asset source now tags every built-in typeface with language groups so the typeface library can filter the fonts by language.

Text Formatting UI

  • Editor/Android + iOS: Added a text formatting UI that stays anchored to the keyboard while the IME is open.

Text Runs API

  • Engine (Web / Android / Swift): Added getTextRuns returning an ordered list of per-run TextRunInfo (color, font weight, font style, font size, text case, typeface, resolved font file URI, text decoration, and kerning): engine.block.getTextRuns(id, from, to) (Web), getTextRuns(block, from, to)List<TextRunInfo> (Android), and getTextRuns(_ id:, in subrange:)[TextRunInfo] (Swift).

Crop — Original Aspect Ratio

  • Editor/iOS + Android: Added an “Original” crop preset to the crop sheet that reverts a block to the intrinsic aspect ratio of its image or video content.
  • Engine (Swift + Android): Added canRevertToOriginalRatio (BlockAPI.canRevertToOriginalRatio(_:) / BlockApi.canRevertToOriginalRatio(block)) to query whether a block can revert to the intrinsic aspect ratio of its image or video content.

Control Gizmo Handle Visibility

  • Engine: New controlGizmo/moveHandleVisibility, controlGizmo/resizeHandlesVisibility, controlGizmo/scaleHandlesVisibility and controlGizmo/rotateHandlesVisibility settings ('auto' | 'always' | 'never', default 'auto'). Use 'always' to keep a handle visible while editing text, so a block can be moved, resized or rotated while typing. (These supersede the older show*Handles flags — see Deprecations.)

Actions Registry

  • Engine: Added engine.actions, a registry of named editor commands — undo, redo, delete, duplicate, group, align, crop, text formatting, zoom, pan, and many more. Run one by id (engine.actions.run('undo')), change what a built-in does, or add your own. Clicks, double-clicks, wheel zoom, and right-click/long-press run through the same registry, so an override applies consistently across the editor. Available with @cesdk/engine and @cesdk/node; the register, override, and keyboard-rebinding APIs are not yet exposed on the iOS and Android bindings.

Structured Errors

  • Engine/Web: Errors thrown by CreativeEngine are now EngineError instances (extending Error) with a stable code (e.g. "SCENE.NOT_VALID") plus category, hint, args, docsUrl, and silent. Existing try/catch code that reads error.message keeps working — new code can branch on error.code instead of matching message strings. A typed EngineErrorCode union of all codes is exported from @cesdk/engine (and re-exported from @cesdk/cesdk-js together with EngineError/isEngineError) for compile-time-checked branching. error.code stays a string, so unknown or future codes never break consumers. See the Migrate to Structured Errors guide for how to move off message-string matching.
  • Engine/Swift: Thrown NSErrors now carry the structured fields in userInfo (EngineErrorCodeKey, EngineErrorCategoryKey, …); domain and code are unchanged. The hint and docs URL surface through Foundation’s standard slots (localizedRecoverySuggestion / helpAnchor). Wrap an error with EngineError(error) to read code, category, hint, args, docsURL, and silent, then branch on code instead of localizedDescription. Use the EngineErrorCode enum to switch on codes without bare strings. See the Migrate to Structured Errors guide for how to move off message-string matching.
  • Engine/Android: EngineException now exposes code, category, hint, args, docsUrl, and silent. Existing code that reads e.message keeps working — new code can branch on e.code and surface the relevant docs page via e.docsUrl. Use the EngineErrorCode constants in ly.img.engine to branch without bare strings. See the Migrate to Structured Errors guide for how to move off message-string matching.
  • Editor: Engine error dialogs across Web, iOS, Android, Flutter, and React Native now show customer-facing, localizable copy keyed off the structured engine error code, falling back to the engine’s English message when no copy is authored — so a dialog never shows a blank or a raw code. You can override this copy per error code and resolve it yourself in custom error handlers. See the Custom Error Messages guide for authoring copy and the Error Catalog for the full list of structured error codes.

Node-Native Engine & ESM Build

  • Engine/Node: New @cesdk/node-native package shipping a native N-API addon for macOS (arm64, x64) and Linux x64 (glibc ≥ 2.39). Drop-in replacement for @cesdk/node (WASM) with GPU rendering, real video/audio export, and no WebAssembly memory ceiling. Switch the import — import CreativeEngine from '@cesdk/node-native' — and the existing code keeps working. Windows, Alpine/musl, Linux arm64, and AWS Lambda are unsupported in this release; those workloads stay on @cesdk/node. Licensing requirements are unchanged from @cesdk/node — see the package README and https://img.ly/pricing for details. Nightly builds publish under the @dev dist-tag for early validation.
  • Engine/Node: Ship a real ESM build alongside the existing CJS build. import resolves to ./build/index.mjs and exposes CreativeEngine as the default export plus all named exports (LogLevel, color helpers, MimeType, etc.); require continues to return the CreativeEngine class with named exports attached as properties. No source code changes are required for existing CJS consumers.

Print & PDF Output

  • Plugins/Web: Added convertToPDFX to @imgly/plugin-print-ready-pdfs-web. Supports both PDF/X-3 and PDF/X-4 via outputStandard, defaulting to PDF/X-4 so live transparency is preserved and vector text on transparent pages is no longer rasterized. (Supersedes convertToPDFX3 — see Deprecations.)
  • Engine/Renderer: Added support for underlayer settings, text overhang, and PDF device CMYK export options

Improvements & Behavior Changes

Typefaces & Font Library

  • Editor/Web: Removed the font style/weight dropdown from the default text controls; weight and style are now set via the typeface library panel and the bold/italic toggles.
  • Editor/Web: The typeface select tooltip now shows the selected typeface name.
  • Engine: ly.img.document-typefaces asset source stays in sync with the scene. Entries are removed once no text or caption block references the typeface anymore, and onAssetSourceUpdated fires after every mutation.

Text Presets & Library

  • Editor/Web: The default ly.img.text library keeps the source ID it has used since earlier versions, but its content changed from the basic Title / Headline / Paragraph entries to the new Plain Text style presets (per-asset IDs are now group-scoped, e.g. ly.img.text.default.title); the ly.img.text.styles, ly.img.text.curves, and ly.img.text.components sources join the same entry. See the Migrating to v1.77 guide for details.
  • Editor/Web: Caption style presets now set the caption’s font size and frame, scaled to the page, so applying one sizes the caption consistently and the size scales with the page resolution.

Keyboard Shortcuts

  • Engine: Keyboard shortcuts are no longer handled inside the engine. If you embed @cesdk/engine without the CE.SDK editor UI and relied on the engine reacting to key presses (undo/redo, delete, arrow-key nudge, and so on), handle the key events yourself and dispatch the matching command through engine.actions. Integrations that use the prebuilt CE.SDK editor are unaffected — on the web it maps keys to actions for you.

Performance

  • Engine: Added viewport-aware page culling for multi-page scenes. Only visible pages are processed each frame, dramatically improving performance for photobook-style scenes with 100+ pages. Controlled via features/viewportCullingEnabled setting (enabled by default).
  • Editor/Android: Improved pages mode performance for large scenes. Page thumbnails are now rendered sequentially with an in-memory cache, so re-entering pages mode displays thumbnails instantly.

Bug Fixes

Engine

  • Fixed a data race in the audio time-stretcher that could crash playback when scrubbing or splitting a video clip at a playback speed other than 1.
  • Fixed line shapes losing their gradient or image fill and turning solid black. Lines now render gradient, image, and video fills correctly.
  • Fixed movement constraint clamping for rotated blocks. The constraint now follows the block’s axis-aligned bounding box in page space, so rotating a block no longer lets its visible bounds drift past the page edge along its long axis.
  • Fixed PDF exports with exportPdfWithDeviceCMYK losing spot color names. Spot colors now keep their name in the exported PDF, so print shops can match them to the correct ink.
  • Fixed system font fallback for characters not covered by the assigned typeface on Node and Node-Native. The hosted fallback fonts are now resolved from the IMG.LY CDN when a local baseURL/basePath is configured (as on Node), instead of from a local path where they are not available — so unsupported characters render the same as in the browser. A remote baseURL (e.g. a self-hosted CDN mirror) is still used as-is.
  • Fixed lines disappearing when combined with another element through a boolean operation. A line now contributes its visible (stroked) footprint to the combined shape, and a result that takes its color from a line now uses the line’s color.
  • Fixed a video fill whose source failed to load (for example because of a CORS or network error) being re-fetched on every render frame with no limit. A failed video load now keeps its error state like image fills do; use forceLoadResources/forceLoadAVResource to explicitly retry it.

Engine/Web

  • Fixed jittery video playback on Firefox. H.264 videos containing B-frames are now decoded in presentation order instead of decode order, eliminating the jumping and twitching artifacts that appeared while a video was playing.

Engine/Node

  • Fixed targetWidth/targetHeight being silently ignored by exportVideo in @cesdk/node-native. Passing both dimensions now resizes the exported video as documented, matching the WASM binding — no explicit useTargetSize flag required.

Engine/Android

  • Fixed a potential crash when overlapping engine directory cleanup operations delete stale temporary files.

Editor/Web

  • Fixed uneven inspector bar spacing — corrected the doubled flex gap around zero-width spacers and removed the redundant horizontal margin that made the trim bar inset wider than other bars.
  • Fixed the caption panel input losing focus immediately after clicking “Create Manually”, which interrupted typing the first caption.
  • Fixed an issue causing the shadow inspector to be visible for page blocks.

Editor/iOS

  • Fixed a regression where pressing Backspace on an empty list item deleted the whole paragraph in a single keystroke. The first Backspace now clears the bullet/number while keeping the paragraph, and a second Backspace merges it with the previous paragraph (matching Web and Android). Affects both the hardware and on-screen keyboard.
  • Fixed the Crop sheet’s Reset button. It is now correctly disabled when the crop has no modifications, and tapping it clears all crop edits while keeping the block in crop mode.
  • Fixed undo/redo after a page resize leaving the canvas zoom misaligned. The view now re-fits the page on every history step while the resize sheet is open.
  • Dashed and dotted strokes no longer flicker while adjusting the stroke width.

Editor/Android

  • Dashed and dotted strokes no longer flicker while adjusting the stroke width.

Editor/Flutter

  • Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView.

Version v1.76.1 Changelog June 17, 2026

Breaking Changes

Non Breaking Changes

  • Engine/Web, Editor/Web: Fixed a critical issue around the API endpoints used by the licensing mechanism.

Version v1.76.0 Changelog June 3, 2026

Breaking Changes

  • Editor/RN: Fixed exported artifact files on Android being named with a .tmp extension instead of the format-specific extension (e.g. .mp4, .png, .pdf). EditorBuilderDefaults.getExportResult now requires a mimeType: MimeType argument; callers that override the export builder must pass the MimeType of the exported buffer.
  • Editor/Flutter: Fixed exported artifact files on Android being named with a .tmp extension instead of the format-specific extension (e.g. .mp4, .png, .pdf). EditorBuilderDefaults.getExportResult now requires a mimeType: MimeType argument; callers that override the export builder must pass the MimeType of the exported buffer.

Non Breaking Changes

  • Engine: Added subscribeToHistoryWithKind, whose callback receives a HistoryUpdate distinguishing snapshot changes (Updated) from activations via setActiveHistory (Activated), so consumers can ignore pure preview-mode activations. The existing subscribeToHistory is deprecated in favor of the new method.
  • Engine/Web: Added engine.editor.onHistoryUpdatedWithKind((kind) => …), whose callback receives a HistoryUpdate ('Updated' or 'Activated'). engine.editor.onHistoryUpdated is deprecated in favor of the new method.
  • Engine/Swift: Added EditorAPI.onHistoryUpdatedWithKind and onHistoryUpdatedWithKindPublisher, which emit HistoryUpdate. EditorAPI.onHistoryUpdated and onHistoryUpdatedPublisher are deprecated in favor of the new members.
  • Engine/Android: Added EditorApi.onHistoryUpdatedWithKind(), which returns Flow<HistoryUpdate>. EditorApi.onHistoryUpdated() is deprecated in favor of the new method.
  • Editor/Android: Added the BackgroundRemoval plugin for removing image backgrounds in the editors.
  • Editor/Android: Added support for multi-clip foreground tracks in the timeline, including split, gap-aware trim and move, and respect for locked clips.
  • Editor/Android: Long-press a clip on the timeline to drag it within or across tracks, or into a gap to create a new track.
  • Editor/Android: The video starter kit’s Dock and InspectorBar no longer include Dock.Button.rememberReorder() / InspectorBar.Button.rememberReorder() — long-press drag on the timeline replaces them. The functions remain available for consumers who want to add the buttons back.
  • Editor/Android: The video starter kit’s InspectorBar no longer includes InspectorBar.Button.rememberMoveAsClip() / InspectorBar.Button.rememberMoveAsOverlay() — drag-and-drop between background and foreground tracks on the timeline replaces them. The functions remain available for consumers who want to add the buttons back.
  • Engine/Web: Added optional filter parameter to engine.asset.findAssets for structured property predicates ({ property, contains?, equals? }) combined with and / or / not combinators. See Querying Assets guide for details.
  • Engine/Web: Custom asset sources now receive the structured filter in their findAssets callback alongside the existing query / tags / groups fields.
  • Engine/Web: Added block.getTextCharacterInkBoxes(id, from, to) — returns the tight ink-paint bounding box of each grapheme cluster in [from, to), in global scene coordinates.
  • Engine/Android: Added BlockApi.getTextCharacterInkBoxes(block, from, to) returning List<CharacterInkBox>.
  • Engine/iOS: Added block.getTextCharacterInkBoxes(_:in:) returning [CharacterInkBox].
  • Engine: Added setContentFillHorizontalAlignment, getContentFillHorizontalAlignment, setContentFillVerticalAlignment, and getContentFillVerticalAlignment to control the alignment of the content fill within a block when using Contain or Cover fill modes. Useful for templates where the inserted image’s aspect ratio is unknown and should pin to a specific edge (e.g. top-left) rather than always centering.
  • Editor/Web: Added content fill alignment controls in the crop inspector. Can be disabled via cesdk.feature.enable('ly.img.crop.fillAlignment', false).
  • Editor/iOS: Added support for multi-clip foreground tracks in the timeline, including split, gap-aware trim and move, and respect for locked clips.
  • Editor/iOS: The default video editor’s Dock and InspectorBar no longer ship Dock.Buttons.reorder() / InspectorBar.Buttons.reorder() — long-press drag on the timeline replaces them. The factories remain available for consumers who want to add the buttons back.
  • Editor/iOS: Drag clips between background and foreground tracks on the timeline.
  • Editor/iOS: Long-press a clip on the timeline to drag it within or across tracks, or into a gap to create a new track. Background clips reorder using the same gesture.
  • Engine: Added paragraph-granular line height API: setTextLineHeight and getTextLineHeight allow each paragraph in a text block to carry its own line height multiplier, independent of the block-level text/lineHeight default.
  • Engine: Added scene.setFontSizeUnit() / scene.getFontSizeUnit() to choose how setTextFontSize, getTextFontSizes, and the font-size float properties (text/fontSize, text/min/maxAutomaticFontSize, and the matching caption/* properties) interpret values on a per-scene basis (Point or Pixel). The engine continues to store font sizes in points internally; this only affects API-boundary interpretation.
  • Engine: scene.create() gained an overload that accepts designUnit and an optional fontSizeUnit. When fontSizeUnit is omitted it is auto-paired with designUnit (PixelPixel, others → Point).
  • Editor/Web: Added a font-size unit selector to the page resize panel, and the font-size input now displays the scene’s unit (px or pt). The new selector is gated by the ly.img.scene.fontSizeUnit feature key (enabled by default; disable via cesdk.feature.disable('ly.img.scene.fontSizeUnit')).
  • Editor/Android: Added a font-size unit selector to the page resize dialog.
  • Editor/iOS: Added a font-size unit picker to the page resize overlay.
  • Engine: Added setTextKerning and getTextKernings API for per-range character kerning offset control.
  • Engine: Added text/useKerning, text/useContextualLigatures, and text/useDiscretionaryLigatures boolean properties to text and caption blocks, enabling independent control of OpenType kerning (kern), contextual ligatures (clig), and discretionary ligatures (dlig) via getBool/setBool.
  • Engine: Text and caption blocks now render Inner and Outer stroke positions in addition to Center, matching shape behavior. The setStrokePosition API no longer returns an error for text blocks.
  • Editor/Web: The stroke position selector is now shown for text and caption blocks in the Inspector.
  • Engine: Line shapes are now true open-path lines instead of thin rectangles. Stroke caps can now be configured for both line and dash endpoints.
  • Editor/iOS: Updated the value of the ly_img_editor_timeline_add_audio_option_music resource from “Music” / “Musik” to “Audio” / “Audio”.
  • Editor/Android: Fixed the “Add Audio” timeline menu’s library option reusing the dock’s ly_img_editor_dock_button_audio string. It now uses the dedicated ly_img_editor_timeline_add_audio_option_music resource.
  • Editor/Android: Opening the filter sheet, opening the crop sheet, or uploading an asset no longer crashes when the corresponding asset source is not registered. The affected feature degrades gracefully instead.
  • Editor/Android: Fixed voiceover sheet controls being drawn under the system navigation bar on devices with 3-button navigation.
  • Engine: Fixed click-through on images with effects or a blur applied.
  • Engine: Fixed exportPdfWithDeviceCMYK deriving the DeviceN alternate color from RGB instead of CMYK when a spot color carried both definitions.
  • Engine: Routed the evaluation-license banner and the EventSubscriptionService::initEventCallbacks errorStateChanged line to stderr instead of stdout, so callers can keep stdout clean for structured output (e.g. piping engine results through jq). On emscripten the banner now goes through emscripten_console_error (browser DevTools, console.error; Node.js process.stderr); on native targets it goes through UBQ_ERRPRINTLN (FD 2).
  • Engine: Fixed glyph overhangs (e.g., descenders) being clipped when exporting text with allowTextOverhang: true.
  • Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView.
  • Editor/Web: Fixed the per-image sub-section labels in the color picker’s “More” view, which previously showed the raw translation key (e.g. libraries.ly.img.colors.panel...) instead of the image’s name.
  • Camera/iOS: Multiple Dual Camera and reaction clips now share a single track per camera angle instead of creating a new track per recording, both when entering the Video Editor from the camera and when adding recordings to an existing timeline.
  • Engine/Swift: Fixed fast single-finger gestures on iOS being silently dropped before reaching the engine, causing quick page-carousel swipes and other gestures to occasionally do nothing.
  • Editor/iOS: Fix corrupted target color icon in the Recolor effect on iOS 26.
  • Editor/iOS: Fixed a “Tried to get solid color fill value on a block that has no such fill color” error when opening a scene whose named blocks have image, video, or non-linear-gradient fills.
  • Editor: Fixed multi-selection bounding box and resize behavior when an audio block is selected together with visual blocks. The selection frame now stays around the visual blocks only, and resizing no longer affects audio tracks.
  • Engine: Improved page-carousel swipe feel.
  • Editor/Web: Silenced findDOMNode deprecation warning emitted by react-draggable by passing nodeRef to every Draggable/DraggableCore instance.
  • Engine: Fixed the corner-rounding slider producing a triangular bevel on shapes with mild bends (e.g. Organic Dot 1/2). Mild junctions now smooth progressively with the slider; sharper corners still round as before.
  • Editor/Web: Fixed an issue where the slider’s optional numeric input was letting users commit values that did not land on the slider’s step grid.
  • Engine: Fixed move-handle snap targets being offset from the design block frame for text blocks with a background fill. All four edges (left/right/top/bottom) now consistently snap to the design block frame bounds; background-color padding is no longer factored into the snap geometry or the dragged-segment indicator.
  • Engine: setStrokeDashArray and setStrokeDashOffset now reject NaN and infinity inputs with a clear error message, matching the validation already used by the rest of the float-typed stroke setters.
  • Engine: Custom dash patterns now scale with the shape when resizing from a corner, keeping the dash spacing visually consistent.
  • Editor/Android: Updated the English translation of ly_img_editor_sheet_format_text_label_frame_clipping from “Frame Clipping” to “Clipping”.
  • Editor/iOS: Updated the English translation of ly_img_editor_sheet_format_text_label_frame_clipping from “Frame Clipping” to “Clipping”.
  • Editor/Web: Inspector sliders bound to a block property (e.g. brightness, contrast) now reliably update the undo state on slow CPUs.
  • Editor/Web: Fixed an issue where the fill and stroke placeholder sections where enabled for stickers blocks.
  • Engine: Fixed slowdowns and occasional freezes when applying adjustments, filters, or effects to images.
  • Engine: Fixed an issue where video clip thumbnails not updating after replacing the underlying video in some cases.
  • Engine: Added a new playback/showAllBlocks setting that keeps every element visible on the canvas at once, even ones that would otherwise only appear at certain playback times. Off by default.
  • Renderer: Fixed --page <index> selecting the wrong page on multi-column/spread layouts. The CLI now selects pages in document order, matching whole-scene PDF export, instead of reordering them by canvas position.
  • Engine: Fixed an issue where PDF exports with exportPdfWithDeviceCMYK enabled could render thin shape outlines far too thick, turning small icons into oversized solid shapes.
  • Editor/Web: Fixed an issue where the audio track in the video editor timeline could be hidden on initial load until the timeline was collapsed and re-expanded.
  • Editor/Android: Fixed tapping a placeholder page not opening any replace library. The library now matches the page’s fill — images for an image fill, videos for a video fill.
  • Editor/Android: The inspector bar now shows a Replace button for a page with an image or video fill, opening the matching library (images or videos) to replace the page’s fill.
  • Editor/iOS: Fixed tapping a placeholder page opening the full asset library instead of one matching the page’s fill (images for an image fill, videos for a video fill).
  • Editor/iOS: The inspector bar now shows a Replace button for a page with an image or video fill, opening the matching library (images or videos) to replace the page’s fill.

Version v1.75.1 Changelog May 21, 2026

Breaking Changes

Non Breaking Changes

  • Maintenance release. No SDK changes.

Version v1.75.0 Changelog May 19, 2026

Breaking Changes

Editor/Android

  • All ScopedProperty component properties in EditorConfigurationBuilder now return nullable components. For example, ScopedProperty<EditorScope, EditorComponent<*>>? is now ScopedProperty<EditorScope, EditorComponent<*>?>?.

Engine — Text

  • Setting block-level text/horizontalAlignment (via setEnum or setTextHorizontalAlignment without a paragraphIndex) now clears all paragraph-level horizontal alignment overrides.
  • Fixed paragraph override retention during text deletion/merge, so list style and paragraph horizontal alignment are preserved correctly.
  • getTextParagraphIndices now expects the to parameter to be exclusive.

New Features

APNG Support

  • Engine: Animated PNG (APNG) files can now be imported. In design scenes they appear as a static image (the first frame); in video scenes they play as a looping animated fill, the same way GIFs do.
  • Editor/Web, iOS, Android: The upload widget accepts .apng files.

Text

  • Engine: Added paragraph-level text horizontal alignment APIs (setTextHorizontalAlignment, getTextHorizontalAlignment) and getTextEffectiveHorizontalAlignment.

Crop & Aspect Ratio

  • Engine: Added a new ContentAspectRatio asset transform preset that snaps a block’s frame to the intrinsic aspect ratio of its image or video content at apply time.
  • Engine/Web: Added block.canRevertToOriginalRatio(block) which reports whether the “Original” crop preset (ContentAspectRatio) can be applied.
  • Editor/Web: Added an “Original” entry to the crop presets palette. Selecting it resizes the block to match its content’s natural aspect ratio.

Color & Image Colors

  • Engine: Added engine.block.getDominantColors() to extract the prominent colors of the rendered appearance of a block.
  • Editor/Web: Added an “Image Colors” section to the color library panel that aggregates the dominant colors of every block in the current scene, split into one sub-section per contributing block. Blocks referencing the same underlying image are collapsed to a single sub-section.
  • Editor/Web: Added Feature API keys to independently toggle sub-controls (color picker, gradient editor, opacity slider, swatch library) across every color panel:
    • ly.img.fill.color.picker, ly.img.fill.color.picker.gradient, ly.img.fill.color.picker.opacity, ly.img.fill.color.library
    • ly.img.stroke.color.picker, ly.img.stroke.color.picker.opacity, ly.img.stroke.color.library
    • ly.img.shadow.color.picker, ly.img.shadow.color.picker.opacity, ly.img.shadow.color.library
    • ly.img.text.background.picker, ly.img.text.background.picker.opacity, ly.img.text.background.library

Grid

  • Engine: Each page can now have its own grid settings.
  • Editor/Web: Grid controls moved to the Page panel as a new “Grid” section. New and duplicated pages inherit the previous / source page’s grid so you don’t have to set it up each time. The Document panel now only has “Show Rulers”.

Movement, Interaction & Vector Paths

  • Engine: Added editor.setMovementConstraint, editor.getMovementConstraint, and editor.removeMovementConstraint to limit how far blocks can be positioned outside their parent page during user interactions. See Movement Constraints guide for details.
  • Engine: Clicks now pass through fully transparent parts of images and stickers to the element behind them. On by default; disable via features/transparentClickThroughEnabled = false to restore the legacy behavior.
  • Engine: Added shape/vector_path/fillRule enum property (EvenOdd | NonZero) so imports from PDF, SVG and other tools that use non-zero winding render correctly. The default stays EvenOdd, preserving existing scene rendering.

PDF Output

  • Engine: Added fill/overprint and stroke/overprint block properties for controlling the PDF overprint attribute on exported PDFs.

Archival & Block APIs

  • Engine: Added archival/bundleOnlyUsedFontVariants setting. When enabled, saveSceneToArchive and saveBlocksToArchive bundle only the font variants actually referenced by text blocks instead of every variant of each used typeface, significantly reducing archive size. Defaults to false to preserve the ability to switch to other weights/styles after re-loading the archive.
  • Engine: Added engine.block.findAllUnused API that returns all blocks that are not attached to any scene.
  • Engine: forceLoadResources now accepts an empty block list to load resources for every block currently known to the engine.

Editor Configuration & Assets

  • Editor/Android: Added EditorConfiguration.then and EditorConfigurationBuilder.parentConfiguration to support chaining editor configurations and extending existing callbacks or UI components.
  • Editor/Web: Added a customizable asset.delete action that is invoked when the user deletes an asset from an asset source via the asset library card. Register a custom implementation with cesdk.actions.register('asset.delete', ({ sourceId, asset }) => { ... }) to replace the confirmation dialog content, swap in a custom dialog, or change the deletion behavior entirely. The default behavior is unchanged.

Text Rendering

  • Engine: Added features/fontLineGapEnabled setting (default true). Set to false to restore the pre-1.73 text rendering that ignored the font’s line_gap metric, for projects whose stored scenes or templates were authored against the older layout.

Improvements & Behavior Changes

Editor

  • Enlarged the clickable area of selection corner handles on mouse input so corners are easier to grab near the frame corner. The corner hit area is now symmetric around the frame corner with a reach of 9 px in every direction.

Editor/Web — Video Editor

  • In the Video Editor caption start/end time reverts to the previous value when cleared or given an invalid time.
  • In the Video Editor caption timing inputs can no longer produce overlapping or out-of-order captions.

Editor/Web — Placeholders

  • The placeholder “Allow to Resize” toggle on pages now applies only to the current page instead of fanning out to every page in the scene. The i18n key scope.layer.resize.allPages was renamed to scope.layer.resize.page.
  • Hide the “Allow to Change Shape” placeholder option for pages, where shape replacement is not exposed by the default editor UI.
  • Correct the “Allow to Change Shape” placeholder tooltip to describe replacing the shape type instead of editing shape options.

Editor/Web — Image Colors

  • Fixed the search bar in the “Image Colors” picker — typing a hex value or image name now filters the swatches.
  • “Image Colors” no longer shows solid-color fills; only colors picked from images appear in this section.

Bug Fixes

Engine

  • Fixed vector path editing where dragging anchor points, adding anchors to segments, and bending segments would not update until the camera moved.

Engine/Swift

  • Fixed Dolby Vision videos not working correctly.
  • Fixed memory leak during video export.

Engine/Android

  • Fixed video MediaCodec, MediaExtractor, and Surface resources not being released when a decoder is destroyed, which could exhaust the platform hardware codec limit across long-running sessions.

Engine/Web

  • Fixed a glitch where some AI-generated videos briefly showed frames from the start of the clip near the end of playback.

Editor

  • Fixed vector path editing segments rendering oversized on monitors with different pixel densities.

Editor/Web

  • Fixed an issue where the editor could load with mobile layout on desktop.
  • Fixed a crash when popover content is hidden via custom CSS.
  • Fixed an issue where hovering the Replace Shape dropdown item did not display a tooltip.
  • Fixed slider being unable to reach its default value in Safari and Edge.
  • Fixed a video timeline issue where height was not re-measured properly when enabling video timeline features after initial render.
  • Fixed an issue where the advanced video editor starterkit would not show all the timeline tracks in some edge cases.

Editor/iOS

  • Fixed “Add Clip” button drifting to the foreground track’s trailing edge after removing all background clips.
  • Fixed a “Could not create View for Canvas Menu / Inspector Bar” error popup that could appear after moving a single clip from the background track to an overlay (and other interactions that destroyed the selection’s parent block).

Editor/Flutter

  • Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView.

Version v1.74.2 Changelog May 15, 2026

Breaking Changes

Non Breaking Changes

  • Editor/iOS: Engine-provided animation asset labels can now be localized through the platform localization system. Apps can override labels per locale by declaring the matching string keys.
  • Editor/Android: Engine-provided animation asset labels can now be localized through the platform localization system. Apps can override labels per locale by declaring the matching string keys in their strings.xml

Version v1.74.1 Changelog May 7, 2026

Breaking Changes

Non Breaking Changes

  • Editor/Web: Fixed dependency declarations and import resolution causing some starterkits to fail on startup.
  • Camera/iOS: Fixed a crash that could occur when the camera failed to start.

All Releases

v1.79.0 Changelog July 17, 2026
v1.78.0 Changelog July 17, 2026
v1.77.1 Changelog July 9, 2026
v1.77.0 Changelog July 2, 2026
v1.76.1 Changelog June 17, 2026
v1.76.0 Changelog June 3, 2026
v1.75.1 Changelog May 21, 2026
v1.75.0 Changelog May 19, 2026
v1.74.2 Changelog May 15, 2026
v1.74.1 Changelog May 7, 2026
v1.74.0 Changelog May 5, 2026
v1.73.1 Changelog April 23, 2026
v1.73.0 Changelog April 20, 2026
v1.72.3 Changelog April 14, 2026
v1.72.2 Changelog April 9, 2026
v1.72.1 Changelog April 2, 2026
v1.72.0 Changelog April 2, 2026
v1.71.0 Changelog March 19, 2026
v1.70.1 Changelog March 13, 2026
v1.70.0 Changelog March 9, 2026
v1.69.0 Changelog February 23, 2026
v1.68.0 Changelog February 6, 2026
v1.67.0 Changelog January 22, 2026
v1.66.1 Changelog December 19, 2025
v1.66.0 Changelog December 17, 2025
v1.65.0 Changelog December 5, 2025
v1.64.0 Changelog November 21, 2025
v1.63.1 Changelog November 13, 2025
v1.63.0 Changelog November 7, 2025
v1.62.1 Changelog November 7, 2025
v1.62.0 Changelog October 22, 2025
v1.61.0 Changelog October 8, 2025
v1.60.0 Changelog September 19, 2025
v1.59.2 Changelog September 12, 2025
v1.59.1 Changelog September 8, 2025
v1.59.0 Changelog September 2, 2025
v1.58.0 Changelog August 19, 2025
v1.57.1 Changelog August 15, 2025
v1.57.0 Changelog August 6, 2025
v1.56.0 Changelog July 24, 2025
v1.55.2 Changelog July 18, 2025
v1.55.1 Changelog July 11, 2025
v1.55.0 Changelog July 8, 2025
v1.54.1 Changelog July 2, 2025
v1.54.0 Changelog June 26, 2025
v1.53.0 Changelog June 12, 2025
v1.52.0 Changelog May 29, 2025
v1.51.0 Changelog May 19, 2025
v1.50.2 Changelog May 15, 2025
v1.50.1 Changelog May 9, 2025
v1.50.0 Changelog April 29, 2025
v1.49.1 Changelog April 21, 2025
v1.49.0 Changelog April 16, 2025
v1.48.1 Changelog April 11, 2025
v1.48.0 Changelog April 1, 2025
v1.47.0 Changelog March 20, 2025
v1.46.1 Changelog March 5, 2025
v1.46.0 Changelog March 4, 2025
v1.45.0 Changelog February 19, 2025
v1.10.6 Changelog February 19, 2025
v1.44.0 Changelog February 6, 2025
v1.43.0 Changelog January 21, 2025
v1.42.0 Changelog January 9, 2025
v1.41.1 Changelog December 16, 2024
v1.41.0 Changelog December 11, 2024
v1.40.1 Changelog December 6, 2024
v1.40.0 Changelog November 28, 2024
v1.39.0 Changelog November 12, 2024
v1.38.0 Changelog October 29, 2024
v1.37.0 Changelog October 14, 2024
v1.36.1 Changelog October 4, 2024
v1.36.0 Changelog September 30, 2024
v1.35.1 Changelog September 20, 2024
v1.35.0 Changelog September 16, 2024
v1.34.0 Changelog August 31, 2024
v1.10.5 Changelog August 30, 2024
v1.33.0 Changelog August 23, 2024
v1.10.4 Changelog August 21, 2024
v1.32.0 Changelog August 6, 2024
v1.31.0 Changelog July 18, 2024
v1.30.0 Changelog July 3, 2024
v1.29.0 Changelog June 20, 2024
v1.28.0 Changelog June 6, 2024
v1.27.1 Changelog May 23, 2024
v1.26.1 Changelog May 22, 2024
v1.27.0 Changelog May 21, 2024
v1.26.0 Changelog May 7, 2024
v1.25.0 Changelog April 23, 2024
v1.24.0 Changelog April 5, 2024
v1.23.0 Changelog March 26, 2024
v1.22.0 Changelog March 12, 2024
v1.21.1 Changelog February 27, 2024
v1.21.0 Changelog February 22, 2024
v1.20.0 Changelog January 25, 2024
v1.19.0 Changelog December 13, 2023
v1.18.1 Changelog November 29, 2023
v1.18.0 Changelog November 6, 2023
v1.10.3 Changelog October 26, 2023
v1.10.2 Changelog October 26, 2023
v1.17.0 Changelog October 9, 2023
v1.16.1 Changelog September 14, 2023
v1.16.0 Changelog September 8, 2023
v1.15.0 Changelog September 1, 2023
v1.14.0 Changelog July 21, 2023
v1.13.1 Changelog July 10, 2023
v1.13.0 Changelog July 3, 2023
v1.12.2 Changelog June 30, 2023
v1.12.1 Changelog June 12, 2023
v1.12.0 Changelog June 2, 2023
v1.11.1 Changelog May 17, 2023
v1.11.0 Changelog May 10, 2023
v1.10.1 Changelog March 29, 2023
v1.10.0 Changelog March 14, 2023
v1.9.2 Changelog January 18, 2023
v1.9.1 Changelog December 15, 2022
v1.9.0 Changelog December 12, 2022
v1.8.0 Changelog October 21, 2022
v1.7.0 Changelog August 11, 2022
v1.6.3 Changelog June 13, 2022
v1.6.2 Changelog May 24, 2022
v1.6.1 Changelog May 23, 2022
v1.6.0 Changelog May 16, 2022
v1.5.1 Changelog May 9, 2022
v1.4.7 Changelog May 3, 2022
v1.4.6 Changelog April 14, 2022
v1.5.0 Changelog April 4, 2022
v1.4.5 Changelog April 1, 2022
v1.4.4 Changelog March 9, 2022
v1.4.3 Changelog March 7, 2022
v1.4.2 Changelog February 23, 2022
v1.4.1 Changelog February 22, 2022
v1.4.0 Changelog February 18, 2022
v1.3.0 Changelog January 6, 2022
v1.2.1 Changelog November 30, 2021
v1.2.0 Changelog November 22, 2021
v1.1.1 Changelog October 29, 2021
v1.1.0 Changelog October 28, 2021
v1.0.0 Changelog August 18, 2021