← Research Notes中文
Technology · 2026-07-27 · 10 min read · Close read

What Kills Open-Source and Nonprofit Projects: The Name, the Domain, Publish Rights, Ownership

The standard answers to "how do I keep a project alive" are: find funding, prevent burnout, build community. On the evidence, none of the three is the primary cause. What actually kills projects is that four un-forkable assets are held by one person who will change jobs, get tired, or disappear — and the new variables that arrived in 2026 only steepened the load curve. They did not change that structure.

Research note

This piece reviews the structural half of how an open-source project — and a public-benefit project — stays alive over the long term: permissions, succession, trust, and shutdown. Figures were traced to primary sources wherever possible: original paper PDFs, regulations and official changelogs in full text, npm’s official API, and maintainers’ own blogs and announcements. Every conclusion carries one of three grades: [Solid] = traced word-for-word to a primary source and not materially shaken; [Narrowed] = the direction holds, but the widely circulated phrasing was too broad or the numbers were wrong, and what appears here is the corrected version; [Judgment] = mechanically coherent but without direct empirical support — an inference. The other half — money (sponsorship, public funding, fundraising compliance) and legal form — is a separate piece.

1. The structural layer: four things you can't fork

"The project dies when the founder leaves" is almost always misread in an open-source context. MIT and Apache-2.0 already guarantee that anyone can take the code and continue. What dies is never the code. What genuinely cannot be forked is four things:

  1. The package name / namespace (the string you occupy on npm, PyPI, crates)
  2. The domain and its DNS
  3. Publish rights (the ability to push a fixed version to already-installed users)
  4. Organization ownership (the owner seat on the GitHub org)

The nonprofit side is structurally identical, substituting: the legal entity, the public-fundraising qualification (or the sponsorship relationship), the donor list, and the continuity of the ledger.

Downstream trust in a package name or a domain is inherited. Nobody re-runs diligence when a maintainer changes hands, and neither registries nor browsers signal that it happened. So "handing it over" means transferring an already-established trust credential covering tens of thousands of downstream consumers, wholesale, to a new party.

This is why you must never simply let the domain expire [Solid]: expiry means the drop-catch market, where an attacker acquires it for nothing — worse than selling it. polyfill.io is the sale case: in February 2024 the domain was sold to Funnull, an entity with almost no industry record, and from June it injected code redirecting users to gambling sites. Worth correcting a widely repeated error: the original author, Andrew Betts, never owned that domain (the service was operated by the Financial Times); his statement afterwards was simply that modern browsers no longer need it and people should stop using it.

2. Where the bus factor actually sits

[Narrowed] A bus factor of ≤2 is the norm in popular projects — roughly 46–65%. Avelino et al. measured truck factor across 133 popular GitHub systems: TF=1 for 34%, TF=2 for 31%, so 65% at ≤2. Metabase re-ran the truckfactor library over the top 1,000 repos by stars (about 95% computable) and found "nearly half at ≤2, and only 10% at ≥6." The frequently quoted "74%" is wrong.

The Metabase re-run also produced a counterintuitive finding: star count is uncorrelated with bus factor. Being well known is not being safe.

[Judgment] But every one of those percentages measures "who wrote more than half the files." No public dataset has ever measured concentration of publish rights. A project whose GOVERNANCE.md lists five maintainers while exactly one holds npm publish still has a bus factor of 1 in the sense that matters. This is the most important reframing in this piece — and it has to be labeled an inference, because it rests on mechanism rather than data.

The metric also deserves cooling off. Avelino's own validity check cuts against high confidence: asked whether losing the identified TF authors would cause the project trouble, 39% agreed and 43% disagreed. Most maintainers do not accept that the metric is fatal.

3. The 2025–26 platform shift: "guard your key" is now obsolete advice

The most widely circulated succession advice is "never transfer the release signing key." That is largely void as of 2026 [Solid]:

The control point therefore moved from "who holds the key" to "who can merge to the release branch, and who can approve that workflow."

