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

# Overview

export const Framed = ({image, background, link, alt = "Framed content", borderWidth = "24px", outerRadius = "10px", innerRadius = "6px"}) => {
  const parseShorthand = value => {
    const values = String(value).trim().split(/\s+/);
    switch (values.length) {
      case 1:
        return [values[0], values[0], values[0], values[0]];
      case 2:
        return [values[0], values[1], values[0], values[1]];
      case 3:
        return [values[0], values[1], values[2], values[1]];
      default:
        return values.slice(0, 4);
    }
  };
  const isZero = v => parseFloat(v) === 0;
  const padding = parseShorthand(borderWidth);
  const outer = parseShorthand(outerRadius);
  const cornerMasks = [];
  if (isZero(padding[0]) && isZero(padding[3])) {
    cornerMasks.push(`radial-gradient(circle at 0% 0%, transparent ${outer[0]}, black ${outer[0]})`);
  }
  if (isZero(padding[0]) && isZero(padding[1])) {
    cornerMasks.push(`radial-gradient(circle at 100% 0%, transparent ${outer[1]}, black ${outer[1]})`);
  }
  if (isZero(padding[2]) && isZero(padding[1])) {
    cornerMasks.push(`radial-gradient(circle at 100% 100%, transparent ${outer[2]}, black ${outer[2]})`);
  }
  if (isZero(padding[2]) && isZero(padding[3])) {
    cornerMasks.push(`radial-gradient(circle at 0% 100%, transparent ${outer[3]}, black ${outer[3]})`);
  }
  const backgroundMask = cornerMasks.length > 0 ? cornerMasks.join(", ") : undefined;
  const innerImage = <img src={image} alt={alt} noZoom={link ? true : false} style={{
    display: "block",
    width: "100%",
    margin: 0,
    borderRadius: 0
  }} />;
  return <div style={{
    display: "inline-block",
    position: "relative",
    borderRadius: outerRadius,
    overflow: "hidden"
  }}>
            {}
            {background && <div style={{
    position: "absolute",
    inset: 0,
    backgroundImage: `url(${background})`,
    backgroundSize: "cover",
    maskImage: backgroundMask,
    WebkitMaskImage: backgroundMask,
    maskComposite: "intersect",
    WebkitMaskComposite: "source-in"
  }} />}
            {}
            <div style={{
    position: "relative",
    padding: borderWidth
  }}>
                <div style={{
    borderRadius: innerRadius,
    overflow: "hidden",
    lineHeight: 0
  }}>
                    {link ? <a href={link}>{innerImage}</a> : innerImage}
                </div>
            </div>
        </div>;
};

export const NullableBadge = ({size = "sm"}) => {
  return <Tooltip tip="Property does not need to be set">
            <Badge icon="circle" color="gray" size={size}>nullable</Badge>
        </Tooltip>;
};

export const ImmutableBadge = ({size = "sm"}) => {
  return <Tooltip tip="Property cannot be modified">
            <Badge icon="lock" color="gray" size={size}>immutable</Badge>
        </Tooltip>;
};

export const MutableBadge = ({size = "sm"}) => {
  return <Tooltip tip="Property is automatically updated by the system; cannot be modified directly">
            <Badge icon="feather" color="orange" size={size}>mutable</Badge>
        </Tooltip>;
};

export const EditableBadge = ({size = "sm"}) => {
  return <Tooltip tip="Property can be directly modified">
            <Badge icon="pencil" color="blue" size={size}>editable</Badge>
        </Tooltip>;
};

<Framed background="https://assets.mirurobotics.com/docs/v04/images/deployments/background.jpeg" image="https://assets.mirurobotics.com/docs/v04/images/deployments/header:panel.png" borderWidth="28px 56px 0 0" innerRadius="0 8px 0 0" />

A **deployment** is a set of config instances delivered to a device for consumption by your software.

Deployments tie together **config instances**, **releases**, and **devices** to simplify configuration management and delivery.

Deployments have a variety of constraints designed to simplify configuration updates:

