NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1482 most downloaded on pub.dev
A Flutter image editor: Seamlessly enhance your images with user-friendly editing features.
Last release today
07 Oct 2026
Ships fairly regularly
a new release about every 8 days
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
455 releases · first in 2024
feat(layers): move, scale, turn and fade layers between keyframes by @hm21 in #884
Layer.keyframes to move, scale, turn and fade a layer over time in the video editor, matching pro_video_editor 2.29.0; transform gestures edit the keyframe at the playhead.LayerKeyframe.effects to play loop animations between two keyframes (Layer.keyframeEffects).Layer.opacity for every layer type; captureAsPng bakes it in and captures keyframed layers at their largest size.setLayerTimeline takes keyframes, replaceLayer takes skipUpdateHistory; add LayerTimelineConfigs.keyframeTolerance.One column per month.
feat(layers): reveal text letter by letter or word by word, add wiggle, bounce and loop animations by @hm21 in #883
Full Changelog: v14.8.0...v14.9.0
LayerAnimationType.typewriter and wordByWord to reveal a text layer letter by letter or word by word, exported as one image per step in ExportedLayer.revealBytes.LayerAnimationType.wiggle, bounce and AnimationPhase.loop, matching pro_video_editor 2.27.0.RoundedBackgroundText.visibleLength to draw only the start of a text while laying out all of it.pro_video_editor export.feat(paint-editor): measure censor areas in their own pixels and give each its own strength by @hm21 in #882
Full Changelog: v14.7.0...v14.8.0
CensorConfigs.pixelateInLayerSpace to measure pixelate blocks in the censor area's own pixels, so they scale with the layer like the blur does.PaintedModel.censorStrength and PaintEditor.setCensorStrength to give each censor area its own blur sigma or pixel block size.feat(text-editor): wrap text layers at the canvas edges by @hm21 in #881
Full Changelog: v14.6.2...v14.7.0
TextEditorConfigs.layerBounds to wrap text layers at the canvas edges instead of letting them run past them when scaled up or moved.RoundedBackgroundText.maxWidth and softMaxWidth to limit the width of the whole widget.fix(layers): stop hidden timed layers from catching touches by @hm21 in #877
Full Changelog: v14.6.1...v14.6.2
fix(main-editor): keep layers on the image point when cropping and re… by @saif-ellafi in #874
Full Changelog: v14.6.0...v14.6.1
editorBodySize.feat(layers): highlight parts of a text layer while the video plays through them by @hm21 in #876
Full Changelog: v14.5.0...v14.6.0
TextLayer.highlights / highlightColor to light up words of a text layer while the video plays through them; ExportedLayer.highlightBytes and ExportedLayer.frames carry them into the export (#876).feat(text-editor): add an outline to text layers and scale shadows with the text by @hm21 in #875
Full Changelog: v14.4.1...v14.5.0
TextLayer.outlineWidth / outlineColor and TextEditorState.setOutline to outline text; its shadows are cast by the outlined glyphs.scale and fontScale like the text, instead of keeping their unscaled offset and blur.TextEditorStyle.inputShadows: null, the input previews the shadows at the size the layer draws them.height.fix(crop-rotate-editor): ignore setState after dispose and color undo/redo with appBarColor by @hm21 in #873
Full Changelog: v14.4.0...v14.4.1
Bad state: Cannot add new events after calling close (#858).setState calls that arrive after dispose.appBarColor instead of a hardcoded white (#856).perf(filter-editor): skip the identity color filter and per-frame rebuilds by @hm21 in #872
Full Changelog: v14.3.1...v14.4.0
ColorFilterLayer when no filter or tune adjustment is active, and stop rebuilding the filter on every video frame (#872).filterStates or play-time notifier is replaced.fix(main-editor): skip replacing a background screenshot when the lis… by @saif-ellafi in #870
Full Changelog: v14.3.0...v14.3.1
WidgetLayer without exportConfigs no longer throws when background or isolate generation is off, and rasterizes it once as PNG instead of once per history step (#870).ci: test the Flutter 3.44 leg against the material_ui floor by @hm21 in #869
Full Changelog: v14.2.0...v14.3.0
TuneEditorWidgets.slider now receives the value it reported through onChanged instead of the value from the last drag end.TuneEditorStyle.bottomBarActiveItemDecoration to decorate the selected bottom bar item.localizationsDelegates an app that still uses the SDK MaterialApp needs so the editor's material_ui widgets find their localizations.perf(layers): draw static paint layers from a cached raster by @hm21 in #867
Full Changelog: v14.1.1...v14.2.0
MainEditorConfigs.enablePaintLayerRasterCache, which draws static paint layers from a cached raster instead of re-stroking them on every frame.fix(layers): keep a slide's start point in step with the layer on canvas resize by @hm21 in #866
Full Changelog: v14.1.0...v14.1.1
slideFrom point now follows the layer when the canvas is resized or a state history recorded at another size is imported. Only Layer.offset was rescaled before, so the preview travelled a different distance than the one the point was placed for.feat(layers): let a layer slide animation start from a point of its own by @hm21 in #865
Full Changelog: v14.0.0...v14.1.0
LayerAnimation.slideFrom to start a slide from a point of your own instead of a canvas edge. It uses the same coordinates as Layer.offset, may sit outside the canvas, and overrides slideDirection.perf(paint-editor): stop paint layers from burning CPU per hit test by @hm21 in #863
package:flutter/material.dart and package:flutter/cupertino.dart to the standalone material_ui and cupertino_ui packages, which Flutter is decoupling from the SDK. Apps must migrate their own imports as well (dart fix --apply --code=migrate_design_widgets), because types such as ThemeData are no longer interchangeable with the SDK ones.feat(helper-lines): add smart alignment and paint snap opt-out by @saif-ellafi in #860
Full Changelog: v13.4.0...v13.5.0
HelperLineConfigs.enableSmartAlignment (opt-in) so same-type layers snap matching edges, mixed types snap center to center, and only nearby or shared axes act as guides. Tune the reach via smartAlignmentNeighborLimit and smartAlignmentSharedAxisMin.HelperLineConfigs.enablePaintLayerSnapping to exclude paint layers from snapping.feat(paint-editor): allow zoom while drawing by @saif-ellafi in #857
Full Changelog: v13.3.1...v13.4.0
PaintEditorConfigs.enableZoomWhileDrawing (opt-in). Pinch, trackpad and mouse wheel zoom; secondary/middle mouse buttons pan.HelperLineConfigs.enableEdgeSnapping to let text and paint layers snap from their center only instead of from every edge.fix(crop-rotate): stop crop handles, pinch and tilt from jumping by @hm21 in #855
Full Changelog: v13.3.0...v13.3.1
feat(layers): rasterize layers outside a live editor session by @hm21 in #853
Full Changelog: v13.2.3...v13.3.0
LayerRasterizer and LayerRasterizerHost.feat(layer-interaction): enhance alignment guide behavior during drag interactions by @hm21 in #852
Full Changelog: v13.2.2...v13.2.3
fix(main-editor): ignore spurious scale-end on mid-gesture pointer change ( #850 ) by @hm21 in #851
Full Changelog: v13.2.1...v13.2.2
_dependents.isEmpty assertion (#850).fix(text-editor): reserve hit-box padding in editing preview so the text box doesn't jump on done by @hiake21cUs in #849
Full Changelog: v13.2.0...v13.2.1
feat: combine paint layers + flatten filters by @hm21 in #847
Full Changelog: v13.1.0...v13.2.0
mergeSelectedLayers() / canMergeSelectedLayers. PaintLayer now holds multiple items, baking each source transform into a shared frame so the drawing looks identical after merging.FilterState via mergeFilters() / canMergeFilters (appearance-identical; skipped for video-timeline filters).chore: migrate Android module to Flutter's built-in Kotlin and update version to 13.1.0 by @hm21 in #846
Full Changelog: v13.0.0...v13.1.0
feat(tune)!: replace luminance with tint, remove sharpness, fix colorOverlay/fade by @hm21 in #844
Full Changelog: v12.11.1...v13.0.0
luminance control (which only desaturated) with a real tint green–magenta adjustment, the natural complement to temperature.colorOverlay tinting towards the complementary color instead of the overlay color (inverted sign), and rebuild fade as a proper fade (lower contrast + lifted black point) instead of a desaturation.sharpness control (a per-pixel color matrix cannot sharpen) and rename luminance → tint across ColorFilterAddons, TuneEditorIcons and I18nTuneEditor; saved histories using the old tune ids are no longer recognized.fix(layers): anchor timeline scale animation on layer visual center by @hm21 in #843
Full Changelog: v12.11.0...v12.11.1
scale layer animation on the layer's visual center. Combining scale with a slide (e.g. slide-in from the top) previously drifted the layer in diagonally instead of straight, because scaling used the layout-box center while the layer content is painted off-center.Nothing published for this version
feat(crop-rotate): perspective tilt/skew with auto-zoom bounds ( #525 ) by @hm21 in #842
Full Changelog: v12.10.0...v12.11.0
CropRotateTool.tilt with rotate/horizontal/vertical rulers (TiltConfigs); the crop stays inside the tilted image via auto-zoom, and tilt is hidden in the video editor by default.FEAT(helper-lines): Add app-defined custom snapping guide lines (#834). HelperLineConfigs.customGuides accepts a list of HelperGuideLines (vertical or
HelperLineConfigs.customGuides accepts a list of HelperGuideLines (vertical or horizontal, positioned with absolute editor-body pixels or a normalized 0.0-1.0 fraction) that participate in layer snapping and are drawn - using the new HelperLineStyle.customGuideColor - while a layer snaps to them. Useful for safe areas, thirds, columns or any layout-specific alignment points. See the new Custom-Guide-Lines example.FEAT(editors): Support keyboard handling in the sub-editors, not just the main editor (#837). The onKeyboardEvent callback is now available on every s
onKeyboardEvent callback is now available on every standalone editor's callbacks (crop-rotate, paint, filter, tune, blur) via StandaloneEditorCallbacks; returning true consumes the event and skips the built-in shortcut. The crop-rotate and paint editors additionally gain an enableKeyboardShortcuts option (default true) to disable their built-in shortcuts (e.g. R/F in the crop-rotate editor). Previously these callbacks and the option only affected the main editor, so the crop-rotate R/F shortcuts could not be intercepted or disabled.FIX(crop-rotate): Honor initAspectRatio for the oval cropper in the main editor's initial state. Opening the editor directly in CropMode.oval with a f
initAspectRatio for the oval cropper in the main editor's initial state. Opening the editor directly in CropMode.oval with a fixed initAspectRatio (e.g. 1.0) previously rendered and exported an ellipse stretched to the full image bounds for non-square images, because the initial (un-transformed) state never consulted initAspectRatio and fell back to the full image aspect ratio. The initial oval mask now uses a centered crop of the requested ratio in the overlay, the capture overlay and the export clip (so 1.0 produces a circle), while a free (-1) or original (0.0) ratio keeps the previous full-image behavior.FIX(crop-rotate): Cover the image edge with the crop overlay when the image is panned. The darkened overlay is painted on top of the image and its out
FIX(layers): Make the video-timeline slide layer animation edge-aware. Previously the layer was only translated by its own width/height (a single laye
slide layer animation edge-aware. Previously the layer was only translated by its own width/height (a single layer size), so a layer that did not sit against the canvas edge stayed partially visible while sliding in/out. The slide now uses the layer's center and the canvas size to push the layer's nearest edge exactly onto (or off) the canvas border, so off-center layers leave the visible area completely. The preview math mirrors the matching native renderer change in pro_video_editor (ApplyAnimation.kt / ApplyAnimation.swift). Use this together with the corresponding pro_video_editor release so the in-editor preview keeps matching the exported video. Prerelease.Nothing published for this version
FEAT(layers): Add first-class per-layer enter/leave animations for the video timeline. A new LayerAnimation model (type fade/slide/scale, phase animat
LayerAnimation model (type fade/slide/scale, phase animateIn/animateOut/animateInOut, duration, curve, optional slideDirection and scaleFrom) can be attached to any layer via the new Layer.animations list (or set on an existing layer through ProImageEditor.setLayerTimeline(animations: …)), mirroring the pro_video_editor model so the in-editor preview matches the exported result. The video-layer-timeline preview is now phase-aware: it composes fade (opacity), slide (per-direction translation) and scale effects across a layer's enter and exit windows, so the enter and leave phases can use distinct animation types. The legacy enterDuration / exitDuration / enterCurve / exitCurve fade fields are kept as a back-compat convenience and can be read as a unified animation list via Layer.effectiveAnimations. animations is serialized in toMap / fromMap and carried through copyWith, equality and layer cloning. Non-breaking, additive change.Nothing published for this version
FEAT(import-export): Add optional widgetLoader (and widgetRecords) parameters to CompleteParameters.fromMap and CompleteParameters.fromJson so widget/
widgetLoader (and widgetRecords) parameters to CompleteParameters.fromMap and CompleteParameters.fromJson so widget/sticker layers exported with an exportConfigs.id can be reconstructed. This is a non-breaking, additive change; existing callers are unaffected.CHORE(main-editor): Refactor the layer-scale regression test for readability.
FIX(main-editor): Prevent layer scale from compounding (layers shrinking) when a single paint session adds multiple layers. Shared layer instances reu
Nothing published for this version
FEAT(main-editor): Add interactiveViewerClipBehavior option to MainEditorConfigs (default Clip.hardEdge) to control clipping of the editor's interacti
interactiveViewerClipBehavior option to MainEditorConfigs (default Clip.hardEdge) to control clipping of the editor's interactive content area.FEAT(crop-rotate): Add enableKeepAspectRatioOnRotate option to keep the selected aspect ratio orientation when rotating (e.g. 9:16 stays 9:16 instead
enableKeepAspectRatioOnRotate option to keep the selected aspect ratio orientation when rotating (e.g. 9:16 stays 9:16 instead of becoming 16:9), zooming the image in so it still fully covers the crop area.CHORE: Update CI to Flutter 3.44 and fix deprecated API usages.
FIX(example): Update Supabase initialization to use publishable key and upgrade supabase_flutter dependency to 2.14.1.
supabase_flutter dependency to 2.14.1.FEAT(ios/macos): Add Swift Package Manager (SPM) support.
FIX(layers): Improve text quality by applying FilterQuality.high when rendering layer images with transforms.
FilterQuality.high when rendering layer images with transforms.FIX(layers): Improve exported layer resolution for scaled layers to avoid blurry output.
FIX(state-manager): Update activeFilters and activeTuneAdjustments to directly use historyPointer.
FEAT(state-manager): Add replaceHistory() to replace an existing history entry in the stack (current pointer by default, or a custom index).
replaceHistory() to replace an existing history entry in the stack (current pointer by default, or a custom index).Nothing published for this version
FEAT(main-editor): Add captureImageOnDone to MainEditorConfigs (default true) to make final captureEditorImage() on done optional.
captureImageOnDone to MainEditorConfigs (default true) to make final captureEditorImage() on done optional._isProcessingFinalImage from getting stuck by guarding done-flow cleanup with try/finally.DEPRECATED(complete-parameters): customAudioTrack — use audioTracks instead.
volume, loop, audioStartTime, audioEndTime, and endTime fields to AudioTrack.audioTracks field (List<AudioTrack>) to CompleteParameters for multiple audio track support.customAudioTrack — use audioTracks instead.enableLoop parameter in AudioTrack.copyWith — use loop instead.FEAT(complete-parameters): Export meta field in CompleteParameters so user-defined metadata is available in the onCompleteWithParameters callback.
meta field in CompleteParameters so user-defined metadata is available in the onCompleteWithParameters callback.FEAT(processor): Add initializationDelay to ProcessorConfigs to optionally defer isolate/thread startup and avoid jank during page transition animatio
initializationDelay to ProcessorConfigs to optionally defer isolate/thread startup and avoid jank during page transition animations.FIX(main-editor): Preserve active filters, tuneAdjustments, and meta in addHistory() when values are not explicitly provided.
filters, tuneAdjustments, and meta in addHistory() when values are not explicitly provided.filters/tuneAdjustments/meta in history entries to prevent shared-reference mutations across undo/redo states.Nothing published for this version
Nothing published for this version
Nothing published for this version
FEAT(filter-editor): Add unique id to FilterState, export/import it, and generate backward-compatible IDs when missing in older history payloads.
id to FilterState, export/import it, and generate backward-compatible IDs when missing in older history payloads.Your coding agent can read these notes before it upgrades. Set up the MCP server →