Skip to main content

OTA Distribution CLI

Use the AppsOnAir CLI to upload Android (.apk) and iOS (.ipa) builds directly to OTA Distribution from your terminal or CI/CD pipeline.


Platform Support​

PlatformSupported
macOS✅
Linux✅
Windows✅

Basic Requirements for Service Usage​

Essential Setup
  • For CLI installation and authentication setup, see Overview

Quick Start​

Follow these steps once per project to set up recurring uploads.

Step 1: Initialize Your Project​

Run this command from your project root:

appsonair init ota

This creates a .appsonair-cli.yaml config file linked to your workspace and app. The identity fields (workspaceId, appId, appName) are filled in automatically — workspaceId and appId are stored encrypted, so leave them untouched. Open the file and set your build output paths:

.appsonair-cli.yaml
# Auto-generated values.
# Do not modify these fields manually.
workspaceId: <auto-filled, encrypted>
appId: <auto-filled, encrypted>
appName: <app-name>

ota:
# Absolute path to the generated Android APK/AAB output directory.
androidOutput: build/app/outputs/flutter-apk/ # update to your .apk build folder

# Absolute path to the generated iOS IPA output directory.
iosOutput: build/ios/ipa/ # update to your .ipa build folder
tip

Point androidOutput and iosOutput to a folder — the CLI automatically picks the newest APK/IPA in that directory by modified time. An exact file path works too.

Common output paths by framework:

FrameworkandroidOutputiosOutput
Flutterbuild/app/outputs/flutter-apk/build/ios/ipa/
Android Nativeapp/build/outputs/apk/release/—

Step 2: Build Your App​

Build your Android and/or iOS app using your existing build process.

Step 3: Upload​

Upload both platforms at once:

appsonair-ota upload

Upload a specific platform only:

appsonair-ota upload --android   # Android APK only
appsonair-ota upload --ios # iOS IPA only

After a successful upload, the CLI prints a shareable install link for each build.

You can also add appsonair-ota upload to your build command or CI/CD pipeline to automatically upload builds to the AppsOnAir web portal on release.


All Upload Flags​

FlagDescription
(none)Upload both Android and iOS using yaml config
--androidUpload Android only (yaml mode)
--iosUpload iOS only (yaml mode)
--path <path>Direct upload — auto-detect APK or IPA from a file's extension, or upload the newest APK and newest IPA from a folder
--android-path <path>Direct upload — APK file or folder (strict APK validation)
--ios-path <path>Direct upload — IPA file or folder (strict IPA validation)
--note <note>Release note applied to both Android and iOS
--android-note <note>Release note for Android only
--ios-note <note>Release note for iOS only

Upload Without a Config File (Path Mode)​

Use path mode for one-off uploads without a config file.

# Auto-detect platform from file extension
appsonair-ota upload --path build/app.apk
appsonair-ota upload --path build/app.ipa

# Point --path at a folder to upload the newest APK AND newest IPA inside it
appsonair-ota upload --path build/outputs/

# Strict platform targeting
appsonair-ota upload --android-path build/app.apk
appsonair-ota upload --ios-path build/app.ipa

# Upload both in one command
appsonair-ota upload --android-path build/app.apk --ios-path build/app.ipa
tip

A folder path works too — the CLI picks the newest file automatically:

appsonair-ota upload --android-path build/app/outputs/apk/release/
caution

Since there is no .appsonair-cli.yaml in path mode, the CLI will prompt you to select your workspace and app interactively every time you run an upload command.


Adding Release Notes​

# Same note for both platforms
appsonair-ota upload --note "Bug fixes and improvements"

# Platform-specific notes
appsonair-ota upload --android-note "Fixed crash on Android 12" --ios-note "Improved Dark Mode support"

# Android-only upload with a note
appsonair-ota upload --android --android-note "Hotfix build"

# Android gets its own note, iOS gets the shared note
appsonair-ota upload --android-note "Android specific fix" --note "Common release"
tip

Platform-specific flags (--android-note, --ios-note) always take priority over --note for their respective platform.


Video Tutorials​

Watch the full walkthrough for your framework to see how to integrate and use the OTA Distribution CLI step by step.