> For the complete documentation index, see [llms.txt](https://docs.check.tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.check.tech/deployment/chrome-edge-deployment-instructions/macos.md).

# MacOS

I'd recommend that this be deployed via your MDM if the goal is to auto-deploy it without user interaction.

A custom .mobileconfig file can be uploaded to most MDMs for deployment if they don't have their own Google Chrome, or Microsoft Edge profile building functionality baked-in.

Here's an example profile of the XML to create a mobileconfig that will install this in Microsoft Edge and Google Chrome.

```
<?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>
		<dict>
			<key>ExtensionInstallForcelist</key>
			<array>
				<string>benimdeioplgkhanklclahllklceahbe</string>
			</array>
			<key>PayloadDisplayName</key>
			<string>Google Chrome</string>
			<key>PayloadIdentifier</key>
			<string>com.google.Chrome.23E5DDCF-1EB2-4869-9510-5E47D6640A85</string>
			<key>PayloadType</key>
			<string>com.google.Chrome</string>
			<key>PayloadUUID</key>
			<string>23E5DDCF-1EB2-4869-9510-5E47D6640A85</string>
			<key>PayloadVersion</key>
			<integer>1</integer>
		</dict>
		<dict>
			<key>ExtensionInstallForcelist</key>
			<array>
				<string>knepjpocdagponkonnbggpcnhnaikajg</string>
			</array>
			<key>PayloadDisplayName</key>
			<string>Microsoft Edge</string>
			<key>PayloadIdentifier</key>
			<string>com.microsoft.Edge.DD4A940A-B216-4D5E-8B2C-1EF2CAFF7F38</string>
			<key>PayloadType</key>
			<string>com.microsoft.Edge</string>
			<key>PayloadUUID</key>
			<string>DD4A940A-B216-4D5E-8B2C-1EF2CAFF7F38</string>
			<key>PayloadVersion</key>
			<integer>1</integer>
		</dict>
	</array>
	<key>PayloadDescription</key>
	<string>This profile installs and enforces the 'Check' browser extension from CyberDrain on Google Chrome and Microsoft Edge web browsers. </string>
	<key>PayloadDisplayName</key>
	<string>Check CyberDrain</string>
	<key>PayloadIdentifier</key>
	<string>020D4Z7P-7F1A-4723-89CB-1826F8BAF4B5</string>
	<key>PayloadOrganization</key>
	<string>YOUR ORG NAME</string>
	<key>PayloadScope</key>
	<string>System</string>
	<key>PayloadType</key>
	<string>Configuration</string>
	<key>PayloadUUID</key>
	<string>020D4Z7P-7F1A-4723-89CB-1826F8BAF4B5</string>
	<key>PayloadVersion</key>
	<integer>1</integer>
	<key>RemovalDate</key>
	<date>2044-05-19T21:46:44Z</date>
	<key>TargetDeviceType</key>
	<integer>5</integer>
</dict>
</plist>
```

You could also deploy it in Chrome via command-line by creating the proper JSON object in the correct directory in the core /Library directory in macOS. Credit to @cezaraugusto for the script (slightly modified to simply install 'Check' if no parameter is passed...though technically you could pass any other Chrome extension ID after the script path and it would install that extension).

```
#!/bin/bash

# https://developer.chrome.com/docs/extensions/mv3/external_extensions/#preferences
# Credit to #cezaraugusto# from GithubGist for this script...slightly modified for the purposes of installing Check by Cyberdrain if no parameter is passed
# https://gist.github.com/cezaraugusto
# https://gist.github.com/cezaraugusto/0101d2cb251c088f398ca0f8d4495ca0

extension=$1

if [[ -z "$extension" ]]; then
  extension="benimdeioplgkhanklclahllklceahbe"
fi
install_chrome_extension() {
  chrome_extensions_folder="/Library/Application Support/Google/Chrome/External Extensions"
  chrome_extensions_preferences_file="$chrome_extensions_folder/$extension.json"
  # This URL is used by Chrome to check for updates to external extensions
  update_services_url="https://clients2.google.com/service/update2/crx"

if [[ -d "$chrome_extensions_folder" ]]; then
  mkdir -p "$chrome_extensions_folder"
fi

  echo "{" > "$chrome_extensions_preferences_file"
  echo "  \"external_update_url\": \"$update_services_url\"" >> "$chrome_extensions_preferences_file"
  echo "}" >> "$chrome_extensions_preferences_file"

  echo "Added \"$chrome_extensions_preferences_file\""
}

if [ $# -ne 1 ]; then
  echo "Usage: $0 <extension_id>"
  exit 1
fi

install_chrome_extension "$extension"

# Usage: 
# ./install_extension.sh <extension_id>
# Sample: adding React Dev Tools from command-line to Chrome 
# ./install_extension.sh fmkadmapgofadopljbjfkapdkoienihi
```

This would not install the extension until the next time Chrome is launched, and then it will require the user to approve it.

<img src="https://github.com/user-attachments/assets/f53a13fe-c16b-4941-aa39-0799b2b32b6e" alt="SCR-20260520-krbi" height="330" width="448">

Due to limitations like this it really would be better to push it via an MDM.

If you have experience deploying managed MacOS browser extensions, please contribute to the [docs via GitHub](https://github.com/CyberDrain/Check/tree/dev/docs). All Mac resources in the GitHub repo should be considered inaccurate until tested.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.check.tech/deployment/chrome-edge-deployment-instructions/macos.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
