Skip to main content

Installing Comet for Enterprise (macOS)

Guide to installing Comet at large scale in macOS environments

Written by Emilio Morales
Updated over a month ago

This guide is intended for organizations that require to install Comet at large scale. If you’re looking for the individual Comet installer, you’ll find it here.

This guide covers deploying the Comet browser across your organization using Mobile Device Management (MDM) solutions on macOS systems.

Prerequisites

To install Comet for Enterprise using MDM you will need:

  • An MDM solution (Jamf Pro, Intune, Kandji, Mosyle, Workspace ONE, etc.)

  • Access to your organization's Comet settings at perplexity.ai/account/org/comet

  • Your organization token (available from the Comet Setup page)

Overview

Mac policies are deployed using Configuration Profiles (.mobileconfig files) through your MDM solution. These profiles use the ai.perplexity.comet payload type to configure Comet settings.

Getting Started

First, you’ll need to download the Comet installer and obtain your organization token from: perplexity.ai/account/org/comet.

The Comet for Enterprise installer is currently available as a .dmg macOS disk image.

Mass-Deploying Comet

For mass deployment using tools like Jamf Pro:

  1. Upload the .dmg file to your MDM solution

  2. Prepare a script that mounts the DMG, copies the Comet app to /Applications, and unmounts the DMG

  3. This script can be part of your post-install tasks or included in the package

  4. Use post-install scripts to:

    • Handle app copy

    • Set permissions

    • Make Comet the default browser if required

    • Configure first run settings (via plist manipulation if needed)

Jamf Pro Deployment

Jamf Pro allows you to deploy and manage custom application settings in two different ways.

  • Using just the plist content (without the full mobileconfig wrapper), where Jamf handles wrapping it into a proper configuration profile.

  • Using custom json schema to provide a UI based approach to managing policies (unique to Jamf)

Using plists

Step 1: Create Configuration Profile

  1. Go to ComputersConfiguration ProfilesNew

  2. Enter a display name (e.g., "Comet Policies")

  3. Select Application & Custom SettingsExternal Applications

  4. Select Upload

Step 2: Configure Preference Domain

  1. Preference Domain: ai.perplexity.comet

  2. Paste the plist content from the examples below

Step 3: Scope and Deploy

  1. Go to the Scope tab

  2. Add target computers or groups

  3. Click Save

Before configuring browser policies, you must first enroll devices into your organization. This associates each Comet installation with your enterprise account for centralized management.

Get your organization token from perplexity.ai/account/org/comet and deploy the following plist:

<?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>CloudManagementEnrollmentToken</key>
<string>YOUR-ORG-TOKEN-HERE</string>
</dict>
</plist>

Once devices are enrolled, you can deploy additional configuration profiles to enforce browser policies. See examples below.

Example: Block Extensions

<?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>ExtensionInstallBlocklist</key>
<array>
<!-- Metamask -->
<string>nkbihfbeogaeaoehlefnkodbefgpgknn</string>
</array>
</dict>
</plist>

Example: Block URLs

<?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>URLBlocklist</key>
<array>
<string>chatgpt.com</string>
<string>*.competitor.com</string>
</array>
</dict>
</plist>

Example: Multiple Policies

Combine multiple policies in a single plist:

<?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>ExtensionInstallBlocklist</key>
<array>
<string>nkbihfbeogaeaoehlefnkodbefgpgknn</string>
</array>
<key>URLBlocklist</key>
<array>
<string>chatgpt.com</string>
</array>
</dict>
</plist>

Using Jamf Custom Schema for a UI based approach

Step 1: Create Configuration Profile

  1. Go to ComputersConfiguration ProfilesNew

  2. Enter a display name (e.g., "Comet Policies")

  3. Select Application & Custom SettingsExternal Applications

  4. Select Add

Step 2: Configure Preference Domain

  1. Preference Domain: ai.perplexity.comet

  2. Select Add Schema

  3. Paste JSON Schema to populate configurable properties from the examples below

Step 3: Scope and Deploy

  1. Go to the Scope tab

  2. Add target computers or groups

  3. Click Save

Example: Homepage and startup settings

{
"title": "Perplexity Comet – Homepage and Startup",
"description": "Control homepage, startup behavior, and New Tab configuration.",
"properties": {
"HomepageLocation": {
"title": "Homepage Location",
"description": "URL of the homepage that is loaded when the Home button is pressed.",
"type": "string",
"property_order": 10
},
"HomepageIsNewTabPage": {
"title": "Homepage Is New Tab Page",
"description": "If true, the homepage is the New Tab page instead of a custom URL.",
"type": "boolean",
"property_order": 20
},
"ShowHomeButton": {
"title": "Show Home Button",
"description": "Shows or hides the Home button in the toolbar.",
"type": "boolean",
"property_order": 30
},
"RestoreOnStartup": {
"title": "Restore On Startup",
"description": "Configures what pages are shown at startup.",
"type": "integer",
"enum": [0, 1, 4],
"options": {
"enum_titles": [
"0 – Open the New Tab page",
"1 – Restore the last session",
"4 – Open a list of URLs"
]
},
"property_order": 40
},
"RestoreOnStartupURLs": {
"title": "Restore On Startup URLs",
"description": "List of URLs to open on startup when RestoreOnStartup is set to 4.",
"type": "array",
"items": {
"type": "string"
},
"property_order": 50
},
"NewTabPageLocation": {
"title": "New Tab Page Location",
"description": "Custom URL to use for the New Tab page instead of the default.",
"type": "string",
"property_order": 60
},
"ManagedBookmarks": {
"title": "Managed Bookmarks",
"description": "JSON-like structure defining a set of mandatory bookmarks managed by policy.",
"type": "array",
"items": {
"type": "string"
},
"property_order": 70
},
"BookmarkBarEnabled": {
"title": "Bookmark Bar Enabled",
"description": "Shows or hides the bookmarks bar by default.",
"type": "boolean",
"property_order": 80
},
"DefaultBrowserSettingEnabled": {
"title": "Default Browser Setting Enabled",
"description": "Controls whether the browser can be set as the system default.",
"type": "boolean",
"property_order": 90
},
"BlockExternalExtensions": {
"title": "Block External Extensions",
"description": "Blocks extensions installed outside the browser when set to true.",
"type": "boolean",
"property_order": 100
}
},
"required": []
}

