Typefold and headless Chrome, measured.

We rendered the same invoice with Typefold and with headless Chrome on the same server, and measured speed, file size, memory and start-up time. Here are all the numbers, including where Chrome wins.

Measured on 14 October 2026.

The short version.

Where Typefold is ahead

  • About 4 to 6 times faster than Chrome opening a new page for each document, the usual way to keep documents apart: 24 ms on average against 92 to 152 ms for a one-page invoice.
  • About 4 times smaller files: 20 KB against 77 KB for the same invoice.
  • Flat memory: the render process grew by less than 1 MB over 1,000 documents. Chrome reusing one page grew by more than 1 GB.
  • The same bytes every time: the same request gives a byte-identical PDF.

Where Chrome is ahead

  • A warm, reused Chrome page is as fast on a one-page invoice (22 ms each), and about 2.4 times faster on a 13-page document. Reusing one page shares state between documents and kept growing in memory.
  • Cold start: from a new process to the first PDF, Chrome takes 550 to 690 ms and Typefold about 790 ms. The hosted service keeps its engine warm, so you don't wait for this.

A one-page invoice.

Median time to render one invoice, one request at a time, after warm-up. Shorter is faster.

  • Typefold22.0 ms
  • Chrome headless shell, one reused page22.0 ms
  • Chrome, one reused page39.3 ms
  • Chrome headless shell, new page per document89.3 ms
  • Chrome, new page per document149.8 ms
SetupMedian ms95th pct. msMean msPDFs per secondPDF bytes
Typefold engine22.034.323.941.919,968
Typefold API, end to end86.7108.387.911.419,968
Chrome headless shell, one reused page22.027.022.145.277,359
Chrome headless shell, new page per document89.3108.591.510.977,359
Chrome headless shell, new context per document90.2105.190.111.177,359
Chrome, one reused page39.346.439.625.377,464
Chrome, new page per document149.8177.4152.46.677,464
Chrome, new context per document159.8183.2160.66.277,464

"Typefold engine" is the render step alone. "Typefold API, end to end" is a full HTTP call: sign-in check, template, saving the job, queueing, rendering, storing the file and the response. The engine took about 24 ms of those 87 ms. Chrome rows are the bare page.pdf() call, so compare them with the engine row.

A long invoice.

The same template with 200 lines. Chrome with one reused page, its fastest setup, is about 2.4 times faster here.

SetupMedian ms95th pct. msMean msPDF bytes
Typefold engine (13 pages)245.3318.3250.272,711
Typefold API, end to end (13 pages)357.2459.6369.472,711
Chrome headless shell, one reused page (12 pages)102.6135.2105.0111,030
Chrome, one reused page (12 pages)116.9152.2121.7111,135

The fonts differ (see the notes below), so Typefold lays the document out on 13 pages and Chrome on 12. Part of the gap is the extra page.

Memory over 1,000 documents.

Proportional memory (PSS) in MB, after 20 warm-up renders and after 1,000 more invoices.

SetupBeforeAfter 1,000Notes
Typefold render process in the running service280.1280.7It had already rendered about 300 documents before the run.
Typefold engine in a new process193.9320.0The engine's own memory stayed at 27 MB; the rest is the new process settling in.
Chrome, new page per document267.6273.2Eight processes. 191 MB when idle.
Chrome, one reused page313.01,436.4Grows about 1.1 MB per document.

Chrome with a new page per document stays flat too, but it is the slow setup above. Chrome's memory is summed over all of its processes.

Cold start.

From starting a new process to having the first invoice, in ms. Median of six runs, with the range.

SetupTo first PDFRangeEngine or browser startFirst render
Typefold794771–929181217
Chrome691665–761149169
Chrome headless shell551499–6127097

Loading the code takes about 350 ms on both sides. Typefold's first render is slower because WebAssembly is still being optimised; after warm-up it takes about 22 ms.

Excel workbooks.

A formatted sales workbook through the API, end to end. Chrome has no Excel output.

WorkbookMedian ms95th pct. msFile bytes
Monthly sales, 6 rows41.253.78,398
Monthly sales, 10,000 rows2,623.52,974.0282,409

How we measured.

Server
Cloud VM with 4 vCPUs (Intel Xeon, 2.1 GHz) and 16 GB of memory, Linux 6.18
Runtime
Node.js 24.22
Chrome
Chromium 141 through Playwright 1.63, both the full browser and the headless shell
Document
A one-page A4 invoice with four lines, a QR code and a footer with page numbers
  • Both sides got the same final HTML and CSS: the exact request Typefold's renderer received after the template was filled. Chrome loaded it with setContent and printed it with page.pdf(), with the same page size, margins and footer.
  • Each speed figure is 200 renders after 20 warm-up renders (50 after 5 for the long invoice and the large workbook), one at a time. We did not measure parallel throughput.
  • Chrome ran in three setups: one page reused for every document, a new page per document, and a new browser context per document. The last two keep documents apart, as a service needs to.
  • We checked page 1 of every output by eye. Both sides produced the same layout and content.

What to keep in mind.

Try it with your own documents.

Start building