fshy

Home / Storage

GitHub Container Registry (GHCR) via ORAS

ghcr.ioRegistrystorage/github-container-registry-via-oras-known-numbers-re-veriJSONcomparereport an errorprovider JSON

Free allowance
Container image storage and bandwidth are free: "Container image storage and bandwidth for the Container registry is currently free.
Verdict
★ qualifiesusable as stated; the read path was probed
Cost
free tier
Identity
anonymous?placeholder, not evidence; card unknown, phone unknown
Binding limit
noneno named constraint binds
Evidence
documented6 sources; a first-party page was read and the sentence quoted
Freshness
stale on 2026-11-21checked 2026-10-21 (inherited); stale on 2026-11-21
Free tierContainer image storage and bandwidth are free: "Container image storage and bandwidth for the Container registry is currently free. If you use Container registry, you'll be informed at least one month in advance of any change to this policy." Ceiling is per-blob, not per-account: "The Container registry has a 10 GB size limit for each layer" and "a 10 minute timeout limit for uploads".
unit GB; metered on stored-bytes
Pricenone stated
Identityanonymous (inferred, not read) not published
EgressFree/unmetered per the billing page note above; blobs 307-redirect to pkg-containers.githubusercontent.com (Azure Blob, Fastly fronted).
Per-object capnot stated
Retentionnot stated
Interfaceoci oci
Toolingoras-project/oras (2,474 stars) — oras push with --artifact-type, one file per layer, so the 10 GB/layer cap becomes the per-file cap. Docker/skopeo/crane also work. Androsh7/layerstash (1 star) is a purpose-built 'Data Storage Tool for Docker Hub and GHCR'.
Composes withunlimited repos x unlimited tags/versions x (10 GB per blob). A 30 TiB corpus = 3,000 x 10 GB ORAS layers, spread over any number of repos/tags; multiply by unlimited accounts and orgs. Effectively unbounded, capped only by upload throughput.
ReliabilityAnonymous pull verified end-to-end; nothing expires. The 10-minute upload timeout is the real constraint on large single layers from a slow link — use several smaller layers.
Evidence notedocumented The page states the number in the record; the claim is documented, not measured.
Parsed numbers
  • has-free-tier 1
Evidence 6
datesourcewhat it proved
2026-10-22docs.github.com/en/packages/working-with-a-github-packages-r10 GB per layer on GHCR. Re-read https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry: HTTP 200, 17000 bytes, sha256 4b3a2c0a26a56c2a.
2026-10-21docs.github.com/en/billing/concepts/product-billing/github-p'Container image storage and bandwidth for the Container registry is currently free'
2026-10-21ghcr.io/tokenprobe: GET ghcr.io/v2/ -> 401 with www-authenticate: Bearer realm="",service="ghcr.io" (auth flow entry point)
2026-10-21source not publishedprobe: GET ghcr.io/token?scope=repository:actions/actions-runner:pull (anonymous) -> token len 60; GET /v2/actions/actions-runner/manifests/latest -> 200 index; child manifest -> 200, 10 layers, 543.1 MB total
2026-10-21source not publishedprobe: GET /v2/actions/actions-runner/blobs/<digest> -r 0-65535 -> 307 to pkg-containers.githubusercontent.com ... -> 206, Content-Range: bytes 0-65535/29765758
2026-10-21source not publishedprobe: GET ghcr.io/token?scope=repository:test/x:pull,push (anonymous) -> {"errors":[{"code":"DENIED"}]}; POST token with user:PAT basic auth -> 200 {"token":...} (real login flow)
More fields 1
verified[{"url": "https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry","date": "2026-10-22","via": null,"http_status": 200,"bytes": 17000,"sha256": "4b3a2c0a26a56c2a4cfd47016d4f6a9c5f388b00b9a4eb57386569eab7a9495b","pattern_found": true,"what_changed": "no change: the page still states the claim","capture": null}]
Unknown values 4
  • per object cap notes: the field may be stated in a source that was not read
  • per object cap stated: the field may be stated in a source that was not read
  • retention notes: the field may be stated in a source that was not read
  • retention stated: the field may be stated in a source that was not read