@appsonair/appsonair-cli
v1.0.1
Published
A command-line tool for managing AppsOnAir OTA (Over-the-Air) updates and CI/CD integrations.
Readme
AppsOnAir CLI
A command-line tool for managing AppsOnAir OTA (Over-the-Air) updates and CI/CD integrations.
Usage
Run the appsonair command to see the available commands and options:

📖 Full documentation: AppsOnAir CLI
Tech Stack
- NPM: 11.6.2
- Runtime: Node.js (ESM)
- CLI Framework: Commander.js
- API: GraphQL via
graphql-request - Auth Storage:
keytar(OS keychain — all user data stored securely) - UI:
chalk+@inquirer/prompts
Setup
Install globally — this puts the appsonair command on your PATH:
npm install -g @appsonair/appsonair-cliCommands
The toolset ships as two binaries that share one login (token stored in the OS keychain):
appsonair— auth, project setup + system commands (login,logout,whoami,init <service>,system-info,uninstall)appsonair-ota— OTA build upload (upload)
Setup runs through appsonair init <service>; each service's actions live on its
own appsonair-<service> binary (appsonair-ota today).
Auth (appsonair)
appsonair login # Login via browser and save token locally
appsonair logout # Logout and clear local token
appsonair whoami # Show current logged-in userOTA (appsonair-ota)
Log in once with
appsonair login; all commands reuse that session.
yaml mode — reads paths from .appsonair-cli.yaml (run from project root):
appsonair init ota # initialize config
appsonair-ota upload # upload both android + ios
appsonair-ota upload --android # android only
appsonair-ota upload --ios # ios onlypath mode — direct upload from anywhere, selects workspace + app interactively:
appsonair-ota upload --path build/app.apk # auto detect APK → android
appsonair-ota upload --path build/app.ipa # auto detect IPA → ios
appsonair-ota upload --android-path build/app.apk # android only, strict APK validation
appsonair-ota upload --ios-path build/app.ipa # ios only, strict IPA validation
appsonair-ota upload --android-path build/app.apk --ios-path build/app.ipa # both in one commandFolder paths also work — picks the newest APK/IPA by modified time:
appsonair-ota upload --android-path build/app/outputs/apk/release/
Config (.appsonair-cli.yaml)
Top-level keys (version, workspaceId, appId, appName) are shared by every
product area. Each area keeps its own settings under its own block (ota: today;
future areas add sibling blocks). Re-running an init merges into this file rather
than overwriting it, so your paths and other areas' settings are preserved.
workspaceId: abc123
appId: app456
appName: my-app
ota:
androidOutput: build/app/outputs/flutter-apk/ # folder or exact file
iosOutput: build/ios/ipa/ # folder or exact fileSystem (appsonair)
appsonair system-info # Check system environment and dependencies
appsonair uninstall # Remove the CLI and clear all local dataPlatform Support
| Feature | macOS | Linux | Windows |
|---|---|---|---|
| appsonair login / logout / whoami | ✓ | ✓ | ✓ |
| appsonair init ota | ✓ | ✓ | ✓ |
| appsonair-ota upload — Android APK | ✓ | ✓ | ✓ |
| appsonair-ota upload — iOS IPA (pre-built file) | ✓ | ✓ | ✓ |
| iOS build via iosConfig in yaml | ✓ | ✗ | ✗ |
| appsonair system-info — Android checks | ✓ | ✓ | ✓ |
| appsonair system-info — iOS checks | ✓ | skipped | skipped |
iOS builds (
xcodebuild) are macOS-only. On Linux, build your IPA on a Mac and upload it directly:appsonair-ota upload --ios-path path/to/app.ipa
