---
title: Live Update Bundles
description: Understand Live Update bundles in Capawesome Cloud — the packaged web assets delivered over-the-air to your Capacitor and Cordova apps.
---

# Bundles

A **bundle** (a "Live Update") is the packaged web assets — HTML, CSS, JavaScript, images — of your app, deployed to a [channel](channels.md) in Capawesome Cloud. Because a bundle contains only web assets and no native code, it can be delivered to your users without an app store review. See [Binary-Compatible Changes](binary-compatible-changes.md) for exactly what a bundle can and cannot change.

For how bundles relate to channels, deployments, and devices — and the full path from publishing to applying an update — see [How Live Updates Work](how-it-works.md).

## Create a bundle

There are two ways to get a bundle into Capawesome Cloud:

- **Build in the cloud or upload** from your machine — see [Publish an update](publish.md).
- **Register a self-hosted bundle** by URL — see [Self-host bundles](self-hosting.md).

## Custom properties

You can attach custom properties to a bundle — for example a version number or release notes — and read them in your app.

```bash
npx @capawesome/cli apps:liveupdates:upload --custom-property key1=value1 --custom-property key2=value2
```

Read them with `fetchLatestBundle()`:

=== "Capacitor"

    ```typescript
    import { LiveUpdate } from "@capawesome/capacitor-live-update";

    const { customProperties } = await LiveUpdate.fetchLatestBundle();
    // customProperties = { key1: "value1", key2: "value2" }
    ```

=== "Cordova"

    ```javascript
    const { customProperties } = await cordova.plugins.LiveUpdate.fetchLatestBundle();
    // customProperties = { key1: "value1", key2: "value2" }
    ```

Custom properties can be updated at any time from the [Console](https://console.cloud.capawesome.io/){:target="_blank"} or the [CLI](../cli/index.md).

## Versioned bundles

A Live Update may only reach devices whose native binary can run it — see [Binary-Compatible Changes](binary-compatible-changes.md) for why this matters and how it compares to [versioned channels](channels.md#versioned-channels). Versioned bundles enforce this without extra channels: attach a native version range to each upload, and Capawesome Cloud only serves the bundle to devices inside that range. Use the `--android-min` / `--android-max` / `--ios-min` / `--ios-max` flags on [`apps:liveupdates:upload`](../cli/commands.md#appsliveupdatesupload):

```bash
npx @capawesome/cli apps:liveupdates:upload \
  --channel production \
  --android-min 6 \
  --ios-min 6
```

This bundle reaches only devices on Android `versionCode` 6 or higher and iOS `CFBundleVersion` 6 or higher. To exclude a single native version instead of setting a range, use `--android-eq` / `--ios-eq` — the bundle is then served to every device except those on the exact version code you specify.

For example, suppose a web bundle is compatible with Android `versionCode` 4 through 6, but version 5 already ships that exact bundle baked into its native binary. You can target the range and skip version 5 in one upload:

```bash
npx @capawesome/cli apps:liveupdates:upload \
  --channel production \
  --android-min 4 \
  --android-max 6 \
  --android-eq 5
```

Devices on `versionCode` 4 and 6 receive the update, while version 5 is left alone because it already includes the bundle. The same flags are available on [`apps:liveupdates:register`](../cli/commands.md#appsliveupdatesregister) for self-hosted bundles.

## Next steps

- [Publish an update](publish.md) — ship a new bundle to your users.
- [Manage channels](channels.md) — control which devices receive which bundles.
- [How Live Updates Work](how-it-works.md) — see how bundles fit into the bigger picture.
