"1.5 million PDFs in 25 minutes." It describes how they tore headless Chrome out of their PDF pipeline, tried LaTeX, and eventually landed on
Typst — a modern, open-source typesetting engine written in Rust. The number that stuck with me: a 2,000-page document that took
18 minutes to render with LaTeX came back in about
1 minute with Typst, out of a tiny statically-linked binary.
Around the same time, I read how Zomato had rebuilt their own PDF pipeline — they call it "Espresso" — to render and sign over a million PDFs in minutes.
Two of the biggest engineering teams I knew of, both ripping out their document stacks for the same reason: generating PDFs at scale had quietly become a serious bottleneck. And they'd taken different roads — Zomato squeezed every drop of performance out of headless Chromium with Go; Zerodha abandoned the browser entirely.
I couldn't stop thinking about it.
So I had to see it myself
The claims sounded too good, so I did the obvious thing: I tried Typst on my own machine.
A document that took a few seconds to render through a headless browser was ready in milliseconds — and it looked perfect every single time. I'd braced for "a bit faster." This wasn't a bit faster. It was a different category of thing. Once you've watched a browser screenshot-a-document next to a native engine compile one, you can't unsee the gap.
That was the moment the rabbit hole opened.
The catch nobody mentions
Here's the part that complicates the happy ending: Typst is a language.
It's a beautifully designed one — far saner than wrestling LaTeX or hand-tuning HTML/CSS for print. But it's still something you have to sit down and learn. And the more I thought about who actually needs documents, the more that bothered me.
The person who needs an invoice, a receipt, a contract, or an event ticket is usually not the person who wants to learn a typesetting language. They're founders, ops people, designers, marketers. They have a layout in their head and a pile of data in a database. Asking them to learn Typst syntax to get a PDF is like asking someone to learn PostScript to print a letter. They'll never do it — and honestly, they shouldn't have to.
So the speed was incredible, but it was locked behind a wall most people would never climb.
The idea: Typst's speed, without ever touching Typst
That gap became the entire idea. What if you could get all of Typst's speed without ever writing a line of Typst?
I started with a rough proof-of-concept: a visual, drag-and-drop builder that quietly compiled down to Typst under the hood. You drag in a few blocks — a header, a table that expands to fit line items, a totals row — bind them to a JSON payload, and hit generate.
The moment that POC actually worked — I dragged a few blocks around, clicked generate, and a clean PDF popped out in milliseconds — I knew this had to exist as a real product. Not a script in my side-projects folder. A real thing other people could use.
What it became
That's Cellystial: a drag-and-drop visual builder and a fast REST API, both sitting on top of a native Rust + Typst engine. You design a template visually (or drop down to raw Typst if you want), then generate pixel-perfect invoices, receipts, contracts, certificates, and tickets at scale — by sending a JSON payload to a single endpoint. No browser anywhere in the pipeline. No Typst syntax required.
The whole thing is built around one belief I picked up that first night: performance is a feature, not a tuning project you get to later.
It's live
Full transparency, because build-in-public should mean it: Cellystial is live in production right now, and I'm just starting to get it in front of people. This post is part of that.
So if you've ever fought headless-Chrome memory leaks, babysat zombie browser processes, or watched an invoice layout drift a pixel after a Chromium bump — I would genuinely love for you to come kick the tires and tell me where it breaks: cellystial.com (the free tier needs no credit card).
And to the Zerodha and Zomato engineering teams whose blogs kicked this whole thing off — if we ever cross paths, the coffee's on me. ☕
Next post — **Part 2: the architecture.* Why I threw out the browser, how the Rust + Typst engine is wired, and the warm-worker-pool trick that keeps renders in single-digit milliseconds even for untrusted, user-authored templates. Read Part 2 →*