> ## 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.

# Dashboard

export const ProvisionerBadge = ({size = "md"}) => {
  return <Tooltip tip="Members with the provisioner role can execute this action." cta="Workspace roles" href="/admin/users/access-control">
            <Badge icon="bot" color="purple" size={size}>provisioner</Badge>
        </Tooltip>;
};

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>;
};

<Framed background="https://assets.mirurobotics.com/docs/v04/images/devices/background.jpeg" image="https://assets.mirurobotics.com/docs/v04/images/devices/provisioning/header:provision-dialog.png" innerRadius="12px" outerRadius="16px" />

The Miru dashboard is the simplest method for provisioning a device, ideal for getting started or managing individual devices. For automated provisioning, consider using [provisioning tokens](/learn/devices/provision/provisioning-tokens) instead.

## Create a device  <ProvisionerBadge />

If you don't yet have a device in Miru, you'll need to create one.

Navigate to the [Devices page](https://app.mirurobotics.com/devices).

<Frame>
  ![Devices Create Page](https://assets.mirurobotics.com/docs/v04/images/devices/create-page.png)
</Frame>

Click the **New Device** button in the top right corner. Enter a descriptive name for your device and click **Create**.

<Frame>
  ![Devices Create Dialog](https://assets.mirurobotics.com/docs/v04/images/devices/create-dialog.png)
</Frame>

## Install the `miru-agent` package

Click the **Provision** button on the device you want to provision.

<Frame>
  ![Device to Provision](https://assets.mirurobotics.com/docs/v04/images/devices/device-to-provision.png)
</Frame>

A dialog will appear prompting you to install the Miru Agent. If the device already has a compatible Miru Agent installed, you can skip this step.

<Frame>
  ![Install Miru Agent Dialog](https://assets.mirurobotics.com/docs/v04/images/devices/provisioning/install-dialog.png)
</Frame>

<Note>
  For more information about installing the `miru-agent` package, visit the [agent installation](/developers/agent/install) documentation.
</Note>

## Provision the device  <ProvisionerBadge />

Once the `miru-agent` package is installed, continue to the provisioning step.

The dialog will present a pre-authenticated command that invokes the `miru-agent` binary with a short-lived token (5 minutes) to provision the device for your workspace

<Frame>
  ![Provision Miru Agent Dialog](https://assets.mirurobotics.com/docs/v04/images/devices/provisioning/provision-dialog.png)
</Frame>

* `sudo -u miru` sets the command to run as the `miru` user.
* `MIRU_PROVISIONING_TOKEN=<token>` authenticates the request.
* `/usr/sbin/miru-agent provision` executes the `miru-agent` binary with the `provision` command.

To provision the device, copy the command from the dialog and paste it into the terminal of the machine you want to provision.

<Tip>
  For more information about Miru's authentication model, visit the [agent security](/developers/agent/security) documentation.
</Tip>

## Verify the installation

To verify the agent was successfully installed and provisioned, navigate to the [Devices page](https://app.mirurobotics.com/devices). You should see your device listed with the status `Activating` before transitioning to `Online`.

<Info>
  The transition from `Activating` to `Online` may take up to 10 seconds, depending on your network connection.
</Info>
