This was sitting in my notes for years. I’m still not sure if publishing this is a good idea. It’s bound to stir some discussion and I’m not entirely sure if I’ll handle it right but it seems like now is as good a time as any other.
A bit of history
Prawn is an old gem. It sprang from a very concrete need to generate PDF without external dependencies. I wasn’t around at the very beginning and can’t be certain for sure but this can be pieced together from commit messages, old emails, issues, and PRs.
There was a need (generate PDFs), there were constraints (e.g. no external dependencies), and that’s pretty much it.
The gem grew very organically. That is, it started with minimal features to arrive at the end goal as fast as possible. It’s amazing how much functionality is covered. But at the same time there was not much in the way of architecture.
Later things got untangled a bit here and there but it’s still can’t quite be called an architecture. For example, pdf-core was extracted into a separate gem but it still sticks its fingers deep into Prawn here and there and can’t be used entirely on its own. Likewise, there’s not clear mapping from Prawn to PDF features (or the other way around) which might guide implementation of missing features.
How I became the maintainer
I found Prawn when I needed to generate a few PDF of my own.
It didn’t do all the thing I wanted so I contributed a few features. I liked interactions with the maintainers. I liked giving back to Prawn in return for what it gave me. I fixed a few bugs, improved performance in a few places.
Eventually I’ve got a commit bit. It was Prawn’s policy to be generous with commit bits. It’s still kinda true it’s just, unfortunately, we don’t see many returning contributors to enact the policy.
A bit later then-maintainers decided they couldn’t dedicate much time to Prawn for various reasons and I got an invitation to become a maintainer. For a while I was part of a maintainers team but eventually everyone (but me) took off their “official maintainer” badge.
In short, it’s complicated. I consider Prawn to be complete and stable. More on this later.
Yet there are a few missing features coming up regularly. For example, support for scripts heavily relying on ligatures or contextual variants (e.g. Arabic or South Asian scripts). Reading/editing PDFs is often requested. Layout tools are lacking. Font support is spotty.
Bugs are aplenty, too. Most are not the severe but some are even if not hit often.
Documentation is not complete and not easy to navigate.
As you can see, there’s much to do.
Hard truth about Open Source repeated time and time again
Stories from maintainers crop up regularly. They’re often filled with bitterness, guilt, regret, defensiveness and sometimes a sprinkle of joy or hope. I’m sure you can recall one.
The latest one is Sorry everybody, I failed with you
I’m doing well, too. I’m not going to complain. But I have to make a confession. An obvious one, too. I was not a very good maintainer.
But it’s not for the reason you might think. Not because there was not many releases recently. Not because bugs are not getting fixed. Not because PRs hang open for a long time.
It’s because I was really bad at managing expectations. And today I’m trying to fix that. My hope is if that gets fixed everything else will become better at least a little bit.
As I mentioned, I contributed features when Prawn couldn’t do what I wanted it to do. At the moment, it does everything I need it to do. So I don’t work on anything new.
I maintain Prawn because I don’t want to switch to another lib (one may observe, I’m lazy) and there’s no-one else to maintain it for me.
In my eyes Prawn is complete and stable.
I honestly admire Prawn community. It’s not as active as of some other open source projects but it’s still awesome.
I want to brig to your attention a few relatively recent examples that I think should inspire you.
Thomas Leitner (@gettalong) does awesome job triaging issues and answering Discussions. I honestly believe he know Prawns ins and outs much better than I do. And he does this while technically being a competitor working on HexaPDF. I feel a little conflicting by directing you to Prawn’t competition but you should check HexaPDF. It’s awesome.
Cameron Dutro (@camertron) has contributed OpenType Fonts support. It’s incomplete but it’s objectively much, much better than no support. It took a lot of time and a massive effort on his part.
These are only few examples but they illustrate what I think is a great community member.
I want Prawn to be a community project. If you believe there’s a missing feature. Build it. If you find a bug. Fix it. If you see a question you can answer. Go for it. See an issue. Triage it.
The point is build a better Prawn for yourself.
I understand that not everyone can contribute. Some of you don’t have time. Some don’t have the expertise. And I agree that Prawn is not the cleanest codebase out there. No pressure. I hope Prawn is of use for you. But if you can please treat Prawn as your project. Do the work you need done on Prawn. I’ll do my best to not be an obstacle.
I made a call for maintainers a few time since I became a maintainer. I had no responses. Cameron agree do become a co-maintainer of TTFunk after I begged him. There was just massive amounts of code and I needed someone more familiar with it. I’m forever grateful he accepted.
I hired here and there that you don’t have to wait on me to do most of the work on the gems but it probably got lost somewhere on the way or I might’ve been too subtle.
This is not directly related to Prawn specifically but it comes up in relation to OSS and I have some thought and I don’t know when it’s good to stop cutting in editing so I’m keeping it.
So, would money make Prawn active again? I don’t think. There are many reasons. Let’s start with practical ones.
Who’d even get paid?
Maybe Gregory? At the moment he’s the only person financially involved with the project (he generously keep paying for our domain). But he’s not involved with the project otherwise. I personally will be eternally grateful if you helped him recoup the costs. But unfortunately, I don’t believe we’ll be able to muster a sum that would compel him back working actively on Prawn.
Me? Firm no. I can’t claim ownership over much of the existing code. I don’t feel like I’ll rewrite the whole thing to bring much more value. And on top of that I’m in a privileged position where my day job pays way too well to me switch to full time Open Source any time soon if I’m to judge by experiences shared by other OSS maintainers.
Contributors? It’s an interesting though but I have no clue how to make it work from the logistics point of view.
GitHub has Sponsors feature and there are other platforms to collect funds like Liberapay or Patreon. But again, those are usually used for individual to individual support. I don’t think it’s a sustainable model in general and specifically for Prawn.
I know for sure that business use Prawn. Some even for business-critical features. I know that because I myself used Prawn with client projects. It has been mentioned a few times in mailing list. And I’ve got a few private emails starting that.
Unfortunately, it’s not customary for businesses to pay for OSS. I could relicense Prawn to make it easier or more compelling. But I don’t see the point without a plan for spending the funds.
Would that help?
I don’t believe it would. I’m not in it for the money. I don’t believe anyone else is interested in that either. I never saw it coming up in any of the discussions in many years.
I know some of the work has been sponsored in the past. That is, features were developed by an employee for the benefit of the company. It was great for Prawn. I’d be glad hearing from contributors that their time has been sponsored by their employer. But that is external to the project as of now and beyond my control whatsoever.
Hopes and dreams
I’m not abandoning Prawn even if it might’ve looked a bit like that. I hope you (personally) can be more involved with the project in any way you can. I’ll try my best to not be an obstacle. I’ll try a bit to be helpful but just to set expectations right I will not be answering questions at 3am, on weekends, or maybe even in a timely manner.
As I said, Prawn Dows all I need it to do and I’m happy with that.
I hope, you can take on yourself implementing missing features you need for your particular use case. I’ll try helping you where I can.
I hope, you can understand that I will try to avoid any negative emotions. This is an ongoing effort. I haven’t figured it out yet. But to give a glimpse here are a few examples.
I won’t let anyone guilt me into working on Prawn or anything at all. This is specifically to address questions like “When’s the next release?”. It’ll come when it come. Either when I feel like it or when there are enough changes in the master. You can use master in your Gemfile if you absolutely need latest change. You can calmly present arguments to convince me to cut a release. I won’t count it against you. Or questions like “Are there any news on this issue?”. Feel free to pick it up. I might help you just out of gratitude. But guilt won’t get you anywhere.
I won’t tolerate aggressive behaviour in public spaces. I don’t care about your age but I assume you all are adults and know how to be civil. Type it out but take 5 minutes away from the keyboard if you don’t feel perfectly level. Then come back and edit your message. I promise I’ll do my best to assume best possible interpretation but still. Please take into consideration that we’re a global community with different backgrounds and cultures. I also remind that we have Code of Conduct.
And finally, I hope this might generate some conversation. I’ll be happy to answer them.
I don’t write as much as I should and my editing skills are not good. English is not my native tongue. I’m overwhelmed with feeling and not all of them are good. It’s hot in my office and sun shines directly into my eye through a hole in blind. There’s a pile of email waiting on me when I finish this and I’m not looking forward to it at all. Etc., etc.
As I said, I’m not in it for the money. I’ll be glad to pitch someone else to Ruby Together. And I’ll be happy to vouch for anyone who wants to work o Prawn and get paid by them or via GH Sponsors or any other mean.
I’m not stepping away from maintainership. Not really. I do t expect spending less time on Prawn than I currently do. If anything I stepped away years ago. I’m still here. I’m just trying to set expectations right.
PS: Thank you.
Incidentally, I recently did some very small paid work for a company that uses Prawn and it seemed that they were happy someone was available to do that work. Probably because understanding the code base is one thing but without the necessary PDF knowledge it is hard to make some changes or find/fix bugs.
And I also look at prawn/pdf-core/ttfunk regularly as part of me benchmarking HexaPDF and try to fix things there as they pop up. So that may count as a (very small) company doing work for Prawn
Prawn/pdf-core split is artificial. pdf-core was extracted from Prawn. Unfortunately, it wasn't quite completed. And the lack of any proper architecture made the final separation rather difficult. I'm on the fence about it. On one had I like the idea. Untangling different parts of Prawn might guide it to some kind of structure in the codebase. On the other, it's a lot of work. I flip between the opinions like every season. So… Maybe sometime one of these will materialize.
Relicensing HexaPDF to MIT is strictly worse than dual license. It removes current financing opportunities. It removes contribution incentives.
MIT is good for what it is. It's a license for people that don't care about contributions and only want to absolve themselves of any responsibility. And it makes sense for where it came from. Academics publishing their code to accompany their papers. They needed to prove they did what they described in their papers but they absolutely didn't want to do any support or be held accountable for any bugs.
If Prawn wasn't a collective effort I'd go with a dual license similar to how HexaPDF does it.
To be clear, I'm not considering relicensing Prawan.
Regarding replacing pdf-core with HexaPDF or anything else. I'm not against it in principle but it's hard to see how this would benefit HexaPDF. It might be benefitial to Prawn to replace parts with better engineered solutions but it would require much effort. I won't stop anyone. Just saying it's much work for little benefit to the end user. At least in the short term.
don't share your view(s) on the MIT license, consider ruby, rails and a lof other projects (it strengthens a projects and companies are maybe more willing to contribute to it, like paying/sponsoring someone for new features)
hexapdf unter a MIT license would push ruby (and rails) and benefit a lot people!
of course, the work done by gettalong should be paid (as i already mentioned, you could give it a try, starting a campaign with whatever $$$ as a final goal, there are a lot companies using ruby/rails and an option for perfect PDF support could be a major pro ruby/rails argument).
If I were to describe my experience maintaining Prawn I'd say I'm still around because I sand on the shoulders of giants, one of which is you. Thank you for all the work you did on Prawn and pdf-reader. I'm glad you dropped by.
Money is not the driving force or a way to improve my involvement. And I'm not the one spending money on Prawn. If you must, ask Gregory how to pass a few bucks because he's the one paying for our domain.