Documentation

Operations and limits

Operational limits, failure checks, and benchmark context.

Fixed limits

Limit Value
HTTP request body 1 MiB
Render data 64 KiB
One request asset 256 KiB
All request assets 512 KiB
One published object 2 MiB
One downloaded control-plane object 4 MiB
Loaded published versions 128
Loaded source, font, and static bytes 64 MiB
Concurrent compilation 4
Render deadline 10 seconds
Replica catalog reload 5 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

Symptom First check
Renderer exits at startup Check PostgreSQL, object storage, and required environment variables
502 control plane unavailable Check object hashes and PostgreSQL and storage connectivity
409 on publish Use a new immutable version name
413 Reduce request data, assets, or object size
503 template registry cache limit exceeded Change 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