Version v1.76.0 Changelog May 22, 2026
Breaking Changes
- Engine:
onHistoryUpdatednow receives aHistoryUpdatedistinguishing snapshot changes (Updated) from activations viasetActiveHistory(Activated), so consumers can ignore pure preview-mode activations. - Engine/Web:
engine.editor.onHistoryUpdated((kind) => …)callbacks now receive aHistoryUpdate('Updated'or'Activated'). No migration required —() => voidcallbacks remain assignable. - Engine/Swift:
EditorAPI.onHistoryUpdatedandonHistoryUpdatedPublishernow emitHistoryUpdateinstead ofVoid. Migration:for await _ in …and.sink { _ in … }keep working, update only explicitAsyncStream<Void>/AnyPublisher<Void, Never>annotations. - Engine/Android:
EditorApi.onHistoryUpdated()now returnsFlow<HistoryUpdate>instead ofFlow<Unit>. Migration:.collect { … }keeps working, update only explicitFlow<Unit>annotations orUnit-typed lambda parameters. - Editor/RN: Fixed exported artifact files on Android being named with a
.tmpextension instead of the format-specific extension (e.g..mp4,.png,.pdf).EditorBuilderDefaults.getExportResultnow requires amimeType: MimeTypeargument; callers that override the export builder must pass theMimeTypeof the exported buffer. - Editor/Flutter: Fixed exported artifact files on Android being named with a
.tmpextension instead of the format-specific extension (e.g..mp4,.png,.pdf).EditorBuilderDefaults.getExportResultnow requires amimeType: MimeTypeargument; callers that override the export builder must pass theMimeTypeof the exported buffer.
Non Breaking Changes
- Editor/Android: Added the
BackgroundRemovalplugin 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
filterparameter toengine.asset.findAssetsfor structured property predicates ({ property, contains?, equals? }) combined withand/or/notcombinators. See Querying Assets guide for details. - Engine/Web: Custom asset sources now receive the structured
filterin theirfindAssetscallback alongside the existingquery/tags/groupsfields. - 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)returningList<CharacterInkBox>. - Engine/iOS: Added
block.getTextCharacterInkBoxes(_:in:)returning[CharacterInkBox]. - Engine: Added
setContentFillHorizontalAlignment,getContentFillHorizontalAlignment,setContentFillVerticalAlignment, andgetContentFillVerticalAlignmentto control the alignment of the content fill within a block when usingContainorCoverfill 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:
setTextLineHeightandgetTextLineHeightallow each paragraph in a text block to carry its own line height multiplier, independent of the block-leveltext/lineHeightdefault. - Engine: Added
scene.setFontSizeUnit()/scene.getFontSizeUnit()to choose howsetTextFontSize,getTextFontSizes, and the font-size float properties (text/fontSize,text/min/maxAutomaticFontSize, and the matchingcaption/*properties) interpret values on a per-scene basis (PointorPixel). The engine continues to store font sizes in points internally; this only affects API-boundary interpretation. - Engine:
scene.create()gained an overload that acceptsdesignUnitand an optionalfontSizeUnit. WhenfontSizeUnitis omitted it is auto-paired withdesignUnit(Pixel→Pixel, 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 (
pxorpt). The new selector is gated by thely.img.scene.fontSizeUnitfeature key (enabled by default; disable viacesdk.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
setTextKerningandgetTextKerningsAPI for per-range character kerning offset control. - Engine: Added
text/useKerning,text/useContextualLigatures, andtext/useDiscretionaryLigaturesboolean properties to text and caption blocks, enabling independent control of OpenType kerning (kern), contextual ligatures (clig), and discretionary ligatures (dlig) viagetBool/setBool. - Engine: Text and caption blocks now render
InnerandOuterstroke positions in addition toCenter, matching shape behavior. ThesetStrokePositionAPI 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_musicresource 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_audiostring. It now uses the dedicatedly_img_editor_timeline_add_audio_option_musicresource. - 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
exportPdfWithDeviceCMYKderiving 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 errorStateChangedline to stderr instead of stdout, so callers can keep stdout clean for structured output (e.g. piping engine results throughjq). On emscripten the banner now goes throughemscripten_console_error(browser DevTools,console.error; Node.jsprocess.stderr); on native targets it goes throughUBQ_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
findDOMNodedeprecation warning emitted byreact-draggableby passingnodeRefto everyDraggable/DraggableCoreinstance. - 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
stepgrid. - 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:
setStrokeDashArrayandsetStrokeDashOffsetnow 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_clippingfrom “Frame Clipping” to “Clipping”. - Editor/iOS: Updated the English translation of
ly_img_editor_sheet_format_text_label_frame_clippingfrom “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.