{"eid":"haskell","name":"Hackage","domain":"haskell.org","resolved_by":"domain","topics":["storage"],"n_records":2,"best_vorder":1,"review":null,"aliases":["Hackage","Hackage (hackage.haskell.org)","hackage (haskell)","haskell.org"],"records":[{"rid":"storage/hackage","card":{"rid":"storage/hackage","eid":"haskell","topic":"storage","slug":"hackage","provider":"Hackage (hackage.haskell.org)","url":"https://hackage.haskell.org","domain":"haskell.org","category":"registry","tier":null,"verdict":"qualifies-with-caveat","vorder":1,"grp":"usable","confidence":"reported","binding":"none","identity_kind":"institution","identity_basis":"stated","needs_card":0,"needs_phone":0,"needs_id":0,"needs_institution":1,"country":null,"crypto":null,"interfaces":"rest","egress_metered":0,"per_object_bytes":null,"retention_days":null,"verified_at":"2026-10-21T00:00:00.000Z","verified_basis":"inherited","checked_on":"2026-10-21","stale_on":"2026-11-04","n_evidence":3,"usd_month":null,"usd_per_tb_month":null,"summary":"No published per-package or total quota found on the upload page or the server API. Uploads are permanent: 'Upload and publish a package permanently' and 'Yo...","duplicate_of":null,"n_unknown":4},"record":{"topic":"storage","slug":"hackage","provider":"Hackage (hackage.haskell.org)","url":"https://hackage.haskell.org","category":"registry","free_tier":{"stated":"No published per-package or total quota found on the upload page or the server API. Uploads are permanent: 'Upload and publish a package permanently' and 'You can only upload a package version once and this cannot be undone'. Real large package verified: pandoc-3.5.tar.gz is 7,483,625 bytes. Packages must be `cabal sdist` output (gzipped tar with package.cabal).","unit":"mixed","metered_on":"unstated","source_url":"https://hackage.haskell.org/upload","read_on":"2026-10-21","notes":null},"per_object_cap":{"stated":"not stated","source_url":"https://hackage.haskell.org/upload","notes":"not stated"},"retention":{"stated":"No published per-package or total quota found on the upload page or the server API. Uploads are permanent: 'Upload and publish a package permanently' and 'You can only upload a package version once and this cannot be undone'","source_url":"https://hackage.haskell.org/upload","notes":"not stated"},"egress":{"terms":"Free. Content is served from hackage.haskell.org and the hackage-content.haskell.org CDN. No billing, no bandwidth meter.","metered":false},"interface":["rest"],"interface_detail":"rest","tooling":"`cabal upload` / `stack upload` (write), `hup` (a dedicated upload client, hackage.haskell.org/package/hup), Hackage server API at hackage-origin.haskell.org/api (open, 62,403-byte route listing), plain HTTPS tarball GET (read).","chaining":"unlimited packages x unlimited versions per package (versions are never deleted and the index keeps all of them) x unlimited free Hackage accounts. Content must be a Cabal sdist, but the sdist can contain arbitrary files declared in extra-source-files - so a multi-GB blob can be shipped as a package's data. Multiply: N accounts x M packages x K versions.","limits":[],"limits_note":"per-object-cap: none documented; 7.4 MB verified, and the 100 MB-class limits seen in other ecosystems are not stated here - likely a server-side request size limit that is undocumented. IMPORTANT retention property: uploads are immutable and permanent (no delete, no re-upload of the same version), which is exactly what an archive workload wants. request-rate: not documented.","identity_cost":{"kind":"institution","detail":"derived from the record's prose, not from an identity field, and no signup was executed: kage or total quota found on the upload page or the server API. Uploads are permanent: 'Upload and publish a package permanently' and 'You can only upload a package version once and","country":null},"reliability_note":"Immutable by design - a bad upload cannot be deleted, which is irreversibility risk in the other direction. No documented byte ceiling means the ceiling is empirical and could change without notice. Read path is plain static files and reliable.","confidence":"reported","confidence_note":"One page read moves it to documented.","evidence":[{"url":"https://hackage.haskell.org/package/pandoc-3.5/pandoc-3.5.tar.gz","date":"2026-10-21","proved":"probe: GET -> 200, 7,483,625 bytes"},{"url":"https://hackage-origin.haskell.org/api","date":"2026-10-21","proved":"probe: GET -> 200, 62,403 bytes (open route listing)"},{"url":"https://hackage.haskell.org/upload","date":"2026-10-21","proved":"'Upload and publish a package permanently ... You can only upload a package version once and this cannot be undone'"}],"verdict":"qualifies-with-caveat","verified_at":"2026-10-21T00:00:00.000Z","notes":"No published per-package or total quota found on the upload page or the server API. Uploads are permanent: 'Upload and publish a package permanently' and 'You can only upload a package version once and this cannot be undone'. Real large package verified: pandoc-3.5.tar.gz is 7,483,625 bytes. Packages must be `cabal sdist` output (gzipped tar with package.cabal).","extras":{},"binding":"none","binding_note":"no constraint in the record binds at this scale; the record carries no limit of a kind the vocabulary names"},"claims":[{"path":"$.free_tier.stated","kind":"free-quota","num":null,"unit":null,"per":null,"currency":null,"usd":null,"fx_date":null,"parse":"unparsed"}],"unknown":[["$.free_tier.notes","process"],["$.per_object_cap.notes","not-extracted"],["$.per_object_cap.stated","not-extracted"],["$.retention.notes","not-extracted"]],"history":[],"drift":[{"kind":"duplicate-disagrees","subject":"storage/hackage","other":"storage/hackage-2","field":"verdict","a":"qualifies-with-caveat","b":"fails-quota","detail":null},{"kind":"duplicate-disagrees","subject":"storage/hackage","other":"storage/hackage-2","field":"identity_kind","a":"institution","b":"email","detail":null}]},{"rid":"storage/hackage-2","card":{"rid":"storage/hackage-2","eid":"haskell","topic":"storage","slug":"hackage-2","provider":"hackage (haskell)","url":"https://hackage.haskell.org/upload","domain":"haskell.org","category":"rejected-provider","tier":null,"verdict":"fails-quota","vorder":6,"grp":"rejected","confidence":"reported","binding":"none","identity_kind":"email","identity_basis":"defaulted","needs_card":null,"needs_phone":null,"needs_id":null,"needs_institution":null,"country":null,"crypto":null,"interfaces":null,"egress_metered":0,"per_object_bytes":null,"retention_days":null,"verified_at":"2026-10-21T00:00:00.000Z","verified_basis":"inherited","checked_on":"2026-10-21","stale_on":"2026-11-04","n_evidence":2,"usd_month":null,"usd_per_tb_month":null,"summary":"No documented size limit and no documented quota — could not establish any number from the upload page, the FAQ, or the server source (the upload handler has...","duplicate_of":null,"n_unknown":15},"record":{"topic":"storage","slug":"hackage-2","provider":"hackage (haskell)","url":"https://hackage.haskell.org/upload","category":"rejected-provider","free_tier":{"stated":"No documented size limit and no documented quota — could not establish any number from the upload page, the FAQ, or the server source (the upload handler has no size guard visible in Distrib","unit":"none","metered_on":"none","source_url":"https://hackage.haskell.org/upload","read_on":"2026-10-21","notes":null},"per_object_cap":{"stated":"not recorded","bytes":null,"source_url":"https://hackage.haskell.org/upload","notes":"not recorded"},"retention":{"stated":"not recorded","days":null,"source_url":"https://hackage.haskell.org/upload","notes":null},"egress":{"terms":"not recorded","metered":false},"interface":["unknown"],"interface_detail":null,"tooling":"not recorded","chaining":"not recorded","limits":[],"limits_note":null,"identity_cost":{"kind":"email","detail":null,"country":null},"reliability_note":"No documented size limit and no documented quota — could not establish any number from the upload page, the FAQ, or the server source (the upload handler has no size guard visible in Distrib","confidence":"reported","confidence_note":null,"evidence":[{"url":"https://hackage.haskell.org/upload","date":"2026-10-21","proved":"No documented size limit and no documented quota — could not establish any number from the upload page, the FAQ, or the server source (the upload handler has no size guard visible in Distrib"},{"url":"https://raw.githubusercontent.com/haskell/hackage-server/master/src/Distribution/Server/Features/Upload.hs","date":"2026-10-21","proved":"cited as the basis of the rejection: No documented size limit and no documented quota — could not establish any number from the upload page, the FAQ, or the server source (the upload handler has no size guard visible in Distrib"}],"verdict":"fails-quota","verified_at":"2026-10-21T00:00:00.000Z","notes":"No documented size limit and no documented quota — could not establish any number from the upload page, the FAQ, or the server source (the upload handler has no size guard visible in Distrib","extras":{"dead_end":{"failure_class":"quota","why":"No documented size limit and no documented quota — could not establish any number from the upload page, the FAQ, or the server source (the upload handler has no size guard visible in Distrib","retry_when":null,"first_recorded":"2026-10-21"}},"binding":"none","binding_note":"no constraint of a named kind was recorded; the verdict rests on the quota sentence rather than on a named limit"},"claims":[{"path":"$.free_tier.stated","kind":"free-quota","num":null,"unit":null,"per":null,"currency":null,"usd":null,"fx_date":null,"parse":"unparsed"}],"unknown":[["$.chaining","not-recorded"],["$.confidence_note","withheld"],["$.egress.terms","not-recorded"],["$.extras.dead_end.retry_when","process"],["$.free_tier.notes","process"],["$.identity_cost.detail","defaulted"],["$.identity_cost.kind","identity-defaulted"],["$.interface","interface-unknown"],["$.interface_detail","withheld"],["$.limits_note","process"],["$.per_object_cap.notes","not-recorded"],["$.per_object_cap.stated","not-recorded"],["$.retention.notes","process"],["$.retention.stated","not-recorded"],["$.tooling","not-recorded"]],"history":[],"drift":[{"kind":"duplicate-disagrees","subject":"storage/hackage","other":"storage/hackage-2","field":"verdict","a":"qualifies-with-caveat","b":"fails-quota","detail":null},{"kind":"duplicate-disagrees","subject":"storage/hackage","other":"storage/hackage-2","field":"identity_kind","a":"institution","b":"email","detail":null}]}]}