Top
Best
New

Posted by jlowin 11 hours ago

An open-source maintainer's guide to saying “no”(www.jlowin.dev)
163 points | 75 comments
ChrisMarshallNY 9 hours ago|
I’ve had some experience developing an infrastructure-level system for use around the world.

I had to maintain it, almost completely alone, for ten years, before it was taken over by a competent team, and I could finally walk away.

One of the most important things I did, in that decade, was say “no” a lot.

Some folks were not happy about it, and Godwin’s Law was invoked on my ass, multiple times.

A lot of requests were ones that would optimize for a specific use case, but it was a generalist system, so it had to remain “imperfect.”

In the end, it all worked out well, if not “perfectly.” It’s now a worldwide system, being run by hundreds of organizations, and used daily, by thousands of people.

jddil 8 hours ago|
> I had to maintain it, almost completely alone, for ten years, before it was taken over by a competent team, and I could finally walk away.

No you didn't.

Younger folks reading this, you don't owe anyone free labor. If you want to donate your time to open source that's ok but just know there are thousands of people in this industry that don't care about your mental health and will continue to take advantage of you because you enjoy coding and don't understand how valuable your time is yet.

ChrisMarshallNY 8 hours ago|||
Sometimes, we do stuff for reasons that folks, these days, can't relate to. I'm truly sorry that you've never had a Cause to which you could dedicate that kind of effort.

No one ever "took advantage" of me. I'm actually kind of hard to hoodwink.

Yes, I did "have to."

If I have to explain, you wouldn't understand.

kiddico 5 hours ago||
I think folks these days can relate just fine. That particular guy a bit less so.
latexr 6 hours ago||||
I get the impression the OP isn’t saying they “had to” in the sense of “being forced to by outside forces” but rather “wanted to for personal satisfaction and pride”. I understand the feeling: you create something you’re proud of and which means a lot to you, and before you let it go you want to ensure it’s in good competent hands which will care for it and make it flourish the same way you would.

That is very different from being exploited or taken advantage of.

NegativeK 7 hours ago||||
I agree with the quoted commenter's point that sometimes shit matters enough to put up with the suck, but I also agree with your point that people need to understand that walking away might be the right thing to do.

Finding that balance can be very hard.

ChrisMarshallNY 7 hours ago||
This is true. I knew what I was getting into. I didn't expect it to be ten years, but I did expect at least five, before I could get folks to pitch in. I knew the character of the folks that would be trying to force the system into shapes that would not last, and how they would react to me.

In this case, it was for an organization that I've been involved in, for decades. I'm incredibly Grateful for what it's done for me, and I'm simply paying it back a bit.

The system was required to help them improve their discoverability, which could be life-saving.

It's not hyperbole to say that the system has probably saved many lives, and will continue to do so, for the foreseeable future.

It's also pretty much worthless, monetarily. No one would be willing to pony up a fraction of what it would have cost to build, if it were paid.

I'd do it all over again, if I had to. Fortunately, I don't have to. The team that took it over have done great things with it. It's a ship of Theseus type of thing. There's probably not much code I wrote, left. I write apps that now leverage it.

obk0943t 5 hours ago||
can you share what system is it ? is it public ?
ChrisMarshallNY 5 hours ago||
I don’t really mention it in public, but it’s no secret. It’s managed by a team, these days, and it’s not really appropriate for me to draw much attention to my role. They are doing a great job.

It is public.

Happy to share it one-on-one.

Seattle3503 8 hours ago||||
Seems like you are saying the same thing as OP, but with a more cynical framing. He set boundaries because he did not in fact have to accept those PRs.
squigz 6 hours ago|||
One might argue that programmers owe something to all those maintainers who so nonsensically donated their time and money to furthering a free software ecosystem that every single one of us - humans, not just programmers - benefit from. Maybe it's money, as you seem to imply, but maybe it's more time and labor to continue to further that cause.
prymitive 9 hours ago||
If someone has a “readfile” cli app on gh it’s just a moment away from a issue being open:

> thanks for a great project, in our org we have a requirement that we only write files, not read them. Can you please add —-write flag so this app works for us?

The fact that someone clones your repo or uses your software doesn’t mean that you owe them anything. Every person with open source code should realise this before they start responding to feature requests.

Liriel 8 hours ago||
My pet peeve is people who use LLMs to generate code, never check whether it works, and then submit a PR.

As if open-source maintainers don't have enough chores.

meesles 8 hours ago||
Over the last 6 months this has been my experience with new engineers at work, absolutely awful. I wish people didn't feel the need to throw out SDLC once the LLMs came along.
palata 7 hours ago||
It's not rare for me to ask if they tested it. They can lie, but if they say they did and it crashes on me right when I start it, then I may never trust this contributor ever again.

