Minimal vs Minimus
Both projects ship small, hardened, low-CVE container images. This page is the measured comparison: 81 exact or same-major/minor version pairs, scanned with the same Grype binary against the same frozen database on 2026-10-15. Another 23available pairs have mismatched or unknown versions and are excluded from the score.
Summed across those 81 images, Minimal carries 215 unique CVEs against Minimus's 1089. That total is dominated by a handful of images on both sides, so the per-image table below matters more than the sum.
Where Minimal is worse
Leading with this because it is the part a vendor comparison normally hides. On1 of 81 images Minimal reports more unique CVEs than Minimus:
| Image | Minimal | Minimus | Δ | Minimal crit/high | Minimus crit/high |
|---|---|---|---|---|---|
| temporal-server | 37 | 17 | +20 | 5 / 28 | 1 / 4 |
These are current scan observations, not permanent product properties. The complete raw dataset and version classifications are published below so each difference can be checked.
Full head-to-head
Every exact or same-major/minor version pair, best result first. Δ is Minimal minus Minimus, so negative is better for Minimal.
| Image | Minimal | Minimus | Δ | Minimal crit/high | Minimus crit/high |
|---|---|---|---|---|---|
| solr | 4 | 51 | -47 | 0 / 1 | 1 / 19 |
| airflow | 8 | 45 | -37 | 0 / 0 | 0 / 12 |
| gitlab-runner | 1 | 33 | -32 | 0 / 0 | 3 / 25 |
| opensearch | 3 | 30 | -27 | 0 / 0 | 1 / 65 |
| node-slim | 0 | 23 | -23 | 0 / 0 | 0 / 6 |
| trufflehog | 5 | 25 | -20 | 0 / 3 | 1 / 9 |
| seaweedfs | 0 | 19 | -19 | 0 / 0 | 1 / 6 |
| cassandra | 40 | 58 | -18 | 1 / 17 | 1 / 19 |
| etcd | 1 | 19 | -18 | 0 / 0 | 3 / 14 |
| gitea | 0 | 17 | -17 | 0 / 0 | 1 / 5 |
| metrics-server | 0 | 17 | -17 | 0 / 0 | 1 / 12 |
| tailscale | 0 | 17 | -17 | 0 / 0 | 3 / 12 |
| consul | 1 | 17 | -16 | 0 / 0 | 1 / 5 |
| deno | 0 | 16 | -16 | 0 / 0 | 0 / 3 |
| openbao | 1 | 17 | -16 | 0 / 0 | 1 / 6 |
| skopeo | 1 | 17 | -16 | 0 / 0 | 1 / 5 |
| wordpress | 0 | 16 | -16 | 0 / 0 | 0 / 2 |
| cosign | 4 | 19 | -15 | 0 / 0 | 1 / 6 |
| telegraf | 1 | 16 | -15 | 0 / 0 | 1 / 4 |
| zookeeper | 15 | 29 | -14 | 0 / 7 | 0 / 9 |
| flink | 3 | 16 | -13 | 0 / 0 | 0 / 2 |
| kube-state-metrics | 0 | 13 | -13 | 0 / 0 | 1 / 9 |
| patroni | 0 | 13 | -13 | 0 / 0 | 0 / 2 |
| gitleaks | 1 | 13 | -12 | 0 / 0 | 0 / 3 |
| postgres-slim | 0 | 12 | -12 | 0 / 0 | 0 / 2 |
| python | 0 | 12 | -12 | 0 / 0 | 0 / 2 |
| qdrant | 0 | 12 | -12 | 0 / 0 | 0 / 1 |
| ruby | 1 | 13 | -12 | 0 / 0 | 0 / 3 |
| dotnet | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| erlang | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| fluent-bit | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| go | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| httpd | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| kafka | 38 | 49 | -11 | 0 / 16 | 0 / 15 |
| keycloak | 3 | 14 | -11 | 0 / 0 | 0 / 2 |
| kong | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| kustomize | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| nats | 0 | 11 | -11 | 0 / 0 | 0 / 1 |
| nginx | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| perl | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| pgbouncer | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| php | 0 | 11 | -11 | 0 / 0 | 0 / 2 |
| bun | 0 | 10 | -10 | 0 / 0 | 0 / 1 |
| haproxy | 0 | 10 | -10 | 0 / 0 | 0 / 1 |
| memcached | 0 | 10 | -10 | 0 / 0 | 0 / 1 |
| mosquitto | 0 | 10 | -10 | 0 / 0 | 0 / 1 |
| notation | 1 | 11 | -10 | 0 / 0 | 0 / 1 |
| rclone | 1 | 11 | -10 | 0 / 0 | 0 / 1 |
| redis-slim | 0 | 10 | -10 | 0 / 0 | 0 / 1 |
| sqlite | 0 | 10 | -10 | 0 / 0 | 0 / 1 |
| unbound | 0 | 10 | -10 | 0 / 0 | 0 / 1 |
| valkey | 0 | 10 | -10 | 0 / 0 | 0 / 1 |
| neo4j | 11 | 19 | -8 | 0 / 18 | 0 / 10 |
| thanos | 5 | 13 | -8 | 0 / 2 | 1 / 6 |
| coredns | 2 | 9 | -7 | 0 / 1 | 1 / 6 |
| dex | 1 | 8 | -7 | 0 / 0 | 2 / 7 |
| alertmanager | 1 | 7 | -6 | 0 / 0 | 2 / 8 |
| descheduler | 0 | 6 | -6 | 0 / 0 | 1 / 3 |
| grype | 5 | 11 | -6 | 0 / 3 | 1 / 6 |
| kyverno | 2 | 8 | -6 | 0 / 0 | 1 / 3 |
| loki | 3 | 9 | -6 | 0 / 0 | 1 / 3 |
| syft | 0 | 6 | -6 | 0 / 0 | 1 / 3 |
| velero | 1 | 7 | -6 | 0 / 0 | 2 / 7 |
| zot | 1 | 7 | -6 | 0 / 0 | 1 / 3 |
| blackbox-exporter | 1 | 6 | -5 | 0 / 0 | 1 / 3 |
| caddy | 0 | 5 | -5 | 0 / 0 | 1 / 3 |
| external-dns | 1 | 6 | -5 | 0 / 0 | 1 / 3 |
| kube-vip | 1 | 6 | -5 | 0 / 0 | 1 / 3 |
| kubectl | 1 | 6 | -5 | 0 / 0 | 1 / 3 |
| kubeseal | 1 | 6 | -5 | 0 / 0 | 1 / 3 |
| pushgateway | 1 | 6 | -5 | 0 / 0 | 1 / 3 |
| node-exporter | 1 | 5 | -4 | 0 / 0 | 1 / 3 |
| oauth2-proxy | 1 | 5 | -4 | 0 / 0 | 1 / 3 |
| traefik | 1 | 5 | -4 | 0 / 0 | 1 / 3 |
| crane | 0 | 0 | — | 0 / 0 | 0 / 0 |
| helm | 1 | 1 | — | 0 / 0 | 0 / 0 |
| opa | 1 | 1 | — | 0 / 0 | 0 / 0 |
| oras | 1 | 1 | — | 0 / 0 | 0 / 0 |
| regctl | 0 | 0 | — | 0 / 0 | 0 / 0 |
| trivy | 1 | 1 | — | 0 / 0 | 0 / 0 |
| temporal-server | 37 | 17 | +20 | 5 / 28 | 1 / 4 |
Minimus had 104 public equivalents in this run: 81 were version-matched and scored, while 23 were excluded for mismatched or unknown versions. Minimal also publishes 31 scanned images with no Minimus equivalent; those are excluded entirely rather than scored as wins.
The differences that are not CVE counts
| Cost | Minimal is $0 for the entire catalog, with no tier above it. |
| Licence | Every Minimal build recipe is MIT-licensed and in one public repo. |
| Auth | Minimal images pull from GHCR with no account. |
| Rebuild cadence | Minimal rebuilds the whole catalog daily, matching Minimus's own cadence. |
| Provenance | Minimal publishes cosign signatures, an SPDX SBOM and SLSA v1.0 Build L2 provenance. |
| Catalogue size | Minimal is deliberately small. If breadth is what you need, it is the wrong tool. |
Statements above describe Minimal, and each is checkable with the commands on theverify page. We deliberately do not characterise Minimus's pricing, licensing or roadmap here — those change, and their site is the authority on them.
Trying it
Pull any image and scan it yourself with the same tool used above:
docker pull ghcr.io/rtvkiz/minimal-python:latest
grype ghcr.io/rtvkiz/minimal-python:latestMigrating an existing deployment? Seemigrating from Minimus to Minimal.
How these numbers were produced
- Scanner: Grype 0.109.1, vulnerability DB schema v6.1.10, built 2026-10-15T06:30:36Z.
- DB checksum:
https://grype.anchore.io/databases/v6/vulnerability-db_v6.1.10_2026-10-15T00:29:08Z_1792045836.tar.zst?checksum=sha256%3A2f1597f25b5089e966272b251eb4d1f9977e59d57029af1c8810deb6e5321aa2 - Platform:
linux/amd64. Scan date: 2026-10-15. - Production
latesttags were resolved to immutable digests before scanning, so the run is repeatable. - Every image was scanned with the same Grype binary and the same frozen database.
- Raw Grype findings. No vendor VEX suppression was applied to anyone, including us.
- Only publicly pullable images were scanned. No paid or private registry credentials were used.
- Only exact or same-major/minor upstream version pairs are scored. Mismatched and unknown versions are excluded.
The full 540-row dataset, including the resolved reference and digest for every provider/image pair, is here: cve-comparison-2026-10-15.csv. The scored-pair inputs and version classifications are here:cve-comparison-pairs-2026-10-15.csv. Every figure on this page is derived from those files.
What this does not prove
Exact versions can still bundle different feature sets, and same-major/minor pairs can use different patch releases, so an individual outlier still needs inspection before it is treated as a product-level claim. A scanner reports known findings visible to one database snapshot; a low count is not proof that an image is free of vulnerabilities. An image a vendor does not publish is counted as not available — never as zero.