Before I sat down to write this, I actually tried telling the whole story to my wife first.
Her reaction? A single, polite nod right before turning straight back to her drama series without missing a beat.
Since my in house audience clearly wasn’t interested, but the urge to share was still burning inside me, I decided to take it to the internet instead.
I’ve been wanting to share what it actually feels like to maintain a tiny, obscure open source project that rarely gets any spotlight, yet quietly keeps a steady stream of users. It constantly puts me in that classic dilemma: too invested to walk away, but not ready to go all in. Essentially, stuck in limbo.
Let’s get into it. My name is Wanpat, a Thai developer in my 40s. The project I've been maintaining (a pure Go PDF generator) has been alive for over 10 years now.
And the whole thing began completely by accident.
Rewind to around 2012. The company I worked for at the time was building a system to help insurance agents issue policy documents. Naturally, one non negotiable requirement was exporting insurance policies as PDF files.
I vaguely remember assuring my team lead back then (who remains a good friend of mine to this day):
"Don’t worry, Bro. I’ve checked—Go definitely has PDF libraries. Piece of cake, we'll wrap this up in no time!"
Well, damn.
After building the core system for a while, we finally arrived at the PDF export phase. Reality hit me like a truck: none of the Go PDF libraries available at the time properly supported Thai fonts. The rendered text was far too broken to ever hand over to an insurance client.
At that crossroads, I had three choices:
- Rewrite the PDF generation service in another language.
- Hack around it using browser based HTML print.
- Try to find someone else to blame for choosing Go in the first place (completely ignoring the fact that I was the one who told everyone it would be easy).
Just as I was secretly leaning toward Option 3, my team lead asked: "What if you just build one from scratch? Want to give it a shot?"
Without thinking, I blurted out: "Two weeks."
I remembered that exact number because I was trying to copy Linus, who famously built Git in just two weeks. The only problem? I’m definitely not him.
My master plan was to port FPDF—a PHP library I was quite fond of back when I wrote PHP. That explains why the API still looks suspiciously like FPDF in Go.
It ended up taking me nearly a month just to get the PDF generator working. At the time, it wasn't even an open source library; it was just a lonely subdirectory inside our insurance codebase.
Later on, the company started another Go project and we needed to share this PDF engine between both codebases. We decided to extract the code into its own library. But there was a catch: back then, GitHub charged money for private repositories, and we didn't want to pay extra. I asked my team lead, and he shrugged: "Just make it public. Nobody is going to care about us anyway."
So I did. And without putting much thought into it, I just slapped two words together: Go + PDF. Naturally, it became gopdf.
Some time passed—I don’t remember exactly how long. But what I do remember vividly is sitting in a meeting with an insurance client when an email from GitHub popped up on my laptop screen.
At first, I didn't understand it was an email notification from GitHub, thinking someone had hacked our repo and injected strange code.
Then I opened it and realized: someone out there in the world cared enough about our tiny project to fix a bug and submit a Pull Request. Open source wasn't brand new to the world back then, but to me, it felt like magic.
Over the decade, two specific interactions remain etched in my memory:
The Chinese User and Subset Fonts
A user from China opened an issue stating that the library produced insanely massive PDF files.
Coming from Thailand, where our entire alphabet and tone marks fit comfortably within 100 characters, our Thai font files were tiny. I had zero clue that Chinese fonts contain tens of thousands of characters and can weigh tens of megabytes. Embedding the entire font file was making PDFs unnecessarily huge.
At first, I thought understanding the PDF format was difficult enough. Then I discovered TrueType.
I had to extend the existing TrueType parser that I had originally ported from FPDF. In fact, parsing TrueType fonts turned out to be the hardest part of implementing font subsetting. The rest was relatively straightforward: keep track of which characters were actually used in the document, then embed only the necessary glyphs into the PDF instead of the entire font.
I spent a long Songkran holiday (Thai New Year) wrestling with this problem.
To test it, I copied some Chinese text from the internet and generated a PDF. The result was pretty satisfying: the PDF file became dramatically smaller. I honestly can't remember the exact numbers anymore, though.
I don't remember exactly when the feature was finally released, but I do remember how long it took to figure out.
The Gentleman from Taiwan and Musical Notes
A user from Taiwan ran into rendering issues with musical note fonts. He actually mentioned to me that he wasn't a programmer at all. To this day, I still remember him vividly—even though he probably doesn't remember me anymore. That very issue was what led me down the rabbit hole to discover composite glyphs and dive headfirst into the deeper depths of TrueType specifications.
That rabbit hole was also when I realized just how deep font technology really goes—especially concepts like contextual glyph substitution and complex text shaping. Ironically, proper glyph shaping is still one of the biggest pain points in gopdf today. It’s an itch I’ve been trying to scratch for years—I'm still secretly experimenting with ways to fix it, but somehow, I just never seem to get it finished.
Since then, issues and PRs have trickled in steadily. There were bugs I fixed, bugs other contributors generously patched, and plenty of issues that still sit open today. Life just kept rolling forward.
Trying to explain this project to my wife is what led to this post, especially with all the recent talk about maintainer burnout. Personally, open source hasn't burned me out (my day job does a much better job at that! ).
To me, open source remains genuinely beautiful. Having strangers from all over the globe collaborate and build something together across borders is not something you see every day in the physical world.
I’m not sure how to wrap this up with a profound takeaway or life lesson.
To be completely honest, I’m mostly just wondering: if I show this post to my wife, will she actually read it this time?
Thanks for reading, and happy coding!
Note: English is not my first language, so I wrote this in Thai and used AI to translate and polish it. Some expressions (like “hit me like a truck”) are from the AI, not mine. The story and feelings are all mine. Sorry if anything sounds a bit off!
