Documentation menu

Playwright & Puppeteer

Clearcote is just Chromium, so it works as a drop-in browser for the automation tools you already use.

The drop-in way (works today)

Point your launcher at the Clearcote binary with executablePath (Node) or executable_path (Python), and pass identity options as args:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(
        executable_path=r"C:\clearcote\chrome.exe",
        headless=False,
        args=[
            "--fingerprint=seed-123",
            "--fingerprint-platform=windows",
            "--timezone=America/New_York",
        ],
    )
    page = browser.new_page()
    page.goto("https://abrahamjuliot.github.io/creepjs/")
    browser.close()

The SDK way (published on npm & PyPI)

The clearcote package wraps the above so identity options become named arguments and launch() returns a standard Playwright Browser. It auto-downloads and SHA-256-verifies the Clearcote binary on first use — no manual download.

# pip install clearcote
from clearcote import launch

browser = launch(fingerprint="seed-123", platform="windows", brand="Chrome")
page = browser.new_page()
page.goto("https://example.com")
browser.close()

Auto-match a proxy's region (geoip)

Pass geoip with a proxy and the SDK resolves the proxy's exit IP — looked up in the offline geoip-all-in-one database — and sets a coherent timezone + navigator.languages + Accept-Language + WebRTC IP for that region. No more hand-matching a timezone to every proxy:

from clearcote import launch

browser = launch(
    fingerprint="user-7423",
    proxy={"server": "http://host:8080", "username": "u", "password": "p"},
    geoip=True,  # timezone + language auto-matched to the proxy's region
)

Prefer to set it yourself? Use acceptLanguage (Node) / accept_language (Python), e.g. "en-US,en" — it sets both the Accept-Language header and navigator.languages.

Humanized cursor (humanize & showCursor)

Pass humanize and every page.click / hover / mouse.move / scroll is driven through the engine's humanized input — a cubic-bézier path dispatched as real, trusted mouse events (MouseEvent.isTrusted === true, no CDP-injection tell, and navigator.webdriver stays false). Add showCursor to draw a dot that follows the motion so you can watch it.

from clearcote import launch

browser = launch(fingerprint="seed-123", humanize=True, show_cursor=True)
page = browser.new_page()
page.goto("https://example.com")
page.click("text=Sign in")   # moves along a human-like curve, then clicks
browser.close()

Profiles & persistence

Keep a stable identity across runs by reusing the same --fingerprint seed, and persist cookies/storage with a user-data dir:

python
browser = p.chromium.launch_persistent_context(
    user_data_dir=r"C:\clearcote\profiles\acme",
    executable_path=r"C:\clearcote\chrome.exe",
    headless=False,
    args=["--fingerprint=acme-tenant-7"],
)
Tip: derive the seed from your own account/tenant id so each identity is reproducible — same seed, same browser fingerprint, every time. See the full switch list under Fingerprint flags.