flutter_release_manager 1.0.13 copy "flutter_release_manager: ^1.0.13" to clipboard
flutter_release_manager: ^1.0.13 copied to clipboard

Flutter build and release automation tool for Android and iOS. Build APKs and IPAs, upload to Google Drive via rclone, distribute through Diawi, and manage releases from a single CLI.

flutter_release_manager #

Build, package, and distribute Flutter releases with a single command.

pub.dev License: MIT Platform


Quick Navigation #


Quick Start #

# 1. Install
dart pub global activate flutter_release_manager

# 2. One-time setup โ€” installs rclone, signs into Google Drive
flutter_release_manager init

# 3. Build and upload from your Flutter project
cd your_flutter_project
flutter_release_manager

That's it. The tool builds your APK/IPA, uploads it to Google Drive, and prints a shareable link.

CI/CD: Pass all values as flags to skip every prompt:

flutter_release_manager --platform android --upload-drive --environment UAT

The Problem #

Every time you finish a feature or fix a bug, your QA team needs the latest build. Without a tool, you do this manually:

  1. Run flutter build apk in the terminal โ€” wait 3 minutes
  2. Navigate to build/app/outputs/flutter-apk/ in Finder/Explorer
  3. Upload the APK file to Google Drive by dragging and dropping
  4. Wait for the upload to finish
  5. Right-click โ†’ Get shareable link
  6. Copy the link and paste it in Slack/WhatsApp
  7. Tell the QA team which version it is

With flutter_release_manager:

cd your_flutter_app
flutter_release_manager

Done. The APK is built, uploaded, and a shareable link is printed in your terminal โ€” in one command.


What It Does #

Without this tool With this tool
Build manually, upload manually One command does everything
Flat Drive folder โ€” chaos after 10 builds Organized: AppName/2026/June/UAT/
Duplicate folders from typos or case mismatch Smart folder reuse โ€” case-insensitive
Create shareable links manually Link generated and printed automatically
Android and iOS are separate workflows Both platforms in one command
Re-enter Drive folder every time Remembers settings, asks only what changed
No idea which build is DEV vs PROD Environment (DEV/UAT/PROD) in every filename

Features #

Feature Description
โœ… Android APK Build flutter build apk --split-per-abi โ€” arm64-v8a preferred
โœ… iOS IPA Build Xcode archive + export, fully automated
โœ… Google Drive Upload Browser sign-in via rclone โ€” zero Cloud Console setup
โœ… Diawi Upload iOS testers get a one-tap install link
โœ… Rclone Authentication Non-interactive OAuth, no deadlocks, no interactive prompts
โœ… Real-time Upload Progress [โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘] 64% 42 MB / 66 MB 4.2 MB/s ETA: 6s
โœ… Environment Selection DEV / UAT / PROD per build โ€” never remembered by mistake
โœ… Configuration Management flutter_release_manager config โ€” edit all settings interactively
โœ… Smart Folder Reuse Case-insensitive Drive folder matching prevents duplicates
โœ… Structured Drive Hierarchy root/AppName/year/month/ENV/APK โ€” scales to multiple apps
โœ… Team Distribution Shareable Drive link + Diawi install link printed after build
โœ… CI/CD Ready All settings overridable via flags โ€” zero prompts in pipeline
โœ… Cross-Platform macOS, Linux, Windows

Before You Start #

You need these installed before using this package:

Requirement What it is How to install
Flutter & Dart The Flutter framework and Dart SDK flutter.dev/docs/get-started/install
rclone (Android upload) A tool that uploads files to Google Drive Automatic โ€” init installs it for you
Xcode (iOS only, macOS only) Apple's IDE, needed to build iOS apps Mac App Store โ†’ Xcode

Note for iOS builds: After installing Xcode, run this once:

xcode-select --install

You do not need:

  • A Google Cloud account
  • An OAuth client ID or secret
  • A service account key file
  • Any prior rclone experience

macOS users: On first use, macOS may show a security dialog asking if you want to allow Flutter, Dart, or rclone to run. Click Open or go to System Settings โ†’ Privacy & Security โ†’ Allow Anyway. This approval is required only once per tool. See macOS Gatekeeper for full instructions.


