Mimic runs website JavaScript in V8 and exposes browser state over the Chrome DevTools Protocol (CDP), without embedding Chromium. It is a source-available public beta for nonvisual automation and web scraping. Playwright remains the client; Mimic is the runtime you start separately.

Start Mimic and install the client

Download Mimic for Windows or Linux amd64, extract the archive and start the executable. The packaged runtime needs no Chrome, Go or Rust. Keep the unauthenticated CDP endpoint bound to loopback.

Windows / Linux
# Windows
./mimic.exe -listen 127.0.0.1:9222

# Linux
./mimic -listen 127.0.0.1:9222

# In a separate terminal, in your Node.js project
npm install playwright-core@1.63.0

There is no Playwright browser download in this workflow. Use chromium.connectOverCDP() to attach to Mimic's endpoint.chromium.launch() would launch a separate Chromium executable.

Extract book titles and URLs as JSON

Save this as playwright-books.mjs and run node playwright-books.mjs. Books to Scrape is a public scraping sandbox. Its catalog is static: this example validates navigation, DOM extraction and a JavaScript evaluation, not compatibility with an arbitrary JavaScript application.

playwright-books.mjs
import { chromium } from "playwright-core";

const endpoint = process.env.MIMIC_CDP_URL ?? "http://127.0.0.1:9222";
const browser = await chromium.connectOverCDP(endpoint);
let page;
try {
  page = await browser.contexts()[0].newPage();
  const response = await page.goto("https://books.toscrape.com/", {
    waitUntil: "load",
    timeout: 30000,
  });
  if (!response || !response.ok()) {
    throw new Error(
      `Navigation failed: ${response?.status() ?? "no response"}`,
    );
  }
  const heading = await page.locator("h1").textContent();
  const books = await page
    .locator(".product_pod h3 a")
    .evaluateAll((nodes) =>
      nodes.map((a) => ({ title: a.title, url: a.href })),
    );
  if (heading?.trim() !== "All products" || books.length !== 20) {
    throw new Error(
      "Unexpected Books to Scrape content; inspect the response and DOM.",
    );
  }
  console.log(JSON.stringify({ heading: heading.trim(), books }, null, 2));
} finally {
  try {
    await page?.close();
  } finally {
    // Disconnect the client; the separately started Mimic process stays running.
    await browser.close();
  }
}

The expected output is an All products heading and 20 book records with titles and absolute URLs. HTTP failures or changed page content produce an error. The script closes its Page and disconnects; stop the Mimic process separately when finished.

This example was checked with the Mimic v0.1.9 Windows release and playwright-core 1.63.0. That is a checkpoint for this script, not a guarantee for other sites or all client methods.

What CDP compatibility means here

Playwright documents CDP attachment as lower fidelity than its native protocol connection. Mimic implements a subset of the browser behavior expected by that CDP client.

Using the same client does not make Mimic a drop-in replacement for every Playwright workflow. Mimic has partial CDP and Web API compatibility, targets observable Chrome 152 behavior and supports independent Pages and Contexts. A protocol schema entry alone is not evidence that a command is implemented.

Check the CDP compatibility notes and semantic support matrix for your commands. Mimic does not provide rendered screenshots, video or PDF rendering, or full Blink behavior. Modeled geometry and browser observations do not establish visual fidelity.

Move a real workload in small steps

First compare extracted fields, navigation and session behavior against your existing Chrome workflow. Check client-version compatibility, unsupported commands and target-site errors before adding concurrency. Keep Chromium available for jobs that need rendering or unsupported browser behavior.

Continue with Mimic versus Chromium for repeated extraction, the setup and compatibility guide, or Puppeteer, Python and raw CDP examples.