mrkeyoor.com_
Tue 01 Sept 17:40 UTC
Self-Hostedevaluationupdated 26 Aug 2026

gotenberg review

Gotenberg is a self-hosted HTTP service that converts web pages, HTML, Markdown, and office documents into PDFs. Its container bundles Chromium, LibreOffice, and PDF tools so an application can upload files or a URL and receive a finished document without managing those engines itself.

+38stars / 7d
Verdict

Our Gotenberg checkout added 11 npm packages in 12 seconds with 0 known audit findings, but it exposed no npm build or test target and therefore did not exercise the document server. Judge Gotenberg through its pinned container: it is a strong choice when one internal API must handle both browser and office conversion, provided exact source fidelity is tested. Keep URL egress restricted and run a representative PDF comparison before every image upgrade.

We ran it

Lab card: what happened when we ran gotenbergScreenshot of gotenberg (gotenberg.dev)
Install✓ · 12s11 packages · 27 MB
Buildn/ano build script
Testsn/ano test script
Known vulns00 critical · 0 high · 0 moderate · 0 low (npm audit)
Repo390 files~39,332 lines of source · 4.8 MB · 3 CI workflows · tests dir

Answers from our run

Does gotenberg build from source?

Dependencies installed in 12 seconds (11 packages), and the project has no separate build step. We cloned commit 0b16b0a into a clean Debian container with 3 CPUs and no project-specific setup.

Does gotenberg have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Does gotenberg have known vulnerabilities in its dependencies?

npm audit found none in the dependency tree at the time of our run.

Who should not use gotenberg?

Teams requiring pixel parity with Microsoft Office: issue 1342 reports an A4 DOCX becoming Letter because LibreOffice renders it that way, and issue 1389 reports different equation spacing.

What are the alternatives to gotenberg?

WeasyPrint, Browserless, pdfcpu. Our Gotenberg checkout added 11 npm packages in 12 seconds with 0 known audit findings, but it exposed no npm build or test target and therefore did not exercise the document server.

Setup4/5One container starts the API; production policy and fonts add work
Docs5/5Clear routes, container start, modules, options, and security controls
Community5/512,940 stars, August 2026 release and push, active reports
Maturity4/5Broad version 8 API, with renderer-specific output regressions

Discussed on

  1. hnGotenberg: A Docker-powered stateless API for PDF files4 points

Who it’s for

Backend teams that want one HTTP boundary around Chromium and LibreOffice conversion.
Self-hosters generating invoices, reports, previews, or archival PDFs from several input formats.
Applications that also need PDF merge, split, rotate, flatten, watermark, encryption, or metadata operations.
Operators prepared to pin a container version and compare output against representative source documents.

Who it’s NOT for

Teams requiring pixel parity with Microsoft Office: issue 1342 reports an A4 DOCX becoming Letter because LibreOffice renders it that way, and issue 1389 reports different equation spacing.
Workloads that cannot tolerate browser-engine regressions: issue 1491 reports blank sections with backdrop-filter after a Chromium change and recommends pinning an older image.
Anyone expecting OCR or digital signatures in the current API: those remain open feature requests rather than documented capabilities.
Operators who cannot control outbound requests: URL conversion launches Chromium, and v8.36.0 fixed WebSocket handshakes that bypassed the existing outbound policy.
Developers judging the product from our npm checks alone: those installed 11 packages but did not build or exercise the Go service, Chromium, LibreOffice, or a published container.

Setup reality

Our sandbox npm install succeeded in 12 seconds, adding 11 packages and using 27 MB. Npm audit found 0 known vulnerabilities. There was no npm build script or target, so we skipped that step; there was also no npm test script or target, so we skipped tests. The 4.8 MB checkout contained 390 files and about 39,332 source lines, with 3 CI workflow files, a Compose file, a tests directory, and no Dockerfile detected by our scan.

The documented product path is the published gotenberg/gotenberg:8 container, not the small npm dependency set our generic harness found. It exposes port 3000 and accepts multipart requests. Production should pin a specific image, set resource limits and timeouts, and configure authentication plus outbound restrictions.

Chromium and LibreOffice decide much of the rendering behavior. Custom fonts must be installed in the image, office layout follows LibreOffice rather than Microsoft Office, and URL conversion needs controlled network access. Test every document family before upgrading.

One API contains Chromium, LibreOffice, and PDF tooling

Gotenberg accepts multipart HTTP requests and returns PDFs. Chromium handles URLs, HTML, Markdown, and screenshots. LibreOffice handles more than 100 office formats. PDF engines merge, split, rotate, flatten, watermark, stamp, encrypt, optimize, and edit metadata or bookmarks. Putting those programs behind one service is easier to operate than embedding browser launches and office processes inside every application worker.

The README's quick start is a single container command exposing port 3000, followed by a form upload to a route. That is genuinely simple for a trial. Production still needs an image pin, queue or concurrency policy, CPU and memory limits, request-size limits, timeouts, authentication, logs, and a storage cleanup plan. Gotenberg removes engine packaging from the calling application; it does not remove document-processing operations.

Browser output and office output follow different engines

HTML users get a modern browser engine, which suits JavaScript-heavy pages, web fonts, and applications already designed for Chromium. Office documents go through LibreOffice. That boundary matters because a DOCX can render differently from Microsoft Word even when its content is valid. Issue 1342 describes an A4 document coming out as Letter, matching LibreOffice's local result. Issue 1389 reports different spacing for mathematical equations.

