This is Part 1 of 2 β the story. Part 2 is the architecture: how it actually hits single-digit-millisecond renders.
The blog post that nerd-sniped me
It started, like a lot of bad decisions do, with a blog post at 1 a.m.
I came across Zerodha's engineering write-up, "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 β*












