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:
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.