Haskell World logo Haskell WorldWrite code, build worlds
Open Source

How Open Source Maintainers Decide What Features To Reject

Every popular open source project accumulates a long tail of feature requests that never get merged, and the people who maintain those projects spend a surprising amount of their time saying no.

Maintainer reviewing a stack of pull requests next to a project roadmap

Every popular open source project accumulates a long tail of feature requests that never get merged, and the people who maintain those projects spend a surprising amount of their time saying no. Rejecting a feature is rarely about the code quality of the pull request itself. It is almost always about whether the feature fits the shape of the project, who will maintain it in five years, and whether the people asking for it actually represent the project's wider user base or just the loudest corner of it.

The First Filter Is Not Code Quality

A contributor who submits a clean, well tested pull request is often surprised when a maintainer still closes it. The first question most maintainers ask is not "does this work" but "does this belong here." A feature that solves a real problem for a narrow audience can still be rejected if supporting it means the maintainer has to understand and defend that code path for every future release, every security patch, and every refactor, long after the original contributor has moved on. The packaging and maintenance habits that keep a community's libraries usable depend on exactly this kind of restraint, because a package that says yes to everything eventually becomes a package nobody can safely upgrade.

Scope Creep Is The Quiet Killer Of Small Tools

Small, focused tools are valuable precisely because they do one thing well. A maintainer who accepts a feature that is adjacent to the project's purpose, but not actually central to it, sets a precedent. The next adjacent feature becomes easier to justify, and the one after that easier still, until the tool that once did one job cleanly now does five jobs adequately. Rejecting a reasonable sounding feature is often less about that specific request and more about refusing the slow drift that turns a sharp tool into a blunt one.

This is one of the quieter reasons contributors are sometimes pointed toward libraries that are still actively maintained rather than older, broader ones: an actively maintained project usually has a maintainer who has been saying no consistently, and that consistency is exactly what kept the project coherent enough to still be worth using.

Who Will Actually Maintain It Later

A feature proposal that includes a promise to "maintain it going forward" is treated very differently depending on who is making that promise. A first time contributor making that promise is taken far less seriously than someone who has already shipped several accepted patches, responded to issues on other parts of the codebase, and shown up during a release cycle without being asked. Maintainers have all seen contributors disappear after a feature lands, leaving the maintenance burden to fall on whoever is left, and that experience makes them conservative about accepting anything that cannot be supported by the existing team alone.

Backward Compatibility Changes The Calculation Entirely

A feature that only adds new, optional behavior is a much easier yes than one that changes existing behavior, even slightly. Any change to an existing default risks breaking code that users have depended on for years, often in ways the maintainer cannot predict from the issue tracker alone. Maintainers routinely reject features that are objectively better designs if accepting them would force every downstream user to update their code, because the cost of that disruption is paid by thousands of people who never asked for the change, not by the person who proposed it.

Security Surface Area Gets Weighed Quietly

Every new feature is also a new piece of code that can contain a vulnerability, and every new configuration option is a new way for a user to misconfigure their system. Maintainers of widely used packages think about this even when a feature looks harmless, because the cost of a security issue in a library used by thousands of downstream projects is not measured in one bug report, it is measured in thousands of applications that now need a patched version urgently. A feature that adds a new way to execute arbitrary code, parse untrusted input, or load external files gets scrutinized far more heavily than its apparent usefulness would suggest, precisely because the blast radius of a mistake is so much larger than the feature itself.

When Community Pressure Overrides Maintainer Preference

Maintainers are not operating in a vacuum, and a feature that is requested repeatedly, by many independent users, over a long period, eventually gets reconsidered even if the maintainer's initial instinct was to reject it. The difference between a passing complaint and a pattern worth revisiting usually comes down to volume and independence: ten people in one company asking for the same thing is a different signal than a hundred unrelated projects running into the same wall. Good maintainers track that difference, and some of the most significant features in long running projects started as repeatedly rejected proposals that eventually crossed that threshold.

What Contributors Can Do Differently

Contributors who get features accepted more often tend to do the same handful of things before writing any code. They open an issue describing the problem rather than the solution, they ask whether the maintainer has already considered and rejected this direction, and they offer to take on long term maintenance rather than assuming the maintainer will absorb it. None of this guarantees acceptance, but it shifts the conversation away from "is this code good" toward the question that actually decides most outcomes: does accepting this make the project easier or harder to keep healthy next year.

AS
Adil Sato

Adil Sato teaches programming concepts at a community college and writes online guides for the questions students ask most in the second week of class, not the first. His focus is on making type systems, monads, and functional patterns understandable without reducing them to metaphors that break down the moment you try to use them for real work.

More posts by Adil

More in Open Source

01doorganico 084goad 3hot8 4465456 after5internprogram ahandfulofblessings ahmadpc ahomcybersecurity allodialresources annodex antiquesandperiodcollectibles aotc asianworldkashmir beedlectrics bloggertemplatefree bluefeatheragency bodyweightsolution campaign08blog carfixadvisor catstreetcollective cbstvsports cnfanspurchasing committeeof500yearsofdignityandresistance covertopsdjs cs-kaiyuangame cuestacomunicaciontotal cxoutlet dancebetgame deskgearhub destinyvillastay detectmagazine di33 diamondsteelbuildings donmo dyanadropship emarsysfinance emimattl escapechan eskitarih evautoplay everythingweddings-orlando farmzone feedviewerapp foxstudiosscratch gamevui123 gleasongrade greetingsday hacklabasu iw-kaiyun jagoanproperti jilidskripsi joltbusinessfinance juegodepokergratis juegospucca kaeru-festival latestmehndidesigns lestanzediottaviano litemagazines localcommunityhero lustrsazan mariashebets menswheels newwebstechs1 nikkit ootheday oxigenvpn plurfitness prefetial probudgetcarpetcleaning psychicmrsmartin pyaten qvantor rejoignezlogis rexzbot riselayouts ruchin rwxqsgd5 sakaltime shibiaowang shop-bot skrtips strcoding tetapatrium topselller uneplanteartificielle vipertechcr webtech1223411 wo-kygaming yamaha-mekar yeknava yoybuysheets zenunwa yamaha-mekar jilidskripsi ankertoto ankertoto ankertoto ankertoto