
Sealpost
The Problem
After organising multiple hackathons and workshops, I spent hours generating and sending certificates by hand: exporting participant lists, personalising each one, and emailing them individually. I knew there had to be a better way.
What I Built
Sealpost started as a Python CLI that turned a CSV into personalised PDF certificates and emailed them via Gmail SMTP. It worked, but only I could use it. I evolved it into a web app so any organizer can run an event without touching a terminal. You create an event by uploading a template, clicking where the name goes, picking a font, and writing the email. Then you upload a CSV per tier, map its columns, and send.
Technical Implementation
The technical journey was fascinating. I started with Pillow for PDF generation, but quickly ran into challenges with text fitting - names vary wildly in length, and I wanted consistent, beautiful typography. I implemented auto-shrinking fonts that dynamically adjust based on name length while maintaining visual hierarchy.
The CLI's hardest problems were text fitting and delivery failures, and the web app had to solve both properly.
- Text fitting: names vary wildly in length, so fonts auto-shrink to fit while keeping the layout consistent.
- CSV chaos: real participant lists are messy. Column mapping handles arbitrary headers, names-only CSVs, and split first/last name columns.
- Delivery you can trust: every row moves through a clear state, whether invalid (caught before sending, like a typo'd
gmial.com), failed (SMTP refused), or bounced (an NDR arrived later). The History page shows all three, and re-send targets only those rows, with an email message you can rewrite first. - Rate limits: configurable batch sizes keep sends within Gmail's SMTP limits.
For email automation, I chose Gmail SMTP for its reliability and wide availability. The trickiest part was handling rate limits and failures gracefully.
Key Features
- Batch generation from CSV, with multiple tiers and templates
- Gmail SMTP delivery with per-tier email overrides
- Live send tracking with invalid/failed/bounced handling
- Re-send only the failures
- Generate & download a zip without sending any email
Impact
What took 4–5 hours by hand now takes minutes. I've used it for three hackathons and competitions in college as well as a separate workshop, including SummerHacks 2026, where it sent 450+ certificates.
Key Takeaway
The best automation tools solve problems you've personally experienced. I built the CLI because I was frustrated. I turned it into a web app once I realized other organisers had the same problem.