Step 1 โ€” Install the Package #

Open your terminal and run:

dart pub global activate flutter_release_manager

What this does: Downloads and installs the flutter_release_manager command on your machine globally. You can now use it from any directory.

Expected output:

Resolving dependencies...
Downloading flutter_release_manager 3.0.0...
Building package executables...
Built flutter_release_manager:flutter_release_manager.
Installed executable flutter_release_manager.
Activated flutter_release_manager 3.0.0.

Make sure the command is available. If you get "command not found" after installing, add the Dart pub global bin directory to your PATH:

  • macOS / Linux โ€” add to ~/.zshrc or ~/.bashrc:

    export PATH="$PATH:$HOME/.pub-cache/bin"
    

    Then restart your terminal or run source ~/.zshrc.

  • Windows โ€” add %LOCALAPPDATA%\Pub\Cache\bin to your System PATH.

Verify it works:

flutter_release_manager --help

Step 2 โ€” One-Time Setup #

Run this once per machine. After setup, you never need to run it again unless you want to change your Drive folder or Diawi token.

flutter_release_manager init

The setup wizard walks you through 5 steps. Here is exactly what happens at each step:

Step Name What happens Time
1 rclone Installation Checks if rclone is installed. Installs automatically via Homebrew/apt if not. ~1 min
2 Google Drive Sign-in Opens your browser for a standard Google sign-in. One-time only. ~1 min
3 Connection Verification Confirms Google Drive is reachable and shows your quota. Instant
4 Choose Drive Folder Lists your top-level Drive folders. Pick one or enter a name. Instant
5 Diawi Token Optional. Paste your token for iOS tester distribution. Skip if Android only. Instant

Step 2.1 โ€” rclone Installation #

What is rclone? rclone is a free, open-source program that uploads files to cloud storage services like Google Drive. It handles the connection between your machine and your Google Drive account. flutter_release_manager uses rclone internally to upload APKs โ€” you never interact with rclone directly.

What happens: The wizard checks if rclone is installed. If not, it installs it automatically:

  • macOS: installs via Homebrew
  • Linux: installs via apt-get
  • Windows: shows instructions with download links

Expected output (rclone already installed):

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Step 1 โ€” rclone
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  โœ“  rclone โ€” rclone v1.67.0

Expected output (rclone not installed, macOS):

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Step 1 โ€” rclone
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  โš   rclone not found โ€” attempting automatic installation...

  โ†’  Installing rclone via Homebrew...
  [homebrew output...]
  โœ“  rclone installed โ€” rclone v1.67.0

Troubleshooting:

  • macOS โ€” Homebrew not found: Install Homebrew first: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  • Linux โ€” apt-get fails: Install manually from rclone.org/install

Step 2.2 โ€” Google Drive Sign-in #

What happens: The wizard opens your web browser automatically. You sign in to your Google account and click Allow to give rclone permission to access your Google Drive. The permission is saved securely on your machine โ€” you never need to sign in again.

Why is sign-in required? APKs are uploaded to your Google Drive. Google requires authentication to access your files. Unlike manual setup, you don't need to create a Google Cloud project or generate API keys โ€” rclone uses its own built-in credentials and handles everything through the standard Google sign-in screen you already know.

Expected output:

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Step 2 โ€” Google Drive Remote
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  โ”€โ”€โ”€ Google Drive Sign-in โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

  Your browser will open for Google sign-in.
  Sign in with the account that owns your Drive folder,
  then click Allow โ€” this tool will resume automatically.

  โ†’  Opening browser for Google OAuth (waiting up to 5 min)...

  If your browser doesn't open automatically go to the following link:
  http://127.0.0.1:53682/auth?...
  Log in and authorize rclone for access
  Waiting for code...
  Got code

  โœ“  Authorization complete.
  โ†’  Saving credentials to rclone remote "flutter_release_manager"...
  โœ“  Remote "flutter_release_manager" configured.

What the browser shows: A standard Google sign-in page, then a screen asking you to allow access to Google Drive. Click Allow.

