The browsers are not equally served. Read this table before you plan a rollout.
Chrome and Edge take one extension id and one update URL, and they must be used together: see Fleet deployment.
Where this lives in the product, and how the rollout screen is organised.The card is Context Firewall (Browser Extension), in the Context Firewall section of
the Connectors page, beside the Discovery Sensor.Its rollout studio asks which browser before it asks which console, because the browser
decides the mechanism and the console only decides where you paste the result. That ordering
is what stops the screen offering an Intune-shaped flow for Safari, which has no such flow.
It also means the work is done once per browser you run: there is no cross-browser
extension-deployment primitive in any MDM, and there is not going to be one.
- Chrome & Edge are a single target. Edge reads the same Chromium policy as Chrome at its own path, and every artifact the studio generates carries both, so there is nothing separate to deploy for Edge.
- Safari is its own target: a signed package plus a declaration, never
ExtensionInstallForcelist. - Firefox is shown but cannot be selected, and its steps render read-only with no copy or download control, because there is no artifact to roll out. See the Firefox card above for exactly what is missing.
Supported browsers
The extension is a Manifest V3 build, and its interception relies on reaching the page’sMAIN world. Chrome and Edge run world: "MAIN" content scripts natively; Firefox has since 128, so it gets its own Gecko build. Safari does not support that manifest key at all — so the Safari build reaches MAIN the classic way instead, by having its isolated content script inject a <script src> element pointing at a web-accessible resource. That path works on every engine, and the Safari build asserts it survived conversion on every release.
Google Chrome
Supported. Chrome 128+ on Windows, macOS, Linux and ChromeOS.
Microsoft Edge
Supported. Edge 128+ (Chromium). Same package as Chrome.
Safari
macOS 13+, on both Apple silicon and Intel, as a Safari web extension delivered inside a signed, notarized macOS app. Safari drops the
world: "MAIN" manifest key, so the build uses the injected-<script> fallback to reach the page world; and every release asserts that fallback survives the conversion. The package is signed, notarized and stapled. Enabling a Safari extension is a manual step in Safari’s own settings on each Mac, which is why the rollout below is a package plus a declaration, and why you should run Verify it is actually working on the first Mac you deploy to. Fleet rollout is the .pkg + managed-extension declaration below, not ExtensionInstallForcelist. Not available on iOS or iPadOS: Safari there takes extensions only through the App Store. Where the extension is not deployed, the Deployed Sensor’s egress proxy still governs the same hosts on the machine: see Install the Deployed Sensor.Firefox
There is no way to install it today. The Gecko build exists (
extension-firefox/, carrying the browser_specific_settings.gecko id Firefox requires) and is web-ext linted, but nothing signs an .xpi, nothing is published to addons.mozilla.org, and VisIQ’s distribution endpoint serves no Firefox artifact, so there is no install path to give you. Firefox 128+ would be the floor when there is one (that is where Gecko gained world: "MAIN" content scripts). To govern Firefox users today, use the Deployed Sensor’s egress proxy instead: see Install the Deployed Sensor.Manual install (a single machine)
Use this for a proof of concept on one endpoint, to try the firewall before a rollout, or to verify policy behaviour. No MDM is needed.- Chrome / Edge: managed policy (one machine)
- Safari on macOS
- Chrome / Edge: load unpacked
The way to put the extension on a single Chrome or Edge machine and have it stay there and update itself. It is the same policy the fleet rollout uses, applied to one machine by hand, so what you evaluate is what you will deploy.Chrome and Edge install an extension that is not on a store only when the browser is managed. On a machine that is not domain-joined, Entra-joined or enrolled in an MDM, the policy is read and the install is refused. If that is your situation, use the load unpacked tab.
1
Write the policy
Apply the
ExtensionInstallForcelist entry from Fleet deployment to the one machine: a .reg file on Windows, a .plist in /Library/Managed Preferences on macOS, or a JSON file in /etc/opt/chrome/policies/managed on Linux.2
Restart the browser
Chrome and Edge install force-listed extensions at start, so a browser left open keeps its old state until it restarts.
3
(Optional) Enrol the browser to your organization
In VisIQ, from your organization, open Context Firewall → Endpoints → Enrol a browser to generate a single-use code. Then open the extension’s options (right-click its toolbar icon and choose Options, or go to
chrome://extensions → Details → Extension options) and paste the code.Or set the enrolment policy alongside the forcelist and the browser enrols itself, with nobody touching the machine: that is the second half of Fleet deployment.The message itself never leaves the browser. A decision reports counts, detector kinds and rule ids, and carries masked values (stored encrypted, revealed one at a time) only when your workspace has turned on masked-value retention under Settings → Context Firewall.Fleet deployment (managed browsers)
Force-installing through your browser-management policy is the way to keep the extension present and non-removable across the estate. It is the sameExtensionInstallForcelist mechanism you already use for other managed extensions: a force-installed extension is silently installed and cannot be disabled or removed by the user. It keeps itself up to date only if you also set the ExtensionSettings entry below, because it is not listed in a store. Pick the console that manages your browsers.
One id, one update URL, and they are used together. An id and an update URL that do not belong together is the one mistake that fails silently: the browser finds nothing to install and the policy sits inert rather than erroring.
The same pair covers both Chrome and Edge. Edge reads the Chromium policy under its own namespace, so the value you paste is identical and only the policy path differs.VisIQ serves this itself rather than through a store, which puts you in control of when a fix reaches your estate: VisIQ publishes, your browsers pick it up on their next update check, and no third-party review sits in between. That update check reaches VisIQ only when the
ExtensionSettings entry below is in place; see Keep it up to date.The extension installs only on a managed browser. That is a Chromium rule for anything not carried by a store, not a VisIQ one: a browser that is not domain-joined, Entra-joined, MDM-enrolled or cloud-managed reads the policy and declines the install. For machines outside your management, use the load unpacked tab above.- Google Workspace / Chrome Browser Cloud Management
- Microsoft Intune (Edge or Chrome)
- Safari on macOS
- Self-hosted CRX (Chrome and Edge)
- Other MDM (Jamf, generic)
In the Google Admin console → Devices → Chrome → Apps & extensions → Users & browsers, select the org unit, then + → Add Chrome app or extension by ID and switch the source to From a custom URL. Adding “by id” alone assumes a store listing, and there is none: supply the id and the update URL from the table above together, then set Installation policy → Force install (optionally Force install + pin). The console turns this into the install policy for every managed browser in that OU.To apply it by Group Policy instead of the console, the equivalent Windows registry / ADMX values are the force-install entry and the On macOS, the same keys are delivered as a configuration profile:Already rolled out through the console without it? Add only this configuration. Each browser updates in place at its next update check once the policy reaches it; nothing is reinstalled.
ExtensionSettings entry from the warning above, the second as a single-line JSON string:ExtensionSettings is one policy for every extension. If you already set it, add this entry to your existing value rather than replacing it.Keep it updating. The Apps & extensions page has no setting for where later updates come from, so add the override through Menu → Chrome browser → Custom Configurations: select the same organisational unit, paste this into Configurations, and click Save. It applies to browsers enrolled in Chrome Enterprise Core, not to ChromeOS devices; for those, open the extension’s row in Apps & extensions, go to Deployment settings, set Installation URL to the custom URL above and Update URL to Installation URL (see above). If your configuration already sets ExtensionSettings, add our key inside that object instead of adding a second one.Pre-enrol the whole fleet
A force-installed extension is present on every managed browser, but each still needs to be enrolled to your tenant to report. Rather than enrolling each by hand, push the enrolment values alongside the force-install policy using the browser’s managed configuration, so a machine is governed the moment the extension lands. Generate the fleet token in Context Firewall → Endpoints.Self-enrolment needs 0.1.9 or later. Builds before it ignore the managed configuration entirely, so a policy written against one silently does nothing. If you built a policy before 2026-09-20 and saw no endpoints appear, it starts working once each browser restarts onto a current build.Check what your machines are actually running with Verify it is actually working before concluding a policy is at fault.
Chrome and Edge: the values live under
3rdparty.extensions.<extension id>. For the self-hosted route documented above:
3rdparty key of an OS-level policy (macOS configuration profile for com.google.Chrome, or com.microsoft.Edge for Edge), or on Linux in /etc/opt/chrome/policies/managed/. On Windows by Group Policy the same values are registry entries under:
3rdparty.Extensions (capital E) and keys it by the add-on’s gecko id, in policies.json:
The Firefox form is documented here because the keys are the same and the policy is worth preparing, but as the Firefox card above says, there is no signed Firefox build to install today, so this policy has nothing to configure yet.
.reg and the macOS profile) from Context Firewall → Deploy in the dashboard, rather than editing the examples above by hand.
Keep it up to date
The two platforms update differently, and one of them is not automatic. Know which you are on before you assume a fix has reached the fleet.Forcing a Chrome update sooner. On a managed browser, visiting
chrome://extensions (or edge://extensions), enabling Developer mode and choosing Update runs an update check straight away. Useful for confirming a rollout rather than waiting out the cycle.⚠️ If Update reports success and the version does not move, check ExtensionSettings first. Without it the check goes to the browser’s store, which does not list this extension, so the button succeeds and nothing changes. chrome://policy shows whether ExtensionSettings reached the browser.⚠️ Restarting the browser is NOT a reliable way to pull an update forward. Chrome queries the update manifest at startup only when a forced extension is missing. Once it is installed and the policy is satisfied, a restart makes no update query at all and the periodic cycle is the only remaining trigger. If you need a specific version on a machine now, use the Update button above rather than telling people to reboot.Automatic update is the browser’s behaviour, not something VisIQ drives. Chrome and Edge poll the update manifest on their own cycle, and the things most likely to make you misread a rollout are written up above: without
ExtensionSettings no update ever arrives, and a restart does not pull an update forward. If a fix matters on a specific machine today, check that machine’s version with Verify it is actually working rather than assuming the cycle has run.Check what is being served right now
You do not have to take our word for which version your fleet is converging on. Each route answers for itself:Verify it is actually working
Do this once per browser type after the first rollout, before you tell anyone they are covered. It takes a minute and it is the difference between “the extension is installed” and “the firewall is running”.1
Open a governed assistant
Go to any of the covered sites —
chatgpt.com, claude.ai, gemini.google.com, copilot.microsoft.com or perplexity.ai.2
Check that masking fires
Type this into the message box and send it:The message should send with the card number replaced, and a notice should appear saying what was masked.
4111 1111 1111 1111 is the standard Visa test number, not a real card — the detector validates a Luhn checksum, so an ordinary 16-digit order number is not mistaken for one.3
Check that blocking fires
Then send:This should be blocked outright rather than masked. Credentials are stopped, because a partially masked key is still a leaked key if its shape gives it away. (This is Amazon’s own published example key pair, not a live credential.)
4
Check that it stays quiet otherwise
Send an ordinary question such as
What is the capital of France?. Nothing should happen — no notice, no delay. The firewall acts only on sensitive content, and a rollout where users see notices on ordinary messages will not survive contact with the estate.