Six things a repository cannot tell you.
A project can have commits this week and a package nobody has shipped in two years. A base image can weigh two hundred times its lightest sibling. A name one keystroke from something you install every day can already be taken. Read from the package registries, Docker Hub, OSV and Stack Overflow.
Last actually shipped
Read from the registries, not from git. Every "is this maintained" badge in circulation reads a repository’s last push — but a push is what a maintainer does for themselves, and a release is what reaches the projects depending on them. The two come apart constantly.
| Package | Registry | Days quiet | Last version |
|---|---|---|---|
| rails | npm | 4649 | 4.1.0-beta |
| lnd | npm | 3595 | 0.0.2 |
| babel | npm | 3462 | 6.23.0 |
| kibana | npm | 3349 | 5.1.1 |
| hapi | npm | 2741 | 18.1.0 |
| faiss | pypi | 2670 | 1.5.3 |
| openzeppelin-contracts | npm | 2053 | 4.0.0 |
| onnxruntime | npm | 1984 | 1.7.0 |
| kustomize | npm | 1556 | 4.5.4 |
| apache-iceberg | pypi | 1378 | 0.0.3 |
| @tanstack/router | npm | 1292 | 0.0.1-beta.53 |
| bellman | crates | 1236 | 0.14.0 |
| tokenizers | npm | 1181 | 0.13.3 |
| walletconnect-monorepo | npm | 1141 | 2.8.2 |
| redux | npm | 958 | 5.0.1 |
What the first line of your Dockerfile costs
A tag is a moving target — the image behind it today is not the one behind it last month. That is why the rebuild date is here: a tag nobody has rebuilt in months is shipping months of unpatched distribution packages, and it looks identical to one built this morning. Sizes are what Docker Hub reports for the compressed image.
| Tag | Size | Over its lightest sibling | Days since rebuild |
|---|---|---|---|
| rust:1 | 597 MB | +274 MB | 1 |
| ruby:3.4 | 421 MB | +378 MB | 1 |
| python:3.13 | 413 MB | +396 MB | 1 |
| python:3.12 | 411 MB | +394 MB | 1 |
| node:24 | 409 MB | +351 MB | 1 |
| node:22 | 408 MB | +351 MB | 1 |
| rust:1-alpine | 352 MB | +29 MB | 21 |
| mongo:8 | 337 MB | lightest | 15 |
| golang:1.24 | 324 MB | +241 MB | 180 |
| rust:1-slim | 323 MB | lightest | 2 |
| Tag | Days since rebuild | Size |
|---|---|---|
| golang:1.24 | 180 | 324 MB |
| golang:1.24-alpine | 180 | 83 MB |
| alpine:latest | 52 | 4 MB |
| python:3.13-alpine | 50 | 17 MB |
| alpine:3.22 | 45 | 4 MB |
| caddy:2-alpine | 44 | 24 MB |
Names one keystroke away
These names exist on npm and are one edit from a package people install. That is the entire claim. None of them is being called malicious, and none should be read that way — near names are routinely forks, ports, translations, or somebody’s abandoned first attempt. Only deletions and transpositions are swept, so this finds fewer than exist and never claims to be a complete list.
| Package | Neighbours | Names that exist |
|---|---|---|
| bootstrap | 15 | boostrap, boosttrap, bootsrap, bootsrtap, bootstap, bootstarp, bootstra, bootstrp |
| express | 11 | epress, epxress, experss, expess, expres, exprses, exprss, exress |
| jest | 6 | ejst, est, jes, jet, jets, jst |
| jquery | 6 | jqeury, jquey, jqury, juery, qjuery, query |
| mobx | 6 | mbox, mbx, mob, mox, moxb, obx |
| pnpm | 6 | npm, nppm, pnm, pnmp, pnp, ppm |
| redux | 6 | edux, rdux, redu, redx, reudx, reux |
| viem | 6 | iem, veim, vem, vie, vim, vime |
Advisory load by ecosystem
Not a survey of any ecosystem. A few dozen hand-picked projects per registry, chosen for being prominent, which is exactly the population most likely to have advisories filed against it. Counts are all-time, so age and scrutiny raise them as readily as danger does. The registries are not the same size or the same age, and per-package is the only comparison worth making — even that one is soft.
| Registry | Advisories | Packages affected | Per affected package | Most |
|---|---|---|---|---|
| pypi | 2141 | 36 of 63 | 59.5 | tensorflow, django, apache-airflow |
| brew | 1243 | 12 of 25 | 103.6 | libtensorflow, django-completion, onnx |
| npm | 461 | 39 of 75 | 11.8 | next, directus, hono |
| crates | 96 | 11 of 20 | 8.7 | surrealdb, diesel, tokio |
How many people it would survive losing
The bus factor is how many contributors, from the most prolific down, account for half the commits. One means half a project’s history came from a single person. Three things it is not: commit count is not contribution, and review, triage and documentation leave few commits while a project cannot run without them; it is history rather than the present, so a founder who left three years ago still dominates; and a low number is a fact about a distribution, never an accusation about anybody. A contributor count with a plus sign was capped at a hundred.
| Repository | Bus factor | Largest share | Contributors | Commits counted |
|---|---|---|---|---|
| ethers-io/ethers.js | 1 | 100.0% | 1 | 826 |
| OpenZeppelin/openzeppelin-contracts-upgradeable | 1 | 99.7% | 4 | 1,247 |
| rqlite/rqlite | 1 | 97.8% | 61 | 8,152 |
| pocketbase/pocketbase | 1 | 97.7% | 44 | 2,442 |
| pgvector/pgvector | 1 | 97.5% | 23 | 1,910 |
| evanw/esbuild | 1 | 96.2% | 100+ | 4,415 |
| jOOQ/jOOQ | 1 | 95.6% | 86 | 14,598 |
| oobabooga/text-generation-webui | 1 | 86.9% | 100+ | 5,407 |
| junegunn/fzf | 1 | 86.3% | 100+ | 3,465 |
| rwf2/Rocket | 1 | 83.9% | 100+ | 2,187 |
| karpathy/minGPT | 1 | 83.8% | 11 | 80 |
| sqlalchemy/sqlalchemy | 1 | 83.8% | 100+ | 17,156 |
| BurntSushi/ripgrep | 1 | 83.0% | 100+ | 1,896 |
| tornadoweb/tornado | 1 | 82.3% | 100+ | 4,423 |
| prisma/prisma | 1 | 81.3% | 21 | 8,019 |
Is anybody still asking
Volume has fallen across nearly every tag on Stack Overflow since assistants started answering these questions instead, so a tag falling is the baseline rather than the finding — the median tag here moved -24.2%. What survives that is the last column: how a tag moved against the rest over the same window. Under 25 questions in the earlier window there is no percentage at all, because four to two is a fifty percent collapse and means nothing.
| Tag | Questions | Change | Points vs median |
|---|---|---|---|
| python | 175 | −26.5% | −2.3 |
| java | 71 | −22.0% | +2.2 |
| typescript | 28 | +7.7% | +31.9 |
| spring-boot | 25 | −35.9% | −11.7 |
| rust | 24 | too few | — |
| angular | 23 | −8.0% | +16.2 |
| kotlin | 23 | too few | — |
| swift | 19 | too few | — |
| postgresql | 18 | too few | — |
| reactjs | 17 | too few | — |
| node.js | 16 | −36.0% | −11.8 |
| docker | 14 | too few | — |