Troubleshooting:

  • Browser doesn't open: Copy the http://127.0.0.1:... link from the terminal and paste it into your browser manually.
  • Authorization failed: Make sure you clicked Allow (not Deny). Re-run flutter_release_manager init.
  • Times out after 5 minutes: The browser window was left open too long. Re-run flutter_release_manager init and complete sign-in promptly.

Step 2.3 โ€” Drive Connection Verification #

What happens: The wizard confirms that the sign-in worked by connecting to your Google Drive and displaying your storage quota.

Expected output:

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Step 3 โ€” Verify Connection
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  โ†’  Verifying Google Drive connection...
  โœ“  Google Drive โ€” connected
   โ„น  Total:   15 GB
   โ„น  Used:    4.2 GB
   โ„น  Free:    10.8 GB

Step 2.4 โ€” Choose Your Drive Folder #

What happens: The wizard lists the folders at the top level of your Google Drive and asks you to choose one. APKs will be uploaded inside that folder, organized by year and month automatically.

Example input:

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Step 4 โ€” Drive Folder
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  Fetching top-level folders from your Google Drive...

  1. Personal
  2. QA Builds
  3. Projects
  4. Enter folder name manually

  Select destination folder [1-4]: 2
  โœ“  Drive folder: QA Builds

If your folder doesn't appear in the list: Choose "Enter folder name manually" and type the folder name. The folder will be created automatically on the first upload if it doesn't exist yet.

Where files will appear:

QA Builds/
โ””โ”€โ”€ 2026/
    โ””โ”€โ”€ June/
        โ”œโ”€โ”€ MyApp_2026_06_18_1430.apk   โ† uploaded on Jun 18 at 14:30
        โ””โ”€โ”€ MyApp_2026_06_19_0920.apk   โ† uploaded on Jun 19 at 09:20

Step 2.5 โ€” Diawi Token (iOS only โ€” optional) #

What is Diawi? Diawi is a web service for distributing iOS and Android builds to testers. After uploading your IPA file, Diawi gives you a short link like https://i.diawi.com/AbCdEf. Testers tap that link on their iPhone and the app installs directly โ€” no App Store, no TestFlight, no developer account needed for testers.

Do I need Diawi?

  • Android only? โ†’ No. APKs go to Google Drive. Press Enter to skip.
  • iOS builds? โ†’ Yes, this is the recommended way to share iOS builds with testers.

How to get a Diawi token:

  1. Go to diawi.com and create a free account
  2. Log in โ†’ click your name โ†’ Account โ†’ API Access Tokens
  3. Click Create new token and copy it

Example input:

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Step 5 โ€” Diawi Token (optional)
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  โ„น  Diawi gives testers an install link for iOS builds.
  โ„น  Sign up at diawi.com โ†’ Account โ†’ API Access Tokens.
  โ„น  Press Enter to skip if you don't need iOS uploads.

  Diawi API token (or Enter to skip): a1b2c3d4e5f6...
  โœ“  Diawi token saved.

Setup Complete #

After all 5 steps, you'll see:

  โœ“  Configuration saved to ~/.config/flutter_release_manager/config.json

  Setup complete.
  Run flutter_release_manager to build and upload.

Your settings are stored at ~/.config/flutter_release_manager/config.json. You never need to run init again unless you want to change your Drive folder or Diawi token.


Step 3 โ€” Build and Upload #

Navigate into your Flutter project and run:

cd /path/to/your_flutter_project
flutter_release_manager

