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

# Download and Install

> Install Velatir for Desktop on a single Windows or macOS device in a few minutes

export const DesktopInstallGenerator = () => {
  const [ingestKey, setIngestKey] = useState("");
  const [os, setOs] = useState("windows");
  const [arch, setArch] = useState("x64");
  const [copied, setCopied] = useState("");
  const cleanArg = value => value.trim().replace(/"/g, "");
  const key = cleanArg(ingestKey) || "vltr_yourIngestKeyHere";
  const isWindows = os === "windows";
  const file = isWindows ? `Velatir-Bootstrap-${arch}.msi` : `Velatir-Bootstrap-macos-${arch}.pkg`;
  const downloadUrl = isWindows ? `https://releases.velatir.com/velatir-desktop/windows-${arch}/latest/${file}` : `https://releases.velatir.com/velatir-desktop/macos-${arch}/latest/${file}`;
  const command = isWindows ? `msiexec /i ${file} INGEST_KEY="${key}" /qn` : `sudo installer -pkg ${file} -target /`;
  const intuneArgs = `/qn INGEST_KEY="${key}"`;
  const archOptions = isWindows ? [{
    value: "x64",
    label: "x64"
  }, {
    value: "arm64",
    label: "arm64"
  }] : [{
    value: "arm64",
    label: "Apple Silicon"
  }, {
    value: "x64",
    label: "Intel"
  }];
  const selectOs = value => {
    setOs(value);
    setArch(value === "windows" ? "x64" : "arm64");
  };
  const copy = async (text, which) => {
    try {
      await navigator.clipboard.writeText(text);
      setCopied(which);
      setTimeout(() => setCopied(""), 2000);
    } catch (e) {}
  };
  const labelStyle = {
    display: "block",
    fontWeight: 600,
    fontSize: "14px",
    marginBottom: "2px"
  };
  const inputStyle = {
    width: "100%",
    boxSizing: "border-box",
    padding: "8px 12px",
    border: "1px solid rgba(128,128,128,0.4)",
    borderRadius: "8px",
    background: "transparent",
    color: "inherit",
    fontSize: "14px",
    marginTop: "4px"
  };
  const toggleButton = active => ({
    padding: "8px 16px",
    borderRadius: "8px",
    border: active ? "1px solid #F74F4F" : "1px solid rgba(128,128,128,0.4)",
    background: active ? "#F74F4F" : "transparent",
    color: active ? "#fff" : "inherit",
    fontWeight: 600,
    fontSize: "14px",
    cursor: "pointer"
  });
  const codeBox = {
    display: "block",
    width: "100%",
    boxSizing: "border-box",
    padding: "12px 14px",
    border: "1px solid rgba(128,128,128,0.3)",
    borderRadius: "8px",
    background: "rgba(128,128,128,0.08)",
    fontFamily: "monospace",
    fontSize: "13px",
    whiteSpace: "pre-wrap",
    wordBreak: "break-all",
    margin: 0
  };
  const copyButton = {
    padding: "6px 14px",
    borderRadius: "8px",
    border: "1px solid #F74F4F",
    background: "transparent",
    color: "#F74F4F",
    fontWeight: 600,
    fontSize: "13px",
    cursor: "pointer",
    marginTop: "8px"
  };
  return <div style={{
    border: "1px solid rgba(128,128,128,0.3)",
    borderRadius: "12px",
    padding: "20px",
    margin: "16px 0"
  }}>
      <div style={{
    marginBottom: "14px"
  }}>
        <label style={labelStyle}>Ingest key</label>
        <input type="text" value={ingestKey} onChange={e => setIngestKey(e.target.value)} placeholder="vltr_..." autoComplete="off" spellCheck={false} style={{
    ...inputStyle,
    fontFamily: "monospace"
  }} />
        <p style={{
    fontSize: "13px",
    opacity: 0.7,
    margin: "6px 0 0"
  }}>
          The ingest key maps each machine's traces to your organisation.
        </p>
      </div>

      <div style={{
    marginBottom: "14px"
  }}>
        <label style={labelStyle}>Platform</label>
        <div style={{
    display: "flex",
    gap: "8px",
    marginTop: "4px"
  }}>
          <button type="button" onClick={() => selectOs("windows")} style={toggleButton(isWindows)}>Windows</button>
          <button type="button" onClick={() => selectOs("macos")} style={toggleButton(!isWindows)}>macOS</button>
        </div>
      </div>

      <div style={{
    marginBottom: "16px"
  }}>
        <label style={labelStyle}>Architecture</label>
        <div style={{
    display: "flex",
    gap: "8px",
    marginTop: "4px"
  }}>
          {archOptions.map(opt => <button key={opt.value} type="button" onClick={() => setArch(opt.value)} style={toggleButton(arch === opt.value)}>
              {opt.label}
            </button>)}
        </div>
      </div>

      <label style={labelStyle}>Install command</label>
      <code style={codeBox}>{command}</code>
      <div style={{
    display: "flex",
    gap: "10px",
    flexWrap: "wrap",
    alignItems: "center"
  }}>
        <button type="button" onClick={() => copy(command, "cmd")} style={copyButton}>
          {copied === "cmd" ? "Copied" : "Copy command"}
        </button>
        <a href={downloadUrl} download style={{
    display: "inline-flex",
    alignItems: "center",
    gap: "7px",
    padding: "7px 16px",
    borderRadius: "8px",
    background: "#F74F4F",
    color: "#fff",
    fontWeight: 600,
    fontSize: "13px",
    textDecoration: "none",
    marginTop: "8px"
  }}>
          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.4" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
            <path d="M12 3v12" />
            <path d="M7 11l5 5 5-5" />
            <path d="M5 21h14" />
          </svg>
          Download installer
        </a>
      </div>
      <p style={{
    fontSize: "12px",
    opacity: 0.6,
    marginTop: "6px",
    marginBottom: 0
  }}>{file}</p>

      {isWindows ? <details style={{
    marginTop: "16px"
  }}>
          <summary style={{
    cursor: "pointer",
    fontSize: "14px",
    fontWeight: 600
  }}>Microsoft Intune command-line arguments</summary>
          <p style={{
    fontSize: "13px",
    opacity: 0.7,
    margin: "8px 0"
  }}>
            For an Intune Line-of-Business app, upload {file} and paste these into <strong>Command-line arguments</strong>.
          </p>
          <code style={codeBox}>{intuneArgs}</code>
          <button type="button" onClick={() => copy(intuneArgs, "intune")} style={copyButton}>
            {copied === "intune" ? "Copied" : "Copy arguments"}
          </button>
        </details> : <p style={{
    fontSize: "13px",
    opacity: 0.75,
    marginTop: "14px",
    marginBottom: 0
  }}>
          macOS doesn't take the key on the install line. After installing, set it with <code style={{
    fontFamily: "monospace"
  }}>sudo velatir set-api-key --key {key}</code> on a single machine, or provision it through your MDM for a fleet (<code style={{
    fontFamily: "monospace"
  }}>com.velatir.agent</code> → <code style={{
    fontFamily: "monospace"
  }}>ApiKey</code>; see Enterprise deployment). Approve the Velatir system extension when macOS prompts.
        </p>}
    </div>;
};

