Skip to main content

Configuration

To configure Flutter Release X, create a config.yaml file in the root directory of your project. This file defines how builds are processed, uploaded, and shared.

🔹 Configuration Options

You have three ways to configure Flutter Release X:

The easiest way to get started is to use the frx init command:

frx init

This command automatically creates a config.yaml file with:

  • ✅ All available upload options (commented out, ready to enable)
  • ✅ QR code settings with sensible defaults
  • ✅ Helpful comments marking Required vs Optional fields
  • ✅ Multi-framework pipeline examples (Flutter, React, Python, .NET, Go, etc.)
  • ✅ Links to setup documentation

Options:

  • --config / -c: Specify a custom config filename (default: config.yaml)
  • --force / -f: Overwrite existing config file if it exists

Example:

# Create default config.yaml
frx init

# Create custom config file
frx init --config my-config.yaml

# Overwrite existing config
frx init --force

After running frx init, simply:

  1. Open the generated config.yaml file
  2. Uncomment and configure the services you want to use
  3. Add your API keys and tokens
  4. Run frx build to start building and releasing!

1. Default Configuration (Quick & Easy 🚀)

  • Ideal for most users who want an automated build & upload process without extra setup.
  • Supports .apk builds, QR code generation, and cloud uploads to multiple platforms:
    • Cloud Storage: GitHub, Google Drive, AWS S3, GitLab, Diawi
    • App Stores: Google Play Store, Apple App Store
    • Notifications: Slack, Microsoft Teams

Default Config file Sample

# Path to Flutter binary
# Example for Windows: C:/dev/flutter/bin/flutter.bat
# Example for macOS: /Users/USER_NAME/development/flutter/bin/flutter
flutter_path: FLUTTER/BINARY/PATH

upload_options:
github:
enabled: true
token: YOUR_GITHUB_TOKEN # Required: Personal Access Token for GitHub
repo: REPO/PATH # Required: GitHub repository path, e.g., RittikSoni/Flutter-Release-X
tag: v0.0.1 # Optional: Release tag (default: v0.0.1)

google_drive:
enabled: true
client_id: YOUR_CLIENT_ID # Required: Google API Client ID
client_secret: YOUR_CLIENT_SECRET # Required: Google API Client Secret

diawi:
enabled: false
token: YOUR_DIAWI_TOKEN # Required: Diawi API Token
wall_of_apps: false # Optional: Display on Diawi wall of apps (default: false)
find_by_udid: false # Optional: Allow finding by UDID (default: false)
callback_url: "" # Optional: URL to notify when upload completes
installation_notifications: false # Optional: Enable installation notifications (default: false)
password: "" # Optional: Password protection for download link
comment: "" # Optional: Comment/description for upload

aws:
enabled: false
access_key_id: YOUR_AWS_ACCESS_KEY_ID # Required: AWS Access Key ID
secret_access_key: YOUR_AWS_SECRET_ACCESS_KEY # Required: AWS Secret Access Key
region: us-east-1 # Optional: AWS region (default: us-east-1)
bucket_name: your-bucket-name # Required: S3 bucket name
key_prefix: flutter-release-x # Optional: Prefix for uploaded files (default: empty)

gitlab:
enabled: false
token: YOUR_GITLAB_TOKEN # Required: GitLab Personal Access Token
project_id: "12345678" # Required: GitLab Project ID (found in project settings)
tag: v0.0.1 # Optional: Release tag (default: v0.0.1)
ref: main # Optional: Branch or commit SHA (default: main)
host: https://gitlab.com # Optional: GitLab host URL (default: https://gitlab.com)

play_store:
enabled: false
service_account_json_path: ./path/to/service-account.json # Required: Path to Google Play Service Account JSON file
package_name: com.example.app # Required: Android app package name
track: internal # Optional: Release track - internal, alpha, beta, or production (default: internal)
release_name: "Release v1.0.0" # Optional: Custom release name

