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, 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. launch() runs on a throwaway profile, so it takes them, and so do launch_persistent_context / launchPersistentContext and serve() (.NET: Extensions). The only launches that can't are the incognito ones (ephemeral_profile=False, the async API's launch(), .NET LaunchAsync). Hosted browsers don't load extensions.

Clearcote can't install or update extensions from the Chrome Web Store: the upstream privacy patches remove that integration, so extensions loaded this way never update on their own. 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, CDP Network.setBlockedURLs in the automation layer blocks by URL pattern with no extension surface and keeps the cache (Playwright's route() works too, but turns the cache off).

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.

The diff

38,921 lines between stock Chromium and Clearcote Pro.

That is how far the Pro build is from the Chromium Google ships. Every value a site can read is set where Chromium computes it, so the page, its workers and its iframes all describe the same device.

  • Canvas
  • WebGL
  • WebGPU
  • Audio
  • Fonts
  • Screen and window
  • WebRTC
  • TLS
  • Client hints
  • Input timing
  • Voices and codecs
Read the open build's patches on GitHub

Pro build, counted from its r57 patch stack (Chromium 156.0.8078.47). The free open build is a smaller, public patch set.

Chromium 156.0.8078.47 → Clearcote Pro r57

345 files changed, 35915 insertions(+), 3006 deletions(-)

240 patches

Files changed, by area

  • Rendering engine (Blink)118
  • Browser (chrome/)52
  • Content layer42
  • Components39
  • Network stack22
  • UI and windows14
  • TLS (BoringSSL)11
  • V8 and URL17
  • Everything else30

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 to launch() or 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

A drop-in for Playwright & Puppeteer, coherent down to the TLS handshake, with an open-source build to start from.

Free for one browser: GitHub, a card check or a company Google account. Never charged.