Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.reader.dev/llms.txt

Use this file to discover all available pages before exploring further.

Browser Sessions

The browser() primitive launches a Hero-stealthed Chrome and returns a CDP WebSocket URL. Connect Playwright or Puppeteer to automate pages with anti-bot stealth active.

How It Works

reader.browser()

    ├── Creates a dedicated HeroCore instance
    ├── Launches Chrome with stealth emulation scripts
    ├── Extracts CDP WebSocket URL
    ├── Disables internal target tracking for external clients


session.wsEndpoint  →  Playwright/Puppeteer connects
Each session gets its own Chrome process, separate from the scrape/crawl browser pool. This isolates sessions from scraping throughput.

Stealth Features

Sessions inherit Hero’s emulation scripts:
FeatureActiveMechanism
webdriver = falseYesPage.addScriptToEvaluateOnNewDocument
Navigator spoofingYesinjected at BrowserContext level
WebGL fingerprintingYesinjected at BrowserContext level
WebRTC IP maskingYesinjected at BrowserContext level
TLS fingerprinting (MITM)NoMITM proxy disabled for sessions
Note on MITM: Hero’s TLS fingerprint emulation uses a MITM proxy that tracks connections by socket. External CDP clients create new sockets the MITM can’t track, so it’s disabled for sessions. The emulation scripts provide the primary stealth layer without MITM.

Usage

import { ReaderClient } from "@vakra-dev/reader";
import { chromium } from "playwright-core";

const reader = new ReaderClient();
const session = await reader.browser({ timeoutMs: 300_000 });

const browser = await chromium.connectOverCDP(session.wsEndpoint);
const context = await browser.newContext();
const page = await context.newPage();

await page.goto("https://example.com");
console.log(await page.title());

await browser.close();
await session.close();

CLI

# Create session (standalone)
reader browser create --standalone

# With daemon running
reader browser create
reader browser list
reader browser stop <sessionId>

Resource Usage

  • Each session uses ~300MB memory (Chrome + HeroCore)
  • Sessions are isolated from the scrape/crawl pool
  • Default timeout: 5 minutes (configurable via timeoutMs)