05 · SaaS · Certificates · TALL stack
Proudify
A certificate platform built from scratch on the TALL stack — Laravel 12, Livewire 3, Alpine.js and Tailwind CSS. Organisations design a certificate on a visual canvas, issue it to one person or to a whole list from a CSV, and anyone can verify it publicly — no login, just a link or a QR code.

How it came together
- 01 · BriefThe problem
Issuing certificates by hand does not scale, and a PDF on its own is easy to fake. Organisations needed to design once, issue in bulk and let anyone check that a certificate is real.
- 02 · BuildWhat I built
A multi-tenant SaaS: template categories, a visual certificate builder, single and bulk issuing, public verification with a unique UUID, verification code and QR code, plus paid certificate packs, pay-per-certificate checkout and subscriptions through Razorpay.
- 03 · ShipThe result
Certificate rendering on the heaviest template went from 11.75 s to 3.2 s — about 3.6× faster — which made it possible to issue a single certificate instantly instead of queueing it.
Built with Livewire
Every screen that users and admins work in all day is a Livewire 3 component — server-rendered, reactive, and without a separate SPA to maintain.
Making rendering fast
- Step 1Dropped headless Chrome
The first version rendered PDFs and images with Browsershot, which needs a system Chrome — heavy on shared hosting. I moved rendering to a Chrome-free Node.js renderer built on Skia (@napi-rs/canvas).
- Step 2Profiled the slow template
Real profiling showed one template taking 11.75 s because of Google Fonts, the Tailwind CDN and a dead image fetch. Self-hosting the fonts (base64) brought it to 3.2 s with pixel-identical output.
- Step 3Instant issuing
With renders that fast, single-certificate issuing moved from a queued job to a synchronous request — users get their certificate immediately, no polling.
- Step 4Fixed an out-of-memory crash
On shared hosting the WASM font decoder ran out of memory. Fonts are now pre-baked to TTF at build time, and the decoder only lazy-loads for rare edge cases.