Uploading from Codemagic
Last updated 16 August 2026
There’s nothing to install. Codemagic’s build machines already have Node, so a one-line script step is the whole integration.
Get a token first
Nothing here works without one. See Set up CI uploads.
1. Add the token
Open Settings → Environment variables
On your app in Codemagic.
Add APPDROPPER_TOKEN
Variable name APPDROPPER_TOKEN, value your token.
Put it in a group and tick Secure
appdropper is a sensible group name. Secure variables are encrypted and masked in build logs.
Reference that group from your workflow
Otherwise the variable won’t be present during the build at all.
2. Add the upload step
Flutter, Android
workflows:
android-beta:
name: Android beta
environment:
groups:
- appdropper # provides APPDROPPER_TOKEN
flutter: stable
scripts:
- name: Get packages
script: flutter pub get
- name: Build APK
script: flutter build apk --release
- name: Upload to App Dropper
script: |
npx appdropper upload build/app/outputs/flutter-apk/app-release.apk \
--notes "$(git log -1 --pretty=%B)"Flutter, iOS
Keep whatever code-signing setup you already use — App Dropper only cares about the finished .ipa. Codemagic puts it in build/ios/ipa/:
workflows:
ios-beta:
name: iOS beta
environment:
groups:
- appdropper
ios_signing:
distribution_type: ad_hoc
bundle_identifier: com.example.myapp
flutter: stable
scripts:
- name: Set up signing
script: keychain initialize && app-store-connect fetch-signing-files "$BUNDLE_ID" --type IOS_APP_ADHOC --create && keychain add-certificates && xcode-project use-profiles
- name: Build IPA
script: flutter build ipa --release --export-options-plist=/Users/builder/export_options.plist
- name: Upload to App Dropper
script: |
npx appdropper upload build/ios/ipa/*.ipa \
--notes "$(git log -1 --pretty=%B)" \
--tag adhocThe glob works because the shell expands it before the CLI sees it — as long as exactly one .ipa is produced, which is the normal case.
React Native and native
Identical, with a different artifact path. Point the command at whatever your build produced:
- name: Upload to App Dropper
script: |
npx appdropper upload android/app/build/outputs/apk/release/app-release.apkUsing the workflow editor
If you configure Codemagic through the UI rather than codemagic.yaml:
Scroll to Post-build script in the workflow editor
Use the post-build script rather than a publishing step: it runs once the artifacts exist, which is exactly when you want to upload.
Paste the upload command
npx appdropper upload build/app/outputs/flutter-apk/app-release.apk \
--notes "$(git log -1 --pretty=%B)"Swap the path for whatever your build produces — build/ios/ipa/*.ipa for iOS, android/app/build/outputs/apk/release/app-release.apk for React Native and native Android.
Select the variable group for the workflow
The one holding APPDROPPER_TOKEN.
Upload only on some branches
Codemagic exposes the branch as $CM_BRANCH, so gating is a shell condition:
- name: Upload to App Dropper
script: |
if [ "$CM_BRANCH" = "main" ] || [ "$CM_BRANCH" = "develop" ]; then
npx appdropper upload build/app/outputs/flutter-apk/app-release.apk \
--notes "$CM_BRANCH · build $BUILD_NUMBER"
else
echo "Skipping App Dropper upload on $CM_BRANCH"
fiUsing the install link
The CLI prints the install URL — and nothing else — on stdout, so you can pass it on to a Slack message or an email step:
- name: Upload to App Dropper
script: |
INSTALL_URL=$(npx appdropper upload build/app/outputs/flutter-apk/app-release.apk)
echo "INSTALL_URL=$INSTALL_URL" >> $CM_ENV
echo "Install: $INSTALL_URL"Writing to $CM_ENV makes the value available to every later step in the workflow.
Troubleshooting
“No API token”
The variable group isn’t attached to this workflow. Defining the variable at app level is not enough — the workflow has to list its group under environment.groups.
“No such file”
Codemagic’s artifact paths differ between Flutter, React Native and native builds, and change with flavours. Add ls -R build | head -50 as a step before the upload to see what was actually produced.
The step is skipped entirely
A failing earlier script aborts the rest of the workflow. Check the build step itself passed — App Dropper can only upload an artifact that exists.
Full flag list is in the CLI reference.
Ready to try it?
Drop an .apk or .ipa and get a shareable install link in seconds.