The Maintainer's No Skill
Maintainer burnout is mostly unsent nos: the feature request at 40 comments,
the well-meant PR that would triple the maintenance surface, the company
that filed "urgent" on a volunteer's project. Every avoided no costs a
week of low-grade guilt; the sent no costs five minutes and is almost never
received as badly as feared. This skill writes the specific no each
situation needs — with the reasoning shown, the effort honored, and a real
alternative where one exists — because "no with a why and a path" keeps
contributors that "maybe someday" quietly loses.
What This Skill Produces
- The situation-fit no, drafted ready to post: scope-no, PR-no,
support-no, urgency-no, or the fork blessing
- The reasoning paragraph: the project-vision line that makes this no
consistent instead of personal (and reusable next time)
- An alternative that's real: plugin/extension point, the fork blessing,
a linked workaround, a paid-support pointer if one exists — or nothing,
stated honestly, if nothing exists
- A policy line worth adding to CONTRIBUTING/README so the next no is
half-written
Required Inputs
Ask for (if not already provided):
- The thread/PR/request text, and how long it's been festering
- The real reason it's a no (doesn't fit vision? maintenance cost? just
don't want to? — all valid; the phrasing differs)
- Who's asking: first-timer, regular contributor, company, drive-by
- What the maintainer could genuinely offer, if anything (review a smaller
PR? accept behind a flag? nothing?)
Framework
- Diagnose the no. Scope-no (doesn't fit what this project is) ·
cost-no (fits, but the maintenance is forever and it's mine) · PR-no
(effort real, direction wrong) · support-no (this is unpaid volunteer
time being invoiced) · capacity-no (fits, but not this year — the only
no that may honestly become "someday").
- Honor effort before delivering direction. For PRs especially: name
something genuinely good in it first (one specific thing, not flattery).
The order is: thanks-with-specifics → the no with the why → the path if
real. Skipping straight to the no is efficient and expensive.
- Show the vision line, not the mood. "This project deliberately stays
[small/zero-dep/single-purpose]; features like X belong in
[plugins/forks/other tools]" — a no anchored to a stated principle
generalizes; a no anchored to today's energy invites relitigation.
If the principle isn't written anywhere yet, this is the moment: the
skill drafts the CONTRIBUTING line.
- Bless the fork sincerely. "This is exactly what forks are for — the
license means you don't need my permission, and I mean that as an
invitation, not a brush-off" defuses more standoffs than any other
sentence in open source.
- For companies: name the exchange. Volunteer-maintained ≠ SLA. The
reply states what's available free (the issue queue, at volunteer pace),
what isn't (deadlines, priority), and — if the maintainer wants it —
the paid path ("sponsorship/support contract gets your issue a
scheduled slot"). No apology anywhere in it.
- Close the loop physically. The no ends with the issue's fate:
closed-wontfix, converted to discussion, or left open behind a named
condition. A no that leaves the thread open re-accrues the guilt.
Output Format
## Diagnosis
[Which no this is, and the real reason in one honest line]
## The reply (ready to post)
[Thanks-with-specifics → the no with the vision line → the real path or
honest nothing → the thread's fate]
## Add to CONTRIBUTING (so the next one is half-written)
[The policy line this no just established]
## If they push back
[The one-paragraph second reply — same decision, warmer, final]
Quality Checks
Anti-Patterns
Related
[[maintainer-triage]] — the system that catches these before they fester;
[[saying-no-kindly]] — the general craft; [[first-maintainer-month]] for
setting the boundaries early enough that nos stay rare.
1---2name: the-maintainers-no3description: Say no as an open-source maintainer without burning contributors or yourself — the feature that doesn't fit, the PR that took someone a weekend but can't merge, the company that wants free support, the fork suggestion said kindly. Use when a maintainer says 'how do I reject this PR nicely', 'a company is demanding support', 'this feature request won't die', or is avoiding an issue thread out of guilt. Produces the specific no for the situation, with reasoning shown and the relationship kept.4---5
6# The Maintainer's No Skill
7
8Maintainer burnout is mostly unsent nos: the feature request at 40 comments,
9the well-meant PR that would triple the maintenance surface, the company
10that filed "urgent" on a volunteer's project. Every avoided no costs a
11week of low-grade guilt; the sent no costs five minutes and is almost never
12received as badly as feared. This skill writes the *specific* no each
13situation needs — with the reasoning shown, the effort honored, and a real
14alternative where one exists — because "no with a why and a path" keeps
15contributors that "maybe someday" quietly loses.
16
17## What This Skill Produces
18
19- The **situation-fit no**, drafted ready to post: scope-no, PR-no,
20 support-no, urgency-no, or the fork blessing
21- The **reasoning paragraph**: the project-vision line that makes this no
22 consistent instead of personal (and reusable next time)
23- An **alternative that's real**: plugin/extension point, the fork blessing,
24 a linked workaround, a paid-support pointer if one exists — or nothing,
25 stated honestly, if nothing exists
26- A **policy line** worth adding to CONTRIBUTING/README so the next no is
27 half-written
28
29## Required Inputs
30
31Ask for (if not already provided):
32- The thread/PR/request text, and how long it's been festering
33- The real reason it's a no (doesn't fit vision? maintenance cost? just
34 don't want to? — all valid; the phrasing differs)
35- Who's asking: first-timer, regular contributor, company, drive-by
36- What the maintainer could genuinely offer, if anything (review a smaller
37 PR? accept behind a flag? nothing?)
38
39## Framework
40
411. **Diagnose the no.** Scope-no (doesn't fit what this project is) ·
42 cost-no (fits, but the maintenance is forever and it's mine) · PR-no
43 (effort real, direction wrong) · support-no (this is unpaid volunteer
44 time being invoiced) · capacity-no (fits, but not this year — the only
45 no that may honestly become "someday").
462. **Honor effort before delivering direction.** For PRs especially: name
47 something genuinely good in it first (one specific thing, not flattery).
48 The order is: thanks-with-specifics → the no with the why → the path if
49 real. Skipping straight to the no is efficient and expensive.
503. **Show the vision line, not the mood.** "This project deliberately stays
51 [small/zero-dep/single-purpose]; features like X belong in
52 [plugins/forks/other tools]" — a no anchored to a stated principle
53 generalizes; a no anchored to today's energy invites relitigation.
54 If the principle isn't written anywhere yet, this is the moment: the
55 skill drafts the CONTRIBUTING line.
564. **Bless the fork sincerely.** "This is exactly what forks are for — the
57 license means you don't need my permission, and I mean that as an
58 invitation, not a brush-off" defuses more standoffs than any other
59 sentence in open source.
605. **For companies: name the exchange.** Volunteer-maintained ≠ SLA. The
61 reply states what's available free (the issue queue, at volunteer pace),
62 what isn't (deadlines, priority), and — if the maintainer wants it —
63 the paid path ("sponsorship/support contract gets your issue a
64 scheduled slot"). No apology anywhere in it.
656. **Close the loop physically.** The no ends with the issue's fate:
66 closed-wontfix, converted to discussion, or left open behind a named
67 condition. A no that leaves the thread open re-accrues the guilt.
68
69## Output Format
70
71```
72## Diagnosis
73[Which no this is, and the real reason in one honest line]
74
75## The reply (ready to post)
76[Thanks-with-specifics → the no with the vision line → the real path or
77honest nothing → the thread's fate]
78
79## Add to CONTRIBUTING (so the next one is half-written)
80[The policy line this no just established]
81
82## If they push back
83[The one-paragraph second reply — same decision, warmer, final]
84```
85
86## Quality Checks
87
88- [ ] The no is unambiguous — a reader cannot mistake it for maybe
89- [ ] Effort is honored with a specific, true observation, not a compliment
90 template
91- [ ] The reasoning cites a project principle that will still be true next
92 month
93- [ ] Any offered alternative is real — no "PR welcome" unless a PR would
94 genuinely merge
95- [ ] The thread's fate is stated (closed / converted / condition), and the
96 pushback reply doesn't reopen the decision
97
98## Anti-Patterns
99
100- [ ] Do not soften into ambiguity — "maybe down the road" costs you this
101 conversation again in six months, with interest
102- [ ] Do not apologize for the project's boundaries; gratitude yes,
103 apology no
104- [ ] Do not match a demanding tone — the calm no in a heated thread is
105 read by every future contributor, not just this one
106- [ ] Do not invent roadmap promises to escape the moment
107- [ ] Do not skip the fork blessing out of possessiveness — the license
108 already said yes; saying it warmly is free
109
110## Related
111
112[[maintainer-triage]] — the system that catches these before they fester;
113[[saying-no-kindly]] — the general craft; [[first-maintainer-month]] for
114setting the boundaries early enough that nos stay rare.