App Dropper

Uploading from Bitrise

Last updated 16 August 2026

Bitrise needs a single Scriptstep after your build step. There’s nothing to install from the Step Library.

Get a token first

Nothing here works without one. See Set up CI uploads.

1. Add the token

Open Workflow Editor → Secrets

On your app in Bitrise.

Add APPDROPPER_TOKEN

Name it exactly that, with your token as the value.

Leave “Expose for pull requests” off

That setting is what stops an outside contributor’s PR from reading your credential. Only turn it on if you specifically want builds from forked pull requests to publish.

2. Add the Script step

In the Workflow Editor, add a Script step immediately after your Android Build or Xcode Archive & Export for iOS step, and paste:

bash
#!/usr/bin/env bash
set -euo pipefail

npx appdropper upload "$BITRISE_APK_PATH" \
  --notes "$BITRISE_GIT_MESSAGE"

For iOS, swap the artifact variable — Bitrise’s export step sets $BITRISE_IPA_PATH:

bash
#!/usr/bin/env bash
set -euo pipefail

npx appdropper upload "$BITRISE_IPA_PATH" \
  --notes "$BITRISE_GIT_MESSAGE" \
  --tag adhoc

Use the Bitrise-provided path variables rather than a hard-coded path. The real output location changes with project type, flavour and export method, and these variables always point at what the previous step actually produced.

Useful Bitrise variables

VariableContains
$BITRISE_APK_PATHThe .apk the Android build step produced
$BITRISE_IPA_PATHThe .ipa the Xcode export step produced
$BITRISE_GIT_MESSAGECommit message — a natural fit for release notes
$BITRISE_GIT_BRANCHBranch name, for gating or for the build tag
$BITRISE_BUILD_NUMBERBitrise’s own build counter

Using bitrise.yml

If you keep your config in the repository instead of the visual editor:

bitrise.yml
workflows:
  beta:
    steps:
      - android-build@1:
          inputs:
            - variant: release

      - script@1:
          title: Upload to App Dropper
          inputs:
            - content: |
                #!/usr/bin/env bash
                set -euo pipefail

                INSTALL_URL=$(npx appdropper upload "$BITRISE_APK_PATH" \
                  --notes "$BITRISE_GIT_MESSAGE")

                # Make the link available to later steps (Slack, email, …)
                envman add --key APPDROPPER_INSTALL_URL --value "$INSTALL_URL"
                echo "Install: $INSTALL_URL"

envman addis Bitrise’s way of passing a value between steps — the CLI prints the install URL alone on stdout precisely so this works.

Upload only on some branches

bash
#!/usr/bin/env bash
set -euo pipefail

if [ "$BITRISE_GIT_BRANCH" != "main" ]; then
  echo "Skipping App Dropper upload on $BITRISE_GIT_BRANCH"
  exit 0
fi

npx appdropper upload "$BITRISE_APK_PATH" --notes "$BITRISE_GIT_MESSAGE"

Troubleshooting

“No API token”

Either the secret isn’t defined, or the build was triggered by a pull request and Expose for pull requestsis off. Both are working as intended — check which case you’re in before changing the setting.

“No such file” with an empty path

$BITRISE_APK_PATH is only set by the build step that produces it. If your workflow builds with a custom Gradle script rather than the Android Build step, that variable will be empty — pass the real path instead.

Several APKs, one variable

With split APKs, $BITRISE_APK_PATH can hold a |-separated list rather than one path. Point the command at a specific file in that case, or upload the universal APK.

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