Alternative

Puppeteer screenshots? There's a faster way.

You wrote the Puppeteer script. It worked locally. Then in production: memory leaks, zombie processes, Chromium crashes at 3 AM. RendShot replaces all of that with one API call.

25→3
Lines of code
0
Docker images
0
Memory leaks
Your Puppeteer setup
Your Server
└ Docker Container
└ Chromium (400MB)
└ Tab Pool (~8 max)
└ page.screenshot()
└ S3 Upload
└ CDN Config
└ Monitoring
You maintain: 7 layers
With RendShot
Your Server
└ POST /v1/image { html, width, height }
 
→ CDN Image URL
You maintain: 0 layers

Sound familiar?

The production pains of self-hosted Puppeteer.

1

Chromium crashes and zombie processes at 3 AM

2

Memory leaks that grow until the container OOMs

3

Docker image is 400MB+ just for the browser

4

Cold starts take 2-5 seconds per render

5

Font rendering differs between local and production

6

Maintaining headless browser config across Node versions

Migration

25 lines → 3 lines.

Same HTML input. Same image output. No browser, no Docker, no cleanup.

// Before: Puppeteer (25 lines)
// const browser = await puppeteer.launch()
// const page = await browser.newPage()
// await page.setViewport({ width: 1200, height: 630 })
// await page.setContent(html)
// await page.waitForTimeout(500) // hope fonts loaded...
// const buffer = await page.screenshot({ type: 'png' })
// await browser.close() // don't forget this or you'll leak memory
// await uploadToS3(buffer)

// After: RendShot (3 lines)
import { RendShot } from '@rendshot/sdk'
const client = new RendShot({ apiKey: process.env.RENDSHOT_API_KEY })

const image = await client.renderImage({
  html,
  width: 1200,
  height: 630,
  format: 'png',
})

console.log(image.url) // CDN-hosted, no upload needed
Same Chromium rendering engine
Same CSS support
Zero infrastructure
CDN-hosted output

Benchmark

Puppeteer vs RendShot — side by side.

MetricPuppeteerRendShot
Cold start2-5s (browser launch)0s (pre-warmed pool)
P50 render time~800ms~400ms
P99 render time~3.2s~1.8s
Concurrent renders~8 tabs (limited by RAM)100 req/min (Pro)
Memory usage~500MB per instance0 (managed)
Docker image400MB+ with ChromiumNot needed
Monthly cost (10k images)$40+ VPS/container$19 Pro plan
CSS supportFullFull (Tailwind, Grid, Flexbox)
JavaScript executionYesNo (HTML/CSS only)
MaintenanceYou — updates, crashes, scalingManaged — zero ops
<1.2s
Median render
vs 2-5s Puppeteer cold start
0
Servers to maintain
Fully managed infrastructure
0 MB
Your RAM usage
No Chromium in your container
$19/mo
10k renders
vs $40+ VPS for Puppeteer

Honest comparison

RendShot isn't the right tool for every job.

Puppeteer is a browser automation tool. RendShot is a rendering API. They overlap for HTML-to-image, but diverge everywhere else.

You need JavaScript execution

Use Puppeteer

Puppeteer runs JS in the page. RendShot renders static HTML/CSS only.

You need PDF generation

Use Puppeteer

Puppeteer has page.pdf(). RendShot produces images (PNG/JPEG/WebP).

You need browser interaction

Use Puppeteer

Clicking, scrolling, form filling — Puppeteer is a browser automation tool.

You need HTML → Image at scale

Use RendShot

No browser to host, no crashes, global CDN, sub-second renders.

You need URL screenshots

Use RendShot

RendShot supports both HTML rendering and URL screenshots via /v1/screenshot.

FAQ

Migrating from Puppeteer

Can I use my existing HTML templates from Puppeteer?

Yes. If your Puppeteer code sets page content with page.setContent(html), that same HTML works with RendShot. Just send it as the html parameter in your API call. The rendering engine is the same (Chromium), so CSS behaves identically.

Does RendShot execute JavaScript in the page?

No. RendShot renders static HTML + CSS. If your templates use client-side JS to modify the DOM before screenshotting, you'll need to pre-render that logic server-side and send the final HTML to RendShot. For most image generation use cases (cards, banners, reports), JS execution is unnecessary.

How does RendShot handle fonts?

RendShot auto-loads 50+ Google Fonts. If your Puppeteer setup installs custom fonts in Docker, you can either use Google Fonts (no install needed) or reference font URLs in your CSS @font-face rules. No more font rendering differences between local and production.

What about URL screenshots?

RendShot supports URL screenshots via POST /v1/screenshot. Pass a URL and optional viewport settings, and get back an image. SSRF protection is built in — private IPs and internal networks are blocked automatically.

Is there a free tier?

Yes. 100 renders per month, 10 requests per minute, 7-day image retention. No credit card required. If you're evaluating as a Puppeteer replacement, the free tier is enough to test your entire workflow.

Same HTML. No infrastructure.

100 free renders to test your migration. No credit card, no Docker, no Chromium.