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:
#!/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:
#!/usr/bin/env bash
set -euo pipefail
npx appdropper upload "$BITRISE_IPA_PATH" \
--notes "$BITRISE_GIT_MESSAGE" \
--tag adhocUse 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
| Variable | Contains |
|---|---|
$BITRISE_APK_PATH | The .apk the Android build step produced |
$BITRISE_IPA_PATH | The .ipa the Xcode export step produced |
$BITRISE_GIT_MESSAGE | Commit message — a natural fit for release notes |
$BITRISE_GIT_BRANCH | Branch name, for gating or for the build tag |
$BITRISE_BUILD_NUMBER | Bitrise’s own build counter |
Using bitrise.yml
If you keep your config in the repository instead of the visual editor:
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
#!/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.