Skip to main content

Dependency Health Monitor (DHM)

Comprehensive health assessments for Python project dependencies.

PyPI version Python 3.10+ License: MIT

Features

  • Health Scoring: Weighted composite scores based on security, maintenance, community, and popularity
  • Vulnerability Detection: Real-time scanning via OSV database with open vs fixed classification
  • Maintenance Analysis: Identifies abandoned, deprecated, or archived packages
  • License Evaluation: Categorizes licenses (permissive, copyleft, weak copyleft)
  • Manifests & Lockfiles: Reads pyproject.toml, requirements*.txt, poetry.lock, uv.lock, Pipfile.lock
  • Installed-Env Scanning: --installed reports on the versions actually installed, not latest-on-PyPI
  • Transitive Analysis: --include-transitive covers the full dependency graph (direct vs transitive tagged)
  • SBOM Export: Emit a CycloneDX 1.5 SBOM with health annotations (-f cyclonedx)
  • Caching: SQLite-based caching reduces API calls and improves performance
  • CI/CD Ready: Exit codes for pipeline integration

Installation

pip install dependency-health-monitor

Or install from source:

git clone https://github.com/jeremylaratro/dhm.git
cd dhm
pip install -e ".[dev]"

Quick Start

Command Line

# Scan current project
dhm scan

# Check a single package
dhm check requests

# Find alternatives for a problematic package
dhm alternatives urllib3

# Output as JSON for CI/CD
dhm scan -f json -o report.json

# Fail CI if high+ severity issues found
dhm scan --fail-on high

# Include transitive dependencies (uses a lockfile if present, else the installed env)
dhm scan --include-transitive

# Scan what's actually installed in the current environment
dhm scan --installed

# Emit a CycloneDX SBOM (with health annotations) for supply-chain tooling
dhm scan --include-transitive -f cyclonedx -o sbom.cdx.json

Python Library

import asyncio
from dhm import check, scan

async def main():
    # Check a single package
    report = await check("requests")
    print(f"{report.package.name}: Grade {report.health.grade}")
    print(f"  Security: {report.health.security_score:.0f}")
    print(f"  Open vulnerabilities: {len(report.health.open_vulnerabilities)}")

    # Scan a project directory
    reports = await scan(".")
    for r in reports:
        if r.health.has_open_vulnerabilities:
            print(f"⚠️  {r.package.name} has {len(r.health.open_vulnerabilities)} open vulns")

asyncio.run(main())

Synchronous API (for non-async contexts):

from dhm import check_sync, scan_sync

report = check_sync("flask")
print(f"Flask health: {report.health.grade} ({report.health.overall:.0f}/100)")

reports = scan_sync("/path/to/project")
unhealthy = [r for r in reports if r.health.is_concerning]

Health Score Algorithm

DHM calculates a composite health score using weighted components:

Component Weight Data Sources
Security 35% OSV vulnerability database
Maintenance 30% PyPI release dates, GitHub activity
Community 20% Contributors, stars, PR merge rates
Popularity 15% pypistats.org download counts

Grade Thresholds:

Grade Score Meaning
A ≥ 85 Excellent - Well maintained, secure, popular
B ≥ 75 Good - Minor concerns, generally safe
C ≥ 65 Acceptable - Some issues, monitor closely
D ≥ 55 Concerning - Significant issues, consider alternatives
F < 55 Critical - Major problems, action required

Vulnerability Classification

DHM distinguishes between open and fixed vulnerabilities:

  • Open: Affects your installed version - action required
  • Fixed: Was present in older versions but patched in yours - historical only
report = await check("aiohttp", version="3.13.3")

# Only shows vulnerabilities affecting version 3.13.3
for vuln in report.health.open_vulnerabilities:
    print(f"🔴 {vuln.id}: {vuln.title}")
    if vuln.fixed_version:
        print(f"   Fix: Upgrade to {vuln.fixed_version}")

Caching

DHM caches API responses to improve performance and reduce rate limiting:

Data Type TTL Rationale
GitHub repo data 24 hours Metrics change slowly
PyPI metadata 1 hour Releases are occasional
Download stats 6 hours Updated daily
Vulnerabilities 6 hours Security-critical, stay current
# View cache statistics
dhm cache --stats

# Clear all cached data
dhm cache --clear

# Remove only expired entries
dhm cache --cleanup

# Invalidate specific data
dhm cache --invalidate 'github:%'

CI/CD Integration

# GitHub Actions example
- name: Check dependency health
  run: |
    pip install dependency-health-monitor
    dhm scan --fail-on high -f json -o dhm-report.json

- name: Upload report
  uses: actions/upload-artifact@v3
  with:
    name: dependency-health-report
    path: dhm-report.json

Environment Variables

Variable Description
GITHUB_TOKEN GitHub API token for higher rate limits (5000/hr vs 60/hr)

License

MIT - See LICENSE for details.

Metadata

Release files for dependency-health-monitor 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dependency-health-monitor 0.4.0
File Size Uploaded
dependency_health_monitor-0.4.0.tar.gz 174.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dependency-health-monitor 0.4.0
File Interpreter ABI Platform
dependency_health_monitor-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 246.0 kB

Release files / dependency_health_monitor-0.4.0.tar.gz

Download URL dependency_health_monitor-0.4.0.tar.gz
Size 174.1 kB
Tags Source
SHA-256 checksum
How to use checksums
28e70ca540985048ca0a6a241b00f2fdc08d8ad1f4dc15f23552933f32a88e47
BLAKE2b-256 checksum
How to use checksums
ef676d89465c3a361c6fa269aed4c0e03a856d2b6b97980466276978eeeb7726
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.

Transparency log

Release files / dependency_health_monitor-0.4.0-py3-none-any.whl

Download URL dependency_health_monitor-0.4.0-py3-none-any.whl
Size 71.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c0562700283c3b9ed41459d4701ebfdb50054630562a722234ac1bde8f28340f
BLAKE2b-256 checksum
How to use checksums
879af30de2a0c66d3ecf4447753e3b6615fd9565187982d778779bebc17a3846
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.1

2 release files

This release

0.4.0 This release

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page