Also I don't hesitate to be frank in my review, it's okay to say "I won't merge your feature because I don't think I can maintain that, but you're free to keep your fork". Or "I can merge it if you change this and this", but in that case I need to actually merge if they do what I asked for.

latexr 5 hours ago||
> They can lie, but if they say they did and it crashes on me right when I start it, then I may never trust this contributor ever again.

If it’s obvious without a shadow of a doubt that someone has lied, either on an issue or a PR, I’m very much inclined to block them. I have a lot of patience for people who are still learning or make silly mistakes but are genuinely making an effort; but if someone doesn’t even help me help them, that’s disrespectful and such behaviour shouldn’t be rewarded.

aDyslecticCrow 10 hours ago||
> we recently tried to nudge this behavior by requiring an issue for every PR

I've not maintained or worked much with open source. But i would have assumed this was already common? It reflects how (from my experience) companies work internally with code. Discussion about a feature or a bug is done before writing any code (over lunch, or in a issue thread). We don't want to pay someone to write a feature we don't agree we need, or that collides with future maintenance.

Even before AI, i'd argue the vast majority of code is cheap and simple. But that is what makes it more important than ever to decide what code should exist before someone (well paid) wastes a day or week writing it.

Aurornis 9 hours ago||
Requiring an issue per PR makes sense for significant bugs and features, but taken to the extreme it feels arbitrary and pedantic.

I occasionally submit documentation fixes when I find broken docs (outdated commands in the docs, incorrect docs). I’ve had these rejected before because someone insisted I create an issue and have it go through some process first just to submit an obvious 1 line fix.

At the extremes it clouds the issue backlog. You try searching for something and find pages and pages of arbitrary issues that didn’t need to exist other than for someone to get past the gatekeeper.

giancarlostoro 9 hours ago|||
I forget the episode its been years but the Talk Python podcast had someone I think from the Django team mention tips on contributing to open source and one of them was start by volunteering to document things, most devs dont do it or want to do it. It forces you to know and understand the codebase and by the time you want to contribute more you know the library better.
Aurornis 9 hours ago||
I actually don’t encourage this. If you find broken docs then contributing a fix is good.

However, writing docs as the starting point for someone’s entry to a project doesn’t produce good results much of the time. You need someone who is more familiar with the project to write the docs. Having the docs written by someone new to the project can lead to some really frustrating docs.

This is even more true now that projects attract junior devs who want to build their resumes and think that documenting can be done by pointing Claude Code at the codebase and demanding it write some docs.

It also encourages bad behavior from devs who think they’re doing a favor for new contributors by leaving the documentation as an exercise for someone else.

rendaw 1 hour ago||||
Or if you need a fix ASAP and go ahead and make the change locally, then want to upstream it later.
aDyslecticCrow 9 hours ago|||
You could easily say that docs, comments, and formatting changes don't need issues. The core problem the author is trying to cope with is code changes or features that could deviate the project or scope. I feel it's quite reasonable to set a blanket "issue first" rule for any change beyond like 5 rows of code.
serial_dev 9 hours ago|||
This was / is not my experience. I worked mainly on frontend code, web and mobile app.

As a developer, I got the task, an “order” that something needs to be added. Best case scenario, my product owner / manager came up with it, because they talk to customers and noticed it would be helpful. Worse case scenario, someone else above them told them to do it because “we need it”, and I just hope the product person on my team properly vetted the request. Worst case scenario, the “order” came down to our team, and the managers push to the individual contributors and there is no room for discussion at this point anymore and an arbitrary (made up) deadline that is somehow always unrealistic.

aDyslecticCrow 9 hours ago||
Oof, ye i have heard about this kind of company culture. I think front-end and app development is particularly prone to cheap and dirty iteration. Bugs are cheap and non-consequential. New features are visible, fast to add, and make higher-ups happy.

I work in industrial embedded C. So perhaps i have weird expectations about the level of pedantry. A 10 row code change may take week to discuss, and likely require an open issue and test-case to get through.

At worst, a small 100 row code-change may require a 8000$ independent re-certification of the device before being fully pulled into master.

LtWorf 8 hours ago||
Yeah frontend don't care about correctness. I've seen entire websites go entirely blank because I clicked somewhere and that triggered a js error and that means delete the whole DOM.
criemen 10 hours ago|||
> Even before AI, i'd argue the vast majority of code is cheap and simple. But that is what makes it more important than ever to decide what code should exist before someone wastes a day or week writing it.

This 1000%. In my opinion, the biggest part of my job is figuring out what should be built at all, not building what we all eventually agree should be built - that's often pretty easy, AI or no AI.

gus_massa 9 hours ago|||
I made a lot of PR for Chez Scheme (and indirectly Racket). For me it's easier to write the code, perhaps because I'm not an English native speaker, but my Spanish is bad too.

