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.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.

Version v1.74.0 Changelog May 5, 2026

Breaking Changes

  • Editor/Web: BREAKING: The video editor starter kit now defaults to a simplified timeline. timeline/trackVisibility is set to 'active' so only the selected track is shown in the foreground, and the ly.img.video.timeline.ruler feature is disabled so the time scale is hidden.

Non Breaking Changes

  • Editor/Web: Add builder.Spinner() to render an indeterminate loading spinner in registered panels, with an optional label rendered beneath the spinner.
  • Engine: Improved corner rounding on polygon and vector path shapes to produce smooth bezier arcs at curved segment junctions
  • Engine: Added Dynamic option to touch/pinchAction setting. Pinch gestures scale the block at the center point between fingers, or zoom the camera if no block is found.
  • Engine/Web: Added exportPdfWithDeviceCMYK export option. When enabled, direct CMYK colors are written as DeviceCMYK (k/K operators) and spot colors with CMYK values are written as DeviceN with process CMYK components in exported PDFs. Disabled by default for backward compatibility.
  • Engine: Added page/flipDimensionsOn90DegreeCropRotation setting. When enabled, rotating the crop by 90 degrees automatically swaps the block’s width and height, causing the page aspect ratio to rotate with the content.
  • Editor/Web: Replaced the editor loading indicator with a theme-aware beacon ring that adapts to light and dark surfaces using the host’s design tokens.
  • Editor/Web: Added UI controls to add and delete gradient color stops from the color picker.
  • Editor/Web: Added UI controls for switching between linear, radial and conical gradient fill types.
  • Editor/Web: Added a mirror button to reverse gradient stops.
  • Engine/Editor: Added page/marqueeSelectOnBodyDrag setting (default: false). When enabled, a click+drag that starts on the page body marquee-selects the blocks inside the page instead of moving the page. The page can still be moved by dragging its title, or by holding Cmd (macOS) / Ctrl (Windows/Linux) while clicking+dragging on the page body, on any block inside the page, or on a page whose body is fully covered by content. In free layout the Cmd/Ctrl+drag translates the page; in horizontal/vertical stack layouts it reorders the page within the stack.
  • Plugins/Web: Added embedICCProfile option to the Print-Ready PDF plugin’s convertToPDFX3. When set to false, the resulting PDF is converted to device CMYK (or RGB, depending on the selected outputProfile) without embedding an ICC profile or the PDF/X-3 OutputIntent, enabling integration with downstream prepress pipelines such as ZePrA or PitStop that assign their own ICC profile and apply color normalization. Defaults to true for backward compatibility.
  • Engine/Editor: Added page/restrictPageSelectionToBorderAndTitle setting (default: false). When enabled, clicking inside a page body no longer selects the page; the page can only be selected by clicking on its border or title.
  • Engine: Auto-width text blocks now shrink back to fit the remaining text when content is deleted to a single line while the page-edge clamping feature is active.
  • Engine: Snap guide lines are now finite and bounded to the edges of the involved elements. Element boundaries are shown with a dashed pattern, while connecting lines and gaps between elements are solid.
  • Engine: Vector anchor handles in vector edit mode now snap to page edges, centers, siblings, grid lines, and to other anchors’ horizontal/vertical alignment.
  • Engine: Added hasSelectedVectorControlPoint() and deleteSelectedVectorControlPoints() APIs for managing bezier control point handles during vector editing.
  • Engine: Added shape/star/cornerRadius property for rounding star shape corners.
  • Engine: Improved vector editing: corner radius is now preserved as a live property when converting parametric shapes to vector paths, bend mode no longer overwrites existing control handles, and segment splits produce smooth nodes by default.
  • Plugins/Web: Fixed background removal failing on GPUs without WebGPU shader-f16 support by falling back to CPU-based inference.
  • Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView.
  • Engine: Fixed getTypeface() and getTypefaces() returning an error for text blocks without an explicitly set typeface. They now resolve the default font from settings when no typeface has been assigned.
  • Editor/Web: Fixed an issue where the hex color input did not update when pasting a color value.
  • Engine/Swift: Dispatch async onXChanged stream unsubscribes to the main thread, fixing a race in the engine’s subscription map when multiple streams terminate concurrently.
  • Engine: Thumbnail generation now caps the effective render resolution at 512 px on each dimension. The returned thumbnail still matches the requested output size.
  • Engine: Fixed the cesdk-renderer Linux CLI exporting only the first page when writing a scene to PDF. PDF exports now include every page of the scene by default; pass --page <index> to export a single page.
  • Engine: Fixed PDF export wrapping spot-colour text in a transparency group.
  • Engine: Fix underlayer shape being offset by the page margin in PDF export when page/marginEnabled is enabled.
  • Editor/Web: Added 46 new Starter Kits covering video editing, plugins, custom built UIs, customization, assets, templating, creative automation, and extensibility.
  • Engine: Fixed an issue where text blocks with pending font resources (e.g., system font fallback) would show a gray background overlay in exported images.
  • Engine: Fixed a rare crash that could occur when moving, resizing, or rotating an element if the selection changed during the gesture.
  • Editor/Web: Fixed the canvas view jumping to the page center on undo/redo when zoomed in.
  • Engine: Star shapes now use the smooth corner rounding introduced for polygons and vector paths, so a star’s cornerRadius looks identical whether or not it is in vector edit mode.
  • Engine: Entering vector edit mode on a circle or ellipse now mirrors its control handles in both angle and length by default, keeping the shape symmetric while dragging a single handle.
  • Editor/Web: Updated the design of gradient color stop handles.
  • Editor/Web: Fixed gradient bar preview to reflect actual stop positions while dragging.
  • Editor/Web: Replaced the color mode label with a dropdown to switch between RGB and CMYK.
  • Editor/Web: Hide the Position control in the inspector bar when a page block is selected. Previously a disabled Position button was shown because the ly.img.position feature was implicitly kept enabled by its always-true arrange, align, and distribute child predicates; the child predicates now mirror the parent and return false for pages.
  • Engine: Fixed page/title/color setting not being applied while editing a page title; the editing text no longer inherits the selection-highlight color from the displayed title.
  • Plugins/Web: Added middlewares to GatewayProviderConfiguration, bringing AI gateway providers in line with every other AI provider. Use it to hook logging, rate limiting, custom error handling, or uploadMiddleware to re-upload generated assets to your own storage — the recommended fix for the gateway’s short-lived presigned URLs.
  • Engine: Added ExportOptions.underlayerRenderRatio and ExportOptions.underlayerMaxError to allow tuning the fidelity of the PDF underlayer contour.
  • Editor/Web: Fixed canvas being greyed out by the ruler overlay on Firefox in advanced mode.
  • Editor/ReactNative: Fixed IMGLYEditor.openEditor and IMGLYCamera.openCamera hanging on iOS when the host app already had a view controller presented modally (e.g. react-native-screens modal routes, Expo Router modal screens, RN <Modal>, system sheets). The editor is now presented from the topmost view controller, so the returned Promise settles correctly in all hosting scenarios.
  • Editor/Android: Introduced the addToBackgroundTrack parameter for EditorEvent.AddUriToScene when adding URI assets to the scene.
  • Editor/Android: Fixed the “Select Group” canvas menu button being rendered as a plain text label instead of the filled tonal chip-style button.

