Skip to content

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.

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. 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. 2 Whatever you pass to the page — props, a data object, an interpolated context — becomes the JSON body of a render request.
  3. 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