Comparison
kove vs Puppeteer
Puppeteer (and Playwright) drive a headless Chrome browser. Calling page.pdf() is the easy part. The hard part shows up on page two: the table header is gone, totals get orphaned at the bottom, rows get cut in half, and you end up writing CSS for break-inside and page-break and repeated headers. Then you have to run and scale headless Chrome in production, with the memory, crashes and concurrency limits that come with it.
kove is a hosted document API. You send a JSON document and get a finished PDF back. Pagination, repeating headers, page numbers and the polish are handled for you, and we run all the infrastructure, so there is no browser for you to host or scale. kove also ships AI-friendly docs (llms.txt, an OpenAPI spec and a simple JSON model), so your coding agent can integrate the hosted API into your app for you: you say what you need, it wires the call in, you review and ship. A CLI covers local and CI runs.
Side by side
| Feature | kove | Puppeteer |
|---|---|---|
| How you build the document | Send JSON, declarative | Write HTML and CSS by hand |
| Pagination (repeating headers, page numbers, no orphans) | Handled for you | You write the CSS |
| Infrastructure | Hosted, we run and scale it | You run and scale headless Chrome |
| AI integration | Your agent wires the hosted API into your app | No, you script it yourself |
| Pixel-level control of every element | Document model plus an HTML escape hatch | Full, you control all the markup |
| Cost | Pay-per-use hosted API, free CLI for local and CI | Free library, plus your time and your servers |
When Puppeteer is the better choice
Use Puppeteer or Playwright when you need full browser automation, not just documents: scraping, testing, screenshots, or driving a real page. It is also a fair pick when you already run headless Chrome, need total control of the markup, or have a one-off job and do not want an external service.
Send JSON. Get a finished PDF.
A hosted document API. Your coding agent wires it into your app for you, with no infra to run.