whoholdsup
Who holds up your app? Point it at your lockfile and it shows how many of your dependencies are kept alive by a single person, which haven't shipped in years, and which recently changed hands.
uvx whoholdsup # in any project with a lockfile
Real output for a typical Next.js + Express app (the lockfile is in docs/example), November 2026.
In 2024, a backdoor came within weeks of shipping in the stable releases of major Linux distros through xz, a compression library maintained by one exhausted volunteer who handed releases to a helpful newcomer. Your app has hundreds of packages just like it. whoholdsup tells you which ones.
What it checks
| What it means | Where it comes from | |
|---|---|---|
| One maintainer | Exactly one person can publish this package. If they burn out, get hacked or hand it over, there's nobody else. | npm's maintainer list; PyPI's owners and maintainers |
| No release in 2+ years | Might be finished. Might be abandoned. Either way, nobody's shipping fixes. | Release dates on the registry |
| Changed hands this year | Everyone who published a release in the last 12 months is someone who had never published it before. Usually a normal handover. It's also exactly what the xz takeover looked like. | npm's per-release publisher history |
| Deprecated | The authors told you to stop using it. | npm deprecation notices; PyPI "Inactive" status |
| Not on the public registry | Private, or removed (which sometimes means malware was taken down). | 404 from the registry |
It also works out which single-maintainer packages are load-bearing: how many other packages in your tree depend on each one, directly or indirectly. And it shows the people holding it up: who is the sole maintainer of the most packages you use.
Organisation and release-bot accounts (types for DefinitelyTyped, PyPI organisations, GitHub Actions trusted publishing) aren't counted as one person.
Supported lockfiles
| Ecosystem | Files |
|---|---|
| npm | package-lock.json (v1–v3), npm-shrinkwrap.json, yarn.lock (classic and Berry), pnpm-lock.yaml (v5–v9) |
| Python | uv.lock, poetry.lock, Pipfile.lock, pinned requirements*.txt |
Direct dependencies are marked using your package.json or pyproject.toml.
Options
whoholdsup # current folder
whoholdsup path/to/project # another folder
whoholdsup uv.lock yarn.lock # specific lockfiles
whoholdsup --direct # only packages you depend on directly
whoholdsup --top 25 # longer tables
whoholdsup --json # everything, machine-readable (for CI)
whoholdsup --no-cache # ignore the one-day lookup cache
How it works
whoholdsup reads your lockfile locally, then asks the public registries about each package: registry.npmjs.org for npm packages, and PyPI's JSON API, XML-RPC package_roles and project pages for Python. Lookups run 16 at a time and are cached for a day, so a second run is instant. Nothing about your project is uploaded anywhere: the registries only see package names, the same as when you install them.
Honest limits. "One maintainer" means one account with publish rights. That's the risk that matters for supply-chain attacks, but some single accounts are backed by a company, and some multi-maintainer packages are really run by one tired person. The publisher-change signal is npm-only, because PyPI doesn't publish who uploaded each release.
Install
uvx whoholdsup # run without installing
pipx install whoholdsup # or install it
Requires Python 3.9+. The only dependency is rich (plus tomli on Python < 3.11).
License
MIT
Metadata
Release files for whoholdsup 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| whoholdsup-0.1.0.tar.gz | 18.9 kB | With provenance | Details for whoholdsup-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| whoholdsup-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for whoholdsup-0.1.0-py3-none-any.whl |
Total release size: 36.5 kB
Release files / whoholdsup-0.1.0.tar.gz
| Download URL | whoholdsup-0.1.0.tar.gz |
|---|---|
| Size | 18.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8bc8b0f492d38def67e78d2ab240d7036bc004667e60f47ec05ccf30f78476e3
|
|
BLAKE2b-256 checksum How to use checksums |
c28926f22363692e5eb291f0cc876dee15ea36917b62aa323d7f08ec2357841d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 5, 2026.
Transparency logRelease files / whoholdsup-0.1.0-py3-none-any.whl
| Download URL | whoholdsup-0.1.0-py3-none-any.whl |
|---|---|
| Size | 17.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9a737f8658e8c30a7243d878749e02966ec9a5e7e094dd404c79cc849c08d009
|
|
BLAKE2b-256 checksum How to use checksums |
6a402f0fc602513150b360ef2b425b045dff7c785a5c84e54c5bc6e8602b9bbe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 5, 2026.
Transparency logSecurity for whoholdsup 0.1.0
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.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for whoholdsup-0.1.0.tar.gz
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 Nov 5, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.