Keep Chromium’s output. Drop Chromium’s infrastructure.
Nobody chooses to run a headless-browser fleet. You needed PDFs, Puppeteer made beautiful ones on your laptop, and six months later your on-call rotation knows the shape of a Chromium OOM crash by heart. The rendering was never the problem — the infrastructure is.
What you’re actually operating
- ~1–2 GB of memory per browser instance under load, and OOM kills when you guessed low
- A 170–280 MB Chromium binary squeezed into Lambda layers or container images
- Roughly a full CPU core per concurrently rendering page
- Memory that creeps until the pod restarts — pages left open, zombie renderer processes, event-listener buildup
- Chromium security upgrades on your calendar, forever
The same render, as one HTTP call
// Before: your service owns a browser fleet
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({
args: ['--no-sandbox', '--disable-dev-shm-usage'], // and 12 more flags
});
const page = await browser.newPage();
await page.setContent(html, { waitUntil: 'networkidle0' });
const pdf = await page.pdf({ format: 'A4', printBackground: true });
await page.close();
// ...plus pooling, recycling, zombie reaping, memory alarms, Chromium upgrades
// After: the fleet is our problem
const res = await fetch('https://api.nippypdf.com/v1/pdf', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.NIPPYPDF_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
html,
format: 'A4',
print_background: true,
wait_until: 'networkidle',
}),
});
const pdf = Buffer.from(await res.arrayBuffer());
NippyPDF runs a managed pool of current Chromium instances — the same
print pipeline as page.pdf() — behind
POST /v1/pdf. Memory pressure, browser recycling and crash
recovery are our pager, not yours. Pricing is pay-as-you-go at around
$0.003/document with 500 documents/month free —
compare that with the EC2/Lambda line item your PDF service bills you today.
Try your own template in the live demo, or grab a working sample in Node.js, Python, PHP, Ruby, C# or Go.
FAQ
Will the output differ from my current Puppeteer PDFs?
It should be near-identical: NippyPDF renders with the same engine family — headless Chromium — using the same print pipeline as page.pdf(). Options map one-to-one (format, margins, print backgrounds, wait conditions), so migration is usually mechanical.
When should I keep self-hosting Puppeteer?
Honestly: if you already have a hardened browser pool with monitoring, recycling and capacity headroom, and the ops cost is sunk, keep it. Self-hosting also wins if your HTML must never leave your network. NippyPDF is for the other 90% of teams, whose Puppeteer service exists only because PDFs were needed and nobody wanted to pay 12¢/doc.
What does Puppeteer PDF infrastructure actually cost?
Typical numbers: Chromium wants around 1–2GB of memory per instance under load and roughly a full CPU core per rendering page. On Lambda, that means high-memory functions, ~170–280MB of browser binary in layers or container images, and slow cold starts. The bigger cost is engineering time: OOM pages, zombie processes, memory-leak hunts and Chromium upgrades.
Is NippyPDF available today?
It is pre-launch. The waitlist is open, early-access keys go out in batches, and early signups lock in launch pricing of roughly $0.003 per document with 500 documents/month free.
Ready to hand off the browser fleet?
NippyPDF is a managed Chromium rendering core behind a single
POST /v1/pdf — no browser fleet, no page-break roulette,
around $0.003/document.
Try the live demo Join the waitlist Keeping Puppeteer for now? Fix the memory leaks →
Get early access to NippyPDF
Pre-launch. Join the waitlist and lock in early-access pricing — we email once, when your key is ready. No spam.