---
title: Publish a Live Update
description: Publish a new Live Update bundle to your Capacitor or Cordova app with Capawesome Cloud — upload from your machine or build in the cloud.
---

# Publish a Live Update

Publishing an update is the workflow you repeat every release: get your web assets into Capawesome Cloud as a new **bundle**, which is then delivered to devices according to your [update strategy](update-strategies.md).

There are two ways to do it:

- **[Upload from your machine](#upload-from-your-machine)** — build your web assets locally and upload the result. Works on any Live Updates plan and doesn't use build minutes.
- **[Build in the cloud](#build-in-the-cloud)** — let Capawesome Cloud build your web assets for you, for a consistent, reproducible release.

## Upload from your machine

Build your web assets, then upload them with the [Capawesome CLI](../cli/index.md) — the same command for Capacitor and Cordova:

```bash
npm run build
npx @capawesome/cli apps:liveupdates:upload
```

You'll be prompted for the path to your web assets directory (e.g. `www` or `dist`) and the target app. After the upload completes, the bundle is available to your users. Open the [Deployments](https://console.cloud.capawesome.io/apps/_/deployments){:target="_blank"} page in the Console to review it.

To run it non-interactively (for example in a script), pass the values as flags:

```bash
npx @capawesome/cli apps:liveupdates:upload \
  --app-id 00000000-0000-0000-0000-000000000000 \
  --path dist \
  --channel production
```

### Options

| Option                 | Description                                                                      |
| ---------------------- | -------------------------------------------------------------------------------- |
| `--channel`            | The channel to publish to. Defaults to the channel's default.                    |
| `--private-key`        | Sign the bundle with your private key. See [Sign your bundles](code-signing.md). |
| `--rollout-percentage` | Release to a subset of devices first. See [Roll out gradually](rollouts.md).     |
| `--artifact-type`      | `zip` (default) or `manifest`. See [Reduce update size](bundle-size.md).         |
| `--git-ref`            | Associate the bundle with a Git commit.                                          |

See the [CLI command reference](../cli/commands.md#appsliveupdatesupload) for the full list.

## Build in the cloud

Instead of building locally, you can let Capawesome Cloud build your web assets and deploy the result — all in a single command:

```bash
npx @capawesome/cli apps:builds:create --platform web --git-ref main --channel production
```

Capawesome Cloud checks out the given Git reference, installs your dependencies, builds your web assets, and deploys the resulting bundle to the channel.

Why build in the cloud:

- **Consistent, reproducible builds.** Every release uses the same Node.js version, the same dependencies, and the same configuration — no more "works on my machine" surprises between team members or CI runners.
- **Your environment and secrets.** Cloud builds can use the [environment variables and secrets](../native-builds/environments.md) you've configured in Capawesome Cloud (pass `--environment`). A local upload can't access those.
- **Builds from Git, not your working tree.** Build from a branch, tag, or commit so what ships always matches what's in your repository.
- **No local tooling required.** Useful in CI, or simply to keep your machine out of the release path.

Building in the cloud uses **build minutes**, so it's available on plans that include build runners. If your plan doesn't, the [upload](#upload-from-your-machine) approach works on any Live Updates plan.

For the full set of build options and ready-made pipeline examples, see [Native Builds](../native-builds/builds.md) and [Integrations](integrations/index.md).

## Choose a channel

Every device receives updates from a [channel](channels.md). If you don't specify one, the bundle is published to the default channel. Pass `--channel` (with either approach above) to target a specific channel — for example a `staging` channel for testers, or a versioned `production-<version>` channel to keep updates [compatible with the installed app version](binary-compatible-changes.md):

```bash
npx @capawesome/cli apps:liveupdates:upload --channel staging
```

## Next steps

- [Roll out gradually](rollouts.md) — release to a percentage of users first.
- [Roll back a release](rollbacks.md) — recover from a bad update.
- [Automate publishing in CI/CD](integrations/index.md).
