# Uploading — Bundle Drop Docs

> Upload OTA bundles to a Bundle Drop channel and publish JavaScript and asset updates to your React Native app.

Canonical: https://bundledrop.app/docs/uploading

## What Uploading Is For

The upload command builds and packages a platform bundle and uploads it to a channel. Delivery follows the channel's [managed publishing](/docs/managed-publishing), rollout, and runtime-version rules.

## Expo Uploads

Expo projects resolve app and runtime identity from project configuration:

**Terminal**

```bash
npx bundle-drop upload ios --channel develop
npx bundle-drop upload android --channel develop
```

The default literal runtime mode needs no build receipt. If the project opts into strict Expo fingerprint authority, upload must match the built identity and may use `--build-receipt <path>`. See [Expo](/docs/expo#strict-expo-fingerprint-authority).

## Bare React Native Uploads

Bare projects can provide an explicit app version or let the CLI read a native version file:

**Terminal**

```bash
npx bundle-drop upload android --version 1.2.3 --channel develop
npx bundle-drop upload android --buildgradle-path android/app/build.gradle --channel develop
npx bundle-drop upload ios --plist-file ios/MyApp/Info.plist --channel develop
```

New projects start with a channel named `develop`. The `--channel` value must name an existing project channel; uploads do not create channels automatically.

## Uploads with Native Fingerprinting

When the config opts into [Native Fingerprinting](/docs/native-fingerprinting), use the same platform upload commands. The CLI independently calculates the current fingerprint and records the derived runtime in the bundle. A separate inspection command or manually supplied hash is not required.

The installed binary must already contain the matching identity. Build a new binary after enabling fingerprinting, changing native inputs, or changing an explicit [hybrid runtime boundary](/docs/native-fingerprinting#hybrid-fingerprints-and-explicit-runtime-versions). Keep native dependencies, lockfiles, configuration, and relevant build environment aligned with that binary. Calculation errors stop upload instead of switching compatibility modes.

The `--version` and build-number options describe the native release; they do not override runtime compatibility. Fingerprinting does not change managed publishing, rollout rules, update policies, or patch matching within the runtime line.

## Upload Options

- `--channel <name>` chooses the required release track, such as `develop`, `beta`, or `production`.
- `--version <version>` provides the bare app version directly.
- `--plist-file <path>` reads bare iOS version information from `Info.plist`.
- `--buildgradle-path <path>` reads bare Android version information from Gradle.
- `--build-number <number>` supplies optional iOS build-number or Android version-code metadata when it cannot be resolved unambiguously from the native version file.
- `--release-notes "<text>"` attaches release notes.
- `--release-notes-file <path>` reads UTF-8 release notes from a file relative to the project directory. Use it for multiline Markdown; do not combine it with `--release-notes`.
- `--author <name>` overrides the stored author name.
- `--sourcemap` generates a Metro source map for error tracking.
- `--token <pat>` authenticates non-interactively in CI/CD.
- `--artifact-dir <path>` copies the bundle, source map, and result JSON to a CI-controlled directory.
- `--build-receipt <path>` supplies an exact receipt for strict Expo runtime authority.

For example, keep release notes alongside your app and upload them with:

**Terminal**

```bash
npx bundle-drop upload android --channel develop --release-notes-file ./release-notes.md
```

The CLI checks that the file is readable and nonempty before bundling. Both notes options preserve intentional line breaks; notes beyond 2,000 characters are truncated with a warning.

## What Upload Needs

- `bundle.drop.config.js` with the generated server, organization, and project values
- a resolvable runtime for the target platform, from manual values, native fingerprinting, or the selected Expo authority
- authentication from `bundle-drop login` or `--token`
- for strict Expo authority, a receipt matching the exact native build identity

See [Runtime Version](/docs/runtime-version) before publishing after a native change.

## What Happens After Upload

Every upload becomes a versioned OTA bundle attached to the selected channel. Bundle Drop validates the bundle and assigns a stable update hash.

After a successful upload, the CLI prints one "Upload complete" summary with the organization, project, channel, platform, app and runtime versions, returned bundle identity and hash, actual ZIP size, source-map and retained-artifact status, and bundling/packaging, request, and total command timings. It links to the project page automatically for the exact production or staging API. Custom servers show the dashboard as unavailable because the CLI has no verified dashboard origin for them. The summary confirms upload, while managed publishing and rollout still determine delivery.

Optimized patch delivery and update-size estimates are prepared after upload. Eligible installs can use the full bundle while that work completes. If patching would not be efficient, Bundle Drop deliberately uses the full bundle and reports that outcome instead of presenting a missing size.

If the same bundle already exists in the project, the CLI asks you to promote that existing bundle rather than uploading duplicate content.

## Hybrid Delivery

One complete upload can take different delivery paths. An eligible device with the exact matching base can receive a binary patch; a device without that base receives the full bundle. The SDK reconstructs and verifies the complete target before staging it. A patch never bypasses [native runtime compatibility](/docs/runtime-version), and the app's [update policy](/docs/update-policies) still controls when the staged update applies.

## Next Steps

- Control eligibility with [Managed Publishing](/docs/managed-publishing).
- Release gradually with [Staged Rollouts](/docs/staged-rollouts).
- Revert a release with [Rollback](/docs/rollback).
- Connect source maps through [Observability](/docs/observability).

## Related Docs

- [CLI](/docs/cli)
- [Expo](/docs/expo)
- [Runtime Version](/docs/runtime-version)
- [Native Fingerprinting](/docs/native-fingerprinting)
- [CI/CD](/docs/ci-cd)