Version v1.73.1 Changelog April 23, 2026

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.73.0 Changelog April 20, 2026

Breaking Changes

  • Editor/Android: BREAKING: Introduced Starter Kits - pre-configured editor templates that replace the previous built-in editor composables. The editor now initializes with a blank canvas by default.

    Key changes:

    • The editor initializes a blank canvas with minimal configuration. Use one of our Starter Kits to get started quickly based on your use case.

    Migration: See the Starter Kits Migration Guide for step-by-step instructions.

  • Editor/iOS: OnCreate.default and OnCreate.loadScene no longer load the default and demo asset sources.

  • Editor/iOS: Removed SceneMode dependency from UI logic. Editor behavior is now configured explicitly per solution rather than derived from the scene mode.

  • Editor/iOS: Added OnExport.static() and OnExport.video() replacing the removed OnExport.default.

  • Editor/iOS: Removed AssetLibrarySceneModeReader, OnExport.default, and OnCreate.loadAssetSources.

  • Editor/iOS: Added photoRollTab requirement to the AssetLibrary protocol. Custom conformances must implement this property.

  • Engine/Swift: Removed sceneMode parameter from addDemoAssetSources. The exclude parameter now defaults to excluding video and audio sources; pass exclude: [] to include all.

Non Breaking Changes

  • Engine/Android: Bumped compileSdk and targetSdk versions to 36.
  • Editor/Android: Bumped compileSdk and targetSdk versions to 36.
  • Engine/Editor: Added controlGizmo/dynamicMoveHandleVisibility setting (default: true). Set to false to keep the move handle always visible regardless of block size. Default behavior is unchanged.
  • Editor/Web: Improved keyboard accessibility by returning focus to the trigger button when closing a panel
  • Editor/Web: Add builder.Select() support to navigation bar, inspector bar and canvas bar with searchable and searchPlaceholder options.
  • Engine: Added SVG export support using the image/svg+xml MIME type. Text is exported as vector paths for consistent rendering across environments. Drop shadows, blur, effects, and raster images are rasterized and embedded as images.
  • Engine: Fixed importing some camera-recorded MP4/3GP videos whose audio track uses AMR sample entries.
  • Engine: Fixed animation duration slider not allowing the full clip length due to rounding.
  • Engine: Local asset sources now resolve labels and tags using a fallback chain (requested locale → “en” → first available) instead of returning empty values when the exact locale is not found.
  • Editor/Web: Fixed the “Match Language Direction” control incorrectly showing RTL mode when LTR text is right-aligned.
  • Editor/Android: Fixed the “Match Language Direction” control incorrectly showing RTL mode when LTR text is right-aligned.
  • Editor/iOS: Fixed the “Match Language Direction” control incorrectly showing RTL mode when LTR text is right-aligned.
  • Engine: Fixed multiline text rendering for fonts with non-standard line gap metrics (e.g., Coiny). The font’s line gap is now correctly incorporated into line height calculations, fixing incorrect line spacing and cursor height.
  • Engine: Fixed document colors missing colors and incorrect active states for text with mixed run colors.
  • Editor/Web: Fixed document colors not refreshing when changing partial text colors.
  • Engine: Fixed fade animation jumping when combined with element opacity on groups
  • Editor/Web: Fixed archive import and cesdk.utils.loadFile opening file picker twice on Windows when OPFS is not available
  • Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView.
  • Engine: Fixed an issue where pages in free layout mode would jump to align with neighboring pages after flipping their orientation.
  • Engine: findAllSettings() no longer returns internal or legacy settings such as debug/* and features/*.
  • Engine/Web: Fixed hover frame remaining visible when moving the mouse from a selected block to the canvas menu.
  • Engine/Swift: Fixed certain HEVC videos not playing correctly on iOS.
  • Engine/Swift: Improved export time for videos.
  • Engine: Fixed console errors when mixing RTL and LTR text in a text block with word wrapping enabled.
  • Engine: Fixed opacity not being applied correctly to nested groups.
  • Engine/Node: Fixed null engine reference on dispose, respect forceCPU on Linux, GPU flush on destruction, and JSON validation for scene deserialization.
  • Editor/Web: Fixed a memory leak where switching fill types (solid/gradient) orphaned the previous fill entity
  • Editor/Web: Fixed page titles being styleable (font, color, size) during editing.
  • Engine: Fixed pinch-to-zoom deselecting the selected element, causing canvas jumps from single-touch scroll, and accidentally triggering handle drags during two-finger gestures.
  • Engine: Reduced jittery behavior when starting a pinch-to-zoom gesture by increasing the single-touch pan distance threshold and adding a time delay before single-touch panning activates.
  • Engine: Fixed placeholder settings not being adjustable for blocks loaded from older scenes.
  • Engine: Fixed a bug where clicking on empty areas within a non-rectangular shape’s bounding box caused the selection to flicker.
  • Engine: Fixed system font fallback rendering producing incorrect results in thumbnails.
  • Engine: Fixed applying a template overwriting the scene layout mode, causing inconsistent state when the previous layout differed from the template’s layout.
  • Engine: Fixed text variables being duplicated when entering text edit mode after applying a text color range that intersected a variable placeholder. Variables are now treated as a single grapheme unit in all text formatting APIs (consistent with inline text editing), so formatting ranges are always snapped to variable boundaries rather than splitting inside them.
  • Engine: Fixed an issue where payload.sourceSet was not applied to video fills when using defaultApplyAsset
  • Engine/Android: Fixed audio playing back at ~2x speed for videos with HE-AAC (SBR) or HE-AACv2 (PS) audio tracks.
  • Engine: Fixed audio duration being reported as half the actual value for HE-AAC/HE-AACv2 audio.
  • Editor/Web: Fixed incorrect translations.
  • Editor/iOS: Added new Editor struct providing a unified core editor.
  • Editor/iOS: Added OnChanged callback to be notified when state changes occur in the editor.
  • Editor/Web: Added 10 new floral stickers to the StickerAssetSource plugin, available under the ly.img.sticker.florals category.
  • Editor/Web: Added new PremiumTemplatesAssetSource plugin for premium template assets (ly.img.templates.premium).
  • Engine: Fixed a crash when loading scene files saved with engine versions prior to 1.72.0 that contain text blocks.
  • Engine/Android: Fixed a crash in pan gesture handling during multi-touch interactions.
  • Editor/Android: Fixed a crash where zooming to a selected block could fail if the block was deleted during the zoom debounce window.
  • Editor/Android: Fixed a rare crash in the canvas menu when the selected block was deleted.
  • Editor/Web: Fixed double-click page title renaming not working on direct load. Page title editing is now enabled by default in every editor config.
  • Engine: Fixed audio waveform thumbnail generation for 24-bit WAV files.
  • Editor/Web: Fixed shape controls incorrectly appearing for sticker blocks in the inspector.

All Releases

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