app_store:
enabled: false
api_key_path: ./path/to/AuthKey_XXXXXXXXXX.p8 # Required: Path to App Store Connect API Key (.p8 file)
api_issuer: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx # Required: App Store Connect API Key Issuer ID (UUID format)
app_id: "1234567890" # Required: App Store Connect App ID
bundle_id: com.example.app # Optional: iOS app bundle identifier

slack:
enabled: true
bot_user_oauth_token: YOUR_BOT_TOKEN # Required: Slack Bot OAuth Token, e.g., xoxb-XXXXXXXXX-XXXXXXXXX-XXXXXXXXXXXXX
default_channel_id: CHANNEL_ID # Required: Slack channel ID, e.g., CXXXXXXXXX
share_QR: true # Optional: Share QR code in Slack (default: true)
share_link: true # Optional: Share build download link in Slack (default: true)
custom_message: "🚀 Check out the latest build! Download your app now!" # Optional: Custom message
mention_users: ["U0XXXXXXX", "U08XXXXXXXX"] # Optional: List of Slack user/member IDs to mention

teams:
enabled: false
webhook_url: YOUR_WEBHOOK_URL # Required: Microsoft Teams Incoming Webhook URL
share_QR: true # Optional: Share QR code in Teams (default: true)
share_link: true # Optional: Share build download link in Teams (default: true)
custom_message: "🚀 Check out the latest build! Download your app now!" # Optional: Custom message
mention_users: ["John Doe", "Jane Smith"] # Optional: List of Teams user names (webhooks don't support @mentions)

# QR Code generation settings
qr_code:
enabled: true # Optional: Whether to generate QR codes (default: true)
save_file: true # Optional: Save the QR code image to the file system (default: true)
show_in_command: true # Optional: Display QR code in the command line output (default: true)
size: 256 # Optional: Size of the generated QR code in pixels (default: 256)
error_correction_level: low # Optional: Error correction level - low, medium, quartile, high (default: low)
save_path: "./release-qr-code.png" # Optional: File path to save the QR code image (default: ./release-qr-code.png)

2. Advanced Pipeline (Full Customization 🔥)

  • For users who need complete control over build steps, dependencies, and automation.
  • Supports custom commands, multiple platforms (iOS, Web, Desktop), and external scripts.
  • Overrides default configuration when enabled.

Advance Pipeline Config file Sample

upload_options:
github:
enabled: true
token: YOUR_GITHUB_TOKEN # Required: Personal Access Token for GitHub
repo: REPO/PATH # Required: GitHub repository path, e.g., RittikSoni/Flutter-Release-X
tag: v0.0.1 # Release tag (e.g., version number)

google_drive:
enabled: true
client_id: YOUR_CLIENT_ID # Required: Google API Client ID
client_secret: YOUR_CLIENT_SECRET # Required: Google API Client Secret

slack:
enabled: true
bot_user_oauth_token: YOUR_BOT_TOKEN # Required: Slack Bot OAuth Token, e.g., xoxb-XXXXXXXXX-XXXXXXXXX-XXXXXXXXXXXXX
default_channel_id: CHANNEL_ID # Required: Slack channel ID, e.g., CXXXXXXXXX
share_QR: true # Optional: Share QR code in Slack (default: true)
share_link: true # Optional: Share build download link in Slack (default: true)
custom_message: "🚀 Check out the latest build! Download your app now!" # Custom message to accompany the link
mention_users: ["U0XXXXXXX", "U08XXXXXXXX"] # List of Slack user/member IDs to mention. Note: not username or display name.

# QR Code generation settings
qr_code:
enabled: true # Whether to generate QR codes (true/false)
save_file: true # Save the QR code image to the file system (true/false)
show_in_command: true # Display QR code in the command line output (true/false)
size: 256 # Size of the generated QR code (pixels)
error_correction_level: low # Error correction level: low, medium, quartile, high
save_path: "./release-qr-code.png" # File path to save the QR code image

# Advanced Pipeline Configuration [OPTIONAL]
# This section allows you to define multiple pipeline steps that can be executed in sequence. Each step can have its own commands, dependencies, and upload options.