What happens โ€” complete example session:

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  flutter_release_manager  v3
  Build ยท Archive ยท Distribute
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  โœ“  Flutter project detected: /Users/shadab/projects/my_app

  โ”€โ”€โ”€ Platform โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

  What do you want to build?
  1) Android only  โ€” generates APK
  2) iOS only      โ€” generates IPA
  3) Both          โ€” APK + IPA

  Enter choice [1/2/3]: 1

  โ”€โ”€โ”€ Google Drive Upload โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

  โ„น  APKs are uploaded via rclone โ€” no OAuth setup needed.
  โ„น  Run flutter_release_manager init once to configure Drive.
  โ„น  Skip to keep the APK on your machine.

  Upload APK to Google Drive after building? [y/N]: y
  โœ“  Drive folder: QA Builds

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Pre-flight checks
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  โœ“  flutter found
  โœ“  rclone found โ€” rclone v1.67.0
  โœ“  rclone remote "flutter_release_manager" configured
  โœ“  Google Drive โ€” connected

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Build Summary
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  Platform      Android
  App dir       /Users/shadab/projects/my_app
  App name      MyApp

  Android
    Drive upload  Yes (via rclone)
    Folder        QA Builds

  Press Enter to start the build, or Ctrl+C to cancel... โ†ต

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Android APK  (2026-06-18_14-30)
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  โ†’  Running: flutter build apk --split-per-abi

  [... flutter build output ...]

  Output APKs:
  โœ“  app-arm64-v8a-release.apk    (28.3 MB)   โ† modern phones
  โœ“  app-armeabi-v7a-release.apk  (26.1 MB)   โ† older phones
  โœ“  app-x86_64-release.apk       (29.0 MB)   โ† emulators

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Uploading APK to Google Drive
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  โ†’  Destination : QA Builds/2026/June/MyApp_2026_06_18_1430.apk
  โ†’  Local file  : app-arm64-v8a-release.apk (28.3 MB)
  โ†’  Uploading (attempt 1/3)...

  [rclone transfer progress...]

  โœ“  Upload complete.

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Upload completed successfully
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  APK Name:
  MyApp_2026_06_18_1430.apk

  Google Drive URL:
  https://drive.google.com/file/d/1AbCdEfGhIjKlMnOpQrStU.../view

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
  Build complete
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  Android APK:
  https://drive.google.com/file/d/1AbCdEfGhIjKlMnOpQrStU.../view

Copy the Google Drive URL and send it to your QA team.

Second run and beyond: The tool remembers your platform choice and folder. Just press Enter to accept the defaults โ€” the build starts in seconds.


Command Reference #

flutter_release_manager init #

Purpose One-time machine setup: install rclone, sign into Google Drive, choose folder, save Diawi token
When to run Once per machine. Re-run to change your Drive folder or Diawi token.
Requires Internet connection, Google account
flutter_release_manager init

flutter_release_manager doctor #

Purpose Check that all prerequisites are installed and configured correctly
When to run After installation to verify setup, or when something stops working
Requires Nothing โ€” just reads system state
flutter_release_manager doctor

Example output (all good):

  โœ“  flutter          flutter found
  โœ“  rclone           rclone v1.67.0
  โœ“  Drive remote     remote "flutter_release_manager" configured
  โœ“  Drive connection Google Drive reachable
  โœ“  Drive folder     "QA Builds" accessible
  โš   Diawi token      not set โ€” iOS Diawi upload will be skipped

  โœ“  All checks passed. Ready to build and upload.

Example output (problem found):

  โœ“  flutter          flutter found
  โœ“  rclone           rclone v1.67.0
  โœ—  Drive remote     remote "flutter_release_manager" not found
                 Fix: Run: flutter_release_manager init

  โš   Some checks failed. Run: flutter_release_manager init

flutter_release_manager #

Purpose Build your Flutter app and upload the artifacts
When to run From inside your Flutter project directory, whenever you want to share a build
Requires init must have been run at least once
cd /path/to/your_flutter_project
flutter_release_manager

flutter_release_manager config #

Purpose Interactively edit all saved settings
When to run To change project directory, app name, Drive folder, Diawi token, or upload preferences
flutter_release_manager config

Menu:

  โ”€โ”€โ”€ Current Configuration โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

  1)  Project Directory          /Users/john/my_app
  2)  App Name                   MyApp
  3)  Google Account             Connected
  4)  Google Drive Root Folder   QA Builds
  5)  Diawi Token                Configured
  6)  Upload Preferences         Drive: auto-upload, Diawi: skip
  7)  Reset Configuration
  8)  Exit

flutter_release_manager --platform android #

Purpose Build and upload Android APK only, skip iOS entirely
When to run When you only need to share with Android testers
flutter_release_manager --platform android --upload-drive

flutter_release_manager --platform ios #

Purpose Build and upload iOS IPA only, skip Android entirely
When to run When you only need to share with iOS testers (macOS only)
flutter_release_manager --platform ios --team-id ABCD1234EF

flutter_release_manager --skip-build #

