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 plansFAQ
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
A drop-in Chromium for Playwright and Puppeteer: one import change in Python, Node or .NET, with the browser downloaded and SHA-256 verified for you.
Opt in and Clearcote fetches Google's Widevine CDM the way stock Chrome does, verifies it and enables it, so DRM video plays.
Run Clearcote as a standing CDP endpoint from the official Docker image, serve() or a CLI, and attach any framework with no code change.
Canvas, WebGL, WebGPU, audio, fonts, screen, hardware and locale set in the C++ engine from one seed, so every surface agrees with every other.
Related reading
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.