Browser automationRuns inside your real ChromeSource-verified, April 19 2026

A web browser automation tool that attaches to the Chrome you already use and paints a glowing halo on every page so you know it is driving.

Every top result for this keyword (BrowserStack, Firecrawl, Thunderbit, Octoparse) frames the choice as Selenium vs Playwright vs Puppeteer, or record-and-replay vs cloud AI agents. All of them skip a third model: a tool that runs inside your already-logged-in Chrome, so your cookies, 2FA state, Cloudflare trust, and WebAuthn credentials are part of the automation from turn one. Fazm does that, through a single Chrome Web Store extension (ID mmlmfjhmonkocbjadbfplnigmagldckm) and a visible on-page overlay you cannot miss.

F
Fazm
11 min read
4.9from 200+
Attaches to your real Chrome via the Playwright MCP Bridge extension (ID mmlmfjhmonkocbjadbfplnigmagldckm)
Injects a glowing halo plus a 'Browser controlled by Fazm' pill on every page at z-index 2147483647 (browser-overlay-init.js)
Retina screenshots are auto-resized to 1920px max in /tmp/playwright-mcp before the agent reads them (acp-bridge/src/index.ts:710-713)
0
z-index of the Fazm overlay canvas, chosen to beat every stacking context on the page
0px
Max longest-edge after acp-bridge auto-resizes a Retina screenshot
0
Token you paste once to connect Fazm to your real Chrome
0
Re-logins required for sites you are already signed into
z-index 2147483647

The anchor fact no competitor page mentions: Fazm ships a specific Chrome Web Store extension, Playwright MCP Bridge at chromewebstore.google.com/detail/playwright-mcp-bridge/mmlmfjhmonkocbjadbfplnigmagldckm, and opens the exact Chrome Web Store URL for you during onboarding (BrowserExtensionSetup.swift line 220). The extension exposes a CDP endpoint the bundled Playwright MCP attaches to when --extension is passed (acp-bridge/src/index.ts lines 1029 to 1031), which means the browser under automation is literally the Chrome you already use, with every session you are already logged into. On top of that, browser-overlay-init.js injects a #fazm-overlay DOM subtree at z-index 2147483647 with the literal pill text 'Browser controlled by Fazm · Feel free to switch tabs or use other apps' so you can glance at any page and instantly see whether the agent is driving it.

/Users/matthewdi/fazm/Desktop/Sources/BrowserExtensionSetup.swift:220 + acp-bridge/browser-overlay-init.js

The attachment path, end to end

A single token from an extension popup is the only thing that stands between a natural-language request in Fazm and your real Chrome doing the work.

How a sentence in Fazm becomes clicks in your real Chrome

Natural-language prompt
Fazm desktop app
acp-bridge process
Playwright MCP --extension
Playwright MCP Bridge (Chrome extension)
Your real Chrome tab
browser_snapshot
browser_type / browser_click
Visible overlay

The four things that follow from running inside your real Chrome

None of these are downstream of a launched browser. All four drop out of the extension-attaches-to-your-live-Chrome design choice.

Real Chrome, not a spawned Chromium

Your existing profile, cookies, 2FA state, WebAuthn credentials, and saved passwords are all live on turn one. No login replay, no storage_state.json, no 'bot detected' fallbacks.

Chrome Web Store install

Extension ID mmlmfjhmonkocbjadbfplnigmagldckm. Installed through the same dialog you use for any other extension. Fazm's onboarding even opens the exact URL for you.

Token-based auth

One token from the extension popup, pasted into Fazm's onboarding, stored as PLAYWRIGHT_MCP_EXTENSION_TOKEN. Rotate from the extension page any time.

Always-visible on-page overlay

Glowing edge halos, floating blobs, and a center pill injected from browser-overlay-init.js. You never wonder whether the agent is currently driving the page.

Anatomy of the on-page overlay

Automation you cannot see is automation you do not trust. Fazm puts the state of the run on the page itself, in a subtree that cannot be clicked through and cannot be hidden by z-index stacking tricks.

Four glowing edge wings

Top, bottom, left, right radial gradients at 55% height / 50% width, animated with fazm-pulse-top / pulse-bottom / pulse-left / pulse-right keyframes. Semi-transparent, pointer-events: none. Draws attention without blocking input.

Four floating blobs

