fshy

Home / Storage

npm public registry (registry.npmjs.org)

www.npmjs.comRegistrystorage/npm-public-registryJSONcomparereport an errorprovider JSON

Free allowance
No total storage quota, no per-account package cap ('Unlimited public packages' — npm Pro page), no cap on versions per package.
Verdict
★ qualifiesusable as stated; the read path was probed
Cost
free tier
Identity
email?placeholder, not evidence; card unknown, phone unknown
Binding limit
noneno named constraint binds
Evidence
reported9 sources; a third party said so
Freshness
stale on 2026-11-05checked 2026-10-21 (inherited); stale on 2026-11-05
Free tierNo total storage quota, no per-account package cap ('Unlimited public packages' — npm Pro page), no cap on versions per package. The only bounds are per-artefact and per-packument: empirically ~200 MB per tarball (no documented figure anywhere) and 100 MB per packument (the accumulated metadata document for all versions of one package).
unit unlimited; metered on stored-bytes
Pricenone stated
Identityemail (inferred, not read) not published
EgressFree and unmetered, Cloudflare-fronted. Probe: GET of a 70 MB tarball returned Server: cloudflare, Cache-Control: 'public, immutable, max-age=31557600', Accept-Ranges: bytes; ranged GET returned 206 Partial Content. No auth, no signed URL, no expiry.
Per-object capnot stated
Retention| Append-only and durable — 2018 tarballs still serve with the original Last-Modified
Interfacerest, rclone, cli rest
ToolingTwo-verb REST: PUT /:pkg with a JSON body containing base64 _attachments (or the standard npm publish flow), GET /:pkg/-/:pkg-:ver.tgz for the blob. Named clients: npm CLI, libnpmpublish (github.com/npm/libnpmpublish), and purpose-built chunking wrappers — gist github.com/yulioaj290/e81d3a59ec00247f00ec34db378fae6c (shell script that splits a file into N MB chunks, publishes each as its own npm package, adds the rest as dependencies of chunk 1, and emits an unzip script), indexzero/npm-publish-split-stream (4 stars, streams a publish request without buffering). No rclone backend.
Composes withUNBOUNDED: unlimited packages per account (Pro page: 'Unlimited public packages') x unlimited versions per package (bounded only by the 100 MB packument, ~763 versions for a 131 KB manifest — so keep manifests tiny and use many packages, not many versions of one package) x ~200 MB per tarball. Free accounts are per-email and per-GitHub-identity, so identities multiply the publish-rate ceiling, not the space ceiling.
ReliabilityAppend-only and durable — 2018 tarballs still serve with the original Last-Modified. Two hard failure modes for a bulk workload: silent 413 at ~200 MB (undocumented, so budget 150 MB), and packument bloat refusing all new versions for the whole package once it crosses 100 MB. Automated mass publishing gets 429'd.
Parsed numbers
  • has-free-tier 1
Evidence 9
datesourcewhat it proved
2026-10-21www.npmjs.com/products/propart of the text of Free tier, above
2026-10-21www.vlt.io/blog/packument-size-limitsthe 100 MB packument limit explained with the Drizzle ORM outage (June 2026); 'the NPM registry will simply refuse any new versions from being published'
2026-10-21github.com/npm/documentation/issues/1691'once my package goes above 200MB I receive this error ... 413 Payload Too Large - PUT https://registry.npmjs.org/'
2026-10-21github.com/npm/cli/issues/4794pretendard 229.9 MB tarball -> npm ERR! code E413
2026-10-21docs.npmjs.com/policies/unpublish/72h / <300 downloads / single-owner deletion rules; 'Registry data is immutable'
2026-10-21registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.20.probe: HEAD -> 200, Content-Length: 70026530, Cache-Control: public, immutable, max-age=31557600, Server: cloudflare
2026-10-21source not publishedprobe: GET same URL with Range: bytes=0-1023 -> 206 Partial Content, Content-Range: bytes 0-1023/70026530
2026-10-21registry.npmjs.org/@types/nodeprobe: GET -> 200, Content-Length: 11180437 (packument already 11 MB, i.e. 11% of the 100 MB ceiling, for a metadata-only package)
2026-10-21registry.npmjs.org/kimi-probe-abc-123probe: anonymous PUT -> 404 Not Found, i.e. publishing requires a token (no anonymous writes)
Unknown values 3
  • 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