NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Tools for managing Flutter applications.
Last release 1 months ago
28 Aug 2026
Release timing varies
gaps range from 8 days to 3 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
6 years old
127 releases · first in 2020
One column per quarter.
[Common] --format=json is supported by changelog update-issue-links, pubspec get, pubspec update and pubspec version too: the number of updated refere
--format=json is supported by changelog update-issue-links, pubspec get, pubspec update and pubspec version too: the number of updated references, the list of the packages the dependencies were got for, the files where the dependency was updated, and the previous and the new version.alex changelog add "Some new feature" (alias alex cl a): adds an entry in CHANGELOG.md. The section is chosen with --section (added by default, also fixed and pre-release), an issue is referenced with --issue - as a markdown link, if issue_url is set in the config. If the changelog starts with a released version, then the section for the changes that are not released yet is created at the top, so an entry can't get into a version that is already out. Supports --format=json.Failed by: Exception: CHANGELOG.md has unknown structure.check: new --gen flag - the code generation is run before the other gates, and the gate fails with exit code 13 if it has changed anything. It's the classic failure: a model or a bloc event was changed, build_runner was not run, and the error shows up somewhere else. Uncommitted changes don't break the check: the content of the changes is compared, not just the list of the changed files, so it works in the middle of the work, not only on a clean tree. The generation itself is the same as in alex code gen - with subprojects and pub workspaces.[Agents] init: the section written in CLAUDE.md / AGENTS.md contains only what is stable, because the file is committed and shared by the whole team:
init: the section written in CLAUDE.md / AGENTS.md contains only what is stable, because the file is committed and shared by the whole team: no local paths (the project root was written as an absolute path of the machine where the command was run), no path to the alex config, no package version and no exact Flutter version (the file would have to be regenerated after every build and every SDK update - the fact that the project uses FVM is what matters). Only the branches that really exist in the repository are reported: every branch has a default value in the config, so a project can have no such branch at all (pipe/test is the usual case). Both local and remote branches are checked, without a network request; if there is no repository, then all the configured branches are listed as before. alex info still reports all of it - it's a live query, not a file to commit - and marks the configured branches that are not found.3 instead of an unhandled exception: the message says that the project is not configured and what to create. If the config is found, but can't be loaded (a broken YAML, an empty alex section), then the message contains the file and the reason - it's not reported as a missing config anymore. A pubspec.yaml without the alex section is not treated as a broken config, it's just a project that doesn't use alex. A broken config is not silently replaced by another one anymore: if alex.yaml can't be loaded, then the alex section of pubspec.yaml is not used instead of it - the file the user edits is the file alex must run with.New command alex pubspec version (alias alex pub version) — increments the version in pubspec.yaml. By default only the version is changed and a build
alex pubspec version <patch|minor|major> (alias alex pub version) — increments the version in pubspec.yaml. By default only the version is changed and a build number is kept as is (usually it's already prepared for the next build); pass --build (-b) to increment the build number too (#12).start: new --increment (-i) option (patch, minor or major) to increment the version of this release before it's started, keeping the build number: 1.2.3+4 is released as 1.3.0+4 with -i minor. The release branch, CHANGELOG.md, the tag and build artifacts use the new version. Without the option nothing changes — the current version is released as is. After the release a patch and a build number are incremented in develop as always, and the new version is printed in the end (#12).start: fixed a failure of a local iOS build (--local), when alex reported that the artifact was placed in an unexpected directory, though the .ipa was built correctly. flutter build ipa prints two ✓ Built lines — for the Xcode archive and for the IPA itself — and alex checked the first one. Now the line with a path in the build output directory is used.start: if the release failed, then all the changes made in the repository are rolled back automatically: uncommitted and untracked changes are discarded, release branch and tag are removed (only if they didn't exist before the release), and develop and master are restored to the state before the release. Every step is printed, and if the rollback itself fails, then instructions for a manual cleanup are shown. Nothing is rolled back as soon as the push is started — a push can update the remote even if it failed as a whole, and a published release should not be rewritten — in that case alex only reports that the release should be finished or reverted manually.start: fix the length limit of the release notes in the form. The limit is enforced by alex now, instead of the maxlength attribute: a browser counts a newline as CRLF (2 characters), so a note with N newlines was cut N characters earlier than the store allows, and it was impossible to type anything while the counter still showed a value below the limit. The counter shows the number of characters as the store counts them, and it's highlighted if the value is longer than the limit.alex code gen stopped with no output when fvm asked to install a missing Flutter SDK. Such a question can't be answered anyway, because the command gets a pipe instead of the terminal, so its input is closed right after the start now, and the command fails with its own message instead of hanging.check: runs the quality gates - analyze, tests and (optionally, with the --build flag) a debug build of the platform target. Output of the commands is filtered from noise, a short verdict is printed for each gate. Exit code is 0 if all gates passed, 10 if analyze failed, 11 if tests failed, 12 if build failed. Flags --analyze-only, --test-only and --fail-fast are supported, arguments after -- are passed to the test command. Build target and additional noise patterns can be defined with the new code.check config section.--format=json option (supported by code check, info, agents and l10n check_translations commands): a command prints a single JSON object with a machine readable report in the standard output, all other messages - including the update banner - go to the error output.agents with the guide subcommand: prints a short guide of alex for an AI agent or a script - the rules (config discovery, machine readable output, exit codes, interactive commands) and all commands with their options and exit codes. The guide is generated from the commands tree of the installed version, so it can't get outdated. Supports a command path argument to print a part of it (alex agents guide l10n) and --format=json for a structured index.agents init: adds or updates the alex section in the agent instructions of the project (CLAUDE.md, AGENTS.md and alike), so an agent learns about alex from the file it reads first. The section describes the project (package, FVM, locales, l10n paths, branches) and the commands to use with their exit codes, and is generated from the alex config, pubspec.yaml and the commands tree. Only the content between the <!-- alex:begin --> and <!-- alex:end --> markers is changed. Files are taken from the new agents.files config option, the --file (-f) option, or CLAUDE.md/AGENTS.md if they exist. With the --check flag nothing is changed and the command fails with exit code 10 if some file is missing or outdated.--non-interactive flag for every command that can ask a question in the standard input (feature finish, pubspec update, custom add). With the flag a command fails with an explanation of the option to pass instead of waiting for an answer that a script can't give. feature finish checks everything it would ask about before it starts, so it fails before the branch is merged, not after.finish: new --section option (added, fixed or pre-release) to define the section of CHANGELOG.md for the entry, instead of choosing it interactively. Default is added, as for an empty answer.finish: the command looped forever asking for an issue id when there was no input at all (a closed stdin in a script). Now it fails with a message.check_translations: new --format=json option - a single JSON object with the result of every check (a stable id, the title, the status, and the problems with locales and keys for the failed ones) is printed in the standard output, so CI or an AI agent doesn't have to parse the human readable report. The list of files changed after pub get is reported in JSON too - both when it fails the command and when it's just a warning, so CI can see that the dependencies are not in sync.--format=json: an error object (with ok: false, the exit code and the message) is printed in the standard output for any failure - not only when a command has finished with a result. It covers an error of a command, a failure of the arguments parsing and a failure before the command is started, so a script always gets a JSON object to parse.alex info (alias alex facts): prints the facts about the project - package and version, path to the alex config, packages of a multi-package project, Flutter version pinned with FVM, locales (by the ARB files) and localization paths, git branches. Supports --format=json, so a script or an AI agent can get all of it with a single call instead of reading several files.[Release] start: new --target-path (-t) option to copy artifacts of a local release build (--local) to the specified directory. Artifacts are renamed
start: new --target-path (-t) option to copy artifacts of a local release build (--local) to the specified directory. Artifacts are renamed by the pattern <name>_v<major>.<minor>.<patch>_<build>.<aab|ipa> (for example sundry_v0.1.2_3.ipa), where <name> is a project name from pubspec.yaml or the new build.name config option. The target directory should be outside of the repository or should be ignored by git, so artifacts can't get in the release commit; it's checked, as well as the write access, before the release is started.start: output directory of a local build is cleaned before the build, and after the build alex checks that exactly one artifact was created there. Now the release fails with an explanation instead of finishing successfully when the build produced no distribution file — for example, when an Xcode archive was created, but the export of an .ipa failed.[L10n] check_translations: new --print-changed-files flag to print the list of files changed after pub get (only paths, not their content). Off by def
check_translations: new --print-changed-files flag to print the list of files changed after pub get (only paths, not their content). Off by default, so local runs are not flooded.check_translations: new --fail-on-changed-files flag to fail with exit code 11 instead of printing a warning when some files were changed after pub get. Off by default; lets CI rely on the exit code instead of parsing the output.[Code] gen: in a pub workspace, run code generation once from the workspace root with the --workspace flag when the resolved build_runner version supp
gen: in a pub workspace, run code generation once from the workspace root with the --workspace flag when the resolved build_runner version supports it (>= 2.11.0). Can be disabled via the new code.use_workspace config option (alex.yaml or the alex: section of pubspec.yaml).[L10n] check-translation: in verbose mode, print the list of changed files and the error details when the clean-status check fails after pub get, to m
check-translation: in verbose mode, print the list of changed files and the error details when the clean-status check fails after pub get, to make diagnosing dependency mismatches easier.[Feature] finish: new --squash (-s) flag to squash all feature commits into a single commit when merging into develop. Useful for tasks like golden te
finish: new --squash (-s) flag to squash all feature commits into a single commit when merging into develop. Useful for tasks like golden tests updates.from_xml: false-positive "No parameters found" error for one/two plural variants when the target locale legitimately omits the count parameter (e.g. Arabic "كل يوم" / "كل يومين"). Other plural quantities (zero, few, many, other) are still validated as before.[Feature] finish: append issue references as a markdown link ([#N](url/N)) when issue_url is set in alex config; falls back to the plain (#N) suffix o
finish: append issue references as a markdown link ([#N](url/N)) when issue_url is set in alex config; falls back to the plain (#N) suffix otherwise.alex changelog update-issue-links (alias cl uil) — replaces plain (#N) issue references in CHANGELOG.md with markdown links built from issue_url. Reports an error if issue_url is not configured.issue_url (in alex.yaml or the alex: section of pubspec.yaml).[Feature] finish: skip appending issue number suffix if the changelog line already contains a markdown link to the issue (e.g. [#1234](...)).
finish: skip appending issue number suffix if the changelog line already contains a markdown link to the issue (e.g. [#1234](...)).New feature: Custom commands support! Define your own commands in alex_custom_commands.yaml to automate workflows.
alex_custom_commands.yaml to automate workflows.
{{var}} or ${var} syntaxalex custom list, add, show, edit, remove, checkcheck_git_branch - Check/switch git branchcheck_git_clean - Verify no uncommitted changescheck_platform - Verify current OS (macos/linux/windows)change_dir - Change working directorycheck_file_exists - Verify file existencecopy_file - Copy filesrename_file - Rename filesmove_file - Move filescreate_file - Create files with contentcreate_dir - Create directoriesdelete_file - Delete filesdelete_dir - Delete directoriesrename_dir - Rename directoriesreplace_in_file - Replace text in files (with regex support)append_to_file - Append content to filesprepend_to_file - Prepend content to filesprint - Print messages to consolewait - Wait for specified duration (in milliseconds)create_archive - Create ZIP/TAR.GZ archivesextract_archive - Extract archives--verbose flag for detailed execution logsalex_custom_commands.yaml.example for examples[Code] code gen command supports run generation for subproject from root folder.
code gen command supports run generation for subproject from root folder.Fixed: alex update command not working.
alex update command not working.alex update check replaced with alex update --check.[pubspec] get: Skip not valid pubspec files. Different result output when pubspec files are not found.
get: Skip not valid pubspec files. Different result output when pubspec files are not found.New command alex update check to check if there are updates available for alex.
alex update check to check if there are updates available for alex.New command alex update to update alex to the latest version.
alex update to update alex to the latest version.Added support for workspaces. See documentation.
Auto adding @@locale to ARB files.
[L10n]
@@locale to ARB files.Fixed: from_xml write @@locale at second place in ARB files, but extract at first.
from_xml write @@locale at second place in ARB files, but extract at first.Base XML file now formatted with 2 spaces indent.
[L10n] to_xml:
Hint and more detailed log for skipped keys if they are not in the base file.
[L10n] import_xml:
More cleaner output for problems with similar keys in different locales.
[L10n] check_translations:
Fixed: Double log for intl commands.
l10n generate and some other commands.Fixed: Incorrect error message when there are uncommitted changes.
BREAKING CHANGE: Now it checks for all locales by default, not only en. You can specify locale with -l or --locale argument.
[L10n] check_translations (formerly check_translate):
en. You can specify locale with -l or --locale argument.~~[L10n] check_translations: returns exit code 10 if some checks failed.~~ (broken, use 1.8.0+2).
[L10n] (broken, use check_translations: returns exit code 10 if some checks failed.1.8.0+2).
[L10n] check_translations: returns exit code 10 if some checks failed.
[L10n] check_translations: returns exit code 10 if some checks failed.
[L10n] check_translations: prints changes if there are any in the repository before checking translations.
[L10n] check_translations: prints changes if there are any in the repository before checking translations.
New command l10n cleanup_xml to remove unused strings from XML files.
[L10n]
l10n cleanup_xml to remove unused strings from XML files.import_xml: Added suggestion when importing archive file with wrong content.
[L10n]
import_xml: Added suggestion when importing archive file with wrong content.from_xml: Fail if there are duplicated keys in the imported file.
[L10n]
from_xml: Fail if there are duplicated keys in the imported file.Fail if there are warning during extraction to arb. Affects l10n extract, l10n check_translate, release start.
l10n extract, l10n check_translate, release start.[L10n] Fixed: empty output on failed extract command in some cases.
import_xml: Fix error in the log message about total project locales count.
[L10n]
import_xml: Fix error in the log message about total project locales count.from_xml: Handle new line symbols for json target.[L10n] from_xml added missing characters for validator checking.
from_xml added missing characters for validator checking.Support name of the directory without _diffs suffix. Therefore, now you can import directory with files like this: intl/intl_diffs_es.xml;
[L10n] import_xml
_diffs suffix. Therefore, now you can import directory with files like this: intl/intl_diffs_es.xml;[L10n] generate always generate main messages file in the same order.
generate always generate main messages file in the same order.[L10n] from_xml validates strings for Cyrillic and other inappropriate characters for locales, where Latin is required. Added config parameter require
from_xml validates strings for Cyrillic and other inappropriate characters for locales,
where Latin is required. Added config parameter require_latin (has default value).More relevant suggestion for --target value when failed to find appropriate file for import.
[L10n] import_xml:
--target value when failed to find appropriate file for import.--diff flag name in suggestion (should be --diffs).Fixed: Program always have 0 exit code, even when execution failed.
from_xml:
Detailed error explanation with a suggestion if can't find appropriate file for import.
[L10n] import_xml:
IMPORTANT [L10n] from_xml: Single quotes in the xml now escaped with another single quote for arb target. See documentation for details. Remove any ma
from_xml: Single quotes in the xml now escaped with another single quote for arb target.
See documentation for details. Remove any manual escapes for ' from xml if you have any.pubspec.yaml from hidden folders (like .dart_tools/).pubspec.yaml is always the first.import_xml: Prints total locales count in project at the end.from_xml: Message on success for json target.Check for updates and message about a new version in the output.
[L10n] import_xml: Support for --locale argument.
import_xml: Support for --locale argument.import_xml Fixed: Failed to import diff for not main localization files.import_xml Fixed: Incorrect locations fallback (can change language, not only pick up region).[L10n] import_xml: Support for .zip from Google Play as a source (argument --path).
import_xml: Support for .zip from Google Play as a source (argument --path).import_xml: Automatically detect diffs import for the translation from Google Play with suffix _diffs.import_xml: Translations are imported in alphabetical order.Command to see a current version of alex: alex --version.
alex --version.[L10n] import_xml: Support for explicit diffs import (new argument --diffs).
import_xml: Support for explicit diffs import (new argument --diffs).[L10n] import_xml: Support for import files with suffix _diffs in plane directory structure (intl/intl_{locale}/intl_diffs.xml or intl_diffs/intl_diff
import_xml: Support for import files with suffix _diffs in plane directory structure
(intl/intl_{locale}/intl_diffs.xml or intl_diffs/intl_diffs_{locale}/intl_diffs.xml);[L10n] to_xml: Export new lines as \n.
to_xml: Export new lines as \n.from_xml Fixed: Adds slash for \n on import.[Release] Local build now build for Android and iOS by default. See parameter --platforms.
--platforms.* [Release] Small help fix.
Prints info about written diffs.
to_xml:
import_xml:
[Release] Support for provide scrips to run before release.
[Release] Parameter --entry-point to define the entry point for local build.
--entry-point to define the entry point for local build.Using ChatGPT to generate Release Notes (only en and ru locales). You should set global setting open_ai_api_key to use it.
open_ai_api_key to use it.alex settings set command.Nothing published for this version
Load config recursive by default.
Support for configuring names for GIT branches.
[Release] Added flag --local for local build.
--local for local build.--skip_l10n to skip localization process when release.ci section in alex configuration. Ability to disable CI for project.[Release] Fixed: failed on empty commit attempt during local build.
Your coding agent can read these notes before it upgrades. Set up the MCP server →