Corner-anchored circular gradients (fazm-blob1..4) with 60px blur and easing translate + scale animations on 6 to 8 second cycles. Gives the page a subtle alive feeling so you can feel at a glance whether the agent is active.

Center status pill

'Browser controlled by Fazm · Feel free to switch tabs or use other apps' with a spinning 10px ring. Backdrop-blur 8px, semi-transparent dark background, fixed at center-top. z-index: 2147483647 to beat any stacking context on the page.

Injected as one DOM subtree, id=fazm-overlay

browser-overlay-init.js builds a single <div id="fazm-overlay"> with inline <style>, appends to documentElement, and returns early if the element already exists. Idempotent, so SPA route changes that call it a second time are no-ops.

One turn, from prompt to clicks

This is a real trace. 'Download the last three invoices from Stripe as PDFs', typed into the Fazm floating bar, with the Stripe Dashboard already open in Chrome because you log into it every day.

A single automation turn

YouFazm agentPlaywright MCPPlaywright MCP Bridge (extension)Your Chrome tab'download last 3 invoices from Stripe'browser_snapshot()CDP: DOM.getDocument + AXTreereads labelled DOM of active tablabels + [ref=e_] tokenssnapshot with refspage.evaluate(overlay script)#fazm-overlay appended, pill visiblebrowser_click(ref=e42) // 'Invoices' tabbrowser_click(ref=e77) // first invoicebrowser_click(ref=e91) // 'Download PDF'three PDFs in ~/Downloads

How Fazm wires Playwright MCP to your real Chrome

Three flags and an env var. All verifiable in the Fazm repo at acp-bridge/src/index.ts. The --extension flag is what turns a normal Playwright spawn into an attachment to your live browser.

acp-bridge/src/index.ts (excerpt)

The overlay, as one idempotent function

One function. One DOM subtree. The pill text is a string literal, not a config. If you want to audit what Fazm paints on your page, this is the file.

acp-bridge/browser-overlay-init.js (trimmed)

What the onboarding window shows you, top to bottom

Four phases, two polling timers, one token paste. The whole connect flow takes about 60 seconds on a machine that already has Chrome.

Fazm browser extension setup
0Onboarding phases (welcome, connect, verify, done)
0Glowing edge gradients painted by the overlay (top, bottom, left, right)
0Built-in MCP servers bundled with Fazm (acp-bridge/src/index.ts:1266)
0pxBackdrop-blur on the center status pill

Launched Chromium vs attached real Chrome

Every web browser automation tool picks one of two models. Clean launched browser, or attached real browser. Fazm picks the second, and the downstream consequences are not small.