Example: Force install extensions - eg 1Password and Okta Verify

{
"title": "Perplexity Comet – 1Password and Okta Extensions",
"description": "Toggle force-install for 1Password and Okta extensions in Comet.",
"properties": {
"ForceInstall_1Password": {
"title": "Force install 1Password",
"description": "If enabled, Comet force-installs the 1Password browser extension.",
"type": "boolean",
"default": false,
"property_order": 10
},
"ForceInstall_OktaPlugin": {
"title": "Force install Okta browser plugin",
"description": "If enabled, Comet force-installs the Okta browser plugin defined below.",
"type": "boolean",
"default": false,
"property_order": 20
},
"OktaPluginExtensionId": {
"title": "Okta browser plugin extension ID",
"description": "Chrome Web Store extension ID for your Okta browser plugin (for example, from the Web Store URL).",
"type": "string",
"default": "",
"property_order": 30
},
"ExtensionInstallForcelist": {
"title": "Additional force-installed extensions (advanced)",
"description": "Optional: extra entries in the form extension_id;<https://clients2.google.com/service/update2/crx>. Rows here are in addition to 1Password/Okta switches above.",
"type": "array",
"items": {
"type": "string",
"title": "Extension ID and update URL",
"default": "extension_id;<https://clients2.google.com/service/update2/crx>"
},
"property_order": 40
},
"_info": {
"title": "Info",
"description": "Jamf will write a prefs key named ExtensionInstallForcelist. Enable the switches above to add 1Password and/or Okta automatically; use the array only for extra extensions.",
"type": "string",
"options": {
"inputAttributes": {
"readonly": true
}
},
"property_order": 50
}
},
"required": []
}

Generic MDM Deployment

For MDM solutions that require a complete .mobileconfig file, such as Kandji, Mosyle, Fleet, SimpleMDM, etc., use the full configuration profile format below.

Deployment Steps:

  1. Copy the example template and customize for your needs

  2. Generate unique UUIDs for PayloadUUID fields (use uuidgen in Terminal)

  3. Save as a .mobileconfig file

  4. Upload to your MDM as a custom configuration profile

  5. Assign to target devices or groups

Before configuring browser policies, you must first enroll devices into your organization. This associates each Comet installation with your enterprise account for centralized management.

Deploy a configuration profile containing your CloudManagementEnrollmentToken. Get your organization token from perplexity.ai/account/org/comet.

<?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>PayloadType</key>
<string>ai.perplexity.comet</string>
<key>PayloadIdentifier</key>
<string>ai.perplexity.comet</string>
<key>PayloadUUID</key>
<string>A1B2C3D4-E5F6-7890-ABCD-EF1234567890</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>CloudManagementEnrollmentToken</key>
<string>YOUR-ORG-TOKEN-HERE</string>
</dict>
</array>
<key>PayloadDisplayName</key>
<string>Comet - Organization Enrollment</string>
<key>PayloadIdentifier</key>
<string>ai.perplexity.comet.org-enrollment</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>B2C3D4E5-F6A7-8901-BCDE-F23456789012</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Once devices are enrolled, you can deploy additional configuration profiles to enforce browser policies. See examples below.

Example: Block Extensions

<?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>PayloadDisplayName</key>
<string>Comet Extension Blocklist Policy</string>
<key>PayloadIdentifier</key>
<string>ai.perplexity.comet</string>
<key>PayloadType</key>
<string>ai.perplexity.comet</string>
<key>PayloadUUID</key>
<string>12345678-1234-1234-1234-123456789012</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>ExtensionInstallBlocklist</key>
<array>
<!-- Metamask -->
<string>nkbihfbeogaeaoehlefnkodbefgpgknn</string>
</array>
</dict>
</array>
<key>PayloadDisplayName</key>
<string>Comet - Extension Blocklist</string>
<key>PayloadIdentifier</key>
<string>ai.perplexity.comet.extension.blocklist</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>87654321-4321-4321-4321-210987654321</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Example: Block URLs

<?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>PayloadDisplayName</key>
<string>Comet URL Blocklist Policy</string>
<key>PayloadIdentifier</key>
<string>ai.perplexity.comet</string>
<key>PayloadType</key>
<string>ai.perplexity.comet</string>
<key>PayloadUUID</key>
<string>12345678-1234-1234-1234-123456789012</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>URLBlocklist</key>
<array>
<string>chatgpt.com</string>
<string>*.competitor.com</string>
</array>
</dict>
</array>
<key>PayloadDisplayName</key>
<string>Comet - URL Blocklist</string>
<key>PayloadIdentifier</key>
<string>ai.perplexity.comet.url.blocklist</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>87654321-4321-4321-4321-210987654321</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>