Most of my PR are like 30-50 LOC (including comments and tests), with a few very related features, and I have probably a 90-95% merge rate. Sometimes writing the explanation takes a long time. Many times while writing the code I get a lot of small surprises and unexpected corner cases. So most of the time a previous discussion would be too generic to be useful for me and inteligible for the maintainers.

Anyway, my idea is to take only a few hours (4?), perhaps distributed in a few slow days. So if it's not merged it's not a big deal, not hard feelings. Also a short feature is easier to review and modify if necessary.

palata 7 hours ago|||
> We don't want to pay someone to write a feature we don't agree we need

We're talking about open source here, and saying "no" to unpaid, external contributors.

The way I approach it as an external contributor is that if the project is useful to me, I fork it, make my changes, and then open a PR in case the maintainers want to adopt them upstream. They don't have to, it's fine. But I don't have to ask for their opinion in an issue because I will just do what I want in my fork anyway.

1718627440 9 hours ago||
I think the stereotypical open source way is that you modify the code in private to what you want it to be and then upstream that in case it might be useful for others.
sanarothe 7 hours ago||
When I was a teenager I submitted a random/unsolicited pull request to something in the spree ecosystem, got a very nice message from the maintainer/author saying that he appreciates it but it wasn't in the direction he wanted to take the library, but I could collaborate with him in some other way. Glad for the patience in that message, if it were spicy I might have been put off programming.
brian_cunnie 8 hours ago||
A year ago I changed my CONTRIBUTING document to say that I don't accept pull-requests on my very modest open source project (a special purpose DNS server)

I like coding, but am not fond of reviewing other people's code.

Also, the few PRs I received weren't up to snuff: for example, they included code changes but not tests. If they included tests, they weren't comprehensive. And they never included documentation changes.

palata 7 hours ago|
I think it's fine. Open source does not mean at all that it has to be open development. Doesn't mean it cannot be, of course.
Nevermark 9 hours ago||
> "“In writing, you must kill all your darlings.” - William Faulkner [0]

This quote is becoming a cliche. Perhaps because it provides such helpful dramatic motivation to the act of maintaining creative quality through active negative selection. When have the freedom to create things we want, that can be hard.

[0] https://www.goodreads.com/quotes/79715-in-writing-you-must-k...

arccy 9 hours ago||
Maintainers really do need to say no more often, and teach users to be way less entitled. helping maintain a big project you see all sorts of users trying to push features just for themselves onto you.
joshdavham 7 hours ago||
> There is nothing more delightful than the drive-by PR that lands, fully formed and perfectly aligned, fixing a bug or adding a small, thoughtful feature.

I'm actually generally not a fan of "drive-by" PR's.

Unless the drive-by PR is fixing a simple bug in a simple way, then the contributor really should've opened an issue first. Doing otherwise is rude imo.

This is actually open source etiquette that I'd like to see encouraged more in the future. Something like "If you've never contributed to this project before, then open an issue first". I understand that this can be explicitly placed in a CONTRIBUTING.md file, but I think that this should just become common etiquette that we all follow and understand.

palata 7 hours ago|
> Unless the drive-by PR is fixing a simple bug in a simple way, then the contributor really should've opened an issue first. Doing otherwise is rude imo.

I kindly disagree. If the project is open source, it means that I can fork it. If I find an open source project and want to add a feature to it, I will fork, implement my feature, and then open a PR to the original project. A couple things there:

1. I have no need to open a PR to upstream, it's totally right to keep my changes in my fork (as long as I honour the licence).

2. If the maintainers don't feel like merging my PR, they don't have to. It's their right. They may request changes, and I may choose not to implement them.

It's not the only way to do it: it's perfectly fine to open an issue and ask for guidance. But I don't see the problem in opening a PR saying "look what I did with your project: you can merge it if you want".

eviks 5 hours ago|
Given how many improvements are ignored or rejected in so many of the open source projects, it doesn't seem like "one of the hardest parts" is hard at all.

Especially when "burden of proof is on the contributor, never the repo" and the repo is hiding behind immeasurable principles such as "ultimate success of a project isn’t measured by the number of features it has, but by the coherence of its vision and whether it finds resonance with its users." with the perfect example

> This threat can take many forms. The most obvious is a feature that’s wildly out of scope, like a request to add a GUI to a CLI tool

Indeed, a threat to the project that can transform a niche tool into a widely used one of at least reduce the usability barriers for a wider user base. Shoo the "incoherent vision" of a drive by Trojan horse bearing gui contribution gifts!

> there is a significant transfer of responsibility when a PR is merged. ... maintainer who is suddenly on the hook for it.

> we’ve introduced and documented the contrib

Oh, so all you had to do to get off the hook was add a comment that you're not responsible?

sdenton4 5 hours ago|
You are free to fork and make whatever mess of features you wish for!
eviks 4 hours ago||
You're free to address any of the actual points in my comment instead of using an irrelevant cliche!
More comments...