Purpose Upload the artifact from your last build without rebuilding
When to run Build succeeded but upload failed. Or you want to re-share the same build.
flutter_release_manager --platform android --skip-build

flutter_release_manager --upload-only #

Same as --skip-build. Both flags do the same thing.

flutter_release_manager --platform android --upload-only

All Flags #

Flag Short Description Default
--platform -p android, ios, or both prompted
--app-dir -d Path to Flutter project (where pubspec.yaml lives) auto-detected
--app-name -n Label used in APK/IPA file names from pubspec.yaml
--upload-drive Upload APK to Google Drive prompted
--environment -e DEV, UAT, or PROD โ€” required when --upload-drive prompted
--team-id -t Apple Developer Team ID (iOS only) prompted
--scheme Xcode scheme name Runner
--export-method development | release-testing | app-store development
--diawi-token Diawi API token for IPA upload from config
--skip-build Upload last artifact, skip the build step false
--upload-only Alias for --skip-build false
--help -h Print help text

Non-Interactive Mode (CI/CD) #

Pass all values as flags to skip every prompt. Useful in GitHub Actions, Bitrise, Codemagic, or any CI pipeline.

flutter_release_manager \
  --platform android \
  --app-dir /path/to/my_app \
  --app-name MyApp \
  --upload-drive \
  --environment UAT

For iOS:

flutter_release_manager \
  --platform ios \
  --app-dir /path/to/my_app \
  --app-name MyApp \
  --team-id ABCD1234EF \
  --diawi-token YOUR_TOKEN \
  --export-method development

Both platforms:

flutter_release_manager \
  --platform both \
  --app-dir /path/to/my_app \
  --app-name MyApp \
  --team-id ABCD1234EF \
  --diawi-token YOUR_TOKEN \
  --upload-drive

Configuration Files #

Machine config Project config
Location ~/.config/flutter_release_manager/config.json <app>/.flutter_release_manager_config.json
Stores Drive folder, Diawi token, rclone remote App name, Team ID, scheme, export method
Set by flutter_release_manager init Auto-saved after each build
Contains secrets? Yes (Diawi token) No
In .gitignore? N/A (outside project) Yes โ€” added automatically
Shared between projects? Yes โ€” one per machine No โ€” one per Flutter project

Machine Configuration #

Location: ~/.config/flutter_release_manager/config.json (macOS / Linux) Location: %APPDATA%\flutter_release_manager\config.json (Windows)

What it stores:

  • Your chosen Google Drive folder name
  • Your Diawi API token (if saved)
  • The rclone remote name

Set by: flutter_release_manager init

Security: The directory has permission 700 (owner-only access) and the file has permission 600 (owner-read-only). This is set automatically.

Example contents:

{
  "folderName": "QA Builds",
  "remote": "flutter_release_manager",
  "diawiToken": "a1b2c3d4..."
}

Project Configuration #

Location: <your_flutter_app>/.flutter_release_manager_config.json

What it stores:

  • Last used platform (android / ios / both)
  • App name
  • Apple Team ID
  • Xcode scheme
  • Export method

Set by: Automatically saved after each successful run.

Security: Contains no secrets. The file is added to .gitignore automatically.

Example contents:

{
  "platform": "android",
  "appName": "MyApp",
  "scheme": "Runner",
  "exportMethod": "development"
}

Google Drive Folder Structure #

APKs are organized automatically using the hierarchy:

testing releasing/             โ† your root folder (chosen during init)
โ”œโ”€โ”€ Ruloans/                   โ† app name (case-insensitive, reuses existing)
โ”‚   โ””โ”€โ”€ 2026/
โ”‚       โ””โ”€โ”€ June/
โ”‚           โ”œโ”€โ”€ DEV/
โ”‚           โ”‚   โ””โ”€โ”€ Ruloans_DEV_2026_06_18_1326.apk
โ”‚           โ”œโ”€โ”€ UAT/
โ”‚           โ”‚   โ””โ”€โ”€ Ruloans_UAT_2026_06_18_1430.apk
โ”‚           โ””โ”€โ”€ PROD/
โ”‚               โ””โ”€โ”€ Ruloans_PROD_2026_06_18_1715.apk
โ”œโ”€โ”€ RuConnect/                 โ† separate app in the same root
โ”‚   โ””โ”€โ”€ 2026/ ...
โ””โ”€โ”€ PartnerApp/                โ† another app
    โ””โ”€โ”€ 2026/ ...

