Skip to content
Extensions · MV2 · MV3 · headless

Chrome extensions, Manifest V2 included

Pass a list of unpacked extension folders and Clearcote loads them at launch. Manifest V3 works, and so does Manifest V2, which stock Chrome has finished switching off, so MV2 content blockers and older in-house tools keep running. Headless too.

In every tier, on Windows and Linux.

A list of folders

from clearcote import launch_persistent_context

ctx = launch_persistent_context(
    "./profile",
    extensions=["./ext/ublock", "./ext/my-helper"],   # unpacked directories, MV2 or MV3
    headless=True,                                     # works headed too
)
page = ctx.pages[0] if ctx.pages else ctx.new_page()
page.goto("https://example.com")

Highlights

Manifest V2 still runs

The upstream privacy patch set restores MV2 support, so MV2-only blockers and older tooling keep working here after they stopped working in Chrome.

Headless and headed

Extensions load in headless mode as well as headed, with no virtual display needed just to get one running.

The flag pairing, handled

--load-extension alone is ignored under automation. The SDK sets it together with --disable-extensions-except, so the extension actually appears.

Folders, not .crx files

Point at the folder that holds manifest.json. A .crx unzips into one.

Windows and Linux

The same option on both platforms, tested headed and headless.

Your code, your surface

Clearcote doesn't hide extensions. Prefer ones without web_accessible_resources, since a page can probe for those.

How extensions load

Extensions need a profile to live in, so they load in a persistent context: launch_persistent_context in Python, launchPersistentContext in Node.

The Chrome Web Store isn't reachable from Clearcote: the upstream privacy patches remove the Web Store integration, so there's no in-browser install. Ship the unpacked directory with your automation instead, the same model Playwright and Puppeteer use.

An extension is observable. Content scripts that rewrite the DOM, inject styles or block requests change what a page measures, and declared web-accessible resources can be fetched by any page. If all you need is request blocking, route interception in the automation layer costs no extension surface at all.

What people use it for

Content blocking

Run the MV2 build of a blocker that Chrome no longer loads.

Testing your own extension

End-to-end tests of an extension, headless, in CI.

In-house tooling

Company extensions for sign-in helpers, annotation or QA, inside automated sessions.

Clearcote is built for privacy, testing, research and lawful automation. You're responsible for how you use it and for following the terms of the sites you visit.

Which plan includes it

In every tier, on Windows and Linux, headed and headless.

Compare plans

FAQ

Can Playwright load Chrome extensions in headless mode?

With Clearcote, yes. Pass the unpacked folders as extensions on a persistent context and they load headless as well as headed, with no extra flags.

Does Manifest V2 still work?

Yes. Stock Chrome has finished disabling MV2, but the upstream privacy patch set Clearcote builds on restores it, so MV2 and MV3 extensions both run.

Can I install extensions from the Chrome Web Store?

No. The Web Store integration is removed along with Google's other services. Download or build the extension, unzip it if it's a .crx, and pass the folder.

Why doesn't my extension show up?

Usually the path: it has to point at the folder holding manifest.json, not its parent and not a .crx. If a content script never runs, check that its matches pattern covers the URL; http://localhost/* doesn't match http://127.0.0.1:8080/.

Can websites tell an extension is installed?

Sometimes. A page can notice DOM changes a content script makes, and it can try to fetch an extension's declared web-accessible resources. That's true of any browser with extensions, and Clearcote doesn't hide it.

Go deeper in the docs

Related features

Try Clearcote

Open source, a drop-in for Playwright & Puppeteer, and coherent down to the TLS handshake.

Free for one browser with GitHub. No card.