FeatureTypical framework (launched Chromium)Fazm (attached real Chrome)
Where the browser livesA fresh Chromium spawned from node_modules. New profile directory, blank cookie jar, clean IndexedDB, empty Keychain, zero stored TOTP seeds.Your real running Chrome on your Mac. Fazm's extension attaches to it over CDP after you paste the token from the extension popup (BrowserExtensionSetup.swift phases welcome, connect, verify, done).
Logged-in state on day oneNone. Every automation script starts by replaying a login flow or loading a persisted storage_state.json, both of which break on 2FA, captcha, or SSO with WebAuthn.Whatever you were already logged into. Gmail, Notion, Stripe Dashboard, Google Workspace, Shopify Admin, your bank, Figma, X. The agent sees what you see when you open a tab.
Cloudflare Turnstile, hCaptcha, bot checksFail often. A launched Chromium from node_modules has the CDP webdriver flag by default and a clean fingerprint that does not match any trusted session.Pass transparently, because the fingerprint is your real Chrome: installed extensions, timezone, accept-language, TLS profile, canvas hash, a session TLS cookie already approved by the site.
What the user sees while the agent runsNothing on-page. A headless run is invisible. A headed run looks identical to normal browsing, which makes it very easy to click inside the automated tab by accident and break the run.A glowing animated halo on the four edges of the active tab plus a center pill: 'Browser controlled by Fazm · Feel free to switch tabs or use other apps'. Injected from browser-overlay-init.js at z-index 2147483647, pointer-events: none, so it never blocks input.
How the overlay stays pinned across navigationsMost frameworks do not inject any on-page UI. Those that do (e.g. recorder-first tools like Axiom, Browserflow) inject their own overlay only during a record pass, not during replay.scripts/patch-playwright-overlay.cjs patches Playwright's extensionContextFactory.js at npm postinstall so every page load fires a page.evaluate with the overlay script. addInitScript does not work on CDP-attached contexts in extension mode, so the patch registers DOMContentLoaded + load listeners directly.
Screenshots at full Retina resolutionMost frameworks either send the raw Retina PNG (rejected by multi-image models) or downscale before the agent sees the real pixels.Playwright MCP dumps to /tmp/playwright-mcp, a Node watcher in acp-bridge/src/index.ts:710-713 sharp-resizes any PNG above 1920px on the longest edge in place, so the agent never hits Claude's 2000px multi-image dimension limit.
The browser tree the LLM actually readsComputer-use style agents send a PNG and ask the model to guess x,y coordinates. Every redesign breaks the guesses.Accessibility snapshot from Playwright's browser_snapshot, returning every input with a human-readable label and a [ref=e_] token. The agent sends text, not pixel coordinates, to click and type.
Switching tabs mid-runUsually unsafe. Focusing away from a launched Chromium can break screenshot-based agents that read from the focused window, or steal focus back on every click.Safe. The overlay pill explicitly invites you to switch tabs. Playwright attaches to a specific page object, so your work in other tabs is unaffected and the agent keeps driving the tab it was pointed at.
Auth surface between Fazm and ChromeNo auth because no real browser is involved. The cost is, no real sessions.One token, generated by the Playwright MCP Bridge extension, copied once from the extension popup and pasted into the Fazm onboarding, stored as PLAYWRIGHT_MCP_EXTENSION_TOKEN env var passed to the bridge (acp-bridge/src/index.ts:1043-1047). Rotate any time from the extension page.
Install pathnpm install, write a script, run headless, debug selectors. Or record-and-replay in a cloud dashboard, re-record on every redesign.Google Chrome (or installed detection), then chromewebstore.google.com/detail/playwright-mcp-bridge/mmlmfjhmonkocbjadbfplnigmagldckm, then copy token, then paste. Four phases in the Fazm onboarding window (BrowserExtensionSetup.swift lines 96-101).

Sites where 'already logged in' is the whole game

Every site below has a login flow that is painful to replay, or a fingerprint check that a clean Chromium fails. Running inside your real Chrome removes both problems.

Stripe DashboardGmailNotionShopify AdminGoogle CalendarHubSpotAirtableFigmaLinearGitHubSlack WebChatGPTClaude.aiVercel DashboardAWS ConsoleGoogle AdsLinkedInXAmazon Seller CentralQuickBooks Online

Six steps, from opening Fazm to the overlay lighting up

The first five run exactly once. The sixth is every command you ever give.

1

You open Fazm on your Mac

First launch triggers the BrowserExtensionSetup window. Welcome, connect, verify, done. The window resizes between phases via onPhaseChange, 480x500 for welcome / verify / done, 880x520 for connect (BrowserExtensionSetup.swift line 179).

2

Fazm checks if Chrome is installed

BrowserExtensionSetup.isChromeInstalled. If not, a bordered Download Chrome button opens google.com/chrome and starts a 2-second timer that polls for the app's presence.

3

You install the Playwright MCP Bridge extension

chromewebstore.google.com/detail/playwright-mcp-bridge/mmlmfjhmonkocbjadbfplnigmagldckm. A second timer polls until the extension appears in your installed list, then marks step 2 done.

4

You copy the token from the extension popup

Click the puzzle piece in Chrome's toolbar, click Playwright MCP Bridge, copy the token shown. Fazm opens the exact extension URL for you (chrome-extension://mmlmfjhmonkocbjadbfplnigmagldckm/status.html), and the 'Open Extension Page' button sends you there.

5

You paste the token into Fazm, it verifies

Fazm stores the token as PLAYWRIGHT_MCP_EXTENSION_TOKEN. The acp-bridge process spawns Playwright MCP with --extension so it runs in extension mode, attaching to your live Chrome over CDP. No separate Chromium is downloaded.

6

First command runs, overlay appears

You type 'download the last three invoices from Stripe as PDFs'. Playwright MCP calls browser_snapshot on the current tab. At the same time, the patched extensionContextFactory.js runs browser-overlay-init.js via page.evaluate, injecting #fazm-overlay into the DOM. The glowing halo and 'Browser controlled by Fazm' pill appear. You see the agent click, type, and download while you read another tab.