The current release is v8.36.0, published August 14, 2026. It added image optimization, repeated watermarks and stamps, single-element screenshots, merge bookmarks, storage clearing, and OIDC bearer authentication. It also fixed landscape single-page sizing, some PowerPoint show extensions, workbook rendering, and client-cancelled status handling. This is an actively developed version 8 service, not a frozen wrapper around two old binaries.

What happened when we ran it

Our Node 22 harness completed npm installation in 12 seconds. It added 11 packages, used 27 MB on disk, and npm audit found 0 known vulnerabilities. The checkout contained 390 files, about 39,332 source lines, and occupied 4.8 MB. Our scan found 3 CI workflow files, a Compose file, and a tests directory, though it did not detect a Dockerfile.

There was no npm build script or target, so we skipped the build. There was also no npm test script or target, so we skipped tests. These results cover the small npm surface detected by our generic sandbox, not the Go application or the published image. We did not start Chromium, invoke LibreOffice, convert a file, or inspect a PDF. The 0-audit result must not be read as a container or system-package security scan.

The documented deployment route pulls gotenberg/gotenberg:8, while a serious deployment should pin the full version or digest. The floating major tag can change Chromium, LibreOffice, fonts, and internal PDF tools without an application-code change. The repository's 12-second npm result tells you almost nothing about that upgrade risk. A golden set of source files and rendered PDFs is the useful acceptance test.

URL conversion requires an outbound security policy

Converting a user-supplied URL asks Chromium to make network requests. That can expose private services or metadata endpoints unless egress is constrained. Release v8.36.0 fixed WebSocket handshakes so they are checked by the outbound policy rather than bypassing it. The fix is a concrete reason to stay current and to test HTTP, redirects, WebSockets, DNS changes, and blocked private ranges rather than relying on one successful URL fetch.

The same release added optional OIDC bearer authentication, mutually exclusive with basic authentication. Put the service on a private network even when auth is enabled, because uploaded files and returned PDFs may contain sensitive business data. Separate callers by credentials where possible, limit accepted destinations, and avoid exposing the conversion endpoint directly to browsers. A document API is often an internal dependency, not a public upload product.

Renderer upgrades can change valid output

Issue 1491 reports blank PDF sections involving CSS backdrop-filter after the floating version 8 tag brought a newer Chromium; the reporter says pinning 8.26.0 avoided the regression. Issue 1371 reports custom fonts no longer loading after an upgrade past 8.21.1 in one image customization. These reports do not prove every document is affected, but they show why a 200 response and nonempty PDF are weak release gates.

For web output, compare page count, dimensions, screenshots, text extraction, links, and font names. For office documents, include tables, equations, headers, embedded fonts, tracked changes, spreadsheets, and page-size variants. Issue 1175 also reports a LibreOffice conversion hitting a 30-second client timeout. Timeouts should distinguish a complex but valid conversion from a wedged engine, with caller retries designed to avoid duplicate work.

PDF operations are broad, while OCR and signing remain outside

Gotenberg can work on existing PDFs as well as create them. The README names merge, split, rotate, flatten, watermark, stamp, encryption, PDF/A, PDF/UA, screenshots, metadata, and bookmarks. Version 8.36.0 added image optimization across several routes. This breadth makes the service appealing when an application otherwise needs both a renderer and a separate PDF utility process.

OCR and digital signing are different jobs. Issue 1454 asks for OCR support, and issue 401 asks for digital signatures. They should be read as requests, not current features. If searchable scans or certificate-backed signatures are mandatory, pair Gotenberg with a focused tool or choose another pipeline. Do not mistake PDF/A or PDF/UA options for OCR or cryptographic signing.

Active maintenance supports a pinned production trial

GitHub showed 12,940 stars and 28 combined open issues and pull requests. The repository's latest recorded push was August 21, 2026, one week after v8.36.0. Current issue activity covers security scanning, conversion timeouts, renderer fidelity, fonts, and proposed version 9 changes. The version 9 issue explicitly says its list may change, so it is a roadmap discussion rather than a promise.

Gotenberg is easy to recommend for an internal service that needs both web and office conversion. The condition is disciplined pinning and output comparison. Start the exact image, restrict outbound access, install the fonts you own, and run a golden document set. If those PDFs survive an upgrade review, the single API is likely worth the container's size and moving renderer parts.

Alternatives

ProjectWhat it isPick it when
WeasyPrintA Python HTML and CSS print renderer with strong paged-media support.pick this instead when HTML-to-PDF is the only job and CSS print features matter more than browser parity or office documents.
BrowserlessA hosted or self-hosted browser service for automation, screenshots, and PDF generation.pick this instead when general browser automation is required alongside PDFs.
pdfcpuA Go PDF processing library and command line tool for manipulating existing PDFs.pick this instead when you only need merge, split, optimize, watermark, or validation operations without document rendering.

What people are saying

  1. [github-trending] gotenberg/gotenberg

Sources

  1. Gotenberg repository and README
  2. Gotenberg v8.36.0 release
  3. Chromium rendering regression report
  4. Office page-size report
  5. LibreOffice timeout report
  6. Gotenberg introduction documentation

More self-hosted reviews

v2 · OpenShell · wigolo · Mindwtr · club-3090 · reclip · the whole board →