> ## Documentation Index
> Fetch the complete documentation index at: https://docs.iotmanager.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Device Updates

> Distribute and run releases across your fleet

The **Releases** page lets you define something once and roll it out to any number of devices — either a Docker Compose stack, or an arbitrary shell command/script.

## Release types

<Columns cols={2}>
  <Card title="Compose" icon="box">
    A `docker-compose.yml`, deployed and managed with `docker compose -p iotmanager` on the target device. Requires Docker + Docker Compose already installed on the device — see [Prerequisites](/prerequisites).
  </Card>

  <Card title="Bash" icon="terminal">
    An arbitrary shell script or command, run directly on the device. No Docker required — works on any registered device.
  </Card>
</Columns>

## Deploying online

If the device is online (connected via its reverse tunnel), deploying is immediate:

1. Open a release from the **Releases** page and click **Deploy**.
2. Select which device(s) to deploy to.
3. Confirm — IoT Manager connects to each selected device and applies the release.

For Compose releases, this writes the compose file to the device and runs `docker compose -p iotmanager up -d`, tearing down the previous deployment first to avoid container name conflicts. Named volumes are automatically marked `external: true` to prevent Docker Compose from complaining about label ownership across deploys.

## Deploying offline (air-gapped devices)

If a device has no internet access at all, see [Offline Use](/offline-use) — Compose releases can be packaged into a self-contained bundle (compose file + pre-pulled Docker images) and installed locally through the device's own web UI, no cloud connectivity required for the device itself.

## Checking status

Each device shows its current running release, plus a health indicator:

* **Healthy** — containers are running normally.
* **Unhealthy** — Docker reports at least one container in a restart loop.
* A container that's intentionally stopped (`Exited`) is not treated as unhealthy.

## Viewing logs

Container logs and status are visible per-device from the dashboard without needing to open a terminal — use [Remote Access](/remote-access)'s terminal if you need to go deeper (running arbitrary commands, checking files, etc).
