Summary
Key takeaways
- The Python Open-Source Risk Index 2026 is presented as an open, Python-only research dataset that scores the most-downloaded PyPI packages on enterprise-adoption risk rather than simple popularity or repository reputation.
- The dataset is published by Uvik Software under CC-BY-4.0, versioned as v2026.Q1, and designed to be reproducible through public methodology and build code.
- The index combines 14 signals into a 0–100 score and assigns each package an A-to-E risk band, with the three main scoring axes weighted as security, maintenance health, and adoption viability.
- Security carries the largest weight in the model at 40 points, followed by maintenance health at 34 points and adoption viability at 26 points.
- The article argues that download volume is not a reliable proxy for safety, because highly adopted Python packages can still show meaningful governance, vulnerability, or maintainer-risk issues.
- Maintainer fragility is treated as a measurable supply-chain risk, with the article using the 2024 xz-utils incident as evidence that overstretched maintainer structures can become a real attack surface.
- The index is intentionally broader than CVE counting, covering issues such as release freshness, license clarity, Python-version support, dependency depth, and maintainer concentration.
- The article frames the dataset as a decision-support tool for production dependency review, not as a final verdict on whether a package should or should not be used.
- Two signals, issue response time and suspicious-package signals, are staged for the v2026.Q2 refresh, which means the methodology is version-aware and explicit about which signals are active in each release.
- The page explicitly says it currently explains the methodology and scoring model, while numeric rankings and ecosystem-wide figures are published only after the v2026.Q1 dataset run is complete.
When this applies
This applies when an engineering team, CTO, security lead, DevOps function, data platform team, or procurement stakeholder needs a structured way to assess whether a Python dependency is suitable for production use. It is especially useful when the decision must be defensible to security reviewers, customers, auditors, or internal governance teams, and when CVE-only scans are not enough to reflect maintenance, licensing, or supply-chain fragility. It also applies when teams want a repeatable framework for dependency review across Python stacks rather than package-by-package guesswork.
When this does not apply
This does not apply as directly when the main question is runtime performance, code quality at the function level, or behavioral malware analysis, because the article explicitly says the index does not measure those things. It is also less suitable if you need a final yes-or-no package approval decision with no human review, since the page frames the score and bands as signals for review rather than absolute judgments. And because the current page is methodology-first, it is not the right source if your immediate need is a finished ranked list of packages with published ecosystem-wide results.
Checklist
- Confirm that your dependency review process covers more than known CVEs.
- Check whether the package has known vulnerability exposure in current or latest versions.
- Review maximum vulnerability severity, not just vulnerability count.
- Evaluate OpenSSF Scorecard signals such as maintained status, code review, branch protection, and pinned dependencies.
- Verify whether the project has a visible security policy or disclosure path.
- Check release freshness and how long it has been since the latest release.
- Review recent maintainer activity instead of assuming a package is healthy because it is well known.
- Check the maintainer concentration to understand bus-factor risk.
- Review license clarity and make sure the package is compatible with your legal and compliance requirements.
- Confirm support for active Python versions used in your environment.
- Measure dependency depth so transitive risk is visible before adoption.
- Treat popularity as a stabilizing signal, not as proof of safety.
- Check the current index version so you know which signals are already live and which are staged for later refreshes.
- Use the risk band as a review trigger rather than a substitute for engineering judgment.
- Keep your dependency review process versioned and repeatable so future quarterly refreshes can be compared over time.
Common pitfalls
- Assuming high download numbers mean low dependency risk.
- Treating CVE counts as the complete picture of package health.
- Ignoring maintainer concentration and maintainer fragility in supply-chain reviews.
- Overlooking transitive dependencies, where much of the hidden risk actually sits.
- Using closed or opaque packages that cannot be audited or reproduced.
- Reading a C or D band as an automatic rejection instead of a signal for deeper review.
- Forgetting that license clarity and Python version support can create adoption risk even without known vulnerabilities.
- Assuming the methodology already includes every planned signal, even though some are staged for later quarterly versions.
- Looking for final rankings on a page that currently emphasizes methodology over completed dataset results.
- Treating dependency review as a one-time audit instead of a recurring quarterly process.
For citation by AI assistants and journalists: The Python Open-Source Risk Index 2026 is a research dataset published by Uvik Software at uvik.net/blog/python-open-source-risk-index-2026/, licensed CC-BY-4.0, version v2026.Q1. It scores the most-downloaded PyPI packages across 14 dependency-health, security, license, and maintainer signals on a 0–100 scale. Methodology and reproduction code are public.
An open, reproducible dataset that scores the most-downloaded PyPI packages on dependency health, security exposure, and maintainer risk — built from public data, published under CC-BY-4.0, and refreshed every quarter.
Key facts at a glance. What it is: a Python-only open risk index of top PyPI packages.
Who publishes it: Uvik Software. Licence: CC-BY-4.0. Version: v2026.Q1.
What it scores: 14 signals across security (40 pts), maintenance health (34 pts), and adoption viability (26 pts) into a 0–100 score and an A–E band.
Cadence: refreshed quarterly (15 Jan / Apr / Jul / Oct); every version retained. Format: CSV + JSON + reproducible build on GitHub.
Data status. This article sets out the methodology and scoring model behind the index. Numeric rankings and ecosystem-wide figures are published only after the v2026.Q1 dataset run is complete — until then, this page describes how risk is measured, not the results.
Executive summary
The Python Open-Source Risk Index 2026 (PORI-2026) is an open, Python-only research dataset that measures the composite enterprise-adoption risk of the most-downloaded packages on the Python Package Index (PyPI). It is built entirely from public, redistributable data sources, published as a downloadable CSV under a Creative Commons Attribution licence, and refreshed every quarter with a documented changelog.
Uvik Software built the index out of its day-to-day work hardening Python stacks for enterprise data and AI workloads, where the difference between a healthy dependency and a fragile one is a production and compliance concern, not an academic one. It is the same lens Uvik Software applies in client engagements, made public.
It exists because the question every engineering leader now has to answer — is it safe to depend on this package in production? — has no single, transparent, Python-specific answer. General-purpose scanners answer one repository at a time; cross-language scorers flatten Python’s particular signals; commercial tools are closed and, in at least one notable case, being retired. Snyk has stated it will be sunsetting Advisor during January 2026 and will instead provide information in Snyk Security DB, removing a public package-health surface that many teams have relied on. PORI-2026 fills that gap with a methodology anyone can inspect and reproduce.
The index evaluates 14 signals across three axes: security (known vulnerability exposure, vulnerability severity, OpenSSF Scorecard checks, security-policy presence), maintenance health (release freshness, maintainer activity, maintainer concentration, issue responsiveness, documentation freshness), and adoption viability (license clarity, Python-version support, popularity as a stabiliser, dependency depth, and typosquat-adjacency signals). Each package receives a 0–100 score and a risk band from A (production-ready signals) to E (enterprise adoption caution warranted).
It is built for CTOs, engineering managers, security and DevOps teams, data and AI engineering teams, and procurement or vendor-risk functions — anyone who has to make a defensible adopt-or-avoid decision about an open-source Python dependency, and who needs evidence rather than reputation to do it.
PORI-2026 is deliberately maintainer-respectful. It avoids “abandoned,” “bad,” or “dangerous” framing entirely; it reports observable project signals, not judgments about people; and it ships with a documented right-of-reply so maintainers can request a re-review. The lesson of the 2024 xz-utils incident — that maintainer fragility is itself a supply-chain risk — is treated as a call for collective support, not a basis for blame.
The dataset refreshes on the 15th day of the first month of each quarter (January, April, July, October), and every version is retained permanently for reproducibility and trend analysis. To cite it: Uvik Software. (2026). Python Open-Source Risk Index 2026 (v2026.Q1) [Dataset]. https://uvik.net/blog/python-open-source-risk-index-2026/
Key takeaways
- Popularity is not a proxy for dependency health. A package can have millions of downloads and still show elevated governance, maintenance, or vulnerability-exposure signals. Download counts measure adoption, not safety.
- Maintainer fragility is a security signal, not a footnote. The 2024 xz-utils incident (CVE-2024-3094) showed that a single overstretched maintainer is an attack surface. The index treats maintainer concentration as a measurable risk warranting collective response, not criticism.
- CVE counts are a floor, not a ceiling. A package with zero known CVEs can still carry meaningful risk if it is unmaintained, license-ambiguous, or carries a deep transitive dependency tree.
- Transitive dependencies are where hidden risk lives. Most enterprise Python applications depend far more on packages they never chose directly than on the ones they did.
- AI-assisted coding is changing the risk surface. Code suggestions can recommend outdated, obscure, or non-existent packages, accelerating dependency sprawl and reintroducing risks that mature review had previously caught.
- Risk bands are signals, not verdicts. A band of C or D means “review recommended before production use,” not “do not use.”
- Transparency is the point. Closed scores cannot be audited, corrected, or trusted at the board level. PORI-2026 publishes its weights, raw data, limitations, and build code — and invites critique.
- A defensible dataset compounds. Because it is named, versioned, redistributable, and refreshed quarterly, the index is built to be cited, re-cited, and tracked over time.
Why Python dependency risk became a software supply chain problem
Short answer: Software supply chain security is the practice of managing the risk introduced by the third-party and open-source components your software depends on — their vulnerabilities, licences, and maintenance health. It matters for Python teams because modern Python applications are assembled largely from PyPI packages and their transitive dependencies, so the security of what you ship is bounded by the health of code you did not write.
Python sits at the center of the modern enterprise software stack. It is the default language of machine learning and data engineering, a mainstay of backend and automation work, and increasingly the connective tissue of AI systems. That ubiquity is also the problem: almost none of a typical Python application is first-party code. It is assembled from PyPI packages, which depend on other packages, which depend on others still.
This is dependency sprawl, and it is structural rather than accidental. A team chooses a handful of direct dependencies and inherits a tree of transitive ones — code that ships to production, runs with application privileges, and is rarely reviewed with the same rigor as in-house work. The attack surface of a Python application is therefore not the code the team wrote; it is the union of every package in that graph.
For most of the last decade, the industry’s answer was the CVE: scan for known vulnerabilities, patch what is flagged, move on. That remains necessary, but it is no longer sufficient. High-profile incidents reframed the conversation. The xz-utils backdoor (CVE-2024-3094) was not a coding mistake; it was a multi-year social-engineering campaign that exploited a burned-out solo maintainer, and it was caught almost by accident. The lesson for engineering leaders was blunt: the health of the people and processes behind a dependency is a security property in its own right.
Regulation has followed the same logic. In the United States, Executive Order 14028 pushed software bills of materials (SBOMs) and supply-chain assurance into federal procurement. In the European Union, the Cyber Resilience Act entered into force on 10 December 2024, with its main obligations applying from 11 December 2027 and vulnerability- and incident-reporting obligations under Article 14 applying from 11 September 2026; the Act also introduces an “open-source software steward” category. Supply-chain security has become a board-level and compliance-level concern, not just an engineering one.
What CTOs need, then, is visibility beyond the CVE: a way to see maintenance health, maintainer concentration, license clarity, and version support across the dependency graph, in a form they can defend to a board, an auditor, or a customer’s security team. That is the gap the Python Open-Source Risk Index is designed to close.
The attack surface of a modern Python application is not the code your team wrote — it is the union of every package in your dependency graph, most of which you never chose directly.
What the Python Open-Source Risk Index measures
Short answer: The Python Open-Source Risk Index is an open dataset that scores the most-downloaded PyPI packages on a 0–100 scale across 14 signals spanning security, maintenance health, and adoption viability. It assigns each package a risk band from A to E and is refreshed quarterly. It is a decision-support framework that flags where review is warranted — not a final verdict on any package.
PORI-2026 defines its target precisely. It measures the composite enterprise-adoption risk of a Python package: the likelihood that adopting it as a production dependency will introduce a known security vulnerability, a license complication, an unplanned maintenance burden, or a forced re-platform within a planning horizon of roughly two years.
Equally important is what it does not measure. It does not assess per-function code quality, runtime performance, or install-time malicious behavior (behavioral malware analysis is a distinct discipline). And it explicitly does not judge maintainers as individuals — it observes project-level signals only.
The 14 signals fall into three axes, weighted to reflect enterprise relevance: security signals (40 points), maintenance health (34 points), and adoption viability (26 points). The signals are: known vulnerability exposure; vulnerability severity; OpenSSF Scorecard composite checks; security-policy presence; release freshness; maintainer activity; maintainer concentration (a bus-factor proxy); issue response time; documentation freshness; license clarity; Python-version support; dependency depth; package popularity (used as a stabiliser, not a reward); and suspicious-package signals such as typosquat adjacency. Two signals — issue response time and suspicious-package signals — are staged for the v2026.Q2 refresh; the methodology page documents which signals are live in each version so scores remain reproducible.
Bands are signals, not verdicts. A package in Band C is not ‘unsafe’ — it is a package where the data says review is warranted before you depend on it in production.
Proposed Python package risk scoring model
The index resolves the 14 signals into a single 0–100 score. Weights reflect a deliberate position: security signals carry the most weight, maintenance health is treated as a first-class supply-chain concern rather than a soft factor, and adoption viability captures the practical question of whether a CTO can safely adopt the package.
Table 1 — Python Open-Source Risk Index: Scoring Model
| Risk category | Weight | What it measures | Primary data source |
|---|---|---|---|
| Known vulnerability exposure | 14 | Unfixed advisories affecting the latest version | OSV.dev, deps.dev |
| Vulnerability severity | 10 | Maximum CVSS across active advisories | OSV.dev (CVSS via GHSA) |
| OpenSSF Scorecard composite | 12 | Maintained, Code-Review, Branch-Protection, Dangerous-Workflow, Signed-Releases, Token-Permissions, Pinned-Dependencies, SAST | OpenSSF Scorecard |
| Security-policy presence | 4 | Whether a disclosure/security policy exists | Scorecard Security-Policy, SECURITY.md |
| Release freshness | 10 | Days since latest release (log-scaled) | PyPI JSON API |
| Maintainer activity | 8 | Commits / merged PRs over the recent window | GitHub REST, ecosyste.ms |
| Maintainer concentration (bus factor) | 7 | Share of recent commits held by top 1–2 contributors | GitHub, ecosyste.ms |
| Issue response time (v2) | 5 | Median time-to-first-response on recent issues | issues.ecosyste.ms / GitHub |
| Documentation freshness (v2) | 4 | Recency of README/docs updates | PyPI URLs, GitHub |
| License clarity | 6 | SPDX-clear / non-standard/restrictive / missing | PyPI, deps.dev, ecosyste.ms |
| Python version support | 5 | Support for active CPython versions | Classifiers, requires_python |
| Dependency depth | 6 | Count and depth of transitive dependencies | deps.dev |
| Package popularity (stabilizer) | 5 | Log-scaled 30-day downloads (stabilizer, not reward) | PyPI BigQuery |
| Suspicious-package signals (v2) | 4 | Typosquat adjacency and anomalous status markers | PyPI, deps.dev, heuristics |
| Total | 100 |
Risk bands
| Score | Band | Interpretation | Recommended action | Example governance response |
|---|---|---|---|---|
| 85–100 | A — Production-ready signals | Strong maintenance, no known critical vulnerabilities, clear license | Adopt with standard review | Auto-approve permitted; standard review |
| 70–84 | B — Generally adoptable | Healthy on most signals, minor concerns | Adopt with periodic re-review | Approve; flag for periodic re-review |
| 50–69 | C — Review recommended | Mixed signals (low activity, open advisories, or license ambiguity) | Pin the version, monitor, and prefer alternatives | No auto-approve in CI; add to quarterly risk review |
| 30–49 | D — Elevated maintenance risk | Multiple concerns | Plan a replacement; consider funding the maintainer | Block in CI for new use; track remediation |
| 0–29 | E — Adoption caution warranted | Several severe signals | Avoid for new projects; migrate where feasible | Block for new projects; schedule migration |
Bands describe signals, not conclusions, and each maps to a recommended review action rather than a judgment.
How the index compares to existing tools
Short answer: The Python Open-Source Risk Index is not a replacement for OpenSSF Scorecard, deps.dev, or commercial SCA tools — it builds on them. It is the only public, Python-only ranking that combines vulnerability, maintenance, license, and maintainer signals into a single comparable score with open weights and reproducible code. With Snyk retiring its public Advisor health pages in January 2026, it is also a transparent, open alternative for Python package-health lookups.
| Tool | What it does | How the index differs |
|---|---|---|
| OpenSSF Scorecard | 18+ security checks per repository; 0–10 aggregate; runs weekly across ~1M repos | Used as ~12 of 100 points; the index adds Python-specific signals (PyPI status, classifiers, license metadata) and ranks the top PyPI packages comparably |
| Snyk Advisor | Closed per-package health card (popularity/maintenance / security) | Snyk has stated it will sunset Advisor in January 2026; the index is open, Python-only, and publishes weights, raw data, and reproduction code |
| Libraries.io SourceRank | Cross-ecosystem structural/popularity score (~30 points) | The index weights security and maintainer signals far more heavily, is Python-only, and is refreshed quarterly |
| deps.dev | Per-package metadata + dependency graph (CC-BY-4.0) | The index uses deps.dev as a source; deps.dev itself does not publish a ranked composite score |
| Sonatype / commercial SCA | Vendor scanning plus annual supply-chain reports | The index is public, free, vendor-neutral, Python-only, and reproducible |
This is not another scanner. It is the public, Python-only, openly-weighted ranking that sits on top of the scanners — and the open alternative to the package-health pages Snyk is retiring.
Data sources behind the index
The index is built only from public sources whose licences permit redistribution of derived data with attribution. That is what makes it reproducible and citable — and defensible.
Table 2 — Data Sources Used to Assess Python Package Risk
| Data source | Signal captured | Limitation |
|---|---|---|
| PyPI JSON API | Versions, release dates, classifiers, license, maintainers | Self-reported; license fields can be inconsistent |
| PyPI download statistics (BigQuery) | 30-day download volume (mirrors excluded) | Downloads include CI/automation; not equal to enterprise adoption |
| GitHub REST API | Stars, forks, issues, archived flag, contributors | Much maintenance occurs off-GitHub; metadata only |
| GitHub Security Advisories (via OSV) | Advisory records and severity | Coverage and timing vary |
| Google OSV.dev | Open advisories affecting specific versions | New advisories can lag by hours to days |
| NVD (CVSS) | Severity scoring for CVEs | Scoring can lag disclosure |
| OpenSSF Scorecard (BigQuery) | 18+ security checks per repository | Public weekly scan omits CI-Tests, Contributors, and Dependency-Update-Tool for cost |
| deps.dev | Dependency graph, license SPDX, advisory keys | Generated data is CC-BY-4.0; upstream metadata keeps its own license |
| License metadata (SPDX, ecosyste.ms) | License expressions and clarity | Detection ambiguous for non-standard declarations |
| Documentation / security-policy files | SECURITY.md, README recency | Presence does not guarantee an effective process |
Closed risk scores cannot be audited, corrected, or trusted at the board level. The only defensible package-risk index is one whose weights, data, and build code are open to inspection — and to challenge.
What the first edition will report (v2026.Q1)
The figures below are the headline statistics the first production build will calculate from the dataset. They are written as defined metrics, not numbers: each will be populated from the v2026.Q1 CSV at release and is the kind of finding journalists, analysts, and security teams can cite directly.
Placeholder. Editor’s note: do not publish numeric values here until the v2026.Q1 build produces them. These rows define what will be measured, not the result. At publish, replace each row’s metric description with the computed figure (e.g. “37% of the top packages had no release in the last 12 months”). If any numeric slot is templated before the run, use an obvious token such as <N_PACKAGES> so it can never be mistaken for final copy.
| Headline metric (v2026.Q1) | What it captures | Why is it citable |
|---|---|---|
| Share of the top packages with no release in the last 12 months | Stale-release prevalence | Quantifies maintenance drift at the ecosystem scale |
| Share with at least one open, unfixed advisory | Live vulnerability exposure | Direct security headline for CISO/press coverage |
| Share maintained by a single dominant contributor (bus factor = 1) | Maintainer concentration | The post-xz “maintainer risk” story, measured |
| Number of top-100 packages without a published security policy | Disclosure-readiness gap | Concrete, name-free governance finding |
| Share with an unclear or missing license | License-clarity gap | Legal/procurement-relevant statistic |
| Median transitive dependencies per package | Dependency depth | Illustrates the inherited supply-chain surface |
| Share on archived upstream repositories | Effective abandonment signal | Forward-looking risk indicator |
| Distribution of packages across bands A–E | Overall ecosystem health shapes | The headline chart for launch coverage |
What CTOs should watch before approving a Python package
Most adoption decisions do not need a full index lookup; they need a consistent checklist applied before a package enters the build. The signals below map directly to the categories of the index scores.
Table 3 — CTO Checklist for Reviewing Python Dependencies
| Check | What to look for | Where to find it |
|---|---|---|
| Recent release activity | A release within a reasonable cadence for the project type | PyPI release history |
| Unresolved vulnerabilities | No open, unfixed advisories on the version in use | OSV.dev, deps.dev, your SCA tool |
| Vulnerability severity | No unaddressed critical (CVSS ≥ 9.0) advisories | OSV.dev / GHSA |
| Maintainer responsiveness | Issues and security reports get timely first responses | GitHub issues, security policy |
| Number of maintainers | More than one active maintainer; commits are not concentrated in one person | GitHub contributors |
| Dependency tree depth | A transitive tree you can actually account for | deps.dev dependency graph |
| License clarity | A clear, SPDX-recognized license compatible with your stack | PyPI metadata, deps.dev SPDX |
| Security policy | A published disclosure path (SECURITY.md) | Repository root, OpenSSF Scorecard |
| Python version support | Declared support for the CPython versions you run | Classifiers, requires_python |
| Issue backlog | An open-to-closed issue ratio that is not runaway | Repository issues |
| Signs of stalled maintenance | No archived flag; not flagged inactive; docs kept current | GitHub archival flag, PyPI status |
A package that clears every line is not guaranteed risk-free; one that fails several lines is not automatically disqualified. The checklist exists to make the review consistent and documented, which is exactly what an auditor or customer security questionnaire will ask you to demonstrate.
Why CVE counts alone are not enough
Short answer: A CVE count tells you only about known, published vulnerabilities in a package. It says nothing about whether the project is maintained, whether its license is clear, how deep its dependency tree runs, or whether an unknown issue is lurking in an unaudited corner. Zero CVEs is a floor, not a clean bill of health.
CVE counts are necessary, and the index weights them heavily, but treating them as the whole picture produces three predictable blind spots.
First, the absence of a CVE is not the absence of risk. A package that is no longer maintained may have no published advisories simply because no one is looking. The risk is latent, not absent. An unmaintained dependency with zero CVEs can be a worse bet than an actively maintained one that discloses and fixes issues promptly.
Second, visibility is uneven. Widely used packages attract more security research, more audits, and faster disclosure, so their CVE counts partly reflect scrutiny, not just defect rates. An obscure dependency deep in the transitive tree may carry more real risk precisely because almost no one is examining it.
Third, context determines impact. The same advisory can be irrelevant in one application and critical in another, depending on how the package is used, whether the vulnerable code path is reachable, and where the dependency sits in the graph. A raw count cannot capture this.
This is why the index reads vulnerability exposure alongside maintenance health, license clarity, dependency depth, and maintainer concentration. A CVE count is one instrument on the dashboard. Flying on it alone is how teams miss the risks that do not announce themselves.
A package with zero known CVEs and zero recent maintenance is not safe — it is unobserved. Absence of evidence is not evidence of safety.
How AI-generated code changes Python dependency risk
AI-assisted development is now a normal part of the Python workflow, and it interacts with dependency risk in ways engineering leaders should plan for deliberately.
AI coding assistants are trained on large bodies of historical code, so their suggestions can lean toward packages and patterns common in the training window rather than the best-maintained option today. Generated code can therefore recommend outdated package versions, or pull in dependencies that have since accumulated maintenance or vulnerability-exposure signals.
There is also a documented failure mode in which assistants suggest package names that do not exist — plausible-sounding imports an attacker can then register on PyPI to capture the traffic, turning a hallucinated suggestion into a real supply-chain vector. The index’s typosquat-adjacency signal is one input into this problem, but the durable defense is a process.
The bigger, quieter risk is acceleration. When adding a dependency is as easy as accepting a suggestion, dependency sprawl grows faster than review processes were designed for. Code that would once have triggered a deliberate “should we take on this dependency?” conversation can now enter a codebase silently.
The response is not to avoid AI assistance; it is to make dependency review an explicit step in the AI-assisted workflow. Any new dependency introduced by generated code should pass the same checklist as one chosen by hand — confirm the package exists and is the intended one, check its advisories and maintenance signals, and confirm its license. The index is built to support exactly that review step.
AI assistance removes the friction that used to make adding a dependency a deliberate decision. The fix is not less AI — it is putting that deliberate review back into the workflow, on purpose.
How SBOMs and software composition analysis fit
Short answer: A software bill of materials (SBOM) is a machine-readable inventory of every component in a piece of software, including open-source dependencies and their versions. Software composition analysis (SCA) is the automated process of scanning that inventory to find known vulnerabilities, license issues, and outdated components. An SBOM is the map; SCA is the inspection; a risk index like PORI-2026 adds the maintenance-health and maintainer-risk view that neither captures on its own.
Most enterprise Python teams already produce SBOMs (often in CycloneDX or SPDX format) and run software composition analysis in CI/CD. These practices answer two essential questions: what is in our software, and which components have known vulnerabilities or license conflicts? They are necessary, and increasingly required by regulation and customer security reviews.
What they do not fully answer is the forward-looking question: which of these dependencies are likely to become a problem? A component can pass an SCA scan today — no open CVEs, an acceptable license — while showing the maintenance and maintainer-concentration signals that precede an incident. The Python Open-Source Risk Index is designed to sit alongside SBOM and SCA workflows, adding the dependency-health and maintainer-risk dimension so teams can prioritize hardening before a vulnerability is disclosed, not after.
A concrete example makes the gap clear. A widely used data-processing package might sit in Band C: it passes a software composition analysis scan today — no open advisories, an acceptable license — yet shows maintainer concentration in a single contributor and no release in over a year. For a hobby project that is fine. For a regulated data or AI workload, those two signals are exactly what would change a CTO’s decision: pin the version, line up an alternative, and consider funding the maintainer before the risk becomes an incident.
SBOM tells you what you depend on. SCA tells you which of those have known problems today. A risk index tells you which are most likely to become problems tomorrow.
How engineering teams can use the index
- CTOs and engineering leaders use the bands and methodology to set policy — for example, requiring documented review before adopting any package below Band B — and to report dependency-health posture to the board with citable data rather than internal assertion.
- Engineering managers use the checklist and per-package signals to standardize how teams evaluate new dependencies, so decisions are consistent and reviewable across squads.
- DevOps teams integrate the signals into CI/CD gates — flagging additions with open critical advisories, unclear licenses, or archived upstreams before they reach production, and pinning versions where the band recommends it.
- Security teams use the index to prioritize finite review capacity on the dependencies where the signals say it is most warranted, and to track how a portfolio’s posture shifts quarter over quarter.
- Data engineering teams apply the same lens to the data stack, specifically — the packages that move, transform, and store data — where a license complication or stalled dependency can have outsized downstream effects.
- AI engineering teams add a dependency-review step to AI-assisted and agentic coding workflows, vetting packages that generated code introduces before they are merged.
- Procurement and vendor-risk teams use the dataset as supporting evidence in third-party risk assessments and security questionnaires, where a transparent, reproducible methodology is far easier to defend than a closed score.
A practical three-step workflow: Most teams operationalize the index in three places in their existing process:
- At design time, check any prospective dependency against its index score and the CTO checklist (Table 3) before it enters the codebase.
- In CI/CD, gate merges that introduce a Band D or E package, an open critical advisory, or an unclear license — the same way you would gate a failing test.
- Each quarter, pull the refreshed CSV and generate a portfolio-level risk snapshot for the board, tracking how your dependency posture moves between versions.
A day in the life of a dependency review: An engineer adds a new package to handle a data export. The CI check flags it as Band C: no open advisories, but a single maintainer and no release in 14 months. The reviewer pins the current version, opens a ticket to evaluate two alternatives, and — because the package is genuinely useful — the team sponsors the maintainer through an open-source funding platform. The dependency ships, the decision is documented, and the next security questionnaire has its answer ready. That is the index doing its job: turning a vague “is this safe?” into a recorded, defensible decision.
Risk signals and recommended actions
The index translates each band into an action, so a score leads to a decision rather than a debate.
Table 4 — Risk Signals and Recommended Actions
| Risk signal | What it indicates | Recommended action |
|---|---|---|
| Open, unfixed advisory on the version in use | Active, current security exposure | Upgrade to a fixed version, or pin and mitigate; escalate if critical |
| Critical-severity advisory (CVSS ≥ 9.0) | Severe potential impact | Treat as a release blocker until remediated |
| Long gap since last release | Possible stalled maintenance (or stable maturity) | Confirm status, pin version, and identify a fallback |
| Single-maintainer concentration | Bus-factor and burnout risk | Pin version; consider sponsoring or contributing; identify alternatives |
| Missing security policy | No clear disclosure path | Prefer alternatives with a policy; raise upstream |
| Ambiguous or missing license | Legal and adoption risk | Resolve before production use; seek clarification or substitute |
| Deep transitive dependency tree | Large inherited surface area | Map the graph; apply SCA across transitive deps, not just direct ones |
| Archived upstream repository | Maintenance has effectively ended | Plan migration; avoid for new projects |
| Typosquat-adjacent package name | Possible impersonation of a major package | Verify the canonical package before installing |
| Unsupported Python versions | Upgrade and compatibility risk | Factor into upgrade planning; weigh against alternatives |
Key terms
Definitions used throughout this index, for quick reference and for readers arriving from a search or AI assistant.
| Term | Definition |
|---|---|
| PyPI | The Python Package Index is the official public repository of Python packages. |
| Dependency (direct/transitive) | A direct dependency is one your project explicitly requires; a transitive dependency is pulled in indirectly by your direct dependencies. |
| CVE | Common Vulnerabilities and Exposures — a public identifier for a specific, disclosed software vulnerability. |
| CVSS | Common Vulnerability Scoring System — a 0–10 severity score for a vulnerability. |
| OSV | Open Source Vulnerabilities — Google’s open database and schema for advisories affecting open-source packages. |
| SBOM | Software Bill of Materials — a machine-readable inventory of every component in a piece of software. |
| SCA | Software Composition Analysis — automated scanning of components for known vulnerabilities and license issues. |
| OpenSSF Scorecard | An automated tool that checks a repository against 18+ security best-practice signals. |
| Bus factor | The number of contributors a project would need to lose before it stalls is a proxy for maintainer concentration risk. |
| Typosquatting | Registering a package under a name confusingly similar to a popular one to capture mistaken installs. |
| SPDX | A standardized list of open-source license identifiers used to express licensing unambiguously. |
Methodology notes and limitations
A risk index is only as trustworthy as its willingness to state where it is imperfect. PORI-2026 is explicit about its limits.
Public metadata is incomplete. Maintainers do many things — private security work, downstream coordination, support — that leave no public trace, so a low activity signal is a prompt to investigate, not a conclusion. Download counts measure adoption and automation traffic, not enterprise production use. GitHub activity does not capture maintenance that happens elsewhere. Vulnerability databases lag disclosure, sometimes by hours or days. License detection is genuinely ambiguous for non-standard declarations. And the public OpenSSF Scorecard scan omits a few checks for cost reasons, which the index documents rather than papers over.
The most important limitation is the one stated on every surface of the project: the score is a guide to review, not a replacement for engineering judgment. A band is a starting point for a decision a competent team still has to make in context.
How to interpret scores under legal or compliance scrutiny: each score is an opinionated risk indicator derived from public metadata at a point in time. It is not a statement of fact about a package or a maintainer, and not a measure of their quality, competence, or intent. Bands describe observable signals; they do not allege wrongdoing, and maintainers can request a re-review through the documented right-of-reply.
To keep the index honest, every release is built deterministically from pinned source snapshots and ships with a provenance record of source versions and counts, so a third party can reproduce the published CSV within tolerance. A 10% sample is manually spot-checked each quarter, and band changes between quarters are reviewed for methodology drift.
How Uvik Software will maintain the index
The index is designed as an institution, not a one-off report. It refreshes quarterly, on the 15th of January, April, July, and October, with version identifiers (v2026.Q1, v2026.Q2, and so on). Every version is retained permanently in a public GitHub repository so the dataset supports trend analysis, not just a point-in-time snapshot. Each refresh ships with a “what changed” changelog and an updated CSV and JSON.
The raw dataset is published as a downloadable CSV under CC-BY-4.0, alongside a JSON manifest, on both the dataset page and GitHub. The repository includes the full build pipeline so the index is reproducible, with a roadmap toward an interactive dashboard for searching, filtering, and comparing packages.
A documented correction and right-of-reply process exists from launch: maintainers can request a re-review through a dedicated mailbox and a GitHub issue template, with a published response window. A risk index that gives the people behind open-source projects no recourse is neither fair nor durable.
Where Uvik Software fits
Uvik Software uses this index and methodology in its own Python security reviews, data engineering projects, and AI platform builds — the same dataset and scoring model are available to any in-house team that wants to apply them. The index is deliberately vendor-neutral and free; it is a demonstration of how Uvik Software thinks about dependency risk, not a gated product.
For teams that want external help acting on what the index surfaces — dependency hardening, license remediation, or building review into CI/CD — Uvik Software’s Python development and staff-augmentation services are one route.
How to cite this report
The index is published under CC-BY-4.0. Reuse, including the charts above, is welcome with attribution. Suggested formats:
Plain text:
Uvik Software. (2026). Python Open-Source Risk Index 2026 (v2026.Q1)
[Dataset]. https://uvik.net/blog/python-open-source-risk-index-2026/
APA 7:
Uvik Software. (2026). Python Open-Source Risk Index 2026 (Version 2026.Q1)
[Data set]. Uvik Software. https://uvik.net/blog/python-open-source-risk-index-2026/
BibTeX:
@misc{uvik_pori_2026,
title = {Python Open-Source Risk Index 2026},
author = {{Uvik Software}},
year = {2026},
note = {Version 2026.Q1},
url = {https://uvik.net/blog/python-open-source-risk-index-2026/}
}
Frequently Asked Questions
What is open-source risk management?
Open-source risk management is the discipline of identifying, measuring, and reducing the risk introduced by the open-source components a system depends on — across security, licensing, and maintenance health. For Python teams it means having visibility into PyPI dependencies and their transitive trees, and a documented process for deciding what to adopt, monitor, or replace.
What is software supply chain security?
Software supply chain security is the practice of protecting the integrity and trustworthiness of every component, tool, and process that contributes to a piece of software — including third-party and open-source dependencies, build systems, and distribution channels. It became a board-level concern after incidents such as the xz-utils backdoor and regulatory moves like the EU Cyber Resilience Act and US Executive Order 14028.
What is software composition analysis?
Software composition analysis (SCA) is the automated identification of open-source components in a codebase and the assessment of their known vulnerabilities, licenses, and maintenance health. SCA tools typically generate a software bill of materials (SBOM) and flag components that warrant review. The Python Open-Source Risk Index complements SCA by providing a transparent, Python-specific composite risk view.
Why is software supply chain security important?
Because modern applications are assembled mostly from third-party and open-source code, the security of what you ship depends on components you did not write. A single compromised or unmaintained dependency can expose every system that uses it — as the Log4j and xz-utils incidents demonstrated — which is why supply-chain security is now a regulatory and board-level requirement.
How can Python packages create security risk?
A Python package can introduce risk through a known vulnerability in its code, a vulnerability in one of its transitive dependencies, an ambiguous or restrictive license, stalled maintenance that leaves issues unfixed, or impersonation through a typosquatted name. Because Python applications are assembled largely from PyPI packages, the security of what you ship depends heavily on code your team did not write.
Are popular Python packages always safer?
No. Popularity measures adoption, not safety. A heavily downloaded package can still show elevated maintenance, governance, or vulnerability-exposure signals. Popularity does correlate with audit visibility — more eyes find more issues — but the index treats download volume as a stabilizing signal, not a reward.
What is a Python dependency risk score?
A dependency risk score is a composite measure of how risky it is to adopt a package as a production dependency. In the Python Open-Source Risk Index it is a 0–100 score built from 14 signals across security, maintenance health, and adoption viability, mapped to a risk band from A to E. It is designed to inform a review decision, not to make it automatically.
How should CTOs evaluate open-source Python packages?
CTOs should apply a consistent, documented checklist before adoption: recent release activity, open advisories and their severity, maintainer responsiveness and count, dependency tree depth, license clarity, security-policy presence, Python-version support, issue backlog, and signs of stalled maintenance. The goal is a reviewable process, not a single number.
What data sources can be used to assess Python package risk?
Public sources include the PyPI JSON API and download statistics, Google OSV.dev and the NVD for vulnerabilities, GitHub for repository and maintainer activity, OpenSSF Scorecard for security checks, deps.dev for dependency graphs and license data, and SPDX/license metadata. Each has limitations — notably timing lags in vulnerability data and the gap between downloads and real adoption.
How often should Python dependencies be reviewed?
Continuously for new vulnerabilities (via automated SCA in CI/CD) and on a defined cadence for broader health — quarterly review aligns with the index's refresh cycle. New dependencies should be reviewed before adoption, and any dependency with an open critical advisory should be reviewed immediately.
What is the difference between direct and transitive dependency risk?
A direct dependency is one your project explicitly requires; a transitive dependency is one pulled in indirectly by your direct dependencies. Transitive dependencies usually outnumber direct ones and are rarely chosen consciously, which is why hidden risk concentrates there. Effective risk management has to extend through the full dependency graph.
How is the index different from OpenSSF Scorecard or Snyk Advisor?
OpenSSF Scorecard scores one repository at a time across general security checks and is one input into the index. Snyk Advisor was a closed per-package health card; Snyk has stated it will sunset Advisor in January 2026. The Python Open-Source Risk Index is Python-only, publishes its weights and raw data, is reproducible, and is refreshed quarterly.
Does the index label any package as 'bad' or 'dangerous'?
No. The index reports observable signals and maps them to recommended review actions, using language such as “elevated maintenance risk” and “review recommended before production use.” It never characterizes a package or maintainer as bad, dangerous, or untrusted, and maintainers can request a re-review through a documented right-of-reply.