A Dart CLI for Flutter contributors and power users. Automates contributor environment setup (framework, DevTools, engine), manages multiple Flutter SDK versions side-by-side, and wraps the engine build/run/test cycle into simple commands.
dart pub global activate flutter_compileOr from source:
dart pub global activate --source=path <path to this package>After activation, both flutter_compile and the shorter fcp alias are available:
fcp sdk list # same as flutter_compile sdk list
fcp sync flutter # same as flutter_compile sync flutterRequirements: macOS, Linux, or Windows; git, python3. On Windows, Visual Studio with C++ workload is required for engine builds.
Every command at a glance. Detailed usage follows below.
| Command | Alias | Description |
|---|---|---|
install flutter |
i flutter |
Clone flutter/flutter, set up git remotes, run update-packages |
install devtools |
i devtools |
Clone flutter/devtools, configure PATH for devtools_tool |
install engine |
i engine |
Install depot_tools, generate .gclient, run gclient sync, set up remotes |
uninstall <env> |
delete, remove |
Remove an installed contributor environment and clean up config |
switch [mode] |
s |
Toggle PATH between contributor-built Flutter and system Flutter |
sync |
sy |
Sync all contributor environments with upstream in one shot |
sync flutter |
sy flutter |
git fetch upstream + git rebase upstream/master + flutter update-packages |
sync engine |
sy engine |
git fetch upstream + git rebase upstream/main + gclient sync |
sync devtools |
sy devtools |
git fetch upstream + git rebase upstream/master |
build engine |
b engine |
Run GN + ninja to compile the Flutter engine for a target platform |
run |
r |
Run a Flutter app using a locally-built engine |
test |
t |
Run Flutter tests using a locally-built engine |
clean |
c |
List or delete engine build output directories |
status |
st |
Show engine path, available builds, host CPU, project detection |
sdk install <ver> |
Install a Flutter SDK by version tag or channel name | |
sdk list |
sdk ls |
List all installed SDKs with global/project markers |
sdk remove <ver> |
Delete an installed SDK and clean up config if needed | |
sdk global [ver] |
Set or show the global default SDK version | |
sdk use [ver] |
Pin or show the per-project SDK version (.flutter-version) |
|
sdk exec <cmd> |
Run any command through the resolved SDK (project -> global) | |
config list |
cf list |
Display all ~/.flutter_compilerc entries |
config get <key> |
cf get |
Read a single config value |
config set <k> <v> |
cf set |
Write a config value |
daemon |
Start a JSON-RPC 2.0 daemon for IDE communication | |
ui |
Open the terminal UI dashboard | |
doctor |
dr |
Health-check required tools, config file, and contributor environments |
update |
up |
Self-update flutter_compile to the latest pub version |
Install and manage multiple Flutter SDK versions side-by-side — by version tag or channel. Each SDK gets its own isolated PUB_CACHE to avoid snapshot incompatibility.
Downloads and installs a Flutter SDK. The first install automatically becomes the global default.
flutter_compile sdk install 3.19.0 # Specific version tag
flutter_compile sdk install stable # Channel name
flutter_compile sdk install betaSDKs are stored in ~/flutter_compile/versions/<version>/, each with its own .pub-cache directory.
Shows all installed SDK versions with their paths. Marks which version is set as the global default and which is pinned to the current project.
flutter_compile sdk list
# Output:
# 3.19.0 /Users/you/flutter_compile/versions/3.19.0 (global)
# stable /Users/you/flutter_compile/versions/stable (project)Sets the global default SDK version. This is the version used when no project-level .flutter-version file exists. Running without an argument shows the current global version.
flutter_compile sdk global 3.19.0 # Set 3.19.0 as the global default
flutter_compile sdk global # Show current global versionSetting a global version updates your shell config (~/.zshrc / ~/.bashrc) with the SDK bin/ directory and an isolated PUB_CACHE.
Creates a .flutter-version file in the current directory. When sdk exec is used from this directory, it picks up the pinned version instead of the global default.
flutter_compile sdk use 3.19.0 # Pin 3.19.0 for this project
flutter_compile sdk use # Show currently pinned versionExecutes any command using the resolved Flutter SDK. Resolution order: project .flutter-version first, then global default.
This is the key command for multi-version workflows — it ensures flutter, dart, and any other SDK tool run from the correct version without manually switching PATH.
flutter_compile sdk exec flutter doctor
flutter_compile sdk exec dart analyze
flutter_compile sdk exec flutter build apk
flutter_compile sdk exec dart run build_runner buildThe resolved SDK's bin/ is prepended to PATH and its isolated PUB_CACHE is set, so all tools (flutter, dart, pub) operate in the correct version context.
Deletes the SDK directory. If you remove the current global default, the rc config and shell PATH block are cleaned up automatically.
flutter_compile sdk remove 3.19.0One-command setup for Flutter framework, DevTools, and engine contributor environments. Replaces the multi-step wiki guides.
Each subcommand clones the relevant repository, configures git remotes (upstream = flutter org, origin = your fork), and performs environment-specific setup.
install flutter — Clones flutter/flutter, sets up git remotes, runs flutter update-packages, and optionally configures IDE settings for IntelliJ.
install devtools — Clones flutter/devtools, configures git remotes, and adds devtools_tool to your PATH.
install engine — The most involved setup. Installs depot_tools (Google's build toolchain), generates a .gclient configuration pointing to your engine fork, runs gclient sync (20-40 min on first run), and configures git remotes.
flutter_compile install flutter
flutter_compile install devtools
flutter_compile install engine
flutter_compile install engine --platform androidRemoves the cloned repository directory, cleans PATH exports from your shell config, and removes the path entry from ~/.flutter_compilerc.
flutter_compile uninstall flutter
flutter_compile uninstall devtools
flutter_compile uninstall engine # Optionally removes depot_tools tooToggles your PATH between the contributor-built Flutter (from install flutter) and your normal system Flutter installation. Useful when you want to quickly move between contributing to the framework and using a release Flutter.
flutter_compile switch # Toggle to whichever isn't active
flutter_compile switch compiled # Use the contributor-built Flutter
flutter_compile switch normal # Use your system FlutterAfter switching, restart your terminal or source your shell config for the change to take effect.
Keep contributor environments up to date with upstream. Each sync subcommand fetches the latest changes from the upstream Flutter organization and rebases your local branch on top.
When run without a subcommand, syncs all three environments sequentially. Each environment is synced independently — if one fails, the others still run. A summary at the end reports which succeeded and which failed.
flutter_compile sync
# Syncs flutter, engine, and devtools in order.
# Reports: "Synced: flutter, devtools" / "Failed: engine"Fetches from upstream, rebases on upstream/master, and runs flutter update-packages to keep dependencies current.
flutter_compile sync flutterFetches from upstream in the src/flutter subdirectory, rebases on upstream/main, then runs gclient sync to update all engine dependencies. After syncing, prints a reminder to rebuild.
flutter_compile sync engine
# → "Run "flutter_compile build engine" to rebuild."Fetches from upstream and rebases on upstream/master.
flutter_compile sync devtoolsEach sync subcommand reads its install path from ~/.flutter_compilerc. If an environment hasn't been installed yet, it prints an error suggesting you run install first.
Build, run, and test with a locally-built Flutter engine. These commands wrap the GN + ninja build system and the --local-engine flags so you don't have to remember them.
Runs GN (flag resolution) then ninja (compilation) for the specified target. GN is auto-skipped on incremental rebuilds when build.ninja already exists in the output directory.
flutter_compile build engine # Host platform, debug, unoptimized
flutter_compile build engine --platform android --cpu arm64
flutter_compile build engine --platform ios --simulator
flutter_compile build engine --mode release --no-unoptimized
flutter_compile build engine --gn # Force GN re-run
flutter_compile build engine --no-gn # Skip GN step entirely
flutter_compile build engine --clean # Clean build (removes output dir first)Runs a Flutter app using your locally-built engine. Automatically resolves --local-engine and --local-engine-src-path from your config and the last build target.
flutter_compile run
flutter_compile run -p android -c arm64
flutter_compile run -p ios --simulator -- -d "iPhone 15"Everything after -- is forwarded to flutter run.
Runs Flutter tests using your locally-built engine, with the same automatic --local-engine resolution as run.
flutter_compile test
flutter_compile test -p android -c arm64
flutter_compile test -- test/my_widget_test.dartEverything after -- is forwarded to flutter test.
Lists engine build directories with their disk sizes, or deletes specific builds.
flutter_compile clean # List builds with sizes
flutter_compile clean host_debug_unopt_arm64 # Delete a specific build
flutter_compile clean --all # Delete all buildsDisplays engine configuration: engine path, source directory status, host CPU architecture, available build directories with disk sizes, and whether the current directory contains a Flutter project.
flutter_compile status
# Engine path: /Users/you/flutter_compile/engine
# Source dir: /Users/you/flutter_compile/engine/src [OK]
# Host CPU: arm64
#
# Available builds:
# host_debug_unopt_arm64 4.2G
# android_debug_unopt_arm64 2.1G
#
# Flutter project: yes (pubspec.yaml found)These options are shared by build engine, run, and test:
| Option | Values | Default |
|---|---|---|
--platform, -p |
android, ios, macos, linux, web, host | host |
--cpu, -c |
arm, arm64, x64 | auto-detected |
--mode, -m |
debug, profile, release | debug |
--unoptimized |
flag | true |
--simulator |
flag (iOS only) | false |
build engine also accepts --clean, --gn, and --no-gn.
Read and write ~/.flutter_compilerc, the central config file that stores paths to contributor environments, depot_tools, and the global SDK version.
config list — Show all stored key-value pairs.
config get <key> — Read a single value. Accepts friendly names (flutter, engine, devtools, depot_tools, global_sdk) which map to their internal key names.
config set <key> <value> — Write a value. Useful for manually correcting paths if you moved a directory.
flutter_compile config list
flutter_compile config get engine
flutter_compile config set engine /new/path/to/engineChecks that required tools are installed (git, python3, dart, flutter), engine tools are available (gclient, ninja, Xcode on macOS), ~/.flutter_compilerc is valid, and each contributor environment has correct git remotes (upstream + origin).
flutter_compile doctor
# [+] git is installed
# [+] python3 is installed
# [+] dart is installed
# [+] flutter is installed
# [+] depot_tools (gclient) is installed
# [+] ninja is installed
# [+] .flutter_compilerc is valid
# [+] Flutter contributor environment: installed
# [-] DevTools contributor environment: not configured
# [+] Engine contributor environment: installedChecks pub.dev for a newer version of flutter_compile and updates if available.
flutter_compile updateSeveral commands support --json for machine-readable output, useful for IDE extensions and scripting:
flutter_compile sdk list --json # JSON array of installed SDKs
flutter_compile doctor --json # Health checks as JSON array
flutter_compile config list --json # Config as JSON object
flutter_compile status --json # Engine status as JSON objectflutter_compile --version
flutter_compile --helpThe daemon command starts a JSON-RPC 2.0 server over stdin/stdout, enabling IDE extensions to communicate with the CLI in real time instead of spawning one-off processes.
echo '{"jsonrpc":"2.0","method":"version","id":1}' | flutter_compile daemonEach JSON-RPC message is a single line of JSON (same convention as flutter daemon).
Available methods:
| Method | Description |
|---|---|
sdk.list |
List installed SDKs |
sdk.global.get |
Get global SDK version |
sdk.global.set |
Set global SDK version |
sdk.use.get |
Get project SDK version |
sdk.use.set |
Set project SDK version |
doctor |
Run health checks |
config.list |
List all config values |
config.get |
Get a config value |
config.set |
Set a config value |
status |
Get engine status |
version |
Get CLI version |
shutdown |
Stop the daemon |
Notifications (server to client):
daemon.connected— sent on startup with version and PIDsdk.changed— sent when global or project SDK version changesconfig.changed— sent when.flutter_compilercchanges
The ui command opens an interactive terminal dashboard for SDK management without needing an IDE.
flutter_compile uiTabs:
- SDKs — view installed SDKs, set global default (Enter), install new SDK (i)
- Environments — view contributor environment status
- Builds — view available engine builds
- Doctor — view health check results
Keyboard shortcuts:
1-4— switch tabs- Arrow keys — navigate within a tab
Tab— cycle tabsi— install SDK (on SDKs tab)r— refresh dataq/Esc— quit
A companion VS Code extension lives in extensions/vscode/. It provides:
- Status bar — shows the active Flutter SDK version. Click to open a quick pick switcher.
- Commands —
Flutter Compile: Install SDK,Flutter Compile: Switch SDK,Flutter Compile: Doctoravailable from the command palette. - Auto-update — switching SDK automatically sets
dart.flutterSdkPathin workspace settings so the Dart extension picks up the new SDK. - File watcher — watches
.flutter-versionfor external changes (e.g. from the CLI) and updates the status bar and settings automatically.
cd extensions/vscode
npm install
npm run compileThen press F5 in VS Code to launch an Extension Development Host, or package with vsce package.
The extension requires flutter_compile to be installed and available on PATH. You can configure a custom path via the flutterCompile.cliPath setting.
A companion IntelliJ platform plugin lives in extensions/intellij/. It provides:
- Toolbar combo box — SDK version switcher in the main toolbar. Shows the current global SDK and lets you switch with a single click.
- Tool window — "Flutter Compile" tool window with two tabs:
- SDKs — lists all installed SDK versions with global/project markers, Switch and Refresh buttons.
- Doctor — runs
flutter_compile doctorand displays the output.
- Auto-update — switching SDK automatically updates the Flutter SDK path in project settings via the Flutter IntelliJ plugin's API.
- Settings — configure the path to the
flutter_compileCLI under Settings > Tools > Flutter Compile. - Actions —
Install SDKandDoctoravailable from the Tools menu and Find Action dialog.
cd extensions/intellij
./gradlew buildPluginThe built plugin ZIP will be in build/distributions/. Install it via Settings > Plugins > Install Plugin from Disk.
Requires the Dart and Flutter plugins to be installed.
flutter_compile supports tab completion for commands, subcommands, and flags in bash, zsh, and fish shells.
flutter_compile completion installThis writes the completion script for your current shell. After installation, restart your terminal or source your shell config.
flutter_compile completion uninstallOnce installed, you can use <Tab> to complete:
- Commands:
flutter_compile <Tab>showsinstall,build,sdk,sync, etc. - Subcommands:
flutter_compile sdk <Tab>showsinstall,list,global, etc. - Flags:
flutter_compile build engine --<Tab>shows--platform,--cpu,--mode, etc.
dart testWith coverage:
dart pub global activate coverage 1.2.0
dart test --coverage=coverage
dart pub global run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info
genhtml coverage/lcov.info -o coverage/
open coverage/index.html