Component-first PDF generation Turn your React components into a PDF API.
Push a component once. Generate invoices, reports, and contracts from any backend with a single HTTP call — no templating language, no proprietary editor, no copy of your logic to keep in sync.
No credit card required on the free plan.
$ cat Invoice.tsx
function Invoice({ payload }: { payload: InvoiceProps }) {
return (
<div className="invoice">
<h1>Invoice #{payload.invoiceNumber}</h1>
<LineItems rows={payload.items} />
<Total amount={payload.total} />
</div>
)
}$ renduo push Invoice.tsx
✓ Bundled locally with esbuild (11.8kb)
✓ Registered as tpl_8f3a2c1d
Version 1 → active$ curl -X POST /v1/generate
curl -X POST https://api.renduo.dev/v1/generate \
-H "Authorization: Bearer $RENDUO_API_KEY" \
-d '{
"templateId": "tpl_8f3a2c1d",
"payload": { "invoiceNumber": "1042", "items": [...] }
}'→ response
→ 200 OK · application/pdf · ~950ms→ saved as invoice-1042.pdf
invoice-1042.pdf
Real numbers, measured from production topology. We're pre-launch — no customer logos yet. '0 template copies' is a consequence of the architecture, not a benchmark.
The component is the template.
Most PDF APIs make you rebuild the document you already have in a templating language or a drag-and-drop editor — and keep that copy in sync by hand, forever. Renduo skips the second version entirely.
The usual way
- Rebuild your invoice in Liquid, Jinja, or a proprietary drag-and-drop editor.
- Every layout change happens twice — once in your app, once in the template.
- The two copies drift. Someone finds out in production.
Renduo
- Push the real React component your team already maintains.
- No second language, no parallel editor format, nothing to keep in sync.
- Versions are immutable — regenerate any document exactly as it was, byte-for-byte.
Three ways in, one API underneath.
However your team writes the first version, every generated document goes through the
same POST /v1/generate (or the typed @renduo/sdk).
CLI
$ renduo push Invoice.tsxCompile with esbuild on your machine and register a version from your own pipeline — scriptable, CI-friendly, git-tracked.
In-app editor
/dashboard/templates/invoice/edit
Write and preview a component directly in the dashboard. No local toolchain.
Playground
/dashboard/playground
Generate against a template your team already registered — test payloads fast.
Built like infrastructure, not a form builder.
Typed payloads & SDK
Your payload is the component's props — autocomplete and type errors in your IDE, not string-filled templates. The typed @renduo/sdk mirrors the OpenAPI contract: generate() and waitForGeneration() are compile-time checked.
Sync & async, on purpose
Sync is ephemeral by design — the PDF and the payload are never stored, only operation metadata. It's a compliance guarantee, not a gap. Async queues the job, stores the PDF for your plan's retention window, and notifies you by signed webhook.
Isolated Chrome sandbox
Your component never runs in Renduo's Node process — it renders in an isolated Chrome context with the network blocked. That's the standard HTML-to-PDF posture, applied to a full React component.
Immutable versions
Push the same slug again and you get a new version — the previous one keeps serving until you replace it. Regenerate any document exactly as it rendered, byte-for-byte.
Signed webhooks
HMAC-signed delivery with retries and exponential backoff, so you know a PDF finished without polling a status endpoint.
Custom fonts & assets
Bake your own fonts and images into the baked shell — the HTML container your component renders in — once. Every generation after that renders with your brand, not a fallback serif.
Role-scoped access
Admin, Developer, and Viewer — invite your team without sharing one API key between five people.
Turn your first component into a PDF API today.
Free plan available, no credit card required. Push a component, generate your first PDF in minutes.