Search Docs
Loading...
Skip to content

Version v1.76.0 Changelog May 22, 2026

Breaking Changes

  • Engine: onHistoryUpdated now receives a HistoryUpdate distinguishing snapshot changes (Updated) from activations via setActiveHistory (Activated), so consumers can ignore pure preview-mode activations.
  • Engine/Web: engine.editor.onHistoryUpdated((kind) => …) callbacks now receive a HistoryUpdate ('Updated' or 'Activated'). No migration required — () => void callbacks remain assignable.
  • Engine/Swift: EditorAPI.onHistoryUpdated and onHistoryUpdatedPublisher now emit HistoryUpdate instead of Void. Migration: for await _ in … and .sink { _ in … } keep working, update only explicit AsyncStream<Void> / AnyPublisher<Void, Never> annotations.
  • Engine/Android: EditorApi.onHistoryUpdated() now returns Flow<HistoryUpdate> instead of Flow<Unit>. Migration: .collect { … } keeps working, update only explicit Flow<Unit> annotations or Unit-typed lambda parameters.
  • 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

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