A Gotenberg alternative for documents built from data

If you run Gotenberg only to turn your own data into invoices, receipts or reports, Quire removes both the container and the HTML templates; you send JSON to a hosted API and get a PDF back. If you convert Office documents, HTML or URLs, manipulate existing PDFs, or need everything inside your own network, Gotenberg is the better tool.

What Gotenberg is

Gotenberg is an open-source, Docker-based API for converting documents to PDF. You send files as multipart/form-data and get a PDF back. It bundles two engines and a set of PDF tools:

  • Chromium converts URLs, HTML and Markdown to PDF, and takes screenshots.
  • LibreOffice converts Office documents to PDF.
  • PDF tools merge, split, watermark, encrypt and edit metadata, and support Factur-X/ZUGFeRD e-invoices.

It’s MIT-licensed and actively maintained, with regular releases (8.37.0 at the time of writing). An HTML conversion looks like this (docs):

curl --request POST http://localhost:3000/forms/chromium/convert/html \
  --form [email protected] \
  --form [email protected] \
  -o invoice.pdf

You still write index.html, and its header and footer, and fill them with your data before each call.

What running it takes

From Gotenberg’s own installation guide:

  • On Kubernetes, allocate at least 512 Mi of memory and 0.2 CPU; on Cloud Run, at least 1 Gi.
  • There are smaller image variants: chromium (about 30% smaller than the full image, no Office conversion) and libreoffice (about 40% smaller, no HTML or URL conversion).

The troubleshooting guide notes that Office conversion is resource-heavy and that a page which crashes Chromium every time “usually exhausts the container’s memory”. That’s the normal cost of running a browser and an office suite, and Gotenberg packages it well. It’s still a service you deploy, scale and patch.

How Quire is different

Quire doesn’t convert files. It takes the data and produces the document:

curl https://api.quirepdf.dev/v1/render \
  -H "Authorization: Bearer $QUIRE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "date": "30 Sep 2026",
    "period": "1 Sep – 30 Sep 2026",
    "due_date": "15 Oct 2026",
    "currency": "$",
    "opening_balance": 1250,
    "seller": { "name": "Cascade Coffee Roasters", "email": "[email protected]" },
    "customer": { "name": "Little Owl Café", "account": "C-0192" },
    "entries": [
      { "date": "4 Sep", "reference": "INV-2026-0431", "description": "Wholesale order", "charge": 860 },
      { "date": "12 Sep", "reference": "PAY-88120", "description": "Payment, thank you", "payment": 1250 },
      { "date": "26 Sep", "reference": "INV-2026-0467", "description": "Wholesale order", "charge": 1340 }
    ]
  }' \
  -o statement.pdf

Quire detects a statement of account, computes the running balance from opening_balance, and lays out a balance-due panel and an activity table that repeats its header across pages. Data that isn’t a standard document gets a generic layout of key/value sections and tables.

Gotenberg Quire
Input HTML, URLs, Markdown, Office files, PDFs A JSON object
You maintain HTML templates, plus the container and its scaling The JSON you send
Output PDF from any source, PDF manipulation, screenshots PDF, or a PNG of one page, from seven built-in layouts
Validation Converts what you send Data checked against the template’s schema; every problem listed with its field path
Interface HTTP API, multipart/form-data HTTP API with JSON, plus TypeScript and Python SDKs with types per template, a CLI and an MCP server
Where it runs Your infrastructure Hosted API
Memory At least 512 Mi per instance (docs) Nothing to run
Cost Free (MIT), plus your infrastructure Free to build (unlimited test renders, 20 PDFs a month), then from $19 a month

Speed

Quire typesets with a compiled engine instead of a browser. Measured on a laptop, October 2026: a one-page invoice in 4.2 ms at the median, a 14-page, 300-item invoice in 48 ms, and a median of 16.6 ms end to end over HTTP for 400 requests at a concurrency of 8, with the server at 54 MB of memory. On the hosted API, add your network round trip. We haven’t benchmarked Gotenberg, so we don’t quote a figure for it.

Moving from Gotenberg to Quire

This applies when your Gotenberg calls send HTML that you generate from data:

  1. Send the data instead of the HTML. The object you pass to your HTML template is the JSON body.
  2. Match a gallery template if one fits. Statements, invoices, receipts, quotes, credit notes and certificates each have one; see the gallery or run npx quirepdf-cli templates statement.
  3. Shape everything else for the generic layout: add title, from, to and currency, and order keys the way you want the sections. See Templates and layout.
  4. Keep Gotenberg for the rest if you also convert Office files or merge PDFs. The two work side by side.

When Gotenberg is the better choice

  • You convert Office documents. Word, Excel and PowerPoint to PDF is LibreOffice’s job; Quire doesn’t take files.
  • You convert HTML, Markdown or URLs, including your own designs. Quire has seven layouts and no custom template upload yet (it’s on the roadmap).
  • You manipulate PDFs: merging, splitting, watermarking, encrypting, or producing Factur-X/ZUGFeRD e-invoices.
  • Data can’t leave your network. Gotenberg runs on your infrastructure. Quire is a hosted API, and self-hosting isn’t offered yet; it doesn’t store your data or documents, but they are sent to it.
  • You need Letter or other paper sizes. Quire’s layouts are A4.
  • You already run Gotenberg with spare capacity, so each extra conversion costs you nothing.

Rendering with a browser in your own code instead? See Quire compared with Puppeteer and Playwright.

Try it

npx quirepdf-cli login [email protected]
npx quirepdf-cli templates statement --sample > statement.json
npx quirepdf-cli render statement.json --open

The Render API reference lists every parameter, header and limit.