NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev
Generates App Deployment Screenshots
Last release 3 days ago
06 Oct 2026
Too new to tell
only 2 release windows
Nearly every release is documented
notes for 6 of 6 stable releases
Nothing withdrawn
no release was ever pulled
1 years old
6 releases · first in 2025
One column per month.
fix: a caption with emphasis warned once per unmarked line and once per image, so emphasising only the headline (the usual case) printed a warning for
…layout beside it for 1.x-style code; both are deprecated.
A whole store listing from one test: slides that aren't screenshots, layouts the top apps use, and output fastlane can upload as it is.
Everything written for 1.0 and 1.1 keeps working: the published 1.1.0+1 example test passes unchanged against this release.
Each still works and is removed in 2.0; the IDE names its replacement.
MarketingFrame(layout: FrameLayout...): use slideLayout: SlideLayout.captionTop, .captionBottom or .bleed(...). FrameLayout stays the 1.x enum, and MarketingFrame(bleed: FrameBleed(...)) adds the new bleed layout beside it for 1.x-style code; both are deprecated.MarketingFrame(tilt:): use slideLayout: SlideLayout.bleed(angle: ...).MarketingFrame(bezel:, screenCornerRadius:, shadow:): use device: DeviceStyle(...).forStores(root:): use output: OutputLayout.folders(root).encodeOpaquePng, TestAssetBundle and AppDeployScreenshots.packageLibFromConfig: no longer needed.initialize(mockPlatformChannels:) stays true by default, and becomes false in 2.0. Pass it explicitly to be unaffected.Output changes, for anyone comparing against 1.1 images: package text (captions, callouts, status bars) and the app's own Roboto text draw at real font weights; Android status bars show 9:30 unless time: is set (iOS stays 9:41); bezels are about a third thinner (1.1 drew them at the wrong scale); captions in right-to-left locales lay out right to left unless textDirection: is set.
StoreListing writes a whole listing slide by slide: devices, variants, output, design, status bar and pumps are set once, each slide is numbered in the order it is added, and a slide passes just its caption words, styled like the shared caption (Caption.styledLike does the same for the static methods)widgetForStores / listing.widget render any widget as a full slide at every store size, in the variant's theme, locale and direction, without touching the app under testposterForStores / listing.poster: a slide with no device, made of a background, caption and decorationscaptureScreens and DeviceMockup put captured screens inside a device as a widget, for two phones side by side or a before/after pairpanoramaForStores / listing.panorama draw one widget across several consecutive slidesMarketingFrame.decorations: images and widgets placed on the canvas, behind or in front of the deviceSlideLayout.bleed runs the device off the bottom edge, optionally tilted (MarketingFrame(slideLayout:))DeviceStyle groups how the device is drawn: bezel, Dynamic Island, notch or punch-hole cutout, side buttons, outline, glow, a real shadow, cropping (ScreenCrop.belowStatusBar, .safeArea) and a fade-out, with .screenOnly() and .detailed() presetsFrameBackground.image(blur:, tint:) and FrameBackground.screen(), the app's own screen enlarged and blurred behind the deviceDevice.playStoreWear, playStoreChromebook and playStorePhoneTall presets, and Device.typeCaption.emphasis styles text between **markers** (CaptionEmphasis.color, .style, .marker highlighter and .gradient); markers survive translation filesCaption.footnote for small printLift raises a widget off the screen, larger and with a shadowfontWeight renders as real Light to Black in captions, widget slides and the app's own Roboto textOutputLayout.fastlane() writes where fastlane deliver and supply upload from: each store's locale folder name (ja and ja-JP, he and iw-IL), supply's phone, tablet, TV and Wear folders, and errors before capturing for anything the store would rejectsource (app, widget or poster)fix: byDevices passes deviceSetup through to byDevice, which now runs it inside that device's overrides
byDevices passes deviceSetup through to byDevice, which now runs it inside that device's overridesResizeImage) were captured blankDevice.safeArea is in logical points and is scaled by devicePixelRatio when applied. Previously apps saw about a ninth of the real inset (6.6pt instead of 59pt on iPhone), and the built-in insets now match the real devicesbyDevice takes deviceSetup and applyDeviceOverridesDevice.appStore (iPhone 6.9" 1320×2868, iPad 13" 2064×2752) and Device.playStore (phone 1080×1920, 7" 1224×2176, 10" 1620×2880), plus AppDeployScreenshots.forStoresStatusBarOverlay draws a clean iOS or Android status bar, coloured from the app's SystemUiOverlayStyleMarketingFrame composites the screenshot onto store artwork with a background, a caption, rounded corners and an optional bezel, in captionTop, captionBottom and tilted layouts; ScreenshotFrame.builder varies it per locale, brightness or deviceFinder: Spotlight, Callout and MagnifierInsetScreenshotVariant renders light, dark and locales in one call, with suffixed file namesorder adds a store-order prefix (01_home.png)AppDeployScreenshots.writeReport writes manifest.json and one contact sheet per device, and warns about Google Play screenshots whose caption covers more than 20% of the imageAppDeployScreenshots.emojiFontFamily, loaded by initialize() and never bundled into appsbyDevice, byDevices and byPlatform return ScreenshotRecordscustomPumpfinder below the root is captured at the device pixel ratio, not at 1×Device.meetsPlayStoreRequirements checks pixel size and Play's 2:1 aspect limitdocs: rewrite the README around store artwork, with rendered examples of every feature, accurate store requirements and a type-checked snippet for eac
example/, a chat app whose screenshot test uses every featurefix: pass all args through from byPlatform to byDevices
byPlatform to byDevices- feat: Initial Release
Your coding agent can read these notes before it upgrades. Set up the MCP server →