Alternatives
Moving off Puppeteer
A Node library that drives headless Chrome. `page.pdf()` prints the rendered page, which means full modern CSS, web fonts and JavaScript — the document is whatever the browser shows.
Why teams move
- You are running a browser in production. Each render is a Chrome process with the memory footprint to match, and concurrency is bounded by RAM rather than by anything about the document.
- Cold starts are the usual reason people leave. In a serverless or autoscaled setting, launching Chrome dominates render time, and the workarounds — browser pools, keeping instances warm, a custom Lambda layer — are infrastructure you now maintain.
- Chrome updates change output. A patch release can shift text metrics, and a document that has to look identical this quarter and next inherits that drift.
- The page was designed for a screen. Print CSS is a second layer bolted on, and `break-inside` behaviour across pages is exactly where it is thinnest.
The checkable parts
Claims worth verifying rather than taking on trust — each links to its source, checked July 2026.
-
Puppeteer drives Chrome or Firefox; PDF generation is browser print output.
page.pdf() API ↗
What is different here
No browser in the path
Documents are compiled by a typesetting engine built for pagination. There is no process to pool, no cold start to hide, and concurrency is not a function of how much RAM a Chrome instance takes.
Deterministic across time
The same template and the same data produce the same document. Output does not move because an upstream browser shipped a release.
Paged-first, not screen-first
Repeating table headers, pinned footers and blocks that must not split are first-class parts of a design rather than print-media CSS layered onto a screen layout.
When to stay with Puppeteer
It is often the right answer. If any of these describe you, this is not a migration worth making.
- The document genuinely is a web page — you are archiving live pages, or the layout depends on JavaScript that runs at render time.
- You already operate browser infrastructure for scraping or screenshots, so the marginal cost of PDF rendering is close to zero.
- You need pixel-exact parity with what a Chrome user sees on screen. Nothing that is not Chrome will give you that.
What moving involves
- 1 The layout is authored as a template instead of a page. The HTML and its print stylesheet are the specification, not the input.
- 2 Whatever you pass to the page — props, a data object, an interpolated context — becomes the JSON body of a render request.
- 3 Browser pooling, warm-up hacks and the Chrome dependency come out of your deployment along with it.
The API reference covers authentication, the render call and error handling; the template gallery has designs to start from rather than a blank page.
Other migrations
Render one and compare
Free tier includes 2 templates and 50 watermarked PDF renders per month. No credit card required.
Start building free