The direct implication: .github/workflows/** must have its own CODEOWNERS entry with required review. Granting merge rights without locking the workflow silently grants publish rights too — anyone who can change one line of the release workflow can make your trusted publishing identity sign an artifact you never reviewed.

Also know what it does not solve [Narrowed]: trusted publishing defends against long-lived token theft — which is the highest-base-rate incident class (on 2025-09-08 chalk, debug and 16 other packages were poisoned, entry being a forged 2FA-reset email that harvested a username, password and a live TOTP; on 2025-09-14 the Shai-Hulud worm took down 500+ packages) — but it does not defend against a malicious successor. So the real first priority is switching 2FA on both the registry and the GitHub account from TOTP to a passkey or hardware key: WebAuthn is origin-bound, so the same phishing email fails. The order matters: enabling trusted publishing while your GitHub account remains phishable upgrades the attacker from "steal one token" to "own a standing publishing pipeline."

4. The real xz timeline: why time gates don't hold

"Set a six-month observation period plus five non-trivial PRs" is the most common succession-risk advice. Against the actual xz (CVE-2024-3094) timeline, that gate lets the attacker through on schedule [Solid]:

Common accountActual (Russ Cox's item-by-item timeline)
Twelve months of contributions to build credibility firstThe sockpuppet pressure began 5.8 months after the first patch (2021-10-29). Contribution and pressure ran in parallel.
Then another six months from commit rights to release rights2.6 months (2022-12-30 → 2023-03-18, tagging v5.4.2)
The backdoor hid in the tarball; git was cleanThe payload blob was in git (disguised as corrupt test data, 2024-02-23). What was tarball-only was the build-to-host.m4 glue that wired it into the build.
First patch → backdoored release ≈ 28 months; and after obtaining release rights he published cleanly for about 11 more months

So the only genuine use of a numeric gate is to give you a line to decline with: "this is project policy, not about you." Say exactly that. Do not dress it up as a security control.

Two things actually work: release artifacts must be reproducibly built by CI from a git tag (eliminating the git-versus-tarball delta and forcing the injection surface back into publicly auditable territory), and no individual can release alone.

One popular recommendation that should be deleted

One school of advice says to treat anyone urging you to add a co-maintainer as an attack signal. Delete it: the base rate is around 1%, and the cost is systematically suppressing succession planning — in direct conflict with "bus factor = 1 is the number one long-term killer." The correct formulation is a timeline invariant: no matter who applies pressure or how legitimate the reason, the clock on privilege escalation does not accelerate. The response to pressure is process, not a judgment about the person.

5. The 2026 variables: the section most likely to change your judgment

curl's full arc (the popular account covers only the first half)

WhenWhat happened
2025-07About 20% of submissions were pure AI slop; the confirmation rate fell from a historical >15% to <5%; a 7-person security team, with each report engaging 3–4 people for 30 minutes to 3 hours each
2026-01-31Bounty shut down (cumulative >$100,000 paid, 87 real vulnerabilities confirmed — the money always came from the Internet Bug Bounty), with the platform simultaneously moved from HackerOne to GitHub private vulnerability reporting
2026-02-25"The inflow tsunami has dried out substantially" — but the author explicitly said he could not separate the effect of removing the money from the effect of moving platforms. The same day, a move back to HackerOne was announced (GitHub lacked some 15 required capabilities), the author calling the switch "a mistake"
From 2026-03Zero bounty, back on the original platform, entering "high-quality chaos": more than one report per day on average, 4–5x 2024 and 2x 2025 — with quality at an all-time high
2026-06Release 8.21.0 shipped 18 CVEs in a single version, a project record; the maintainer wrote publicly that he might soon have to cut his working hours
2026-07Vulnerability intake closed for the entire month; the release slipped two weeks
Removing the money only kills arbitrage on fake reports. It does not solve the flood of real ones. The second wave isn't money-driven — credit, CVE attribution, a résumé, and security-tool vendors demonstrating capability are sufficient motivation. The harder part: burnout risk is higher after removing the bounty, because now every report is real and you have no legitimate ground to decline.

One counterintuitive piece of reassurance: nearly all of curl's recently discovered vulnerabilities are rated LOW or MEDIUM, and the most recent HIGH-severity CVE dates to October 2023. What AI finds at scale is the long tail of small defects, not catastrophic holes — a spike in CVE count does not mean the product is becoming more dangerous, so don't over-react to the number.

More lethal than slop: users no longer entering the community

[Solid] Record usage and a funnel at zero can coexist — and every metric you watch stays green.

The operational implications: decouple the revenue entry point from page views (monetize at the moment of use — CLI login, runtime license, hosted service, support contract — not "x% of people who visit the docs will buy"); decouple the recruitment entry point too (put the contribution path into error messages, CLI output and release notes rather than hoping someone browses to CONTRIBUTING.md); and put "docs-site unique visitors / new questions / first-time contributors" on a monthly dashboard with a decline alert — Tailwind's lesson is precisely that the curve is gradual enough that without a threshold you won't notice.

Gates belong at the identity layer, not the "was this written by AI" layer

[Solid] You cannot reliably detect AI-generated content, but you can reliably limit how much of your attention a stranger's account can consume. Three free switches shipped in 2026: repository-level PR access settings (2026-02-13, allowing PRs to be disabled entirely or restricted to collaborators), concurrent PR limits (2026-06, capping users without write access — PRs opened by Copilot and other AI agents count toward the quota, drafts do not, and long-standing contributors can be added to a bypass list), and collaborator-only issue creation (2026-06-29).

But the precondition has to be stated [Judgment]: this is net-positive only once inbound stranger PR/issue volume already exceeds your review capacity. Every example comes from projects at the scale of Homebrew or llama.cpp. A low-traffic project's real constraint is that nobody comes; closing the gate early cuts off the top of the contributor funnel, in direct conflict with preventing the founder-leaves-project-dies outcome. Note too that collaborator-only issue creation blocks more than it sounds like — it takes real users' bug reports with it.

6. Trust: specific to the nonprofit side, structurally identical on the open-source side

[Solid] Mixing project funds with personal finances means, mechanically, that you can only answer challenges with your private life. Once the money is in your personal wallet, "how many properties do you own" becomes a legitimate question and you have no institutional answer — because your bank statement contains your private life, you can only refuse to reconcile, and refusing confirms the accusation.

The Luo Er case in China (November 2016) is the cleanest specimen of this mechanism: the platform ultimately returned a total of 2,525,808.99 yuan in tips (another accounting gives 2,626,919.78) to the original payers before midnight on December 3. He was not penalized administratively and was not found to have committed fraud — yet the civil affairs authority, the legislative affairs commission, the platform and public opinion all characterized the event differently. The lesson is not merely "lawful ≠ defensible," but something harder: once the money is in your personal wallet, you no longer control the characterization.

[Narrowed] The fuel for a collapse of trust is usually being unable to answer about one specific transaction — but add this: a line-item ledger can only prove nothing was stolen. It cannot prove what should have been spent was spent.

So a line-item ledger has to be paired with "the due date for undisbursed funds, the disbursement conditions, and what happens if it slips." And the ledger itself must be a byproduct of wherever the money actually lives [Judgment] — never a hand-maintained page you have to remember to update. A ledger that stopped updating eleven months ago is worse than no ledger: it proves you once had the discipline and lost it.

[Solid] Don't spend limited money on a formal audit first. ACFE's Occupational Fraud 2024 (1,921 cases, roughly $3.1B in losses): 43% of frauds are detected by tips and only 3% by external audit — while 84% of victim organizations already had an external audit. Audit is a compliance credential for regulators and large donors, not a detector; the detector is somebody being able to speak. The one-person equivalent: give a trusted third party outside the project read-only access and state publicly who holds it (the statement itself is the deterrent), plus an anonymous challenge address, plus a surprise reconciliation each quarter.

[Judgment] Don't publish an overhead ratio; publish "what a year costs to stay alive" and "what I pay myself." Ratios can be recomputed, so they are permanently arguable; a budget and a salary are statements of fact and are not. Babel put maintainer salaries directly on a public blog (Henry Zhu's full-time baseline at $11,000/month) — the controversy happened once, and nobody has used it since. Not publishing your own pay is the real landmine: someone will eventually back it out from "income minus known expenses," and at that point any number looks like embezzlement, because you concealed it.

But don't treat "publishing the shortfall" as a fundraising channel either: the Babel post that disclosed a $333,000 gap simultaneously cut three maintainers to $6,000/month; as measured in July 2026, its Open Collective annual income is about $285k — up roughly 70% over five years, and still below the line stated back then. Publishing a shortfall is honesty, not a channel.

7. Shutting down: archiving doesn't send anyone away

[Solid, measured] From the npm downloads API for 2026-07-18 to 24: request at 14,985,210 per week — it marked all 126 versions deprecated back in 2020, and six years later this is where it stands; moment at 36,228,334; core-js at 65,873,924.

Your exit has to assume users will never read anything you publish — because there is no human in the decision loop at all. At that volume, the overwhelming majority of downloads are CI reinstalls and transitive pulls from other unmaintained packages. So the exit has to be machine-readable. The consumer is a machine.

Three actions serving three different purposes; do not treat them as equivalent:

[Solid] Copy two templates for the exit notice. Atom supplies the date: announced 2022-06-08, committing to archive on 2022-12-15, with the announcement itemizing what will break (package management stops working, no security updates, collaboration service ends) and what still works (prebuilt binaries on the releases page remain downloadable). One caveat: it actually archived on 2023-03-03, about 2.5 months late — the date is a floor, and slippage needs a public follow-up note so the buffer period doesn't become a new source of uncertainty. Moment supplies the falsifiable commitment boundary: one characterization ("not dead, but it is indeed done") plus two things it will do (critical security concerns, following time-zone data updates) and six it will not (no new features, no API change, no bundle-size work, no v3, no fixing long-standing known bugs, no accepting changes without adequate evidence), closing with five named alternatives.

There is one more universal lesson from Atom: on 2023-01-30 its code-signing certificate was preventively revoked after unauthorized access, and versions 1.63.0/1.63.1 of the already-archived project stopped running on 2023-02-02. Archiving does not terminate any asset that can still publish in your name or is still injecting runtime content into users' machines — on the way out you must go through the list and mark each item "keep renewing" or "kill deliberately": domains, registry tokens and 2FA recovery, the GitHub account, developer accounts, OTA update endpoints, signing and push certificates.

Finally, write one sentence into the notice in advance: "The package name and publish rights will not be transferred; you are welcome to fork under a new name." Nobody comes asking after a large project archives, but an independent developer will be asked within a day — and handing publish rights to an enthusiastic stranger is exactly how both event-stream (2018) and xz (2024) opened.

Primary sources: Avelino et al., “A Novel Approach for Estimating Truck Factors” (arXiv:1604.06766) and Metabase’s 2022-11-14 re-run; Russ Cox’s xz timeline at research.swtch.com/xz-timeline; the official npm trusted publishing / staged publishing documentation and GitHub’s September 2025 npm supply-chain hardening plan; Daniel Stenberg’s six first-hand blog posts from July 2025 through June 2026 and curl.se’s current vulnerability policy; GitHub’s three repository-settings changelogs from February and June 2026; Tailwind Labs’ founder’s public statements and Stack Overflow’s official site data; ACFE, “Occupational Fraud 2024”; the ProPublica/NPR investigation of the Red Cross in Haiti; the official Atom and Moment wind-down announcements; and the npm downloads API measured directly (2026-07-18 to 24). Every load-bearing conclusion was independently re-verified; what appears here is the corrected version, with grades and staleness risk marked line by line.

Amos · research.xishe.ai · Please credit when republishing