Folder naming rules:

  • Folders are matched case-insensitively โ€” Ruloans reuses an existing ruloans folder
  • New folders are created automatically during the first upload
  • Existing folder names are preserved as-is to avoid duplicates

Filename format:

AppName_ENV_YYYY_MM_DD_HHmm.apk
Ruloans_UAT_2026_06_18_1326.apk

The arm64-v8a APK is uploaded (covers all modern Android phones). A fallback to armeabi-v7a is used if arm64 is not available.


iOS Distribution #

Prerequisites for iOS Builds #

  1. macOS only โ€” iOS builds require Xcode, which only runs on macOS.
  2. Install Xcode from the Mac App Store.
  3. Install command-line tools:
    xcode-select --install
    
  4. Apple Developer Account โ€” needed to sign the app. Free accounts work for development builds. Paid accounts ($99/year) are needed for distribution.
  5. Apple Team ID โ€” a 10-character code like UC2HYA24R2. Find it at: developer.apple.com โ†’ Sign in โ†’ click your name (top right) โ†’ Membership details โ†’ Team ID

Export Methods #

When you build iOS in interactive mode the tool shows a numbered picker โ€” no need to remember flag names:

iOS Export Method
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  How should the IPA be signed?

  1) development     โ€” device must be registered in Apple Developer portal
  2) release-testing โ€” Ad Hoc (requires Ad Hoc provisioning profiles)
  3) app-store       โ€” App Store / TestFlight submission

  Enter choice [1/2/3] (default: 1):

The previously-saved choice is the default โ€” just press Enter to keep it. In CI mode (or when --export-method is passed as a flag) no prompt is shown.

Value Use case When to use
development Development โ€” device must be registered in Apple Developer portal Default. Use for Diawi distribution to registered development devices.
release-testing Ad Hoc โ€” requires explicit Ad Hoc provisioning profiles for every bundle ID Only when you have Ad Hoc profiles set up for all targets
app-store App Store / TestFlight submission Final release builds

Note: ad-hoc is a deprecated alias for release-testing in Xcode 15+. release-testing requires separate Ad Hoc provisioning profiles for every bundle ID in your app (including Notification Service Extensions).


Troubleshooting #

Problem Quick fix
flutter: command not found Install Flutter and add its bin dir to PATH
macOS security popup (Gatekeeper) System Settings โ†’ Privacy & Security โ†’ Allow Anyway
rclone not found after init Install Homebrew (macOS) then re-run flutter_release_manager init
Google Drive authentication failed Re-run flutter_release_manager init and complete sign-in within 5 minutes
Remote "flutter_release_manager" not found Run flutter_release_manager init
Drive folder not in list during init Choose "Enter folder name manually" โ€” it will be created on first upload
Diawi upload failed Regenerate token at diawi.com โ†’ Account โ†’ API Access Tokens
Archive failed / Export failed (iOS) Verify Team ID is 10 chars, run xcode-select --install, try archiving in Xcode
IPA downloads but won't install Use development for devices registered in your Apple portal, or release-testing if you have Ad Hoc profiles
flutter build apk fails Run flutter build apk --split-per-abi directly to see the error
Upload fails despite green doctor Re-run flutter_release_manager init to refresh the Drive token
command not found: flutter_release_manager Add $HOME/.pub-cache/bin to your PATH

flutter: command not found #

Problem: The flutter command is not recognized. Cause: Flutter is not installed, or its bin directory is not in your PATH. Solution:

  1. Install Flutter from flutter.dev/docs/get-started/install
  2. Follow the "Update your path" step in the Flutter installation guide
  3. Restart your terminal and run flutter --version to verify

macOS shows a security popup (Gatekeeper) #

Problem: A dialog appears saying "flutter cannot be opened because the developer cannot be verified" or "Apple cannot verify..." โ€” or a tool is blocked in System Settings.

