A weekend project born out of one very annoying evening.
This wasn't the first time I'd hit this problem. Back in college I was the web head for our annual tech fest, and one year that meant certificates for around 5,000 participants across dozens of events. There was no ready-made tool for it, so I coded one myself: a script that stamped names from a spreadsheet onto a template.
It was rough. Every event had its own certificate design, so every event meant hardcoding new coordinates by hand. Nothing validated the output automatically either, so I ended up manually opening a sample from every batch and checking it name by name, hoping I hadn't mangled someone's certificate right before we handed out 5,000 of them.
Years later, I was helping wrap up a coding bootcamp cohort of 140 students, each needing a personalized certificate of completion. I had a nice certificate template, and a spreadsheet with everyone's name, track, and completion date. That should've been a ten-minute job.
It wasn't. I spent an evening opening the certificate in an editor, copy-pasting one name at a time, exporting, renaming the file, and repeating. Somewhere around student forty I stopped and went looking for a tool that could just take my PDF and my spreadsheet and merge them.
What I found was a mix of enterprise mail-merge platforms that wanted a monthly subscription and a sales call for what was fundamentally a weekend problem, and a handful of desktop tools that hadn't been updated since 2014 and mangled anything that wasn't Times New Roman. Nothing let me visually drop a field onto the PDF, point it at a column, and just go.
So I built it myself: the version of the tool I actually wanted. Upload a PDF, place text and image fields directly on the page, map each one to an Excel column, preview real data as you place them, and export everything as one ZIP.
This is still very much a one-person project, so I'd rather be upfront about its limits than have you hit them by surprise. PDF templates are capped at 5MB, and a single batch tops out around 200 rows, because generation currently runs through one request on a serverless function with real time and memory limits. For a bootcamp cohort, an invoice run, or a batch of offer letters, that's plenty. For a mailing list with 50,000 rows, it isn't. Yet.
That "yet" is the plan. I'm working on moving generation off the request/response cycle entirely: background processing, cloud storage for the output, and no real ceiling on template size or row count. AutoPDF started as a tool to fix one annoying evening; I'd like it to be the tool I reach for no matter how big the batch gets.
If you run into a bug or want something added, tell me directly. It's just me on the other end.