Version v1.80.0 Changelog July 31, 2026
Breaking Changes
- Engine/Android: The automatic default video bitrate now uses the shared resolution/framerate formula, typically producing smaller files for common 30/60 fps HD presets. To keep the previous behavior, pass an explicit bitrate matching the old formula, e.g.
ExportVideoOptions(videoBitrate = width * height * frameRate.toInt() / 4). - Renderer: The base system for the Renderer Docker container has been upgraded from Ubuntu 24.04 to Ubuntu 26.04 to include upstream security vulnerability fixes that were not backported to Ubuntu 24, if you are building a custom image layered on top of our image you might need to adjust your Dockerfile.
Non Breaking Changes
- Engine: Audio blocks and video fills can now fade in and out. Use
setAudioFadeInandsetAudioFadeOut, or theplayback/fadeIn/*andplayback/fadeOut/*block properties. The easing defaults toLinearand a duration of 0 (the default) disables the fade. - Editor/iOS: The text on path sheet now uses the same two-step flow as the animations sheet. The sheet opens with the path selection list only, and the adjustment controls (path position, direction, and offset) moved to a detail page that opens by tapping the selected path again. The default detent of the sheet changed from medium to tiny to match the filter, effect, and blur sheets.
- Editor/Android: The text on path sheet now uses the same two-step flow as the animations sheet. The sheet opens with the path selection list only, and the adjustment controls (path position, direction, and offset) moved to a detail page that opens by tapping the selected path again.
- Engine: Text on a path now selects the text by default. Its selection frame, alignment and snapping follow the visible text bounds instead of the path’s bounding box; click the path to switch to path selection, click the text to switch back. Only corner handles show while text is selected, and hovering the other representation previews the frame a click would switch to.
- Engine:
getScreenSpaceBoundingBoxXYWHreturns the visible glyph bounds for a selected text-on-path block in text mode; unchanged for unselected blocks and for path selection. - Engine: The clickable area of text on a path is now one continuous band matching the drawn glyphs, fixing flickering hover and clicks landing in the curve’s empty interior.
- Engine: Uniformly scaling text on a path no longer makes the letters wiggle or slide along the curve.
- Engine: Corner-resizing any block with snap-to-grid active no longer lets the anchor corner drift by a sub-pixel amount.
- Engine: Scenes and archives now share one
.imglyfile format. The newloadAPI opens any scene or archive file — including existing.sceneand.zipfiles. The previous load methods keep working too. - Editor/Web: A single “Import” option replaces “Import Design” and “Import Archive”. Scenes and archives saved from the editor now download as
.imglyfiles. - Engine/Android: Fixed a native memory leak that leaked the full payload of every
ByteBufferthe engine returned to Kotlin. This affectedBlockApi.export,exportWithColorMask,exportVideoandsaveToArchive,SceneApi.saveToArchive,EditorApi.getResourceData(once per chunk) and the buffer APIs. The leaked memory was native heap, so it counted against the app’s memory budget but stayed invisible to the Java heap profiler. Returned buffers are now reclaimed by the garbage collector. - Engine/Android: Fixed a leak where every export left behind a live
HandlerThread, along with roughly 4.6 MiB of native heap that was only reclaimed once that thread exited. This affectedBlockApi.export,exportWithColorMaskandexportVideo. Apps that exported repeatedly, such as batch or preview flows, accumulated one thread per export until the process was killed. - Editor/Android:
LibraryContent.Sections withaddGroupedSubSectionswhose asset source reports no groups now fall back to a single flat section instead of rendering an empty section - Editor/Android: categories consisting of a single
LibraryContent.SectionwithaddGroupedSubSectionsnow render their grouped subsections instead of auto-expanding into a flat grid of the section’sexpandContent - Editor/Android: the header count of a
LibraryContent.SectionwithaddGroupedSubSectionsnow shows the total across all groups instead of the count of a single group - Editor/Android: Fixed a crash (
IndexOutOfBoundsException) that could occur while editing text. - Engine: Text selection and cursor positions are now clamped to the current text.
- Editor/Web: Fixed crop mode overwriting a user-configured
page/allowResizeInteractionsetting. The value is now restored to its previous state when leaving crop mode instead of always being forced tofalse. - Engine: Fixed
getDominantColors. This function no longer counts as an export event. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView.
- Editor/Web: Fixed the Animations section missing for groups in the advanced video editor. Selecting a group now shows its animation controls in the inspector panel, matching the standard video editor.
- Engine/Web: Added the missing
Mod+Ccopy andMod+Xcut default keyboard shortcuts and registered headlesscopy,cut, andpasteactions; the split shortcut is nowsinstead ofMod+X. - Engine: Fixed undo/redo restoring a stale camera position when the restored history snapshot.
- Engine: Fixed image blocks that showed the preview image instead of the current image when the block is small on screen. The preview image is now only shown while the current image loads.
- Editor/Web: Fixed an issue where the inspector panel was switching to text properties while a page title is being edited.
- Editor/iOS: Fixed the export “cancel” confirmation dialog appearing in inconsistent positions during video export. It now anchors consistently to the progress sheet’s dismiss button.
- Engine: Fixed a hang when disposing the engine while network requests were still in flight on Apple platforms.
- Engine: Fixed page thumbnails (for example in the editor’s page overview) appearing vertically stretched.
- Engine: Fixed PDF export silently returning a corrupted file instead of an error when the device runs out of memory while finalizing the document.
- Plugins/Web: Fixed PDF/X-4 output from
@imgly/plugin-print-ready-pdfs-webfailing preflight metadata checks. Document info and XMP metadata now carry identical creation/modification dates, creator, producer, and title; values inherited from the input PDF no longer override them; non-ASCII titles are written correctly; and the XMP metadata stream is no longer compressed. - Engine/Web: Fixed a crash when saving a scene to an archive that references a font which is not currently loaded, for example an unused typeface variant.
- Engine: Fixed right-to-left text overflowing the right edge of a fixed text frame for wrapped lines.
- Editor/Web: Opening a color picker no longer freezes on scenes with many images. The image colors palette now shows the images on the current page, reuses previous results, and refreshes them after document edits.
- Engine: The
videoBitratevideo export option now accepts two named modes in addition to an explicit number:'System'(default — Web and iOS defer to the platform encoder; Android and GStreamer use the shared formula) and'Auto'(a bounded default derived from the output resolution and framerate, e.g. 5 Mbps at 720p30, 8 Mbps at 1080p30, 40 Mbps at 4K30). On iOS useVideoBitrate.auto, on AndroidVideoBitrate.Auto. - Engine/Web: Pass
videoBitrate: 'Auto'to avoid video exports freezing with an out-of-memory error caused by the browser choosing a near-lossless bitrate (Safari reached ~300 Mbps). - Engine/Android: The automatic default video bitrate now uses the shared resolution/framerate formula, producing smaller default files than before.
- Plugins/Web: AI Gateway failures now show a localized, human-readable message instead of the raw HTTP status and JSON response body. Running out of credits, an expired token, a model that is not on your plan, a temporary outage, and an unreachable gateway each get their own message.
- Plugins/Web: A request that never reaches the AI Gateway — the browser is offline, the gateway is unreachable, or the response was blocked for missing CORS headers — now asks the user to check their connection instead of reporting a failed generation. It is thrown as a
GatewayErrorwithcode: 'network_error'. - Plugins/Web: A generation failure the gateway reports inside an open stream now uses the reason the gateway sent, so a rejected prompt or a provider rate limit no longer claims the AI service is temporarily unavailable.
- Plugins/Web: Fixed AI quick actions failing silently. A failed generation stopped the spinner without telling the user anything; it now shows the same error notification as the generation panel.
- Plugins/Web: Added
GatewayErrorandisGatewayErrorexports to@imgly/plugin-ai-generation-web. Gateway failures are thrown as aGatewayErrorcarryingcode,status,operation, andrequestId, so an error-handling middleware can branch on the failure reason — for example to show a “Manage credits” action forinsufficient_credits. - Plugins/Web: Fixed the
durationoption on a provider’soutput.notification.errorbeing ignored. - Editor/Web: Fixed missing German translations for the DPI and page settings labels, which previously fell back to English.