App Dropper

Uploading from Codemagic

Last updated 25 October 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 and upload to App Dropper
        script: |
          npx appdropper flutter build apk --release \
            --notes "$(git log -1 --pretty=%B)"

appdropper flutter build runs flutter build with the same arguments, then uploads the APK Flutter reports. If the build fails, nothing is uploaded and the step goes red. Prefer separate steps? Keep flutter build apk --release and follow it with npx appdropper upload build/app/outputs/flutter-apk/app-release.apk.

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 and upload to App Dropper
        script: |
          npx appdropper flutter build ipa --release \
            --export-options-plist=/Users/builder/export_options.plist \
            --notes "$(git log -1 --pretty=%B)" \
            --tag adhoc

The CLI uploads the .ipa Flutter exports into build/ios/ipa/. In separate steps, the same upload is npx appdropper upload build/ios/ipa/*.ipa.

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