The supply routes are not equally ready. Read this table before you plan a rollout. Every claim below was measured against the live system, on the date given in its row, not inferred.
Because the store route and the self-hosted route carry different extension ids, a policy must name a matching id/update-URL pair: see the note under Fleet deployment before you write one.
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; prove/safari-webkit.mjs proves WebKit executes it, and the release asserts the fallback survives conversion. Packaging, signing and notarization are solved end to end. What has not been confirmed is an intercepted send in a real Safari GUI (enabling a Safari extension is a manual GUI step no automated proof can perform), so treat Safari interception as engine-proven rather than field-proven, and 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
Engine-proven, but not distributed: there is no way to install it today. The Gecko build exists (
extension-firefox/, carrying the browser_specific_settings.gecko id Firefox requires), interception is proven in a real Firefox by prove/firefox-gecko.mjs on every release, and the package 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 we can 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 — from the store
- Safari on macOS
- Chrome / Edge — load unpacked
The simplest path for a single endpoint: no Developer mode, no file to handle, and it updates itself.
1
Open the listing
Open the Context Firewall listing link from your VisIQ team and choose Add to Chrome. The listing is unlisted, so it is reachable only through that link rather than by searching the store.
2
(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.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.The listing is published and unlisted, serving 0.1.1 as last checked on 2026-09-20. The self-hosted channel served 0.1.9 on that date, so the store copy lags it: see Check what each route is serving right now to compare them yourself at any time.
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, cannot be disabled or removed by the user, and auto-updates. Pick the console that manages your browsers.
There are two Chrome builds, with two different ids, and a policy must name a matching pair. 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.
For a managed fleet, self-hosted is the recommended route. It 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. The store route is there for machines you do not manage, and for admins who specifically want Google’s review in the loop on every release. Both auto-update; see Keep it up to date.Deploy exactly one of the two to any given machine. They are different extension ids, so a browser carrying both runs two independent copies of the firewall and governs every prompt twice. The recommended Intune profile below blocks the other id outright rather than trusting that nobody installs it by hand.For Edge sourced from the Edge Add-ons store, use
https://edge.microsoft.com/extensionwebstorebase/v1/crx and the Edge id, which differs again and is published when that listing goes live. Managed Edge can equally force-install either build above.- Google Workspace / Chrome Browser Cloud Management
- Microsoft Intune (Edge or Chrome)
- Safari on macOS
- Self-hosted (no store review)
- Other MDM (Jamf, generic)
In the Google Admin console → Devices → Chrome → Apps & extensions → Users & browsers, select the org unit, add the extension by id, and set Installation policy → Force install (optionally Force install + pin). This writes the On macOS, the same key is delivered as a configuration profile:
ExtensionInstallForcelist policy for every managed profile in that OU.To apply it by Group Policy instead of the console, the equivalent Windows registry / ADMX value is: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.Shipped in 0.1.9, published 2026-09-20. Verified by downloading what the channel serves and unpacking it: the reporting driver in the published
.crx carries the managed-configuration read and the enrolment call. Between 2026-09-17 and that release the channel served 0.1.3, which did not, so a policy written during that window silently did nothing. If you built one then and saw no endpoints appear, it should begin working once each browser restarts and picks the new build up.Requires 0.1.9 or later. 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:
ijhpnfmdeeclmfahdmckglbepmiokpfl in both places.
Firefox: the same three keys, but Firefox spells the tree 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
Each supply route updates 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, enabling Developer mode and choosing Update requests a check against whichever update URL the policy names. Useful for confirming a rollout rather than waiting out the cycle.⚠️ That button is throttled, and the throttle is silent. Measured 2026-09-17: driving the same call the button makes, seconds after an install, reported success while making zero requests to the update server. Nothing tells you it was suppressed. If you press Update and the version does not move, wait about ten minutes and press it again before concluding the rollout is broken, and confirm against your server’s own logs rather than the button’s response.⚠️ Restarting the browser is NOT a reliable way to pull an update forward. Measured 2026-09-17 against a real managed policy: Chrome queries the update manifest at startup only when the forced extension is missing. Once it is installed and the policy is satisfied, a restart produced no update query at all, and the only remaining trigger was the periodic cycle. If you need a specific version on a machine now, use the Update button above rather than telling people to reboot.What we have proven about updating, and what we have not. The install half is proven on a real Intune-managed device (see Fleet deployment). The update half is not, and we would rather say so than let the table above read as field-tested:
- Proven. The update manifest and the signed package behind it are correct and live: a channel advertising a newer version serves a real, well-formed CRX whose own manifest carries that version, verified by unpacking what the server returns rather than by trusting the XML.
- Proven. A restart does not pull an update forward, and the Update button is silently throttled. Both were measured, and both are written up above because they are the two assumptions most likely to make you misread a rollout.
- NOT observed end to end. We have not yet watched an already-installed extension move to a newer version on its own on a managed device. The periodic cycle is Chromium behaviour we rely on rather than something we have timed in the field: the test machine available to us powers down when idle, and the browser’s update timer is held in memory and restarts with the browser, so the machine has never stayed up long enough for one cycle to elapse.
Check what each route is serving right now
You do not have to take our word for which version your fleet is converging on. Each route answers for itself:The two Chromium routes can legitimately disagree, and usually will. A store release waits on Google’s review before it can even begin rolling out; the self-hosted channel does not. Observed on 2026-09-20: self-hosted served 0.1.9 while the store served 0.1.1. That gap is the reason self-hosted is the recommended route for a managed fleet, and it is also why the two ids must never be mixed on one machine.
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.