Velatir for Desktop ships as a small installer. At first run it downloads the rest of the app and then keeps itself up to date, so this is the only step you take on the device.

<Note>
  Rolling out to a fleet? See [Enterprise deployment](/desktop-app/enterprise-deployment) for Microsoft Intune, Jamf Pro, and other MDM platforms.
</Note>

## Build your install command

Enter your ingest key, pick your platform, and copy the command. Generate a key on the **Setup** tab of the [Velatir dashboard](https://app.velatir.com).

<DesktopInstallGenerator />

## Requirements

| Requirement      | Detail                                                                             |
| ---------------- | ---------------------------------------------------------------------------------- |
| Operating system | Windows 10 or 11 (x64, arm64), or macOS 13 Ventura or later (Apple Silicon, Intel) |
| Access           | Administrator rights on the device                                                 |
| Network          | Outbound HTTPS to `api.velatir.com` and Velatir's update storage                   |

## Updates and uninstall

<AccordionGroup>
  <Accordion title="Updates" icon="refresh-cw">
    The agent checks for new versions every four hours and applies them automatically, so there is no update service to manage. To apply one immediately, run `velatir update --apply`. The previous version stays on disk until the new one is confirmed running, so there is no in-between state.
  </Accordion>

  <Accordion title="Uninstall" icon="trash-2">
    **Windows.** Remove from **Settings → Apps → Installed apps**, or run `msiexec /x` with the product code. This removes the agent, the host, the `VelatirAgent` service, the network adapter, and the Velatir certificate.

    **macOS.** Run the bundled uninstaller:

    ```bash theme={null}
    sudo velatir-uninstall
    ```

    It removes the app, the background services, the system extension, and the Velatir certificate. A restart completes removal of the system extension.
  </Accordion>
</AccordionGroup>

## Next steps

<CardGroup cols={2}>
  <Card title="Enterprise deployment" icon="building" href="/desktop-app/enterprise-deployment">
    Roll out silently across your fleet with Intune, Jamf, or any MDM.
  </Card>

  <Card title="Permissions" icon="shield-check" href="/desktop-app/permissions">
    What the installer asks for, and why.
  </Card>

  <Card title="Troubleshooting" icon="life-buoy" href="/desktop-app/troubleshooting">
    Resolve common install and first-run issues.
  </Card>

  <Card title="How it works" icon="layers" href="/desktop-app/how-it-works">
    The architecture behind the app.
  </Card>
</CardGroup>