1. **A deployment's config instances are immutable**

   Once created, the configs in a deployment cannot be updated. A new deployment must be created to modify a device's configs.
2. **Deployments belong to a single release**

   Deployments belong to exactly one release, whose config schemas are used to validate the configurations in the deployment.
3. **Deployments belong to a single device**

   Deploying the same configs to two devices requires a deployment for each device.
4. **Deployments are one-time use**

   Once removed from a device, a new deployment must be created to restore a device's previous configurations.

## Properties

<ParamField path="description" type="string">
  <ImmutableBadge />

  A user-provided description of the deployment.

  Example: "increase acceleration limit to 1.2 m/s^2"
</ParamField>

<ParamField path="target status" type="enum">
  <EditableBadge />

  The [desired state](/concepts/deployments/status#target-status) of the deployment.

  Allowed values:

  * `staged`
  * `deployed`
  * `archived`
</ParamField>

<ParamField path="activity status" type="enum">
  <MutableBadge />

  The deployment's last known [activity state](/concepts/deployments/status#activity-status).

  Allowed values:

  * `staged`
  * `drifted`
  * `queued`
  * `deployed`
  * `removing`
  * `archived`
</ParamField>

<ParamField path="error status" type="enum">
  <MutableBadge />

  The deployment's last known [error state](/concepts/deployments/status#error-status).

  Allowed values:

  * `none`
  * `failed`
  * `retrying`
</ParamField>

<ParamField path="status" type="string">
  <MutableBadge />

  The status is a merged property of the `activity status` and `error status` fields, with error states taking precedence over activity states when errors are present.

  So, if the error status is `none`, then the status is simply the activity status. If the error status is not `none`, then the status is the error status.

  Below are examples of status values for different activities and error states.

  | Activity Status | Error Status | Status     |
  | --------------- | ------------ | ---------- |
  | `staged`        | `none`       | `staged`   |
  | `deployed`      | `none`       | `deployed` |
  | `queued`        | `retrying`   | `retrying` |
  | `removing`      | `none`       | `removing` |
  | `archived`      | `failed`     | `failed`   |

  Enum: `staged`, `drifted`, `queued`, `deployed`, `removing`, `archived`, `failed`, `retrying`
</ParamField>

<ParamField path="parent" type="Deployment">
  <ImmutableBadge />

  {' '}

  <NullableBadge />

  The deployment from which this deployment was patched.

  Examples: `DPL-L5B8b`
</ParamField>

<ParamField path="release" type="Release">
  <ImmutableBadge />

  The [release](/concepts/releases#properties) which the deployment adheres to.

  Examples: `1.0.1`, `1.7.0-beta.1`
</ParamField>

<ParamField path="config instances" type="[] Config Instance">
  <ImmutableBadge />

  The [config instances](/cfg-mgmt/concepts/config-instances#properties) in the deployment, each of which satisfies a different config schema in the deployment's release.

  Examples: `CFG-68hdX`, `CFG-Cpa13`
</ParamField>

## Deployment methods

Broadly speaking, there are two methods for creating and deploying configurations. Configurations can be:

1. Edited per device via the [config editor](/cfg-mgmt/deploy/config-editor)
2. Staged in a release's [staging area](/cfg-mgmt/deploy/staging-area) to be deployed at a later time

**Per-Device Editing**

Each device has a dedicated config editor for viewing and editing its configurations. Changes made in the config editor are immediately deployed to the device.

The config editor deals only with a single device's configurations. It does not support multiple devices at once nor does it support staging new deployments.

For more information, check out the [config editor](/cfg-mgmt/deploy/config-editor) documentation.

**Release Staging**

Staging a deployment is the process of creating a new deployment in a release's [staging area](/cfg-mgmt/deploy/staging-area) to be deployed in the future. Staging is primarily used to rollout a new release, providing an unobtrusive place to create and review deployments before being deployed to devices.

A release's staging area is also useful for batch operations. Deployments can be created, deployed, and archived in bulk, which helps manage large numbers of deployments at once.

For more information, check out the [staging area](/cfg-mgmt/deploy/staging-area) documentation.
