← Back to the sketchboard
case study

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.

proudify.obiikriationz.com
Proudify — TALL stack certificate SaaS built with Laravel and Livewire

How it came together

  1. 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.

  2. 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.

  3. 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.

Bulk upload wizardTemplate → CSV upload → column mapping → preview → review → confirm. Behind it, queued jobs process large files chunk by chunk.
Certificates dashboardSearch and filter by name, email and status — active, expired or revoked.
Bulk upload historyEvery past batch, with its status, in one place.
Real-time notificationsA notification bell in the header that updates live.
Admin analyticsRevenue, bulk vs single issuance and daily trends, with 7, 30 and 90-day filters.
Admin tablesCertificates, templates, orders, users, subscriptions, plans and API tokens — all with live search, filters and pagination.

Making rendering fast

  1. 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).

  2. 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.

  3. 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.

  4. 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.

Visit Proudify ↗Hire a TALL stack developer