ReaderClient is the high-level API you’ll use for 99% of self-hosted Reader workloads. It owns the HeroCore instance and the browser pool, exposes scrape() and crawl(), and handles lazy initialization.
Constructor
scrape() or crawl() call.
ReaderClientOptions
| Option | Type | Default | Description |
|---|---|---|---|
verbose | boolean | false | Enable Pino logging |
showChrome | boolean | false | Show the browser window (debugging) |
browserPool | BrowserPoolConfig | { size: 2 } | Browser pool configuration |
proxies | ProxyConfig[] | - | Flat proxy list for round-robin rotation |
proxyPools | ProxyPoolConfig | - | Multi-tier proxy pools (datacenter, residential) |
proxyRotation | "round-robin" | "random" | "round-robin" | Rotation strategy within a pool |
skipTLSVerification | boolean | true | Skip TLS certificate verification |
Methods
scrape() and crawl() will initialize automatically if you haven’t called start().
true if the client has been initialized (via start() or a prior scrape()/crawl() call).
Lifecycle
ReaderClient is lazy by design:new ReaderClient()- constructor does nothing expensive- First call to
scrape()orcrawl()- triggers HeroCore startup and browser pool initialization (1-2 seconds) - Subsequent calls - reuse the warm pool
- Auto cleanup on
SIGTERM/SIGINT/process exit - Explicit
close()- tears down browsers immediately
Server pattern
Where to go next
scrape()
Signature, options, and return type.
crawl()
Signature, options, and return type.