The boundary, point by point

Attaching to your real Chrome is a larger trust surface than a clean launched browser, so Fazm makes the trust surface visible and reversible.

What Fazm does and does not do inside your real Chrome

  • The --extension flag is passed only when PLAYWRIGHT_USE_EXTENSION=true, so you can disable extension mode and run against a launched browser instead (acp-bridge/src/index.ts:1029-1031).
  • Screenshots land in /tmp/playwright-mcp and are auto-resized in place, so nothing bigger than 1920px on the longest edge ever leaves the machine.
  • The overlay is injected via page.evaluate, not a background worker, so there is no persistent network listener in your Chrome.
  • The token is an env var read by the acp-bridge process; rotate it and the attachment breaks until you paste the new one.
  • macOS sandboxing still applies. Fazm cannot read files outside Full Disk Access scope.
  • The overlay pill text is verbatim from browser-overlay-init.js line 58: 'Browser controlled by Fazm · Feel free to switch tabs or use other apps'.

Stop re-logging your automation into every SaaS tool you already use.

Fazm attaches to the Chrome you already use via an extension, paints a glowing halo on every page it drives, and takes natural-language commands. Free to download, one-time install.

Download Fazm

See your own Chrome get driven by an agent, live

Book 20 minutes and we'll install the Playwright MCP Bridge extension on your machine and run one automation you pick on the call.

Book a call

Web browser automation tool, answered against the Fazm source

What makes Fazm different from Playwright, Puppeteer, or Selenium as a web browser automation tool?

Playwright, Puppeteer, and Selenium each launch a clean browser instance from your node_modules or system PATH. That instance has a blank profile directory, no cookies, no IndexedDB, no Keychain, and no 2FA state. Every script has to re-create sessions at the top, either by replaying a login flow or by loading a persisted storage_state.json that breaks on SSO, WebAuthn, or TOTP. Fazm uses Playwright MCP in extension mode. It installs a Chrome Web Store extension (Playwright MCP Bridge, ID mmlmfjhmonkocbjadbfplnigmagldckm) and attaches to the Chrome you already use, so every site you are already logged into is live on turn one. The exact flag is --extension in acp-bridge/src/index.ts lines 1029 to 1031, passed when PLAYWRIGHT_USE_EXTENSION is true.

How does the visible overlay work, and why is it there?

An injected DOM subtree with id=fazm-overlay. The source is acp-bridge/browser-overlay-init.js. It paints four glowing radial-gradient wings on the top, bottom, left, and right edges of the viewport, four slow-moving floating blobs in the corners, and a center pill that reads 'Browser controlled by Fazm · Feel free to switch tabs or use other apps' with a spinning indicator. The canvas has z-index 2147483647 (the max signed 32-bit integer, chosen to beat every stacking context a site might use), and pointer-events none, so it never blocks clicks or text selection. The reason for the overlay is trust. A headed browser run that looks identical to your normal browsing invites accidental clicks in the automated tab. A glowing halo plus an explicit pill removes the ambiguity.

How does the overlay stay pinned across every page navigation?

Playwright's addInitScript does not work on CDP-attached contexts when running in extension mode, which is how Fazm runs. So scripts/patch-playwright-overlay.cjs patches Playwright's extensionContextFactory.js at npm postinstall. The patch registers DOMContentLoaded and load event listeners on every page the extension exposes, and each one calls page.evaluate with the full overlay script. Because the script is idempotent (it bails early if document.getElementById('fazm-overlay') is truthy), replays on SPA route changes are no-ops. The init-page script path is passed to Playwright MCP as --init-page at acp-bridge/src/index.ts line 1037.

Can Cloudflare Turnstile or hCaptcha tell it is an automated browser?

In most cases, no, because the fingerprint presented to the site is the fingerprint of your real Chrome. Same installed extensions, same timezone, same accept-language, same TLS client, same canvas hash, and for any site you were already logged into, a session cookie already approved by the server. Compare this to a Playwright-launched Chromium, which exposes the CDP navigator.webdriver flag by default and has no prior session. The tradeoff is that you must be willing to let the agent use your real session, which is exactly the reason the overlay exists: it is always visible when automation is active, and the pill invites you to switch tabs so you can keep working.

