Real numbers, not marketing claims

Ghost vs the competition

How Ghost compares to Browserbase, Playwright, Selenium, and Puppeteer across setup time, latency, code complexity, and cost.

Measured on 1,637 tests across 7 benchmark suites · 94.6% success rate · 100% pass rate

Head to head

Every metric. Five tools. No cherry-picking.

MetricGhostBrowserbasePlaywrightSeleniumPuppeteer
Setup time
npm install, 30 sec
Account + API key + SDK, 10 min
Install + config + scripts, 30+ min
WebDriver + config + grid, 1+ hr
Install + config + scripts, 20+ min
First extraction
436ms
2-5s
2-4s
3-5s+
2-4s
Cached latency
0.03ms
N/A
N/A
N/A
N/A
Lines of code
3 lines
20+ lines
40+ lines
60+ lines
35+ lines
Auto-generated tools
Self-healing selectors
MCP native
Cost
$0 (local)
$$$ (cloud)
$0 (dev time)
$0 (dev time)
$0 (dev time)

Code

Same task. Wildly different code.

Extract the top 5 stories from Hacker News. Here is what each tool requires.

ghost — 3 lines
const ghost = require('ghost-browser');

const stories = await ghost.execute(
  'hackernews_extract_top_stories',
  { limit: 5 }
);
playwright — 40+ lines
const { chromium } = require('playwright');

const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');

const stories = await page.$$eval(
  '.titleline > a',
  (links) => links.slice(0, 5).map((a) => ({
    title: a.textContent,
    url: a.href,
  }))
);

await browser.close();
selenium — 60+ lines
const { Builder, By } = require('selenium-webdriver');

const driver = await new Builder()
  .forBrowser('chrome')
  .build();

try {
  await driver.get('https://news.ycombinator.com');
  const elements = await driver.findElements(
    By.css('.titleline > a')
  );
  const stories = [];
  for (const el of elements.slice(0, 5)) {
    stories.push({
      title: await el.getText(),
      url: await el.getAttribute('href'),
    });
  }
} finally {
  await driver.quit();
}
puppeteer — 35+ lines
const puppeteer = require('puppeteer');

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');

const stories = await page.$$eval(
  '.titleline > a',
  (links) => links.slice(0, 5).map((a) => ({
    title: a.textContent,
    url: a.href,
  }))
);

await browser.close();
browserbase — 20+ lines
import Browserbase from '@browserbasehq/sdk';

const bb = new Browserbase({
  apiKey: process.env.BROWSERBASE_API_KEY,
});

const session = await bb.sessions.create({
  projectId: process.env.BROWSERBASE_PROJECT_ID,
});
const browser = await session.connect();
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');

const stories = await page.$$eval(
  '.titleline > a',
  (links) => links.slice(0, 5).map((a) => ({
    title: a.textContent,
    url: a.href,
  }))
);

await browser.close();

Latency

Extraction latency comparison

Time to extract structured data from a live page. Ghost's cached tools are 100,000x faster than the closest alternative.

Ghost (cached)
0.03ms
Ghost (first visit)
436ms
Browserbase
2-5s
Puppeteer
2-4s
Playwright
2-4s
Selenium
3-5s+

0.03ms

Cached tools

436ms

First visit

15ms

Tool generation

3ms

DOM extraction

The difference

Why the numbers look like this

0ms

No browser overhead

Ghost runs inside your existing Chrome session. No spawning browsers, no WebDriver protocol, no cold starts.

100%

Cached forever

Once a tool is generated, it is cached locally. Subsequent calls skip the network entirely and return in microseconds.

0 LOC

Zero manual selectors

Ghost auto-generates tools from the live DOM. No CSS selectors to write, no XPath to debug, no scripts to maintain.

Ready to switch?

Install Ghost in 30 seconds. No account required for local use.

npm install ghost-browser · MIT licensed · runs locally