# Headless browser alternative: skip the browser, keep the output

# Headless Browser Alternative: Skip the Browser, Keep the Output

Headless browsers are powerful — and expensive to run. Chromium in headless mode needs 200–500MB of RAM per instance, a compatible binary on the server, and careful lifecycle management to avoid zombie processes and memory leaks.

If your goal is a screenshot, a PDF, or a recorded video — not browser automation for testing — there's a simpler path.

## What headless browsers are used for (and what you actually need)

Most production uses of headless browsers fall into three categories:

1. **Screenshot / thumbnail generation** — capture a URL as an image
2. **PDF export** — print a page or HTML template to PDF
3. **Video recording** — record a browser interaction for demos or monitoring

For all three, you don't need to *run* a browser. You need the *output* a browser produces. An API gives you that output without the infrastructure.

## Screenshots without a headless browser

```javascript
// Before: Puppeteer
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
const screenshot = await page.screenshot({ fullPage: true });
await browser.close();

// After: API call
const res = await fetch('https://pagebolt.dev/api/v1/screenshot', {
  method: 'POST',
  headers: { 'x-api-key': process.env.PAGEBOLT_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({ url: 'https://example.com', fullPage: true, blockBanners: true })
});
const screenshot = Buffer.from(await res.arrayBuffer());
```

Same output. No browser process, no binary, no cleanup.

## PDFs without a headless browser

```javascript
const res = await fetch('https://pagebolt.dev/api/v1/pdf', {
  method: 'POST',
  headers: { 'x-api-key': process.env.PAGEBOLT_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({ url: 'https://example.com/report', format: 'A4', printBackground: true })
});
```

## Narrated video recording without a headless browser

This is where the API goes beyond what self-hosted headless setups typically offer:

```javascript
const res = await fetch('https://pagebolt.dev/api/v1/video', {
  method: 'POST',
  headers: { 'x-api-key': process.env.PAGEBOLT_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    steps: [
      { action: 'navigate', url: 'https://yourapp.com', note: 'Open the app' },
      { action: 'click', selector: '#get-started', note: 'Start the flow' }
    ],
    audioGuide: {
      enabled: true,
      script: "Welcome. {{1}} Let's get started. {{2}}"
    },
    pace: 'slow'
  })
});
```

AI-narrated MP4 output — no ffmpeg, no audio pipeline to configure.

## When you still need a real headless browser

A headless browser API isn't a replacement for browser testing. If you need to:
- Run end-to-end tests with assertions
- Interact with complex SPAs across many steps with conditional logic
- Debug rendering in a local environment

Then Puppeteer or Playwright is the right tool. For pure output generation — files, images, videos — an API is lighter, faster to deploy, and scales without memory management.

## Deployment comparison

| | Self-hosted Puppeteer | PageBolt API |
|---|---|---|
| Binary size | ~300MB Chromium | None |
| RAM per request | 200–500MB | Negligible |
| Serverless support | Painful (layers/custom runtimes) | Native |
| Concurrent requests | Requires pool management | Fire-and-forget |
| Narrated video | Requires ffmpeg pipeline | Built-in |

---

Try it free — 100 requests/month, no credit card. → [pagebolt.dev](https://pagebolt.dev)
