Blog / 46 articles

Notes from building a screenshot API

Fixes for headless Chrome errors I ran into, guides for tricky pages and what it takes to run screenshots in production.

How to handle screenshot API responses in production

A 200 OK from a screenshot API doesn't mean you got a screenshot — the transport and render layers fail independently. Which status codes to...

Screenshot API rate limiting strategies in production

Most rate limiting guides only cover retry strategies. That's only half the problem. Five concrete strategies — proactive (token bucket, que...

Headless Chrome "net::ERR_CONNECTION_REFUSED" in Docker: causes and fixes

ERR_CONNECTION_REFUSED in headless Chrome inside Docker isn't one error — it's five different network problems sharing the same message. Dia...

How to take screenshots of pages with infinite scroll feeds

Infinite scroll pages don't have a bottom — so "scroll to the end, then screenshot" doesn't work by definition. Five strategies for deciding...

Why your Puppeteer and Playwright screenshots come out blank or white

"Blank screenshot" isn't one problem — it's at least five different ones. Compare your image against five visual patterns to find the right...

How to take screenshots of single-page applications (SPAs) correctly

SPAs break screenshot tools in their own way — content rendering across several phases, networkidle that never settles, hydration mismatches...

Puppeteer "Protocol error (Page.captureScreenshot): Target closed": causes and fixes

Puppeteer's "Protocol error (Page.captureScreenshot): Target closed" almost always means Chromium crashed during the actual rendering — not...

Playwright "Target page, context or browser has been closed": causes and fixes

Playwright's "Target page, context or browser has been closed" almost always comes from a lifecycle bug, not a Playwright bug. Here are the...

Puppeteer "Navigation timeout of 30000 ms exceeded": causes and fixes

Puppeteer's "Navigation timeout of 30000 ms exceeded" rarely comes from a slow page. It comes from a waitUntil condition that never gets sat...

Wait for page to fully load before screenshot: 4 strategies

I took a screenshot of a public dashboard and got back an image with empty tables. Here are four strategies to wait for a page to fully load...

Generate PDF Invoices from HTML (Stripe + Paddle Webhooks)

Most SaaS apps eventually need to generate invoices programmatically, and most start with a PDF library that fights them on layout. Here's a...

How to Build Visual Regression Testing in GitHub Actions (Full Pipeline)

Visual regression testing catches the UI bugs that unit tests and functional tests miss entirely — broken layouts, shifted buttons, wrong co...

Screenshot API in a few clicks

Free plan includes 200 screenshots every month. No credit card required.

Sign up → copy your key → make your first call