Comparison
A hosted alternative to Gotenberg
Gotenberg is an excellent open-source PDF service. The cost shows up elsewhere: you run the Docker container, you manage the RAM each Chromium instance needs, you handle health checks and scaling, and you absorb a cold start on every deploy. For most teams that operational tax is not worth it. PDFPipe is the same idea, hosted, with several long-standing Gotenberg bugs already fixed.
Self-hosted versus hosted
| PDFPipe | Self-hosted Gotenberg | |
|---|---|---|
| You run | Nothing | A Docker container sized for Chromium |
| Scaling | Automatic | Your problem (Prometheus config required) |
| Cold starts | None you see | On every deploy and scale-up |
| Cost | Flat per document, free below 500/mo | Free software, paid infrastructure and ops time |
| Memory leaks | None (managed renderer) | Open issue, known to require container restarts |
| Duplicate image bloat | Fixed (deduplicate_images option) | Open issue #1077, no fix |
| Digit rendering | Consistent (tabular_nums option) | Known inconsistency, open issue #921 |
| Running headers/footers | Yes (header_html / footer_html) | Partial (limited template substitution) |
| PDF merge | Yes (/v1/pdf/merge) | Merge via Chromium only, no post-processing |
| PDF/A output | Best-effort (pdf_a option) | No |
| Security | SSRF-sandboxed by default | You configure it |
| AI agents | MCP server (npx pdfpipe-mcp-server) | None |
Gotenberg issues that are fixed in PDFPipe
These are open issues in Gotenberg that affect production deployments. PDFPipe does not have these problems because the renderer is managed infrastructure, not a process you operate.
Memory leaks requiring container restarts
Gotenberg's Chromium pool leaks memory under sustained load. Teams running Gotenberg in production report needing scheduled container restarts or Kubernetes liveness probes to recover. PDFPipe manages the renderer: you never touch it.
Blank PDFs after version upgrades
Several Gotenberg versions have shipped with a regression that produces blank PDFs for specific HTML inputs. Diagnosing this requires rolling back the container version and diffing Chromium builds. PDFPipe upgrades are invisible to you.
Duplicate image bloat (issue #1077)
Chromium embeds the same image multiple times when it appears on multiple pages. A 200KB logo on a 50-page invoice inflates the output by ~10MB. PDFPipe's deduplicate_images option post-processes the PDF with pdf-lib to merge identical image XObjects.
Inconsistent digit rendering (issue #921)
Gotenberg inherits a Chromium bug where proportional digits render at slightly different widths, breaking column alignment in tables and invoices. PDFPipe's tabular_nums option injects font-variant-numeric: tabular-nums globally to fix it.
Large file failures (-32000 errors)
Gotenberg returns Chromium's internal -32000 error for HTML above a certain size. PDFPipe returns a structured 413 with a clear message and the exact limit so you can debug without reading Chromium internals.
The request looks familiar
curl -X POST https://api.pdfpipe.xyz/v1/pdf \
-H "Authorization: Bearer pp_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"html": "<h1>Invoice #1042</h1>",
"options": {
"format": "A4",
"header_html": "<div style=\"font-size:10px;text-align:right;width:100%\">Page <span class=\"pageNumber\"></span> of <span class=\"totalPages\"></span></div>",
"deduplicate_images": true,
"tabular_nums": true
}
}' \
--output invoice.pdfWhen to keep Gotenberg
If you need full data sovereignty, run very high volume where per-document pricing adds up, or require LibreOffice document conversion (DOCX, XLSX to PDF), self-hosting Gotenberg wins. PDFPipe is the better trade when you would rather ship product than operate a rendering service.
Try it on the live playground with no signup.
See pricing →