App Dropper

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

codemagic.yaml
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/:

codemagic.yaml
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 adhoc

The 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:

codemagic.yaml
- name: Upload to App Dropper
  script: |
    npx appdropper upload android/app/build/outputs/apk/release/app-release.apk

Using 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

bash
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:

codemagic.yaml
- 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"
    fi

Using 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:

codemagic.yaml
- 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.

Upload a build