Dev.to AI 🤖 Ai 👁 0 📖 4 min read

CertProof: 2,000 Teams Signed Up for Our Hackathon. Nobody Wants to Proofread the Certificates.

What I Built CertProof makes certificates for events, then checks its own work. You pick a style (or describe one and let the AI design it), add your logo and signatures, and upload a list of names. It builds a print-

CertProof: 2,000 Teams Signed Up for Our Hackathon. Nobody Wants to Proofread the Certificates.

What I Built

CertProof makes certificates for events, then checks its own work.

You pick a style (or describe one and let the AI design it), add your logo and signatures, and upload a list of names. It builds a print-ready PDF, then reads every page back and compares it to your list. If a name is missing, repeated or got cut off, it tells you which page.

It also has a blank-name mode for when you'd rather write the names by hand, and a checker for certificate PDFs made in some other tool.

Who would pay? Anyone who hands out certificates in bulk and can't afford a mistake: college clubs, hackathon and workshop organisers, small training companies. A wrong name on 300 printed certificates is expensive and embarrassing. I haven't sold one yet, so that's my guess, not proof.

Pick a style and the preview updates as you type. No refresh button.

After export, every page gets a status. This is one batch of seven certificates.

A very long name got shrunk to fit, so the page is flagged for a human to look at. It isn't silently passed.

The checker also works on PDFs made somewhere else. This test batch has a repeated page, a misspelled name, an extra page and two missing people. It catches all of them.

All names in these screenshots are made up.

Demo

Code

CertProof

Describe an event, add your branding and recipients, and get a checked batch of printable certificates — or export certificates with an empty name area to fill in by hand. You can also check a certificate batch made elsewhere (spreadsheet + searchable PDF) for missing, repeated, unexpected and altered certificates.

  • Local-first, single user. No account, no cloud database, no paid API. Recipient lists and signature images stay on your computer.
  • A local open-weight model (default gemma3:4b via Ollama) proposes a design and a column mapping Everything that matters afterwards — rendering, matching, verification — is deterministic code. The app works without the model.
  • The PDF is the print master. After rendering, a separate verifier re-reads the actual PDF bytes and compares what is printed with what you confirmed.

Status (15 Oct 2026). Built and tested on Linux (Python 3.13, Chromium 141). Not yet run on Windows 11,…

How I Built It

  • Model: Gemma 3 (4B) running through Ollama on my laptop. It only designs the look. It answers with a list of choices (frame, corners, colours, fonts, spacing) and my code turns those into the page. It never writes HTML, and the design call never sees the names.
  • PDF: Chromium (Playwright) draws every certificate.
  • The check: pdfplumber reads the finished PDF back and compares each page to the source row. That's the whole point of the product.
  • Rest of it: React and TypeScript on the front, FastAPI and SQLite on the back, 116 tests.
  • I built it with Claude Code.

My first real run with Gemma failed twice. It gave me a spacing value of 90 when the setting is a multiplier around 1.0, and then picked a pale yellow that you couldn't read on white. So now the code repairs small mistakes and fixes low contrast instead of throwing the answer away. The model still makes the creative choices. The code keeps them printable.

A 4B model's taste is hit and miss, so there are four finished styles to fall back on.

Why Does Open Innovation Matter?

A list of participants is personal data: names, colleges, sometimes ID numbers. With open weights the model runs on the organiser's own machine, so that list never goes to someone else's server. They don't have to trust a third party, and they don't need an account.

It's also free to run. When you charge a small amount per event, paying an API for every certificate would eat the margin.

My First User

The student club in my department at my college. They're running a hackathon on 24 October, and more than 2,000 teams have registered.

Handing out that many certificates by hand is where mistakes happen, so I gave them CertProof. They used it to make the participant certificates and then ran the check on the PDF. They liked it. Making the certificates was easy, and they said the check gave them confidence that the names were right before anything got printed or sent.

The event is still a week away, so the real test comes when the certificates go out. I'll add an update after that.

They haven't paid for it. This was a free trial run. One thing they genuinely said was

this is so much helpful for us to create and distribute certificates amongst a large crowd also with a built-in proof read. would definitely pay for this product!!

Prize Categories

Gemma. CertProof runs Gemma 3 (4B) locally through Ollama. It designs the certificate layout and matches spreadsheet columns to the right fields. The rendering and the name check are plain code, so the model never touches a recipient's name.

Temporal. A big batch is slow, and a crash at certificate 800 shouldn't mean starting over. With Temporal switched on, each chunk of 25 certificates is its own retried step. I killed the worker mid-export and it finished from where it stopped. Only ids go into Temporal, so names stay on the machine.

📰 Read the original article on Dev.to AI

Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.