Last checked: 2026-10-20 (Puppeteer docs for v25.14.0). Every Puppeteer statement links to the official docs. Rendlet is our product, and it runs Puppeteer under the hood.
Short answer: Puppeteer is free (Apache-2.0) and gives you full control of a real browser. To print PDFs with it, though, you run and maintain Chrome yourself: the installation guide says it downloads Chrome for Testing (about 170 MB on macOS, 282 MB on Linux and 280 MB on Windows) plus a chrome-headless-shell binary. The troubleshooting guide notes that the bundled Chrome is missing shared libraries in Docker. Rendlet wraps that same setup in one HTTP call, with a free plan of 100 documents a month. If you need page JavaScript, logins, URL capture or screenshots, Puppeteer is the better tool.
| Self-hosted Puppeteer | Rendlet | |
|---|---|---|
| What you run | A Node.js service plus a Chrome binary, on your servers or in a container | Nothing: POST https://rendlet.com/v1/pdf |
| Browser download | Chrome for Testing: ~170 MB macOS, ~282 MB Linux, ~280 MB Windows, plus chrome-headless-shell (docs) | None on your side |
| Linux and Docker setup | You install Chrome's system libraries; in Docker "the bundled Chrome for Testing that Puppeteer installs is missing the necessary shared library dependencies" (docs) | Handled. Rendlet uses puppeteer-core with a serverless Chromium build on Vercel. |
| Install scripts | Package managers that block install scripts (pnpm, Yarn Berry, Bun, Deno, and npm under a new RFC) skip the browser download, and launch fails with "Could not find Chrome" (docs) | Not applicable |
| Control | Full: run JavaScript, log in, wait for selectors, capture any URL, take screenshots, set header/footer templates | HTML string or JSON template in, PDF out. JavaScript is disabled, there is no URL mode, and only data: and public https:// assets load. |
| Limits | Your hardware | Sandbox 1 page; Free 10 pages, Starter 50, Pro 200, Scale 500 per document; HTML up to 1–2 MB; 10–120 requests per minute by plan |
| Cost | Free software; you pay for the compute and the upkeep | Free: 100 docs/month. Paid: $7 (1,000), $19 (5,000), $59 (25,000) per month, hard caps, never billed for overage |
| Data location | Stays in your infrastructure | Your HTML is sent to Rendlet (hosted on Vercel); see privacy |
| Extras | The whole Chrome DevTools Protocol | Built-in invoice and itinerary JSON templates (no browser needed), Noto Sans SC for Simplified Chinese, base64 responses for agents, OpenAPI 3.1, MCP endpoint |
429 at the cap instead of a surprise bill.// Puppeteer (self-hosted)
import puppeteer from "puppeteer";
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setContent(html, { waitUntil: "networkidle0" });
const pdf = await page.pdf({ format: "A4", margin: { top: "15mm", right: "15mm", bottom: "15mm", left: "15mm" } });
await browser.close();
// Rendlet (hosted): no browser to install
const res = await fetch("https://rendlet.com/v1/pdf", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.RENDLET_API_KEY ?? "sandbox"}`, "Content-Type": "application/json" },
body: JSON.stringify({ html, options: { format: "A4", margin: "15mm" } }),
});
const pdf2 = Buffer.from(await res.arrayBuffer());
More snippets (curl, Node.js, Python) are on the sandbox page. Moving from wkhtmltopdf instead? See Rendlet vs wkhtmltopdf.
puppeteer-core and @sparticuz/chromium on Vercel functions.