Quick start
You need Node.js 20 or newer and a project: Expo, React Native, Capacitor, or a plain Android or Xcode project.
- Open the console, sign in, and make an API key under Keys.
- Install the command line and sign in with the key.
- In your project folder, run
aipps init, thenaipps build.
npm i -g aipps aipps login cd my-app aipps init aipps build -p android
The log streams to your terminal. When the build is done you get a link to its install page with a QR code.
aipps.json
aipps init reads app.json, package.json and eas.json and writes this file. Commit it.
{
"app": "checklists", // the app's name in your account
"framework": "expo", // expo | react-native | capacitor | android | ios
"android": { "package": "one.checklists" },
"ios": { "bundleIdentifier": "one.checklists" },
"profiles": {
"development": { "developmentClient": true, "distribution": "internal" },
"preview": { "distribution": "internal" },
"production": { "distribution": "store" }
}
}Profiles from eas.json are carried over. Pick one with --profile; the default is preview.
Commands
| Command | What it does |
|---|---|
aipps login [--key ak_…] | Saves your API key in ~/.aipps/config.json. Or set AIPPS_API_KEY. |
aipps whoami | Your account and today's builds. |
aipps init | Writes aipps.json and adds the app to your account. |
aipps build -p android|ios | Uploads the project and follows the build. --profile, -m for a note, --no-wait to return at once. |
aipps builds [--all] | Recent builds of this app (or every app). |
aipps logs <id> [-f] | A build's log; -f follows it. |
aipps download <id> | Saves the app file. |
aipps cancel <id> | Stops a build. |
What gets uploaded
Files git tracks plus untracked files that aren't ignored. Without git: the folder minus node_modules, build folders and caches. .env files, keystores, certificates and provisioning profiles are never sent with the source; signing credentials are added separately and kept encrypted. Uploads are deleted when the build ends.
Android builds
Each build runs in a fresh container with JDK 17, Node 22 and the Android SDK (platforms 35 and 36, NDK 27). Expo projects run expo prebuild first; Capacitor projects run your build script and cap sync. Gradle tasks: assembleDebug for development, assembleReleasefor internal profiles, bundleRelease (an .aab for Google Play) for production. Internal builds compile for 64-bit ARM phones only, which halves native compile time; store builds include every architecture. versionCode goes up by one with each build.
iPhone builds
iPhone and Mac builds run on our Mac mini with Xcode 26 or newer (Apple requires it for uploads). Signed builds use your own App Store Connect API key: we never hold an Apple password. Simulator builds come first; signed test builds, device registration and TestFlight uploads follow shortly.
Installing builds
Every finished build has a page at aipps.dev/i/<id> with a QR code. On Android, open it on the phone and tap Install; Android asks once to allow installs from the browser. Anyone with the link can install until the build expires.
Daily builds
Builds are counted per day (UTC) across all your apps. Most builds count as one; long or very large builds count more. The details are on the pricing page. An app's first build on a platform counts as one at most, since it fills empty caches.
API
Everything the command line does is plain HTTPS with your key in X-Api-Key:
GET /api/me account and today's builds
POST /api/apps {"name", "framework", "android_package", "ios_bundle_id"}
POST /api/builds {"app", "platform", "profile"}
PUT /api/builds/{id}/source the project as .tar.gz
GET /api/builds/{id}/logs?offset=n
GET /api/builds/{id}/artifactFull reference: /api/docs.