Documentation

Operations and limits

Operational limits, failure checks, and benchmark context.

Fixed limits

LimitValue
HTTP request body1 MiB
Render data64 KiB
One request asset256 KiB
All request assets512 KiB
One published object2 MiB
One downloaded control-plane object4 MiB
Loaded published versions128
Loaded source, font, and static bytes64 MiB
Concurrent compilation4
Render deadline10 seconds
Replica catalog reload5 seconds

PostgreSQL reserves catalog capacity under a transaction-scoped advisory lock. A failed publication can leave an unreferenced object in storage, but it cannot create a published manifest that points at it.

First checks

SymptomFirst check
Renderer exits at startupCheck PostgreSQL, object storage, and required environment variables
502 control plane unavailableCheck object hashes and PostgreSQL and storage connectivity
409 on publishUse a new immutable version name
413Reduce request data, assets, or object size
503 template registry cache limit exceededChange the catalog design or raise the compiled limit through a reviewed code change

Benchmark context

On an ARM64 Docker host with both renderers capped at 2 CPU and 2 GiB, a small, steady-state invoice workload measured Katagami at 1,440–2,151 requests per second. The equivalent Gotenberg HTML conversion measured 10–14 requests per second. This is a stored-template API comparison, not a general renderer-only claim.

Reproduce it with:

REQUESTS=100 CONCURRENCY=4 CPUS=2 MEMORY=2g \
  bash scripts/benchmark-gotenberg.sh