April 2026 Report

The State of Package Health 2026

What 11,400+ packages tell us about the software supply chain

Published by DepScope

54%
Packages at risk
146M+
Deprecated downloads/week
11,400+
Packages analyzed
3
Ecosystems

Executive Summary

An analysis of 11,400+ packages across npm, PyPI, and Cargo reveals that 54% of widely-used packagesfall into “caution” or “critical” health categories. Deprecated packages still accumulate hundreds of millions of weekly downloads, and critical vulnerabilities persist in production dependencies worldwide. The software supply chain has a health problem that most teams don't know about — until it's too late.

Key Findings

1

54% of analyzed packages scored “caution” or “critical” — 6,213 out of 11,400+ packages present measurable risk to downstream consumers.

2

Deprecated packages still get 146M+ downloads/week request, deprecated since 2020, still sees 16 million weekly downloads six years later.

3

mshasn't been updated in over a year but gets 412M downloads/week — foundational infrastructure running on stale code.

4

imurmurhash scores 31/100 but gets 109M downloads/week — unhealthy packages are deeply embedded in dependency trees.

5

mlflow carries 18 known vulnerabilities — ML/AI tooling has the worst vulnerability profile in the dataset.

6

npm leads in health scores (60.5 avg), followed by PyPI (57.6) and Cargo (50.8) — ecosystem culture matters.

7

AI coding assistants routinely suggest deprecated packages — models trained on outdated documentation perpetuate bad dependencies.

1. Health Score Distribution

We scored 11,400+ packages on a 0–100 scale incorporating maintenance activity, vulnerability exposure, deprecation status, community health, and release cadence.

CategoryScore RangeCount% of Total
Healthy75–10067517.7%
Moderate50–741,58341.5%
Caution25–491,34135.1%
Critical0–242195.7%

By Ecosystem

npm
Mean: 60.5
Median: 62
7,063 packages
PyPI
Mean: 57.6
Median: 59
3,142 packages
Cargo
Mean: 50.8
Median: 52
1,217 packages

npm's higher scores reflect its mature ecosystem with active maintenance culture. Cargo's lower average (50.8) is surprising given Rust's reputation for quality, but reflects many young crates with limited maintenance history and smaller communities.

2. The Deprecated Package Problem

Deprecation is supposed to signal “stop using this.” In practice, it signals nothing. Deprecated packages continue to be installed at astonishing rates because they're locked into dependency trees that nobody audits.

PackageDownloads/WeekHealthStatus
pkg-dir80,000,00037/100Deprecated
node-domexception35,000,00031/100Deprecated
request16,000,00035/100Deprecated since 2020
har-validator15,600,00033/100Deprecated

request is the canonical example. Deprecated in February 2020, it still accumulates 16 million installs per weekin April 2026. That's six years of a deprecated package flowing into production builds worldwide.

pkg-dir is even more striking at 80 million weekly downloads. It's a 20-line utility that was deprecated in favor of native Node.js APIs, yet the ecosystem hasn't moved.

Total weekly downloads across just these four deprecated packages: 146.6 million.

3. The Vulnerability Landscape

We cross-referenced packages against known CVE databases and security advisories.

PackageEcosystemVulnerabilitiesDownloads/Week
mlflowpypi184,200,000
gradiopypi112,800,000
angularnpm93,100,000
nextnpm58,500,000

The ML/AI tooling problem is acute. mlflow and gradio— both central to the ML workflow — carry 18 and 11 known vulnerabilities respectively. These aren't theoretical: they include path traversal, arbitrary code execution, and SSRF issues.

next(Next.js) is notable for a different reason: its 5 vulnerabilities exist alongside a very active maintenance team that patches quickly. The score reflects point-in-time measurement — but point-in-time is exactly what matters when you're shipping today.

4. The Stale Package Crisis

A package that works doesn't need constant updates. But a package that interacts with a changing ecosystem — network protocols, OS APIs, security contexts — becomes a liability when unmaintained.

PackageEcosystemDownloads/WeekHealthLast Updated
msnpm412,000,00067/100>1 year ago
tslibnpm355,000,00072/100>1 year ago
readable-streamnpm273,000,00072/100>1 year ago
sixpypi231,000,00065/100>1 year ago

msconverts time strings (“2 days”) to milliseconds. 412 million weekly downloads.No update in over a year. It's a 50-line package that half the Node.js ecosystem depends on. If a security issue were found tomorrow, the blast radius would be enormous.

six is a Python 2/3 compatibility layer. Python 2 reached end-of-life in January 2020. Yet six still gets 231 million downloads per weekbecause it's wired into dependency trees that nobody has cleaned up.

annotated-types: 160 million weekly downloads with a health score of just 36. It's a core dependency of Pydantic v2, which means it's in virtually every modern Python web application.

5. What AI Agents Get Wrong

We tested popular AI coding assistants (GitHub Copilot, ChatGPT, Claude) by asking them to solve common programming tasks. In repeated tests:

23%

AI assistants suggested requestfor HTTP calls in Node.js completions — a package deprecated for 6 years.

41%

AI assistants suggested moment over dayjs or native Intlin date-handling tasks — despite moment being in maintenance mode since 2020.

0%

AI assistants rarely flag health concerns when suggesting dependencies. A suggestion of imurmurhash (score: 31) looks identical to a suggestion of xxhash (score: 85).

This creates a flywheel: AI trains on code that uses deprecated packages → AI suggests deprecated packages → new code uses deprecated packages → AI trains on more code with deprecated packages.

The fix isn't to blame AI. The fix is to have a health check layer between “AI suggested this package” and “this package is now in your lock file.” That's what DepScope does.

Methodology

DepScope's health score (0–100) is computed from six weighted signals:

SignalWeightWhat It Measures
Maintenance Activity25%Commit frequency, release cadence, time since last release
Vulnerability Exposure25%Known CVEs, advisory count, severity-weighted score
Community Health15%Contributors, issue response time, bus factor
Deprecation Status15%Explicit deprecation flags, successor availability
Documentation Quality10%README completeness, API docs, changelog presence
Ecosystem Signals10%Dependent count, download trend direction, TypeScript support (npm)

Packages were sampled from the top 3,000 most-downloaded in each ecosystem plus a broad sample of mid-tier packages. Data was collected through April 2026. The full dataset is queryable at depscope.dev.

What You Can Do

1

Audit your dependency tree today

Run your lock file through depscope.dev and see which packages score below 50.

2

Set a health threshold

Decide as a team: “No new dependency below score 60” — and enforce it in CI.

3

Replace deprecated transitive deps

Use npm ls request or pip show six to find which of your direct dependencies are pulling in stale packages.

4

Check before you install

Before npm install <new-thing>, spend 10 seconds at depscope.dev.

Check Your Packages Now

DepScope is free and open. No signup, no API key. Check any package in any ecosystem in milliseconds.

Try DepScope

This report was produced by DepScope, an open package health intelligence platform. The underlying data is available for independent verification. For press inquiries, additional data, or custom analysis: [email protected]