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.
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
Pro build, counted from its r57 patch stack (Chromium 156.0.8078.47). The free open build is a smaller, public patch set.
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 plansFAQ
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
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 and hardware derived in the C++ engine from one seed, with locale and timezone set to match, so every surface agrees with every other.
Related reading
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.