Why it happens: macOS Gatekeeper quarantines every binary downloaded from the internet until you explicitly approve it. Flutter, rclone, and Dart tools are all affected on first use. This is normal behaviour โ€” it is not a virus warning.

What NOT to do: Do not click Move to Trash or Cancel. That removes or blocks the tool, and the build will fail.

How to allow it โ€” Option 1 (dialog box):

  1. When the popup appears, click Cancel (not Move to Trash)
  2. Open System Settings โ†’ Privacy & Security
  3. Scroll down to the Security section
  4. Find the entry for the blocked tool and click Allow Anyway
  5. Run flutter_release_manager again โ€” this time click Open when prompted

How to allow it โ€” Option 2 (terminal, faster):

# Allow flutter
xattr -d com.apple.quarantine $(which flutter)

# Allow rclone (after init installs it)
xattr -d com.apple.quarantine $(which rclone)

# Allow dart
xattr -d com.apple.quarantine $(which dart)

How to check which tools are quarantined:

flutter_release_manager doctor

The doctor output includes a macOS Gatekeeper section that lists any quarantined binaries and shows the exact commands to clear them.

This only happens once per tool. After you approve a binary, macOS never asks again.

Recommended screenshot: show System Settings โ†’ Privacy & Security with "Allow Anyway" visible next to "flutter". This is the single most common support question for macOS users.


rclone not found after running init #

Problem: rclone installation failed. Cause: Homebrew (macOS) or apt-get (Linux) failed, or you're on Windows. Solution:

  • macOS: Install Homebrew first: https://brew.sh, then run flutter_release_manager init again.
  • Linux: Run sudo apt-get install rclone manually, then flutter_release_manager init.
  • Windows: Download from rclone.org/install/#windows, install, then run flutter_release_manager init.

Google Drive authentication failed #

Problem: The sign-in step failed or timed out. Cause: You may have clicked Deny, the browser window was left open too long, or network issues occurred. Solution:

flutter_release_manager init

Run init again. Complete the sign-in promptly after the browser opens (within 5 minutes).


Remote "flutter_release_manager" not found #

Problem: The Google Drive connection is not configured. Cause: init was not completed, or the rclone config was deleted. Solution:

flutter_release_manager init

Drive folder is not visible in the list during init #

Problem: Your target folder doesn't appear in the list. Cause: The folder may be inside another folder (not at the root of Drive), or Drive hasn't synced. Solution:

  • Choose "Enter folder name manually" and type the name exactly
  • The folder will be created automatically on the first upload if it doesn't exist

Diawi upload failed #

Problem: The iOS IPA was not uploaded to Diawi. Cause: The Diawi token is expired, incorrect, or Diawi's servers are temporarily unavailable. Solution:

  1. Go to diawi.com โ†’ Account โ†’ API Access Tokens
  2. Create a new token
  3. Run flutter_release_manager init to update the saved token

Archive failed or Export failed (iOS) #

Problem: The iOS build failed at the Xcode archive step. Cause: Misconfigured Team ID, missing provisioning profiles, or Xcode command-line tools not installed. Solution:

  1. Verify your Team ID is exactly 10 uppercase characters (e.g. UC2HYA24R2)
  2. Run xcode-select --install to update command-line tools
  3. Open Xcode and make sure your project builds manually: Product โ†’ Archive
  4. Check that you have a valid signing certificate in Xcode โ†’ Settings โ†’ Accounts

Flutter build apk fails #

Problem: The Android build fails. Cause: Code errors, missing SDK, or Gradle issues. Solution: Run the build command directly to see the raw error:

flutter build apk --split-per-abi

Fix any errors shown, then run flutter_release_manager again.


Doctor shows green but upload fails #

Problem: All checks pass but uploading fails. Cause: The Google Drive token may have expired, or network issues during upload. Solution:

# Re-authenticate Google Drive
flutter_release_manager init

# Or retry the upload without rebuilding
flutter_release_manager --platform android --upload-only

command not found: flutter_release_manager (after installing) #

Problem: The command is not found even after running dart pub global activate. Cause: The Dart global bin directory is not in your PATH. Solution: Add the pub cache bin to your PATH:

# macOS / Linux โ€” add to ~/.zshrc or ~/.bashrc:
export PATH="$PATH:$HOME/.pub-cache/bin"