# If a custom pipeline is provided, it will override the default flow and behavior.
# Ensure that the pipeline steps are properly defined to reflect the intended execution order.

# e.g.,
pipeline_steps:
- name: "Run Tests"
command: "flutter test"
customExitCondition: "Test failed" # Stop if tests fail
upload_output: false # No upload for this step
notify_slack: true # Notify Slack after tests complete

- name: "Lint"
command: "flutter analyze"
customExitCondition: "issues found" # Stop if issues found

- name: "Build APK"
command: "flutter build apk --release"
customExitCondition: "error: some specific error message" # Stop if this error appears in the output
upload_output: true # Enable upload for this step
output_path: "./build/app/outputs/flutter-apk/app-release.apk" # APK path
notify_slack: false # Do not notify Slack after this step

- name: "Package Release"
command: "node --version"
customExitCondition: "version mismatch" # Stop if version mismatch is found
upload_output: true # Upload to cloud on success
output_path: "./release-package.zip" # Path to release package
notify_slack: true # Notify on Slack on success

- name: "Deploy to Cloud"
command: "./deploy_to_cloud.sh"
customExitCondition: "deployment failed" # Stop if deployment fails
upload_output: false # No upload as deployment is handled separately
notify_slack: true # Notify on Slack on success

# Note: The order of steps in the pipeline is crucial!
# Each step depends on the successful completion of the previous step.
# If a step fails due to a custom exit condition, the pipeline will halt immediately,
# and subsequent steps will not be executed. Ensure that custom exit conditions are properly defined
# to avoid unwanted interruptions in the pipeline flow.

📌 Which One Should You Choose?

FeatureDefault ConfigurationAdvanced Pipeline
Ease of Use✅ Simple setup⚡ Requires custom steps
Custom Commands❌ Not supported✅ Fully customizable
Multi-Platform🌍 Any platform🌍 Any platform
External Scripts❌ No✅ Yes
Error Handling🔧 Standard logs⚠️ Custom exit conditions
💡 Tip:

If you're just getting started, go with Default Configuration. If you need full flexibility, switch to Advanced Pipeline.

Flutter Path

KeyDescriptionExample
flutter_pathPath to the Flutter binaryC:/dev/flutter/bin/flutter.bat (Windows), /Users/USER_NAME/development/flutter/bin/flutter (macOS)

Upload Options

GitHub

KeyDescriptionRequiredExample
enabledEnable GitHub uploadYestrue
tokenPersonal Access Token for GitHubYesYOUR_GITHUB_TOKEN
repoGitHub repository pathYesRittikSoni/Flutter-Release-X
tagRelease tag (e.g., version number)Nov0.0.1 (Defaults to v0.0.1)

Google Drive

KeyDescriptionRequiredExample
enabledEnable Google Drive uploadYestrue
client_idGoogle API Client IDYesYOUR_CLIENT_ID
client_secretGoogle API Client SecretYesYOUR_CLIENT_SECRET

Diawi

KeyDescriptionRequiredExample
enabledEnable Diawi uploadYestrue
tokenDiawi API TokenYesGet from Diawi Profile
wall_of_appsDisplay on Diawi wall of appsNofalse (default)
find_by_udidAllow finding by UDIDNofalse (default)
callback_urlURL to notify when upload completesNo""
installation_notificationsEnable installation notificationsNofalse (default)
passwordPassword protection for the download linkNo""
commentComment/description for the uploadNo""

AWS S3

KeyDescriptionRequiredExample
enabledEnable AWS S3 uploadYestrue
access_key_idAWS Access Key IDYesYOUR_AWS_ACCESS_KEY_ID
secret_access_keyAWS Secret Access KeyYesYOUR_AWS_SECRET_ACCESS_KEY
regionAWS regionNous-east-1 (default)
bucket_nameS3 bucket nameYesyour-bucket-name
key_prefixPrefix for uploaded files (organizes files)Noflutter-release-x

Note: The S3 bucket must have public read permissions for direct URL access, or you'll need to use presigned URLs. Check your bucket's public access settings in the AWS Console.

