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

# Browser Extension - macOS (Jamf / MDM)

> Deploy the Velatir browser extension to macOS with a configuration profile via Jamf Pro or any MDM

export const MobileConfigGenerator = () => {
  const [ingestKey, setIngestKey] = useState("");
  const [copied, setCopied] = useState(false);
  const escapeXml = value => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
  const buildProfile = () => {
    const key = escapeXml(ingestKey.trim());
    return `<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PayloadContent</key>
    <array>
        <!-- Chrome: Force install -->
        <dict>
            <key>PayloadType</key>
            <string>com.google.Chrome</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.chrome.forcelist</string>
            <key>PayloadUUID</key>
            <string>5ECD8344-941A-45C0-BE37-7E13BCBBBBBE</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>ExtensionInstallForcelist</key>
            <array>
                <string>bbiokppljpbjgiogcoggjnfffbeiihja;https://clients2.google.com/service/update2/crx</string>
            </array>
        </dict>
        <!-- Chrome: Extension managed storage -->
        <dict>
            <key>PayloadType</key>
            <string>com.google.Chrome.extensions.bbiokppljpbjgiogcoggjnfffbeiihja</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.chrome.extension.config</string>
            <key>PayloadUUID</key>
            <string>5102578B-1554-4556-B895-591A7621A7F8</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>apiToken</key>
            <string>${key}</string>
        </dict>
        <!-- Firefox: Force install + managed storage + enterprise policies -->
        <dict>
            <key>PayloadType</key>
            <string>org.mozilla.firefox</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.firefox.config</string>
            <key>PayloadUUID</key>
            <string>8B2A4F6E-3D5C-4A1B-9E7F-2C6D8A0B4E1C</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>EnterprisePoliciesEnabled</key>
            <true/>
            <key>ExtensionSettings</key>
            <dict>
                <key>velatir@velatir.com</key>
                <dict>
                    <key>installation_mode</key>
                    <string>force_installed</string>
                    <key>install_url</key>
                    <string>https://addons.mozilla.org/firefox/downloads/latest/velatir/latest.xpi</string>
                </dict>
            </dict>
            <key>3rdparty</key>
            <dict>
                <key>Extensions</key>
                <dict>
                    <key>velatir@velatir.com</key>
                    <dict>
                        <key>apiToken</key>
                        <string>${key}</string>
                    </dict>
                </dict>
            </dict>
        </dict>
        <!-- Vivaldi: Force install -->
        <dict>
            <key>PayloadType</key>
            <string>com.vivaldi.Vivaldi</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.vivaldi.forcelist</string>
            <key>PayloadUUID</key>
            <string>A1F0C4D2-9B3E-4C7A-8F5D-2E8B1C4A6D90</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>ExtensionInstallForcelist</key>
            <array>
                <string>bbiokppljpbjgiogcoggjnfffbeiihja;https://clients2.google.com/service/update2/crx</string>
            </array>
        </dict>
        <!-- Vivaldi: Extension managed storage -->
        <dict>
            <key>PayloadType</key>
            <string>com.vivaldi.Vivaldi.extensions.bbiokppljpbjgiogcoggjnfffbeiihja</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.vivaldi.extension.config</string>
            <key>PayloadUUID</key>
            <string>B2E1D5C3-AC4F-4D8B-9061-3F9C2D5B7E01</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>apiToken</key>
            <string>${key}</string>
        </dict>
        <!-- Brave: Force install -->
        <dict>
            <key>PayloadType</key>
            <string>com.brave.Browser</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.brave.forcelist</string>
            <key>PayloadUUID</key>
            <string>C3D2E6F4-BD5A-4E9C-A172-4A0D3E6C8F12</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>ExtensionInstallForcelist</key>
            <array>
                <string>bbiokppljpbjgiogcoggjnfffbeiihja;https://clients2.google.com/service/update2/crx</string>
            </array>
        </dict>
        <!-- Brave: Extension managed storage -->
        <dict>
            <key>PayloadType</key>
            <string>com.brave.Browser.extensions.bbiokppljpbjgiogcoggjnfffbeiihja</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.brave.extension.config</string>
            <key>PayloadUUID</key>
            <string>D4E3F7A5-CE6B-4F0D-B283-5B1E4F7D9023</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>apiToken</key>
            <string>${key}</string>
        </dict>
    </array>
    <key>PayloadDisplayName</key>
    <string>Velatir Browser Extension</string>
    <key>PayloadIdentifier</key>
    <string>com.velatir.browser.profile</string>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadUUID</key>
    <string>D582F777-FEBE-4B67-A3DC-35FD07F37E03</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
</dict>
</plist>`;
  };
  const ready = ingestKey.trim().length > 0;
  const handleDownload = () => {
    const blob = new Blob([buildProfile()], {
      type: "application/x-apple-aspen-config"
    });
    const url = URL.createObjectURL(blob);
    const link = document.createElement("a");
    link.href = url;
    link.download = "velatir-browser-extension.mobileconfig";
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    URL.revokeObjectURL(url);
  };
  const handleCopy = async () => {
    try {
      await navigator.clipboard.writeText(buildProfile());
      setCopied(true);
      setTimeout(() => setCopied(false), 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 buttonBase = {
    padding: "9px 18px",
    borderRadius: "8px",
    fontWeight: 600,
    fontSize: "14px",
    cursor: ready ? "pointer" : "not-allowed",
    opacity: ready ? 1 : 0.5
  };
  return <div style={{
    border: "1px solid rgba(128,128,128,0.3)",
    borderRadius: "12px",
    padding: "20px",
    margin: "16px 0"
  }}>
      <div style={{
    marginBottom: "16px"
  }}>
        <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={{
    display: "flex",
    gap: "10px",
    flexWrap: "wrap"
  }}>
        <button onClick={handleDownload} disabled={!ready} style={{
    ...buttonBase,
    border: "none",
    background: "#F74F4F",
    color: "#fff"
  }}>
          Download .mobileconfig
        </button>
        <button onClick={handleCopy} disabled={!ready} style={{
    ...buttonBase,
    border: "1px solid #F74F4F",
    background: "transparent",
    color: "#F74F4F"
  }}>
          {copied ? "Copied" : "Copy profile XML"}
        </button>
      </div>
      <p style={{
    fontSize: "13px",
    opacity: 0.7,
    marginTop: "14px",
    marginBottom: 0
  }}>
        The profile is generated entirely in your browser. Your ingest key is never sent to Velatir or stored anywhere.
      </p>
    </div>;
};

Deploy the extension to managed Macs with a single `.mobileconfig` profile. It handles force-install and managed storage for Chrome, Firefox, Vivaldi, and Brave.

## Generate your profile

Enter your ingest key (from the Velatir dashboard, under your organisation's settings). The same key is used for every browser. The profile is built locally in your browser, ready to upload to your MDM.

<MobileConfigGenerator />

## Upload to your MDM

1. In Jamf Pro, go to **Computers** > **Configuration Profiles** > **Upload**.
2. Upload the generated `.mobileconfig` file.
3. Scope it to your target computers and save.

Any MDM that supports `.mobileconfig` files (Intune, Kandji, Mosyle, and others) follows the same upload-and-scope flow.

<Warning>
  The Firefox payload sets `EnterprisePoliciesEnabled` to `true`. Without it, Firefox ignores all enterprise policy on macOS.
</Warning>

<Note>
  Edge and ChatGPT Atlas are not in this profile: managed configuration is not reliably delivered to their extensions on macOS, so the profile cannot pass them the ingest key. To use the extension there, install it from the browser's extension store and enter your ingest key from the popup.
</Note>

## Inspect the profile

The profile is plain XML; the generator only substitutes your ingest key into the `apiToken` fields. To review it before deploying, click **Copy profile XML** above, or expand the reference template below (with a placeholder for your key).

```xml expandable velatir-browser-extension.mobileconfig theme={null}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PayloadContent</key>
    <array>
        <!-- Chrome: Force install -->
        <dict>
            <key>PayloadType</key>
            <string>com.google.Chrome</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.chrome.forcelist</string>
            <key>PayloadUUID</key>
            <string>5ECD8344-941A-45C0-BE37-7E13BCBBBBBE</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>ExtensionInstallForcelist</key>
            <array>
                <string>bbiokppljpbjgiogcoggjnfffbeiihja;https://clients2.google.com/service/update2/crx</string>
            </array>
        </dict>
        <!-- Chrome: Extension managed storage -->
        <dict>
            <key>PayloadType</key>
            <string>com.google.Chrome.extensions.bbiokppljpbjgiogcoggjnfffbeiihja</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.chrome.extension.config</string>
            <key>PayloadUUID</key>
            <string>5102578B-1554-4556-B895-591A7621A7F8</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>apiToken</key>
            <string>vltr_yourIngestKeyHere</string>
        </dict>
        <!-- Firefox: Force install + managed storage + enterprise policies -->
        <dict>
            <key>PayloadType</key>
            <string>org.mozilla.firefox</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.firefox.config</string>
            <key>PayloadUUID</key>
            <string>8B2A4F6E-3D5C-4A1B-9E7F-2C6D8A0B4E1C</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>EnterprisePoliciesEnabled</key>
            <true/>
            <key>ExtensionSettings</key>
            <dict>
                <key>velatir@velatir.com</key>
                <dict>
                    <key>installation_mode</key>
                    <string>force_installed</string>
                    <key>install_url</key>
                    <string>https://addons.mozilla.org/firefox/downloads/latest/velatir/latest.xpi</string>
                </dict>
            </dict>
            <key>3rdparty</key>
            <dict>
                <key>Extensions</key>
                <dict>
                    <key>velatir@velatir.com</key>
                    <dict>
                        <key>apiToken</key>
                        <string>vltr_yourIngestKeyHere</string>
                    </dict>
                </dict>
            </dict>
        </dict>
        <!-- Vivaldi: Force install -->
        <dict>
            <key>PayloadType</key>
            <string>com.vivaldi.Vivaldi</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.vivaldi.forcelist</string>
            <key>PayloadUUID</key>
            <string>A1F0C4D2-9B3E-4C7A-8F5D-2E8B1C4A6D90</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>ExtensionInstallForcelist</key>
            <array>
                <string>bbiokppljpbjgiogcoggjnfffbeiihja;https://clients2.google.com/service/update2/crx</string>
            </array>
        </dict>
        <!-- Vivaldi: Extension managed storage -->
        <dict>
            <key>PayloadType</key>
            <string>com.vivaldi.Vivaldi.extensions.bbiokppljpbjgiogcoggjnfffbeiihja</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.vivaldi.extension.config</string>
            <key>PayloadUUID</key>
            <string>B2E1D5C3-AC4F-4D8B-9061-3F9C2D5B7E01</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>apiToken</key>
            <string>vltr_yourIngestKeyHere</string>
        </dict>
        <!-- Brave: Force install -->
        <dict>
            <key>PayloadType</key>
            <string>com.brave.Browser</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.brave.forcelist</string>
            <key>PayloadUUID</key>
            <string>C3D2E6F4-BD5A-4E9C-A172-4A0D3E6C8F12</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>ExtensionInstallForcelist</key>
            <array>
                <string>bbiokppljpbjgiogcoggjnfffbeiihja;https://clients2.google.com/service/update2/crx</string>
            </array>
        </dict>
        <!-- Brave: Extension managed storage -->
        <dict>
            <key>PayloadType</key>
            <string>com.brave.Browser.extensions.bbiokppljpbjgiogcoggjnfffbeiihja</string>
            <key>PayloadIdentifier</key>
            <string>com.velatir.brave.extension.config</string>
            <key>PayloadUUID</key>
            <string>D4E3F7A5-CE6B-4F0D-B283-5B1E4F7D9023</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>apiToken</key>
            <string>vltr_yourIngestKeyHere</string>
        </dict>
    </array>
    <key>PayloadDisplayName</key>
    <string>Velatir Browser Extension</string>
    <key>PayloadIdentifier</key>
    <string>com.velatir.browser.profile</string>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadUUID</key>
    <string>D582F777-FEBE-4B67-A3DC-35FD07F37E03</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
</dict>
</plist>
```

***

<CardGroup cols={2}>
  <Card title="Verify the deployment" icon="circle-check" href="/setup/browser-extension-managed#verify">
    Confirm the profile applied and the extension is installed
  </Card>

  <Card title="Enterprise overview" icon="building" href="/setup/browser-extension-managed">
    Browser support, managed config, and other platforms
  </Card>
</CardGroup>
