New features, fixes, and supported Flutter versions in Shorebird. Expand an entry for the full detail, the command, and the doc it belongs to. Subscribe with the RSS feed.
October 2026
CLI 1.6.128
The CLI refuses to delete built-in tracks
shorebird channels delete now refuses stable, beta, and staging with a usage error before contacting the server, which already refuses them.
With --json, the success object no longer includes is_default_track, since a successful delete can no longer involve a built-in track.
CLI 1.6.128
More CLI fixes in 1.6.128
CLI 1.6.128 also fixes these issues.
Flavored macOS patches run without --release-version read the release version from the flavor's build.
Releases on iOS, iOS framework, macOS, and Linux continue when an artifact already exists, as Android and Windows did.
shorebird release, shorebird patch, and shorebird preview no longer leave copies of the app in the system temp directory.
A rate limit or other refusal from the auth service no longer counts as being logged out. Only expired or revoked credentials do.
A malformed credentials file no longer crashes every command, and on macOS and Linux the file is now readable only by you.
shorebird doctor --fix shows every issue a fix leaves, and the count of fixable issues is accurate. --fix with --json is now a usage error.
The Android INTERNET permission check finds the permission when android:name isn't its first attribute, and reports a permission removed with tools:node="remove" instead of offering a fix that conflicts with it.
shorebird patch aar without --release-version in a non-interactive shell fails before building instead of crashing after it.
shorebird patch ios-framework without --release-version now lets you pick the release in an interactive terminal, like other platforms.
After shorebird preview launches an app on a device running iOS 16 or earlier, Ctrl-C works normally for the rest of the run.
CLI 1.6.128
Consistent flag names for set-track and init
shorebird patches set-track and shorebird init now use the same flag names as the commands next to them. The old names still work, but no longer appear in --help.
shorebird patches set-track takes --release-version and --patch-number, like the other patches commands, in place of --release and --patch.
shorebird init takes --org-id, like shorebird apps transfer, in place of --organization-id.
Names that are only whitespace are now rejected by shorebird init, shorebird channels create, and shorebird patches set-track, as shorebird apps rename already did. shorebird patch now also rejects a --track that is empty, only whitespace, or longer than 128 characters.
shorebird init --org-id 42
CLI 1.6.128
JSON errors explain failed checks
With --json, every failing command now prints an error object on stdout, and a failed check before the command runs reports precondition_failed with a message and, when there's a known fix, a hint.
Checks that report precondition_failed include not being logged in and not being in a Shorebird project.
Previously some of these failures left stdout empty, and the reason was only on stderr.
shorebird patches set-track now reports changed and the patch, as rollback and rollforward already did, so a script can tell whether the run did anything.
CLI 1.6.128
macOS patches install on re-signed apps
macOS patches now install on apps that were re-signed after release, such as for Developer ID notarization or the Mac App Store.
Previously, re-signing changed the binary that patches were built against, so every patch failed the device's check that the app matches its release.
Patches are now built against only the app's Dart code, which re-signing doesn't change.
The fix ships in the engine with CLI 1.6.128. Create a new macOS release with CLI 1.6.128 or later to pick it up. Releases built earlier, or with an older --flutter-version, keep the old behavior.
CLI 1.6.128
Signed patches honor --public-key-cmd
shorebird patch now embeds the public key from --public-key-cmd in the patch build, as shorebird release already did.
Previously only --public-key-path reached the patch build. Signing itself still worked.
The --public-key-cmd command now runs once per shorebird patch or shorebird release run, instead of once per architecture or platform, so a command that prompts, such as for two-factor authentication, prompts once.
CLI 1.6.128
The patches promote command is hidden from help
shorebird patches promote no longer appears in shorebird patches --help. Use shorebird patches set-track instead.
promote has been deprecated since December 2025. It still runs, so existing scripts keep working until it's removed.
Releases no longer upload files from an earlier build
shorebird release now clears build/<platform>/shorebird/ before building on every platform, so files left by an earlier build aren't uploaded with a new release.
Previously only iOS and iOS framework releases cleared it.
Nothing else in build/ is touched.
CLI 1.6.128
Setting a patch's track again succeeds
shorebird patches set-track now succeeds when the patch is already on the requested track, instead of failing with a usage error.
It says the patch is already on that track and doesn't promote it again.
This matches shorebird patches rollback and rollforward, so a retried CI job doesn't fail.
With --json, changed is false when nothing changed.
CLI 1.6.128
An unknown flavor is an error
Commands that act on an existing app now fail when --flavor names a flavor that shorebird.yaml doesn't define, instead of silently using the default app.
For example, a mistyped shorebird patches rollback --flavor previously rolled back a patch on the default app.
This covers the patches, releases, channels, and apps commands. The error lists the flavors that shorebird.yaml defines.
--app-id still takes precedence over --flavor.
CLI 1.6.127
Crash fixes for login, doctor, and set-track
Four commands that could crash now work or fail with a clear message.
shorebird login no longer crashes with Bad state: read(ScopedRef<Browser>), a bug introduced in 1.6.126.
shorebird doctor --verbose shows Gradle as not detected when the Gradle version lookup fails, instead of crashing.
shorebird patches set-track and shorebird patches promote report a patch number that isn't a number as a usage error instead of crashing.
CLI 1.6.127
Linux patches build like Linux releases
shorebird patch linux now builds with --target and the arguments passed after --, so the patch matches the release it targets.
Previously the patch was built from the default entrypoint and without the arguments after --, such as --dart-define values, so it could differ from its release.
Before building, it now checks that you're logged in, that the project is initialized, and that the host is Linux, as shorebird release linux does.
API keys hold exactly their permission level
API keys now hold exactly what their permission level grants. A full access key can do everything your role allows, except delete your account, change your billing limits, or manage your sessions and API keys. Sign in to the Console to do these.
Deleting the account or changing billing limits with a key returns 403 with the code personal_access_token_forbidden. Keys were already refused both, with other error codes.
Full access keys gained what their old fixed permission list left out, such as reading audit logs and managing invitations.
Release and patch only keys can no longer update your account details, create organizations, or accept or decline invitations.
Apps are listed once
The app list no longer shows an app twice when you have both a role in its organization and a role granted on the app itself.
This affected GET /api/v1/apps, shorebird account apps, shorebird apps list, and the app picker in shorebird preview.
The Console's app list wasn't affected.
CLI 1.6.126
The Shorebird cache cleans up after itself
Flutter installs, engine artifacts, and downloaded previews that you no longer use are now removed automatically, so they stop piling up across upgrades and --flutter-version builds.
Flutter installs and engine artifacts are removed after 30 days without use.
Only the 10 most recently used previews are kept, and each is removed after 30 days without use.
The Flutter version your CLI is pinned to is never removed.
shorebird cache clean --unused removes unused items right away, without clearing the rest of the cache.
shorebird cache clean --unused
CLI 1.6.126
Flutter 3.47.7 support
Shorebird now supports Flutter 3.47.7 and Dart 3.13.5.
iOS: fixes accessibility frames for OverlayPortal, which were shrunk and anchored top-left, so VoiceOver focus and XCUITest taps missed the visible controls.
iOS: fixes VoiceOver focus jumping to the top left of the screen in a ReorderableListView.
shorebird release ios --flutter-version=3.47.7
CLI 1.6.126
iOS previews show your app's logs again
With Xcode 26 or later, shorebird preview on an iOS device now shows the app's print output and [shorebird] updater lines, as Android and macOS previews do.
Previously the app launched but none of its output appeared.
The command stays attached until the app exits.
CLI 1.6.126
Sign in from any machine
shorebird login now opens your browser, and when no browser can open, such as over SSH, in CI, or on Linux without a display, it shows a code to enter in a browser on any device.
The login URL is still printed, in case the browser doesn't open.
Pass --device to use a code even when a browser is available.
On 1.6.126, shorebird login without --device crashes with Bad state: read(ScopedRef<Browser>). Upgrade to 1.6.127 or later.
shorebird login --device
CLI 1.6.125
Patch obfuscated Android releases built with older Flutter
Patching an Android release built with --obfuscate on a Flutter version older than 3.41.2 no longer fails with Unrecognized flags: load_obfuscation_map.
Upgrade the CLI and patch as usual. Existing obfuscated releases become patchable without a new release.
iOS patches still need the release to use Flutter 3.41.2 or later for obfuscation, and now fail up front with a clear error instead of a gen_snapshot failure.
For an obfuscated iOS release, shorebird release ios and shorebird release ios-framework now check the Flutter version they actually build with, including --flutter-version.
CLI 1.6.125
Errors say what to do next
Errors from shorebird init, shorebird patch, shorebird preview, and the checks that run before a command now name the step that fixes them.
shorebird patch --force explains that there's no --force flag and points to --allow-native-diffs and --allow-asset-diffs.
With --json, the --force advice is in the error's hint.
CLI 1.6.125
Warning for app extension versions that don't match the app
shorebird release ios now warns when an app extension's version or build number differs from the app's, which App Store Connect rejects with ITMS-90473.
The warning names each extension and the mismatched value, like NotificationService.appex: CFBundleShortVersionString is "1.15.32", the app is "1.15.67".
Shorebird doesn't change the versions for you. Update the extension targets in Xcode so they match the app.
CLI 1.6.125
More secure CLI sign-in
shorebird login now uses standard OAuth with PKCE and state, and shorebird logout now warns when the auth server can't confirm that your session was revoked.
Google and Microsoft sign-in, and tokens from shorebird login:ci, are no longer supported. The server stopped accepting them on October 1, 2026. Run shorebird login to sign in again, and use an API key in SHOREBIRD_TOKEN for CI.
If your stored credentials have expired, shorebird login signs you in again instead of reporting that you're already logged in.
CLI 1.6.125
Script releases and patches with JSON output
shorebird release and shorebird patch now support --json, so a script gets the new release or patch as data instead of parsing log lines.
shorebird release --json reports the app ID, the platforms, and each release with its version, Flutter version, and per-platform status.
shorebird patch --json reports the app ID, the track, and each patch with its platform, release version, patch number, and link percentage.
With --dry-run, both report what would have been published, with dry_run set to true.
With --json, stdout holds only the JSON object. Progress and logs go to stderr.
Sign-ins no longer end at a fixed 90 days. A sign-in now lasts until it goes 30 days without use, so you stay signed in as long as you keep using Shorebird.
Previously, a sign-in also ended 90 days after it began, even in daily use.
You can still revoke any session from your Account page.
The API now reports rate limits
API responses now carry RateLimit and RateLimit-Policy headers, so scripts can see their limit and how close they are to it.
Going over the limit returns 429 with a Retry-After header and the code rate_limited.
Limits are counted per caller: per API key or token, or per IP address for unauthenticated requests.
Patch checks from your app aren't rate limited.
CLI 1.6.124
Flutter 3.47.6 support
Shorebird now supports Flutter 3.47.6 and Dart 3.13.5.
Windows: fixes a hang in production apps. The fix ships in the engine, so a Windows app picks it up only from a new release built with Flutter 3.47.6 or later.
shorebird release windows --flutter-version=3.47.6
CLI 1.6.124
Android patches name the dependency changes behind DEX diffs
When shorebird patch android finds DEX changes, it now lists the Android libraries whose versions differ from the release, which usually explains a native change you didn't make.
Each changed library is shown with its release and patch versions, like io.branch.sdk.android:library 5.21.2 -> 5.21.3, along with added and removed libraries.
The list comes from dependency metadata in both app bundles. If either bundle was built without it, nothing is listed.
Pin dependency versions, or use Gradle dependency locking, so patch builds resolve the same versions as the release. If the listed changes explain every difference and your Dart code doesn't rely on them, --allow-native-diffs is safe for that patch.
In CI and other non-interactive runs, the --allow-native-diffs and --allow-asset-diffs hints are now printed before the command fails.
Legacy login tokens no longer work
Since October 1, 2026, tokens from shorebird login:ci and logins from CLI versions older than 1.6.87 are rejected.
Requests with a legacy token get a 401 with the code legacy_auth_retired.
In CI, create an API key in the Console and set it as SHOREBIRD_TOKEN.
On your own machine, run shorebird upgrade, then shorebird logout and shorebird login.
September 2026
Find apps faster in the Console
The sidebar now lists the active organization's apps, and the organization's app list can now be filtered, sorted, and paged.
The sidebar shows up to 10 apps with their icons, with the open app and the ones you visited recently first.
On the app list, filter by platform and sort by last updated, created date, or name. Long lists are split into pages.
Pick a role when inviting a member
The invite dialog now has a role picker, so a new member joins with any role your plan offers instead of always as a Developer.
The dialog lists what the selected role can do.
Owner can't be picked. Ownership changes only through an ownership transfer.
Move an older patch to another track
Change Track is now offered on a patch that a newer patch has superseded on its track, so an older staging patch can still be promoted to stable.
Previously the action was hidden on any patch with a newer patch on its track that wasn't rolled back.
The dialog now explains what moving the patch will do.
Copy a pending invitation's link
Each pending invitation in an organization's members list now has a button that shows its link, so you can send it yourself.
Only the invited email address can accept the link, after signing in with it.
CLI 1.6.123
Flutter 3.47.5 support
Shorebird now supports Flutter 3.47.5 and Dart 3.13.4.
iOS: fixes an occasional crash when debugging on physical iOS 27 devices.
Widget Previewer: fixes a crash when re-expanding a preview group.
A Dart Development Service startup failure is now handled instead of crashing.
shorebird release ios --flutter-version=3.47.5
CLI 1.6.123
Release with the Flutter version you already use
--flutter-version now accepts fvm and system, so you no longer have to look up and repeat your Flutter version number.
--flutter-version=fvm uses the version fvm resolves for your project from its .fvmrc. It requires fvm on your PATH.
--flutter-version=system uses the version reported by the flutter on your PATH.
Shorebird still builds with its own fork of Flutter at that version, not with your fvm or system install. A version Shorebird doesn't support fails the same way as one you name explicitly.
shorebird release android --flutter-version=fvm
CLI 1.6.123
iOS debug symbols now upload to symbol servers
On iOS, --split-debug-info now writes a Mach-O dSYM, so symbol servers ingest it and Dart stack traces from production become readable.
Previously the file was an ELF with no debug ID. Uploads reported finding nothing, while still exiting cleanly.
The fix is in Shorebird's Flutter 3.47.5, the default in CLI 1.6.123. A release built with an older --flutter-version still gets the old file.
See whose plan each organization runs on
The organizations list is split into Owned by you and Member of, and each organization shows its plan tier.
Organization settings say whose plan the organization runs on, with a Manage link for the owner.
CLI 1.6.122
Patch checks report the patch the device is running
The automatic patch check now starts after the patch the device boots has loaded, instead of before, so it reports the patch the device is actually running. With auto_update: false, your app's own updater call decides when to check.
Each device is now attributed to the patch it is running. Update delivery is unchanged.
Installing a new patch can no longer retire a patch that is still booting for the first time.
When a patch fails to load, the device still checks for a replacement patch on that same launch.
These fixes are in the updater built into Shorebird's Flutter engine, so they apply to releases built with Shorebird's Flutter 3.47.4 or later, the default in CLI 1.6.122.
CLI 1.6.122
Flutter 3.47.4 support
Shorebird now supports Flutter 3.47.4 and Dart 3.13.3.
iOS: native assets now require iOS 15, raised from iOS 13.
iOS: when debugging with Xcode 27, a newly paired or upgraded device no longer hangs on a white screen for minutes. Flutter now prepares missing Device Support Symbols first, or warns with the steps to do it yourself.
Windows: when Smart App Control or another security policy blocks Flutter's binaries, the tool now exits with an actionable error instead of crashing.
shorebird release ios --flutter-version=3.47.4
CLI 1.6.121
Clear error when an Android build drops libapp.so
shorebird release android and shorebird patch android now stop with an explanation when the built app bundle has no libapp.so, your compiled Dart code, for any architecture.
Previously this failed with a generic error about missing artifacts, which for shorebird release android pointed at ABI filters.
The usual cause is a custom Gradle setup that relocates build directories, so the bundle is packaged before libapp.so is written.
A patch that covers only some of the release's architectures now warns and lists the skipped ones, since devices on those architectures won't get it.
CLI 1.6.121
More CLI fixes in 1.6.121
CLI 1.6.121 also fixes these issues.
After an Xcode upgrade, iOS and macOS patches no longer report every asset catalog as changed when no asset changed.
When an Android build fails and a plugin still references the legacy flutter.jar, the error names the plugin to upgrade.
shorebird init no longer separates a comment in your pubspec's flutter: section from the key it describes when it adds the assets: entry.
Mistakes in the signing flags of shorebird release and shorebird patch now name the flag to fix. For example, a key file that doesn't exist names the flag it was passed to, and shorebird patch with only one of --public-key-path and --private-key-path names the one that's missing.
iOS patch errors, like a missing .xcarchive or a release built with Flutter older than 3.22.2, now say what to do next.
An interrupted Flutter install, such as for --flutter-version, now resumes on the next run instead of needing shorebird cache clean.
CLI 1.6.121
Flutter 3.47.3 support
Shorebird now supports Flutter 3.47.3 and Dart 3.13.3.
Android: fixes license detection for cmdline-tools 23.0 and newer.
iOS and macOS: a missing Xcode is now handled instead of failing hard.
Dart: fixes Windows-to-Linux cross-compilation producing incorrect executables when build hooks link native code.
Android: B-series PowerVR GPUs no longer use Vulkan.
New shorebird apps commands list, rename, delete, and transfer apps without opening the Console.
shorebird apps transfer --org-id <id> moves an app into another organization. Run shorebird account orgs to find the id.
shorebird apps rename --name <name> changes the display name.
shorebird apps delete has no prompt. Pass --confirm-name with the app's current display name to confirm.
shorebird apps transfer --app-id <id> --org-id 42
CLI 1.6.121
Manage channels from the CLI
New shorebird channels commands create, list, and delete the channels (tracks) an app can publish to.
Publishing a patch with --track=<name> still creates that channel automatically.
shorebird channels delete has no prompt. Pass --confirm-name with the channel name to confirm. Devices on a deleted channel stop receiving patches.
The built-in stable, beta, and staging channels can't be deleted.
shorebird channels create --app-id <id> --name qa
CLI 1.6.121
See your plan from the CLI
shorebird account whoami now shows your plan level and whether you have an active subscription.
The plan level is free, pro, business, or enterprise.
With --json, the level is in a new plan_level field. The existing plan field still reads paid or free, so scripts that use it keep working.
shorebird account whoami
Manage your plan and billing in one place
The new Plan page under Account replaces the Plan tab in each organization's settings, since a plan belongs to your account and covers every organization you own.
Change plan shows the prorated amount before you confirm. Upgrades take effect immediately, and downgrades are scheduled for the end of the billing period.
Cancel plan keeps your plan until the period ends, and Resume plan undoes a scheduled cancellation.
Set a monthly spending limit on overage installs, see past overage charges, and open or pay invoices from the same page.
A past-due payment shows a banner that links to the Plan page.
Size analysis is free on every plan during rollout
The Size tab is now available on every plan, including Free, and releases are analyzed whatever plan they're on. Pricing will come later.
The upgrade prompt on the Size tab is replaced by a banner you can dismiss.
The Size tab has a link for sending feedback.
The built-in channels can't be deleted
Deleting the stable, beta, or staging channel is now refused, since it would unpublish every patch on that track.
The API returns 403 with the code channels_delete_default_channel.
Channels you create yourself can still be deleted.
August 2026
CLI 1.6.120
Layered app icons no longer count as asset changes
On iOS and macOS, shorebird patch no longer reports an asset change for a layered app icon (.icon) that you didn't change.
Xcode gives a layered icon's images new generated names on every build, so every patch looked like it changed the app's asset catalog.
CLI 1.6.120
Flutter 3.47.2 support
Shorebird now supports Flutter 3.47.2 and Dart 3.13.2.
iOS and macOS: Swift package dependencies are always updated.
Windows: fixes hot reload ignoring file edits made within the same second.
Desktop: --build-name and --build-number are now forwarded to version.json.