GitLab

KeyDescriptionRequiredExample
enabledEnable GitLab uploadYestrue
tokenGitLab Personal Access TokenYesGet from GitLab profile settings
project_idGitLab Project ID (found in project settings)Yes"12345678"
tagRelease tag (e.g., version number)Nov0.0.1 (default)
refBranch or commit SHA from which to create the tagNomain (default)
hostGitLab host URL (for self-hosted instances)Nohttps://gitlab.com (default)

Note: For self-hosted GitLab instances, update the host field with your GitLab URL.

Google Play Store

KeyDescriptionRequiredExample
enabledEnable Google Play Store uploadYestrue
service_account_json_pathPath to Google Play Service Account JSON fileYes./path/to/service-account.json
package_nameAndroid app package nameYescom.example.app
trackRelease trackNointernal (Options: internal, alpha, beta, production)
release_nameCustom release nameNo"Release v1.0.0"

Note: Requires a Google Play Service Account with appropriate permissions. The service account must have access to your app in the Play Console.

Apple App Store

KeyDescriptionRequiredExample
enabledEnable App Store uploadYestrue
api_key_pathPath to App Store Connect API Key (.p8 file)Yes./path/to/AuthKey_XXXXXXXXXX.p8
api_issuerApp Store Connect API Key Issuer ID (UUID)Yesxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
app_idApp Store Connect App IDYes"1234567890"
bundle_idiOS app bundle identifierNocom.example.app

Note: Full IPA upload via App Store Connect API requires proper JWT signing. For production uploads, consider using Transporter, Fastlane, or Xcode Organizer for more reliable uploads.

Slack

KeyDescriptionRequiredExample
enabledEnable Slack uploadYestrue
bot_user_oauth_tokenSlack Bot OAuth TokenYesYOUR_BOT_TOKEN
default_channel_idSlack channel IDYesCXXXXXXXXX
share_QRWhether to share QR code on SlackNotrue (default)
share_linkWhether to share build download link on SlackNotrue (default)
custom_messageCustom message to share with the build linkNo"🚀 Check out the latest build! Download your app now!"
mention_usersList of Slack user/member IDs to mentionNo["U0XXXXXXX", "U08XXXXXXXX"]

Microsoft Teams

KeyDescriptionRequiredExample
enabledEnable Microsoft Teams notificationsYestrue
webhook_urlMicrosoft Teams Incoming Webhook URLYesGet from Teams channel connectors
share_QRWhether to share QR code in TeamsNotrue (default)
share_linkWhether to share build download link in TeamsNotrue (default)
custom_messageCustom message to share with the build linkNo"🚀 Check out the latest build! Download your app now!"
mention_usersList of Teams user names to include in messageNo["John Doe", "Jane Smith"] (Note: Webhooks don't support @mentions, names will be shown as plain text)

QR Code Generation Settings

KeyDescriptionDefaultExample
enabledWhether to generate QR codestruetrue
save_fileWhether to save the QR code image to the file systemtruetrue
show_in_commandWhether to display the QR code in the command linetruetrue
sizeSize of the generated QR code (in pixels)256256
error_correction_levelError correction level for the QR codelowlow (Options: low, medium, quartile, high)
save_pathFile path to save the QR code image./release-qr-code.png./release-qr-code.png

Advance Pipeline

FieldDescriptionExample ValueRequiredDefault Value
nameThe name of the pipeline step."Build APK"YesN/A
commandThe command to run for this pipeline step.flutter build apk --releaseYesN/A
upload_outputWhether to upload the output from this step.true or falseNofalse
output_pathThe file path where the output is stored (if applicable)../build/app/outputs/flutter-apk/app-release.apkNoN/A
notify_slackWhether to notify Slack after this step completes.true or falseNofalse
custom_exit_conditionCustom condition for when to stop the pipeline step. It checks for a specific match in the stdout or stderr. If matched, the pipeline stops. If not matched, the pipeline continues."error: some specific error message" (Stop if a specific error occurs in the output)NoN/A