← Hub

The Real Cost of Open Source Dependency: My 347-Package Audit Results

hero

I've been running the same codebase for three years, adding dependencies as needed, never really thinking about who was behind them. Then last month, a critical package I relied on suddenly went dark—maintainer burned out, repository archived, no migration path. That's when I realized I had no idea who was actually keeping my product running. So I decided to find out.

The Audit Setup

Rather than debate open source sustainability in the abstract, I wanted to understand my actual exposure. I pulled every dependency from my JavaScript and Python stack—347 packages total—and started digging into who maintains them.

My methodology was straightforward but time-consuming. For each package, I tracked:

  • Number of active maintainers and their recent commit activity
  • Last meaningful update (not just automated dependency bumps)
  • Any visible funding or sponsorship
  • The "bus factor"—what happens if the primary maintainer disappears

I used a combination of GitHub API calls, npm/PyPI metadata, and manual investigation for anything that looked critical. The whole audit took me about two weeks of evenings.

The Raw Numbers

The results were more concerning than I expected:

  • 23% maintained by single developers with no clear succession plan
  • 15% haven't had substantive updates in over a year despite being actively used in production
  • Only 12% show any form of documented funding or sponsorship
  • 31 packages sit on what I'm calling my "critical path"—if they break, everything breaks

The funding numbers particularly surprised me. I assumed the most popular packages would be the most supported, but that wasn't consistently true. Some packages with millions of downloads are maintained by developers who've never received a dollar for their work.

Digging Into the Patterns

What emerged were some uncomfortable patterns. There's a negative correlation between package popularity and maintainer sustainability in my stack. The most-used packages often showed signs of maintainer fatigue—long response times to issues, reluctance to make breaking changes even when needed, or maintainers explicitly asking for help.

I found several cases where original maintainers had simply vanished. Not dramatically—just gradually fewer commits, longer gaps, then silence. The packages that survived these transitions were ones where someone else had commit access and stepped up. But that was maybe 40% of cases.

Geography was another surprise. A significant portion of my critical dependencies trace back to maintainers in just a few countries. That's not inherently bad, but it's a concentration risk I hadn't considered.

What This Actually Means for My Stack

The cascade risk was the most sobering discovery. I'd focused on direct dependencies, but many of those depend on other fragile packages. One utility library I barely think about depends on a parsing library maintained by someone who hasn't committed code in eight months.

I immediately replaced six packages based on the audit. Not because they were broken, but because the maintainer situation felt unsustainable. A date formatting library maintained by a single developer who'd been asking for co-maintainers for two years. A validation library where the maintainer explicitly said they were burned out.

But I kept others despite red flags. Sometimes the functionality was too specialized to replace easily. Sometimes the risk felt manageable—like a utility that's genuinely "done" and unlikely to need updates. The key was moving from unconscious dependency to conscious risk acceptance.

How This Changed My Dependency Decisions

I now do maintainer research before adding any package to my stack. It takes maybe ten minutes and has already saved me from at least three dependencies that looked solid from the outside but showed concerning patterns.

My new criteria aren't just about code quality:

  • Is there more than one person with commit access?
  • When was the last non-trivial update?
  • How does the maintainer respond to issues?
  • Are there any signs of funding or institutional backing?

I've also started vendoring more code. Not everything—that would be its own maintenance nightmare. But for small utilities where I understand the implementation, I'd rather own the code than own the risk.

The Uncomfortable Questions This Raises

The audit forced me to confront something I'd been avoiding: the asymmetry of open source. I'm building a commercial product on the unpaid work of hundreds of individual developers. Most will never see a dollar from my success, but my failure is guaranteed if they burn out.

There's a collective action problem here that I can't solve individually. I can sponsor a few maintainers, contribute patches, be a good citizen. But the fundamental mismatch between corporate usage and individual responsibility isn't something my dependency choices can fix.

What I can control is my own exposure. That means being more intentional about what I depend on and more prepared for when dependencies fail.

Living With Interdependence

The strangest part of this whole exercise was realizing how intimate software dependency really is. My product's reliability depends on the personal sustainability of people I'll never meet. A maintainer's sick parent, career change, or simple loss of interest can ripple through to my users.

I wonder sometimes if this brittleness is just the price of modern software development, or if there are models I haven't considered yet. For now, at least I know which relationships I'm counting on to keep working.