What are the exact install steps from a fresh Mac?

Four phases, tracked in BrowserExtensionSetup.swift at enum Phase (welcome, connect, verify, done). One, the welcome screen explains browser access. Two, the connect screen shows four sub-steps: install Google Chrome (with a polling timer that detects when Chrome appears on disk), install the Playwright MCP Bridge extension from the Chrome Web Store (another polling timer that detects the extension's status page URL), click the extension popup in Chrome and copy the token shown, paste the token into Fazm. Three, verify runs a live connection test by asking the ChatProvider to issue a browser_snapshot. Four, done flips a flag and the window closes. The extension URL is chromewebstore.google.com/detail/playwright-mcp-bridge/mmlmfjhmonkocbjadbfplnigmagldckm.

Why does the overlay use z-index 2147483647 specifically?

2147483647 is 2^31 minus 1, the largest signed 32-bit integer. Some sites (ad frames, chat widgets, cookie consent banners) set z-index values up to a few million to make sure they paint on top. Using the absolute max guarantees Fazm's halo and pill win the stacking contest on every page without adding runtime overhead. The z-index is set inline on #fazm-canvas2 in the <style> block embedded in browser-overlay-init.js, so it takes effect before any external stylesheet loads.

What happens to screenshots at Retina resolution?

Playwright MCP saves all snapshots to /tmp/playwright-mcp (set via --output-dir in acp-bridge/src/index.ts:1033). Retina Macs produce images larger than 2000px on the longest edge, which hits Claude's multi-image dimension limit. A Node watcher started at acp-bridge/src/index.ts:710-713 waits for new PNGs and sharp-resizes them in place if they exceed 1920px, then forwards them to the agent. You get sharp screenshots without model errors.

Is the browser automation the only thing Fazm does?

No. Fazm bundles five built-in MCP servers (acp-bridge/src/index.ts:1266): fazm_tools (skill runner and local identity store), playwright (the one this guide is about), macos-use (native macOS accessibility API automation for any Mac app, not just the browser), whatsapp (desktop WhatsApp via a dedicated process), and google-workspace (Drive, Calendar, Gmail). The browser is the most public surface, but in a typical session the agent will chain playwright calls with macos-use calls inside the same turn.

Does Fazm send my browser contents to a server during a run?

The agent sends whatever snapshot and screenshots it chose to the model you selected (Anthropic Claude by default, or your own OpenAI or local Ollama endpoint). Fazm itself does not upload browser data anywhere separate from that. The extension token, the env vars, and the Playwright process all run locally. The /tmp/playwright-mcp screenshot directory is a local path. Raw DOM never leaves your machine unless the agent chose to include it in a tool-call argument that the model reads.

Can I switch tabs or use other apps while Fazm is automating a page?

Yes. That is what the pill text explicitly invites: 'Browser controlled by Fazm · Feel free to switch tabs or use other apps'. Playwright's CDP connection is pinned to a specific page object, so it does not depend on that tab being in the foreground. And the overlay is pointer-events: none, so if you do come back to the automated tab, you can interact with the page underneath (at your own risk of racing with the agent). macOS focus and Mission Control still work normally.

What happens on a site where the page renders in an iframe or a Shadow DOM?

Playwright handles iframes with the browser_snapshot call returning nested frames, each with its own [ref=eN] tokens. The agent reads the outer snapshot, picks the iframe, and calls browser_snapshot on it if needed. For closed Shadow DOM, the snapshot does not descend past the shadow root, so the agent typically switches to accessibility-tree reads on the parent element, or the macos-use MCP server reads the underlying AXUIElement. The overlay appends to documentElement, so it sits above the page regardless of iframe depth or shadow trees.

Is the Playwright MCP Bridge extension Fazm's own, or upstream Microsoft?

Upstream. It is the Playwright MCP Bridge extension published by Microsoft, the same company that maintains Playwright. Fazm bundles Playwright MCP (the @playwright/mcp npm package) and wires it to the extension via the --extension flag. That means the CDP attachment path is the same one Playwright's maintainers ship, and security updates to the extension roll out through the Chrome Web Store.

fazm.AI Computer Agent for macOS
© 2026 fazm. All rights reserved.

How did this page land for you?

React to reveal totals

Comments ()

Leave a comment to see what others are saying.

Public and anonymous. No signup.