# Then reload:
source ~/.zshrc

On Windows, add %LOCALAPPDATA%\Pub\Cache\bin to your System PATH via Control Panel โ†’ Environment Variables.


FAQ #

Why am I seeing macOS security warnings? macOS Gatekeeper quarantines every tool downloaded from the internet until you approve it. When you see "flutter cannot be opened because the developer cannot be verified", go to System Settings โ†’ Privacy & Security โ†’ scroll to Security โ†’ Allow Anyway. Run the command again and click Open when prompted. This is a one-time approval per tool โ€” once approved, macOS never asks again. See the macOS Gatekeeper troubleshooting section for step-by-step instructions.

Do I need a Google Cloud Console account? No. This tool uses rclone's built-in credentials. You sign in with the regular Google sign-in page โ€” no Cloud Console, no project, no API key.

Do I need to know rclone? No. rclone is installed and configured automatically. You never interact with it directly.

Do I need OAuth credentials? No. This is the whole point of the tool. The standard Google sign-in in your browser is all that's required.

Can I use this with a Google Workspace (G Suite) account? Yes. Sign in with your Workspace account during init. If your organization restricts external app access, ask your admin to allow rclone.

Can I upload to Shared Drives? Yes. Shared Drives appear in your Google Drive folder list during init. Select the shared folder.

Can I upload Android only and skip iOS? Yes. Choose 1) Android only when prompted, or pass --platform android.

Can I skip Diawi? Yes. Press Enter when asked for a Diawi token. iOS builds will still work โ€” the IPA will be saved locally but not uploaded.

Can I use multiple Google accounts? One account per machine. To switch accounts, run flutter_release_manager init โ€” it will prompt for a new sign-in.

Is my Google token stored securely? The token is stored by rclone in its configuration file with restricted file permissions (600). It never touches your code or your project directory.

Can I use this in CI/CD? Yes, but CI requires a pre-configured rclone remote. Set up on a developer machine first, then export the rclone config to your CI environment. See the All Flags section for non-interactive usage.

What APK gets uploaded? The arm64-v8a APK (covers all phones made after 2014). If it's not available, armeabi-v7a is used as a fallback.

Does this work on Windows? Yes, for Android builds. iOS builds require macOS (Xcode requirement from Apple).


Screenshots #

Recommended screenshots to add to your documentation:

Screenshot Suggested filename Caption
Full init terminal session doc/screenshots/init.png "One-time setup: installs rclone, signs into Google Drive, picks folder"
doctor output (all green) doc/screenshots/doctor.png "Health check: all systems ready"
Build progress + upload progress doc/screenshots/build.png "Building APK and uploading to Google Drive"
Final output with Drive link doc/screenshots/result.png "Done: shareable Google Drive link ready to paste"
macOS security dialog doc/screenshots/gatekeeper.png "First-time macOS approval โ€” click Open"
System Settings โ†’ Allow Anyway doc/screenshots/gatekeeper_settings.png "System Settings โ†’ Privacy & Security โ†’ Allow Anyway"

To take screenshots that render well on pub.dev: use a terminal with a dark theme and a font size of at least 14pt.


Migration from flutter_build_release #

If you used the previous flutter_build_release package, migration is fully automatic.

What migrates automatically on first run:

Old New Action
~/.config/flutter_build_release/config.json ~/.config/flutter_release_manager/config.json Copied automatically
.flutter_build_release_config.json .flutter_release_manager_config.json Copied automatically
rclone remote flutter_build_release rclone remote flutter_release_manager Migrated, no re-authentication

You keep your Google Drive access. You don't sign in again.

After migration, remove the old package:

dart pub global deactivate flutter_build_release

License #

MIT License ยฉ 2026 Muhammad Shadab


Made for Flutter teams who would rather ship than wait.

8
likes
140
points
84
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Flutter build and release automation tool for Android and iOS. Build APKs and IPAs, upload to Google Drive via rclone, distribute through Diawi, and manage releases from a single CLI.

Repository (GitHub)
View/report issues

Topics

#flutter #android #ios #build #release

License

MIT (license)

Dependencies

args, http

More

Packages that depend on flutter_release_manager