NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #2528 most downloaded on pub.dev
A Flutter video editor: Seamlessly enhance your videos with user-friendly editing features.
Last release today
07 Oct 2026
Ships fairly regularly
a new release about every 9 days
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
175 releases · first in 2025
One column per month.
fix(android): time layers, filters and the fps cap on the output timeline of a sped-up segment, release 2.29.1 by @hm21 in #236
Full Changelog: v2.29.0...v2.29.1
feat: move layers between keyframes and loop over part of a layer, release 2.29.0 by @hm21 in #235
Full Changelog: v2.28.0...v2.29.0
ImageLayer.keyframes and VideoLayer.keyframes move a layer between TimelineKeyframes (position, size, rotation, opacity) with easing; layer animations play on top.LayerAnimation.loopStart/loopEnd limit a loop to part of a layer, e.g. the stretch between two keyframes.feat: fire video effects on trigger times, release 2.28.0 by @hm21 in #234
Full Changelog: v2.27.0...v2.28.0
VideoEffect.triggers fires an effect at given points in time instead of continuously, for example on the beats of a song: one zoom punch, flash or glitch burst per trigger. Preview and export start each hit on the same frame.feat: wiggle, bounce and loop layer animations, release 2.27.0 by @hm21 in #233
Full Changelog: v2.26.0...v2.27.0
LayerAnimationType.wiggle tilts an image layer by LayerAnimation.wiggleAngle and LayerAnimationType.bounce lifts it by LayerAnimation.bounceHeight times its height, censor layers included.AnimationPhase.loop repeats an animation for as long as the layer is visible, one cycle per duration.ImageLayer.animationStartTime/animationEndTime let several layers that each show part of one overlay share one run of animations instead of restarting them.LayerAnimationType.typewriter and wordByWord mirror pro_image_editor's text reveals so animations convert between the packages; the renderer skips them.feat: render video effects the app writes natively, release 2.26.0 by @hm21 in #232
Full Changelog: v2.25.0...v2.26.0
VideoRenderData.customEffects renders video effects the app writes itself in native code: a GLSL shader on Android, Core Image on iOS and macOS, registered under an id with CustomVideoEffects.register and named by a CustomVideoEffect, with its own params and time range. An effect can ask for earlier frames of the same clip, counted on the rendered video, so an effect such as an echo trail exports the same however the clip was played. A render that names an id nothing is registered under fails. On iOS and macOS a render with a VideoRenderData.composition skips them for now.feat: blur or pixelate the picture beneath an image layer, release 2.25.0 by @hm21 in #231
Full Changelog: v2.24.0...v2.25.0
ImageLayer.censor blurs (LayerCensor.blur) or pixelates (LayerCensor.pixelate) the picture beneath an image layer instead of drawing it, e.g. to hide a face or a license plate. Image layers after it stay on top.feat: limit amplified audio instead of clipping it, release 2.24.0 by @hm21 in #230
Full Changelog: v2.23.0...v2.24.0
VideoSegment or a VideoAudioTrack no longer clips loud audio such as a mastered song; peaks that would pass -1 dBFS are limited instead. Volumes at or below 1.0 render as before.fix(android): read stream-only content URIs and copy content in safeFilePath, release 2.23.0 by @hm21 in #229
Full Changelog: v2.22.0...v2.23.0
EditorVideo.safeFilePath copies an EditorVideo.content video into a temporary file instead of throwing. Without that call, the plugin keeps reading the URI in place.EditorVideo.content works with providers that stream the file without random access, as some cloud and archive providers do. Such a source is copied once into the cache; before, most calls failed with setDataSource failed.[darwin] extractToWav returns incorrect format info for HE-ACC audio by @ekuleshov in #225
Full Changelog: v2.21.0...v2.22.0
EditorVideo.content reads a content:// URI, e.g. from the photo picker or the Storage Access Framework, in place instead of copying the file. Other platforms throw an UnsupportedError. EditorVideoType gains content.feat: add block glitch, film grain, signal interference and CRT effects by @hm21 in #222
blockGlitch (the picture breaks into coarse blocks while slices slip sideways, in short bursts), filmGrain (fine, calm grain), signalInterference (thin flickering slices that shift sideways, with bursts of noise) and crt (strong scanlines and a slight color fringe, without movement).shake, zoomPulse, mirror, kaleidoscope, splitScreen and wave. VideoEffectFrame gains a geometry stage for them, ahead of every other operation: a wave (waveAmplitude, wavePeriod, wavePhase), then zoom, offsetX/offsetY, mirrorX/mirrorY, then tiles, so VideoEffectFrame.toList grows from 27 to 36 values. VideoEffectPreview shows them live as well.glow effect: the brightest areas bloom softly into their surroundings. VideoEffectFrame gains glow, glowThreshold and glowRadius, applied last, so toList grows to 39 values. VideoEffectPreview shows it live.feat: add video effects that distort the picture, with a live preview by @hm21 in #220
Full Changelog: v2.19.1...v2.20.0
VideoRenderData.effects adds effects that distort the picture itself: glitch, RGB split, VHS, TV static, old film, pixelate, pixel pulse, strobe, negative flash and vignette, each with an intensity and an optional time range. A flashing effect on its own stays below the three flashes a second that WCAG 2.3.1 allows.VideoEffectPreview shows the same effects live over a video player, frame for frame what the export renders (Impeller only).fix(android): keep image layers in place on segments of another resolution by @hm21 in #219
Full Changelog: v2.19.0...v2.19.1
feat(chroma-key): key a white or light grey wall by @hm21 in #218
Full Changelog: v2.18.1...v2.19.0
ChromaKey can key a white or light grey wall: a neutral key weighs brightness too, so black and dark greys stay, and ChromaKey.autoDetect accepts a bright neutral border. Green and blue screens key exactly as before.fix(android): keep mixed audio at the right volumes and layered renders with their audio by @hm21 in #217
Full Changelog: v2.18.0...v2.18.1
volume. Volumes could swap between sources, and a segment's volume was ignored.VideoComposition keeps its layers' own audio, placed where each clip plays and at its volume.fix(darwin): place a custom audio track on the trimmed output by @hm21 in #216
Full Changelog: v2.17.0...v2.18.0
VideoAudioTrack is placed on the exported video, as on Android. With a VideoRenderData.startTime trim, its startTime/endTime count from the trimmed start, and its fades land at the output's edges instead of being cut off.feat(audio): fade custom audio tracks in and out by @hm21 in #215
Full Changelog: v2.16.0...v2.17.0
VideoAudioTrack.fadeInDuration and fadeOutDuration fade a custom audio track in from and out to silence. The fade out ends where the track's audio ends.feat(android): say which sources a failed render read by @hm21 in #212
Full Changelog: v2.15.0...v2.16.0
NativeFailureDetails.sources lists MIME type, bit depth and transfer (sdr, hlg, pq), and hasHdrSource tells an HDR failure apart from an SDR one. Apple platforms leave it null.cause entry keeps only the first line of its message, so a GL error no longer carries the whole shader source.feat: continue an animated layer across layers; a dip covers the whole output frame by @hm21 in #208
Full Changelog: v2.14.2...v2.15.0
ImageLayer.animationOffset starts an animated layer (GIF) that far into its animation, so one animation can carry on across several layers instead of restarting at each one.fadeToBlack/fadeToWhite transition now dips the whole output frame when a custom resolution letterboxes the clip. Android dipped only a source-sized rectangle, iOS/macOS left the bars out.VideoComposition.fix(darwin): pre-transcode only the window an HDR clip plays by @hm21 in #207
Full Changelog: v2.14.1...v2.14.2
docs(darwin): correct why a turned layer's centre is the box centre by @hm21 in #204
Full Changelog: v2.14.0...v2.14.1
feat: rotate a composition clip via SegmentTransform.rotation by @hm21 in #203
Full Changelog: v2.13.3...v2.14.0
SegmentTransform.rotation turns a composition clip clockwise around its own centre (radians, like Transform.rotate). offset/size keep describing the unrotated layout box and the source is still clipped to it before the turn, so cover overflow is cut at the box edge rather than swinging back into view. Web, Windows and Linux ignore the field.fix(darwin): a stalled HDR pre-transcode or transition pre-render fails the render instead of hanging it by @hm21 in #202
Full Changelog: v2.13.2...v2.13.3
ExportWatchdog error instead of hanging it forever or silently degrading to the HDR source / a hard cut, and concurrent renders no longer run every pre-transcode and blend at once.fix(darwin): hand each render its own compositor config instead of a shared static by @hm21 in #200
Full Changelog: v2.13.1...v2.13.2
EXC_BAD_ACCESS) or composite with each other's crop, color filters and overlays; every render now carries its own compositor configuration.fix(android): blend a transition across a rotated and an upright clip by @hm21 in #198
Full Changelog: v2.13.0...v2.13.1
fix(android): an overlay larger than the frame no longer kills the app by @hm21 in #196
Full Changelog: v2.12.0...v2.13.0
ProVideoEditor.getThumbnailStream delivers a ThumbnailConfigs request as a stream of ThumbnailFrames while it decodes — one native pass for the whole request, each frame tagged with the timestamps indices it resolves to. Cancelling the subscription (or cancel(id)) stops the decoder; web delivers the complete set frame by frame.ThumbnailConfigs.maxParallelDecoders caps the hardware decoder sessions a thumbnail request holds at once (default 3); pass 1 next to a live preview player.getThumbnails strategy fails partway, the fallbacks now decode only the missing frames, and frames the first pass could not produce are no longer dropped.NativeFailureDetails.of(error) reads the platform's error domain, code and cause chain off the PlatformException, and isOutOfStorage names the one failure a retry cannot fix.TASK_ALREADY_RUNNING. Same contract as Android.feat: let a layer slide animation start from a point of its own by @hm21 in #194
Full Changelog: v2.11.4...v2.12.0
LayerAnimation.slideFrom gives a slide animation its own start point instead of a canvas edge. It takes the layer's top-left corner in the same pixel coordinates as ImageLayer.offset, may sit outside the frame, and overrides slideDirection when both are set.fix(android): overlays no longer kill the app when the source is higher-resolution than the export by @hm21 in #193
Full Changelog: v2.11.3...v2.11.4
OutOfMemoryError when the source clip is higher-resolution than the export. Each overlay is now rastered at the size that survives to the encoded frame instead of at the source resolution, so a 4K clip exported at 1080p no longer draws every layer at four times the pixels it can show. An export whose output resolution matches its source is unchanged.fix(darwin): never start an AVAssetExportSession that was already cancelled by @hm21 in #191
Full Changelog: v2.11.2...v2.11.3
perf: keep a stop-motion export and its audio off the managed heap by @hm21 in #185
Full Changelog: v2.11.1...v2.11.2
StopMotionFrame, image VideoLayers and ChromaKey.backgroundImage built from EditorLayerImage.file; other sources still travel as bytes.VideoRenderData.audioTracks entry is pre-rendered through a scratch file instead of one in-memory PCM byte array, which reached ~30 MB for a three-minute stereo track.extractAudio/mergeAudio — the samples were read big-endian on a little-endian device.audioTracks entry that is shorter than its slot and not looping now fills the rest of that slot with silence, as documented, instead of ending the exported audio early.fix: honor EXIF orientation when decoding caller-supplied images by @hm21 in #184
Full Changelog: v2.11.0...v2.11.1
ChromaKey.backgroundImage or image VideoLayer fed a photo straight from the gallery no longer renders sideways — the EXIF Orientation tag is now honored on all three platforms.VideoLayer is decoded at the size it will be scaled to instead of at full resolution, so a large gallery photo no longer risks an out-of-memory overlay.feat: chroma key (greenscreen) for the render pipeline by @hm21 in #183
Full Changelog: v2.10.0...v2.11.0
ChromaKey — green-screen removal with a soft edge and spill suppression. The keyed area becomes a backgroundColor, a backgroundImage, or (in a VideoComposition) the layer below. Settable on VideoRenderData, VideoLayer and VideoSegment, resolved per clip as segment → layer → global. H.264/HEVC carry no alpha, so on the single-track videoSegments path a key without a background is flattened to black.ChromaKey.autoDetect(video) measures the key color and similarity off the footage, for any saturated screen hue. ChromaKey.detect returns the raw measurement. Costs one thumbnail decode, no render.ChromaKey.greenScreen() and ChromaKey.blueScreen() presets. Blue separates skin better but crowds denim and blue eyes, so it keys tighter and despills more gently.VideoComposition layer no longer squares its own alpha. VideoCompositionTransformation blended against an already-transparent framebuffer, thinning any partially transparent edge.EditorVideo.safeFilePath.feat: end a clip where both of its tracks still have content by @hm21 in #182
Full Changelog: v2.9.0...v2.10.0
VideoRenderData.trimToCommonTrackEnd (default false). Ends each clip where both its video and audio track still have content, so an export no longer finishes on a stretch of missing audio — the seam a looping player replays every cycle. Leave it off when a clip is meant to outlast its own audio.fix: distinguish transient codec-resource failures from encoder incompatibility by @hm21 in #181
Full Changelog: v2.8.0...v2.9.0
RenderEncoderException now carries isTransient. A render that failed because the device's codec resources were exhausted is flagged as retryable, so it can be told apart from a genuine format/encoder incompatibility, which is not. Covers a starved decoder as well as a starved encoder.software-encoder label. It is skipped with an explicit log line when the device has no usable software encoder.feat: Implement audio merging functionality with configuration models by @hm21 in #180
Full Changelog: v2.7.1...v2.8.0
ProVideoEditor.mergeAudioToFile — merge an ordered list of trimmed clip windows (AudioMergeConfigs) into one gap-less audio file plus a per-segment offset map (AudioMergeResult) that maps each clip back onto the output timeline. Every segment is brought to one uniform format (optional sampleRate/channels resample/downmix), a clip without an audio track contributes silence instead of throwing, and a single-segment merge is byte-for-byte identical to extractAudioToFile. WAV output is exact on all platforms; other formats encode to AAC. Not supported on Web/Windows/Linux.fix: render transitions that fully consume an adjacent clip by @hm21 in #179
Full Changelog: v2.7.0...v2.7.1
planOverlap previously required both sides to keep some non-blended body, so a boundary where a clip is entirely the blend — two back-to-back transitions sharing a short clip, or a pre-rendered seam trimmed to exactly the blend — fell back to a hard cut (not enough content for boundary). The fully-consumed side is now dropped and the blend takes its place; zero-length clips are no longer fed to the composer.perf: stream-copy split halves instead of re-encoding them by @hm21 in #178
Full Changelog: v2.6.0...v2.7.0
bitrate now stream-copies both halves (passthrough export, frame-accurate via a container edit list) instead of re-encoding them. Measured on an M-series Mac: 29.5s 720p H.264 404ms → 32ms, 5s 10-bit HEVC 793ms → 13ms, 32s 4K60 14.3s → 0.12s. This also fixes two quality losses of the old re-encode: 60fps sources no longer drop to 30fps, and HEVC/HDR sources are no longer converted to 8-bit H.264. An explicit bitrate/qualityConfig re-encodes as before; a source that cannot be stream-copied falls back to the re-encode automatically.bitrate now transmuxes both halves losslessly (Media3 edit-list trim: the mid-GOP half keeps samples from the preceding keyframe and an MP4 edit list gates playback at the exact cut — frame-accuracy verified pixel-exact against the plugin's own thumbnail/metadata pipelines). Measured on a Galaxy S26: 32s 4K60 8.6s → 1.2s, 5s 10-bit HEVC 724ms → 290ms, 29.5s 720p H.264 1.4s → 1.0s. The halves no longer lose quality and HEVC/HDR no longer converts to 8-bit H.264. An out-of-range split position is now validated explicitly up front (same PlatformException as before, since a transmux — unlike the old transcode — would not fail on its own).fix: diagnose split-export stalls and serialize encoder-heavy exports by @hm21 in #176
Full Changelog: v2.5.1...v2.6.0
stallTimeout (split default 12s) is force-cancelled with a diagnostic reason instead of hanging — e.g. Split export stalled after 12s with no progress [half=end progress=0.00 segment=0.52s split=0.53s total=1.05s preset=… audio=false] (preset on iOS/macOS, mime on Android). A wedged encode therefore releases its gate slot instead of deadlocking later exports. exportTimeout (hard bound) and stallTimeout (inner bound) are tunable on SplitVideoModel (stallTimeout must be < exportTimeout); successful exports are unaffected.FIX(iOS, macOS): Loading many clips no longer freezes the editor. A thumbnail decoder race (out-of-order callbacks seen on iOS 26.5) could hang getThu
getThumbnails forever or map frames to the wrong timestamps; frames now stay index-aligned with their requested timestamps and the call always completes.FEAT(android, iOS, macOS): A ClipTransition on the last (or only) VideoSegment now wraps back into the first segment, so a single-track render loops s
ClipTransition on the last (or only) VideoSegment now wraps back into the first segment, so a single-track render loops seamlessly — e.g. a dissolve on one segment cross-dissolves on restart. Overlap types (dissolve/slide/push/wipe) shorten the output by the transition duration and require a single clip longer than 2× the duration (otherwise the wrap is skipped); dip types (fadeToBlack/fadeToWhite) keep the length and dip through the color at the seam. Previously a transition on the last segment was silently ignored.FIX(android, iOS, macOS): The render bitrate is now enforced as a real maximum instead of being silently ignored (Android transmuxed the source untouc
bitrate is now enforced as a real maximum instead of being silently ignored (Android transmuxed the source untouched; iOS/macOS picked an AVAssetExportSession preset with its own bitrate). A source above the cap is re-encoded down to it, a source already within it keeps a lossless fast path (transmux / passthrough), and a null bitrate is unchanged. Note: an over-cap source that used to export losslessly is now re-encoded.…apply) so the plugin no longer triggers the KGP deprecation warning and stays AGP 9+ compatible. Now requires Flutter 3.44+.
Nothing published for this version
Nothing published for this version
FIX(android, iOS, macOS): Stop-motion render progress now advances smoothly instead of sitting near 0% and snapping to 100% at the end. Media3's image
Nothing published for this version
PERF(android): Timestamp thumbnails (getThumbnails) are now extracted with up to three parallel hardware decoders that each decode forward through a c
getThumbnails) are now extracted with up to three parallel hardware decoders that each decode forward through a contiguous timeline chunk (every GOP decoded at most once), with frames GPU-scaled straight to the thumbnail size — instead of one software MediaMetadataRetriever per timestamp. Measured on a Galaxy S26: 20 timeline thumbnails from a 720p H.264 video 2.8s → 0.64s (~4x), 10 from a 1080p 10-bit HEVC video 6.2s → 0.3s (~20x), 14 from a 6s 4K60 HEVC clip 3.6s → 1.3s (~3x), with roughly 3-4x less CPU overall. Extraction keeps its speed while the UI is actively rendering (batch-mode decoder hints, non-blocking pump at display priority). Frame positions are unchanged (still the closest frame) and HDR10/rotation are handled by the GPU. Falls back to Media3 FrameExtractor, then to the previous retriever path when a video can't be decoded in hardware.FIX(android, iOS, macOS): Layer animateOut / animateInOut animations now play for layers that run until the end of the video (endTime unset). An open-
animateOut / animateInOut animations now play for layers that run until the end of the video (endTime unset). An open-ended layer's end previously resolved to "infinity", so the out-phase never triggered and the layer popped off at the last frame; it now resolves to the composition length, so the layer animates out. Only layers carrying an out-phase animation are affected.max(30, source fps)) instead of only the outgoing clip's, so a 25 fps source no longer stutters at the transition seams; directional slide / push transitions also use one easing ramp per output frame, removing velocity kinks with bounce / elastic curves.FIX(iOS, macOS): Fix a layer sliding in from an edge briefly shifting and shrinking the video (e.g. a black bar at the top) when a custom output resol
Nothing published for this version
FEAT(android, iOS, macOS): Add ProVideoEditor.splitVideo — a frame-accurate split that cuts one video into two files (SplitVideoModel). Each half is r
ProVideoEditor.splitVideo — a frame-accurate split that cuts one video into two files (SplitVideoModel). Each half is re-encoded from the exact cut frame without the render compositor/effects, making it far faster and more stall-resistant than splitting via renderVideoToFile; every export is guarded by a watchdog timeout. Cancellable and progress-reporting via the task id. Web/Windows/Linux throw UnimplementedError.FIX(iOS, macOS): Make FlutterEngine detach terminal for method-channel result delivery. After detach, a late render/audio/waveform/metadata/thumbnail
FlutterResult against a torn-down engine, closing the remaining NSInternalInconsistencyException: Sending a message before the FlutterEngine has been run path from 2.1.2.FIX(iOS, macOS): Cancel active tasks and clear event sinks when the FlutterEngine is torn down. In-flight render/audio/waveform callbacks no longer me
NSInternalInconsistencyException: Sending a message before the FlutterEngine has been run crashes on app termination or surface recreation.FIX(android): The global output trim now respects per-clip and global playbackSpeed. A sped-up composition capped by endTime was trimmed against the s
playbackSpeed. A sped-up composition capped by endTime was trimmed against the source timeline, cutting the output far shorter than the preview; the cap now limits the post-speed output length, matching iOS.FIX(android, iOS, macOS): VideoQualityConfig.custom(resolution: …) now renders to exactly that resolution. The video is scaled to fit (preserving aspe
VideoQualityConfig.custom(resolution: …) now renders to exactly that resolution. The video is scaled to fit (preserving aspect ratio), centered, and padded with black instead of producing an aspect-scaled size (e.g. a 720x720 source with a 1080x1920 resolution previously exported 1080x1080, now 1080x1920 letterboxed). Android letterboxes with a Presentation effect; Darwin composites the frame onto a black canvas. Quality presets keep their aspect-preserving scale. A qualityConfig's bitrate is now also applied when used without an explicit bitrate.ImageLayer now detects animated GIFs automatically and plays them back frame by frame; the new loop flag (default true) repeats the animation for the layer's time range or holds the last frame when false. All existing layer properties (position, size, rotation, timing, animations) apply unchanged. Android decodes frames via Movie and swaps them per overlay frame; Darwin decodes via CGImageSource and selects the frame per composition time. Web/Windows/Linux ignore the field.maxFrameRate field on VideoRenderData. It is an upper limit, not a target: a faster source is reduced to it (e.g. 60→30 fps) while a slower source is left untouched, lowering encoding cost and output file size. Android drops surplus frames with Media3's FrameDropEffect; Darwin caps the composition frameDuration. Web/Windows/Linux ignore the field.rotation field on ImageLayer (radians, clockwise around the layer center — matches Flutter's Transform.rotate, so a pro_image_editor layer rotation can be forwarded directly). offset/size keep describing the layout box before rotation. Web/Windows/Linux ignore the field.BREAKING: Remove the previously deprecated APIs. Migrate as follows:
VideoRenderData.video → videoSegments: [VideoSegment(video: …)]VideoRenderData.imageBytes → imageLayersVideoRenderData.playbackSpeed → VideoSegment.playbackSpeedVideoRenderData.colorMatrixList → colorFilters (ColorFilter)VideoRenderData.customAudioPath / customAudioStartTime / customAudioVolume / loopCustomAudio → audioTracks (VideoAudioTrack)VideoRenderData.originalAudioVolume → VideoSegment.volumeVideoMetadata.originalResolution → rawResolutionNothing published for this version
FEAT(android, iOS, macOS): Add multi-layer video compositions via a new composition field on VideoRenderData (VideoComposition). A composition stacks
composition field on VideoRenderData (VideoComposition). A composition stacks several VideoLayers on a fixed-size canvas, each layer being a time-ordered track of VideoSegments composited bottom-to-top with its own opacity and placement (SegmentTransform: offset, size, fit = fill/contain/cover). Clips gain timelineStart (delayed entry on a layer) and transform (per-clip placement), enabling picture-in-picture, side-by-side and grid layouts over a configurable backgroundColor. Android composites layered Media3 sequences with a per-clip GL transform (cover overflow is scissored to its rect); Darwin uses a custom AVVideoCompositing compositor. Per-clip transition, playbackSpeed and reverseVideo are not applied inside a composition. Web/Windows/Linux ignore the field.FIX(android): Fix video export failing with a codec exception on Qualcomm c2.qti.* encoders. The encoder is now retried through a fallback chain (oper
c2.qti.* encoders. The encoder is now retried through a fallback chain (operating-rate cap → unset → Main/Baseline profile → software) before surfacing a typed RenderEncoderException; working devices keep their original export speed.TASK_NOT_FOUND. An early cancel is now handled in the Dart layer before the native task starts, so the render resolves as canceled.FIX(android, iOS, macOS): Fix layer slide animations only moving the layer by its own size, leaving it partly visible at the animation's start/end. Sl
slide animations only moving the layer by its own size, leaving it partly visible at the animation's start/end. Slides are now edge-aware and carry the layer fully off-screen in the slide direction. Requires the matching pro_image_editor release so the in-editor preview matches the export.FIX(android): Fix OutOfMemoryError when pre-rendering longer overlap clip transitions (dissolve/slide/push/wipe). Both sides previously decoded every
OutOfMemoryError when pre-rendering longer overlap clip transitions (dissolve/slide/push/wipe). Both sides previously decoded every I420 frame into memory at once (~370 MB for a 2 s 1080p30 transition); frames are now spilled to a temp file and streamed back one at a time during encoding, so heap use stays constant regardless of duration/fps/resolution — at full quality.Your coding agent can read these notes before it upgrades. Set up the MCP server →