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
| Platform | Supported |
|---|---|
| macOS | ✅ |
| Linux | ✅ |
| Windows | ✅ |
Basic Requirements for Service Usage
- 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:
# 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
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:
| Framework | androidOutput | iosOutput |
|---|---|---|
| Flutter | build/app/outputs/flutter-apk/ | build/ios/ipa/ |
| Android Native | app/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
| Flag | Description |
|---|---|
| (none) | Upload both Android and iOS using yaml config |
--android | Upload Android only (yaml mode) |
--ios | Upload 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
A folder path works too — the CLI picks the newest file automatically:
appsonair-ota upload --android-path build/app/outputs/apk/release/
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"
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.