
Certificates Sender
The Problem
After organizing multiple hackathons and workshops, I found myself spending hours manually generating and sending certificates to participants. The process was tedious - exporting participant lists, designing templates, personalizing each certificate, and then emailing them one by one. I knew there had to be a better way.
What I Built
Certificates Sender is a Python CLI tool that automates the entire certificate generation and distribution pipeline. The tool takes a CSV of participant names, generates personalized PDF certificates with frosted-glass text overlays, and bulk-emails them via Gmail SMTP. It's designed to handle hundreds of certificates in minutes, not hours.
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 frosted-glass overlay effect required careful layering of semi-transparent backgrounds with sharp text, which involved iterating through multiple blending modes before landing on the right approach.
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
- Auto-shrinking fonts - dynamically adjusts based on name length
- Resumable batch sending - picks up where it left off if interrupted
- Dry-run mode - preview everything before committing to actual sends
- GUI helper - template calibration accessible to non-technical organizers
Impact
The impact was immediate. What used to take 3-4 hours of manual work now completes in under 10 minutes. I've used it for three hackathons since building it, including SummerHacks 2026 where we sent 450+ certificates automatically.
Key Takeaway
The best automation tools solve problems you've personally experienced. I built this because I was frustrated, and now it saves me - and others - hours of repetitive work every time we run an event.