cat papyrus.svc
01 / 19
Papyrus
Enterprise-grade PDF rendering as a microservice. Post your data, get a job id, download the PDF.
- role
- creator and lead developer at BigBang.ma, v3 in active development
- year
- 2025-now
- access
- -rwx------ (private, or a company product)
- problem
- Business apps print a lot of invoices, quotes and delivery notes, and rendering PDFs inside the app makes it slow and fragile.
- approach
- Rendering as a service of its own: the app sends its data, gets a job id back at once, and downloads the PDF when it's ready. Templates are designed apart from the app.
- outcome
- v3 in active development at BigBang.ma.
TL;DR

// overview
PDF generation treated as infrastructure, like a queue or a search index. A client posts a template and its data and gets a job id straight back; the document renders in the background, ready to download or to follow live.
Templates are HTML and CSS with variants and translations, so a document's design never touches the app that prints it.
It speaks a compliance-aware format for invoices, quotes and delivery notes, built for Moroccan and international e-invoicing standards. Batches come back as a ZIP or one merged PDF.
// post, and move on
A caller sends its data and the name of a template, and gets a job id back at once. It never waits on a renderer: it can ask after the job, follow it live, or be told by a webhook when the PDF is ready to download.
Finished files don't linger. They're deleted when the job expires, so Papyrus never turns into somebody's document archive.
// one shape for every document
Business documents arrive as a docket: the issuer and the recipient, the lines (items, groups and notes), the taxes and totals, the payment details. One shape covers invoices, quotes, purchase orders and delivery notes.
The docket is strict on purpose. A misspelt field is refused with an error, instead of quietly printing a blank on a customer's invoice.
// no math, anywhere
Totals, taxes and discounts arrive already computed, and nothing downstream works them out again. An invoice is a legal document: a PDF that re-added the lines could disagree with the books by a rounding cent, and then the paper and the ledger say different things. Papyrus formats numbers; it never does arithmetic.
// design apart from data
Templates are written in HTML and CSS by people who never touch the app that prints them. A template comes in variants, a crimson one beside the classic, or takes its colours inline, and its labels are translated, the full locale first, then the bare language.
While a template is being designed, a quick preview sends the first page straight back, watermarked.
// many at once
Send a list instead of one document and it becomes a batch: the items render side by side, a failure is reported on its own without shifting the numbering of the rest, and the result comes back as a ZIP or as one merged PDF.
// stack
- python
- jinja2
- html
- css paged media
// links
closed source. nothing to link yet.