[{"data":1,"prerenderedAt":2390},["ShallowReactive",2],{"NoscriptNav_XrRK2e2e8meJ0jKVGkb5ULGQDVi3UiFQ9nupAr7Yns":3,"\u002Freports\u002Fcategorizing-package-registries":8},["Island",4],{"key":5,"result":6},"NoscriptNav_XrRK2e2e8meJ0jKVGkb5ULGQDVi3UiFQ9nupAr7Yns",{"head":7},{},{"id":9,"title":10,"authors":11,"body":13,"canonicalUrl":2376,"canonicalWebsiteName":2377,"category":2378,"date":2379,"description":2380,"extension":2381,"featured":2382,"fullWidthLayout":2382,"image":2383,"imageAlt":2383,"location":2383,"meta":2384,"metaImage":2383,"navigation":2385,"path":2386,"seo":2387,"stem":2388,"venue":2383,"venueUrl":2383,"__hash__":2389},"reports\u002Freports\u002Fcategorizing-package-registries.md","Categorizing Package Registries",[12],"andrew",{"type":14,"value":15,"toc":2363},"minimark",[16,33,36,50,94,99,102,108,171,182,245,255,313,319,330,336,372,376,379,385,423,429,492,498,521,524,527,533,555,570,591,603,621,631,644,650,674,677,680,686,724,730,748,754,799,813,843,847,850,856,988,994,1114,1120,1134,1140,1179,1182,1185,1191,1229,1235,1263,1269,1291,1294,1297,1303,1335,1341,1349,1355,1399,1405,1447,1451,1454,1459,1467,1472,1499,1504,1520,1525,1533,1537,1540,1546,1558,1564,1634],[17,18,19,20,25,26,32],"p",{},"Package registries differ in dozens of ways, but most of those differences cluster into a few structural categories. Looking at them through the lens of ",[21,22,24],"a",{"href":23},"\u002Freports\u002Fpackage-manager-tradeoffs","design tradeoffs"," helps explain why they ended up where they did. The ",[21,27,31],{"href":28,"rel":29},"https:\u002F\u002Fnesbitt.io\u002F2025\u002F11\u002F30\u002Fdocumenting-package-manager-data.html",[30],"nofollow","ecosyste.ms documentation repositories"," contain detailed data on over 70 registries; here I'm trying to draw out the shapes.",[17,34,35],{},"The categories below are roughly orthogonal dimensions. No registry is \"just\" one thing; each is a particular combination of choices. npmjs.com is database-backed, unreviewed, has flat-plus-scoped names, ships mostly source, and is run by a for-profit company. Debian's repositories are filesystem-based, curated by maintainers, use distro-managed names, ship binaries, and are run by a foundation. Those combinations matter more than any single axis.",[17,37,38,39,43,44,49],{},"A companion post covers ",[21,40,42],{"href":41},"\u002Freports\u002F29\u002Fcategorizing-package-manager-clients.html","package manager clients",": resolution algorithms, lockfiles, build hooks, and manifest formats. The data is also available as ",[21,45,48],{"href":46,"rel":47},"https:\u002F\u002Fgithub.com\u002Fandrew\u002Fnesbitt.io\u002Fblob\u002Fmaster\u002Fdata\u002Fpackage-registries.csv",[30],"CSV",". There are gaps; contributions welcome.",[17,51,52,56,57,61,62,61,66,61,70,61,74,61,78,61,82,61,86,61,90],{},[53,54,55],"strong",{},"Contents:"," ",[21,58,60],{"href":59},"#registry-architecture","Architecture"," · ",[21,63,65],{"href":64},"#reviewed--unreviewed","Review model",[21,67,69],{"href":68},"#namespacing","Namespacing",[21,71,73],{"href":72},"#distribution-model","Distribution model",[21,75,77],{"href":76},"#registry-governance","Governance",[21,79,81],{"href":80},"#ecosystem-scope","Ecosystem scope",[21,83,85],{"href":84},"#version-retention","Version retention",[21,87,89],{"href":88},"#registry-size","Size",[21,91,93],{"href":92},"#mirroring--proxying","Mirroring",[95,96,98],"h2",{"id":97},"registry-architecture","Registry architecture",[17,100,101],{},"How does the registry store and serve package metadata?",[17,103,104,107],{},[53,105,106],{},"Database-backed web services"," are uploaded via API, with metadata in Postgres or similar. This model scales well and supports rich features like download counts and vulnerability reporting.",[109,110,111,115,118,121,124,138,141,144,147,150,153,156,159,162,165,168],"ul",{},[112,113,114],"li",{},"npmjs.com",[112,116,117],{},"pypi.org",[112,119,120],{},"rubygems.org",[112,122,123],{},"nuget.org",[112,125,126,127],{},"crates.io",[128,129,130],"sup",{},[21,131,137],{"href":132,"ariaDescribedBy":133,"dataFootnoteRef":135,"id":136},"#user-content-fn-cargo-index",[134],"footnote-label","","user-content-fnref-cargo-index","1",[112,139,140],{},"packagist.org",[112,142,143],{},"hex.pm",[112,145,146],{},"pub.dev",[112,148,149],{},"clojars.org",[112,151,152],{},"forge.puppet.com",[112,154,155],{},"anaconda.org",[112,157,158],{},"luarocks.org",[112,160,161],{},"community.chocolatey.org",[112,163,164],{},"open-vsx.org",[112,166,167],{},"galaxy.ansible.com",[112,169,170],{},"jsr.io",[17,172,173,176,177,181],{},[53,174,175],{},"Git repositories as indexes"," use version control as the storage layer on the critical path. If you removed git, you'd need to replace it with a database. The git model provides history, is trivially mirrorable, and works offline once cloned. But it doesn't scale indefinitely; Cargo had to add a ",[21,178,180],{"href":179},"\u002Fideas\u002Fthe-compact-index","sparse index"," to avoid downloading the entire registry on first use.",[109,183,184,187,190,193,196,199,202,213,216,227,236],{},[112,185,186],{},"homebrew-core",[112,188,189],{},"cocoapods.org",[112,191,192],{},"vcpkg",[112,194,195],{},"conan.io",[112,197,198],{},"swiftpackageindex.com",[112,200,201],{},"Julia General registry",[112,203,204,205],{},"juliahub.com",[128,206,207],{},[21,208,212],{"href":209,"ariaDescribedBy":210,"dataFootnoteRef":135,"id":211},"#user-content-fn-juliahub-git",[134],"user-content-fnref-juliahub-git","2",[112,214,215],{},"winget-pkgs",[112,217,218,219],{},"spack",[128,220,221],{},[21,222,226],{"href":223,"ariaDescribedBy":224,"dataFootnoteRef":135,"id":225},"#user-content-fn-nix-guix-spack-hashing",[134],"user-content-fnref-nix-guix-spack-hashing","3",[112,228,229,230],{},"nix",[128,231,232],{},[21,233,226],{"href":223,"ariaDescribedBy":234,"dataFootnoteRef":135,"id":235},[134],"user-content-fnref-nix-guix-spack-hashing-2",[112,237,238,239],{},"guix",[128,240,241],{},[21,242,226],{"href":223,"ariaDescribedBy":243,"dataFootnoteRef":135,"id":244},[134],"user-content-fnref-nix-guix-spack-hashing-3",[17,246,247,250,251,254],{},[53,248,249],{},"Filesystem-based repositories"," serve generated index files statically from HTTP mirrors. The server does work only when the repository is updated, not when clients fetch. This is the pattern that ",[21,252,253],{"href":179},"the compact index"," brought to RubyGems.",[109,256,257,260,263,266,269,272,275,278,281,284,287,298,301,304,307,310],{},[112,258,259],{},"apt\u002Fdpkg",[112,261,262],{},"yum\u002Fdnf",[112,264,265],{},"pacman",[112,267,268],{},"apk",[112,270,271],{},"zypper",[112,273,274],{},"Portage",[112,276,277],{},"cran.r-project.org",[112,279,280],{},"bioconductor.org",[112,282,283],{},"metacpan.org",[112,285,286],{},"hackage.haskell.org",[112,288,289,290],{},"pkgs.racket-lang.org",[128,291,292],{},[21,293,297],{"href":294,"ariaDescribedBy":295,"dataFootnoteRef":135,"id":296},"#user-content-fn-racket-filesystem",[134],"user-content-fnref-racket-filesystem","4",[112,299,300],{},"FreeBSD ports",[112,302,303],{},"pkgsrc",[112,305,306],{},"Helm",[112,308,309],{},"postmarketOS",[112,311,312],{},"Adélie Linux",[17,314,315,318],{},[53,316,317],{},"Source host as registry"," means no central registry. Packages are fetched directly from git hosts using URLs as identifiers.",[109,320,321,324,327],{},[112,322,323],{},"Go modules",[112,325,326],{},"Deno",[112,328,329],{},"Carthage",[17,331,332,335],{},[53,333,334],{},"Content-addressed stores"," identify packages by hash of inputs. Binary caches provide pre-built artifacts.",[109,337,338,347,356],{},[112,339,340,341],{},"Nix",[128,342,343],{},[21,344,226],{"href":223,"ariaDescribedBy":345,"dataFootnoteRef":135,"id":346},[134],"user-content-fnref-nix-guix-spack-hashing-4",[112,348,349,350],{},"Guix",[128,351,352],{},[21,353,226],{"href":223,"ariaDescribedBy":354,"dataFootnoteRef":135,"id":355},[134],"user-content-fnref-nix-guix-spack-hashing-5",[112,357,218,358,366],{},[128,359,360],{},[21,361,365],{"href":362,"ariaDescribedBy":363,"dataFootnoteRef":135,"id":364},"#user-content-fn-spack-content-addressing",[134],"user-content-fnref-spack-content-addressing","5",[128,367,368],{},[21,369,226],{"href":223,"ariaDescribedBy":370,"dataFootnoteRef":135,"id":371},[134],"user-content-fnref-nix-guix-spack-hashing-6",[95,373,375],{"id":374},"reviewed-unreviewed","Reviewed \u002F Unreviewed",[17,377,378],{},"Does someone look at packages before they're available?",[17,380,381,384],{},[53,382,383],{},"Unreviewed"," means anyone can publish immediately. You create an account, run a publish command, and your package is live within seconds. This enables growth but creates attack surface.",[109,386,387,389,391,393,395,397,399,401,403,405,407,409,411,413,415,417,419,421],{},[112,388,114],{},[112,390,117],{},[112,392,126],{},[112,394,120],{},[112,396,140],{},[112,398,123],{},[112,400,143],{},[112,402,146],{},[112,404,149],{},[112,406,204],{},[112,408,286],{},[112,410,283],{},[112,412,152],{},[112,414,155],{},[112,416,158],{},[112,418,164],{},[112,420,167],{},[112,422,170],{},[17,424,425,428],{},[53,426,427],{},"Reviewed"," registries have maintainers review packages before they appear. These registries grow more slowly but catch problems earlier. In practice, \"review\" ranges from packaging QA and policy checks to security vetting; very few projects do systematic source code review.",[109,430,431,434,437,440,442,445,456,459,462,464,466,469,471,473,475,477,479,481],{},[112,432,433],{},"Debian",[112,435,436],{},"Fedora",[112,438,439],{},"Ubuntu",[112,441,186],{},[112,443,444],{},"Alpine",[112,446,447,448],{},"Arch",[128,449,450],{},[21,451,455],{"href":452,"ariaDescribedBy":453,"dataFootnoteRef":135,"id":454},"#user-content-fn-arch-aur",[134],"user-content-fnref-arch-aur","6",[112,457,458],{},"nixpkgs",[112,460,461],{},"F-Droid",[112,463,277],{},[112,465,280],{},[112,467,468],{},"conda-forge",[112,470,309],{},[112,472,312],{},[112,474,218],{},[112,476,300],{},[112,478,303],{},[112,480,215],{},[112,482,483,484],{},"central.sonatype.com",[128,485,486],{},[21,487,491],{"href":488,"ariaDescribedBy":489,"dataFootnoteRef":135,"id":490},"#user-content-fn-maven-verification",[134],"user-content-fnref-maven-verification","7",[17,493,494,497],{},[53,495,496],{},"Moderated upload"," accepts uploads but has moderation layers or automated semantic checks.",[109,499,500,511],{},[112,501,502,503],{},"package.elm-lang.org",[128,504,505],{},[21,506,510],{"href":507,"ariaDescribedBy":508,"dataFootnoteRef":135,"id":509},"#user-content-fn-elm-semver",[134],"user-content-fnref-elm-semver","8",[112,512,161,513],{},[128,514,515],{},[21,516,520],{"href":517,"ariaDescribedBy":518,"dataFootnoteRef":135,"id":519},"#user-content-fn-chocolatey-moderation",[134],"user-content-fnref-chocolatey-moderation","9",[95,522,69],{"id":523},"namespacing",[17,525,526],{},"How are packages named?",[17,528,529,532],{},[53,530,531],{},"Flat"," namespaces give each package a single global name.",[109,534,535,537,539,541,543,545,547,549,551,553],{},[112,536,120],{},[112,538,117],{},[112,540,126],{},[112,542,143],{},[112,544,286],{},[112,546,277],{},[112,548,204],{},[112,550,502],{},[112,552,158],{},[112,554,161],{},[17,556,557,560,561,565,566,569],{},[53,558,559],{},"Scoped"," namespaces add organizational prefixes like ",[562,563,564],"code",{},"@babel\u002Fcore"," or ",[562,567,568],{},"symfony\u002Fconsole",".",[109,571,572,574,576,578,580,582,584,587,589],{},[112,573,114],{},[112,575,140],{},[112,577,152],{},[112,579,164],{},[112,581,167],{},[112,583,215],{},[112,585,586],{},"artifacthub.io",[112,588,155],{},[112,590,170],{},[17,592,593,596,597,565,600,569],{},[53,594,595],{},"Hierarchical"," namespaces use structured naming like ",[562,598,599],{},"org.apache.commons:commons-lang3",[562,601,602],{},"DateTime::Format::Strptime",[109,604,605,607,609,611],{},[112,606,483],{},[112,608,283],{},[112,610,149],{},[112,612,218,613],{},[128,614,615],{},[21,616,620],{"href":617,"ariaDescribedBy":618,"dataFootnoteRef":135,"id":619},"#user-content-fn-spack-namespaces",[134],"user-content-fnref-spack-namespaces","10",[17,622,623,626,627,630],{},[53,624,625],{},"URL-based"," identifiers like ",[562,628,629],{},"github.com\u002Fuser\u002Frepo"," use domain ownership as the claim. No registration step.",[109,632,633,636,639,642],{},[112,634,635],{},"proxy.golang.org",[112,637,638],{},"deno.land",[112,640,641],{},"Swift Package Manager",[112,643,329],{},[17,645,646,649],{},[53,647,648],{},"Distro-managed"," names are controlled by distribution maintainers, often differing from upstream project names.",[109,651,652,654,656,658,660,662,664,666,668,670,672],{},[112,653,433],{},[112,655,436],{},[112,657,447],{},[112,659,444],{},[112,661,186],{},[112,663,458],{},[112,665,218],{},[112,667,468],{},[112,669,300],{},[112,671,303],{},[112,673,309],{},[95,675,73],{"id":676},"distribution-model",[17,678,679],{},"What gets distributed?",[17,681,682,685],{},[53,683,684],{},"Source only"," ships code that gets compiled or interpreted on the client. One artifact supports any platform.",[109,687,688,690,692,694,696,698,700,702,704,706,716,718,720,722],{},[112,689,114],{},[112,691,126],{},[112,693,635],{},[112,695,283],{},[112,697,143],{},[112,699,286],{},[112,701,277],{},[112,703,502],{},[112,705,289],{},[112,707,149,708],{},[128,709,710],{},[21,711,715],{"href":712,"ariaDescribedBy":713,"dataFootnoteRef":135,"id":714},"#user-content-fn-clojars-bytecode",[134],"user-content-fnref-clojars-bytecode","11",[112,717,158],{},[112,719,167],{},[112,721,586],{},[112,723,170],{},[17,725,726,729],{},[53,727,728],{},"Binary only"," ships precompiled artifacts.",[109,731,732,734,736,738,740,742,744,746],{},[112,733,483],{},[112,735,123],{},[112,737,259],{},[112,739,262],{},[112,741,265],{},[112,743,268],{},[112,745,161],{},[112,747,215],{},[17,749,750,753],{},[53,751,752],{},"Mixed source and binary"," provides source distributions plus prebuilt wheels\u002Fbinaries. Native code gets platform-specific builds.",[109,755,756,758,760,762,764,774,785,795,797],{},[112,757,117],{},[112,759,120],{},[112,761,189],{},[112,763,155],{},[112,765,186,766],{},[128,767,768],{},[21,769,773],{"href":770,"ariaDescribedBy":771,"dataFootnoteRef":135,"id":772},"#user-content-fn-homebrew-bottles",[134],"user-content-fnref-homebrew-bottles","12",[112,775,776,777],{},"cache.nixos.org",[128,778,779],{},[21,780,784],{"href":781,"ariaDescribedBy":782,"dataFootnoteRef":135,"id":783},"#user-content-fn-nix-substitutes",[134],"user-content-fnref-nix-substitutes","13",[112,786,218,787],{},[128,788,789],{},[21,790,794],{"href":791,"ariaDescribedBy":792,"dataFootnoteRef":135,"id":793},"#user-content-fn-spack-binaries",[134],"user-content-fnref-spack-binaries","14",[112,796,300],{},[112,798,303],{},[17,800,801,804,805,808,809,812],{},[53,802,803],{},"Platform matrices"," publish multiple artifacts per release: ",[562,806,807],{},"cp39-manylinux_x86_64",", ",[562,810,811],{},"cp310-macosx_arm64",", etc.",[109,814,815,817,819,821,823,833,835],{},[112,816,117],{},[112,818,120],{},[112,820,155],{},[112,822,776],{},[112,824,123,825],{},[128,826,827],{},[21,828,832],{"href":829,"ariaDescribedBy":830,"dataFootnoteRef":135,"id":831},"#user-content-fn-nuget-rids",[134],"user-content-fnref-nuget-rids","15",[112,834,186],{},[112,836,218,837],{},[128,838,839],{},[21,840,794],{"href":791,"ariaDescribedBy":841,"dataFootnoteRef":135,"id":842},[134],"user-content-fnref-spack-binaries-2",[95,844,846],{"id":845},"registry-governance","Registry governance",[17,848,849],{},"Who runs the registry?",[17,851,852,855],{},[53,853,854],{},"Non-profit foundations"," operate registries as community infrastructure.",[109,857,858,868,878,888,898,908,918,928,938,948,958,968,978],{},[112,859,117,860],{},[128,861,862],{},[21,863,867],{"href":864,"ariaDescribedBy":865,"dataFootnoteRef":135,"id":866},"#user-content-fn-pypi-psf",[134],"user-content-fnref-pypi-psf","16",[112,869,126,870],{},[128,871,872],{},[21,873,877],{"href":874,"ariaDescribedBy":875,"dataFootnoteRef":135,"id":876},"#user-content-fn-crates-rust",[134],"user-content-fnref-crates-rust","17",[112,879,120,880],{},[128,881,882],{},[21,883,887],{"href":884,"ariaDescribedBy":885,"dataFootnoteRef":135,"id":886},"#user-content-fn-rubygems-central",[134],"user-content-fnref-rubygems-central","18",[112,889,483,890],{},[128,891,892],{},[21,893,897],{"href":894,"ariaDescribedBy":895,"dataFootnoteRef":135,"id":896},"#user-content-fn-maven-lf",[134],"user-content-fnref-maven-lf","19",[112,899,140,900],{},[128,901,902],{},[21,903,907],{"href":904,"ariaDescribedBy":905,"dataFootnoteRef":135,"id":906},"#user-content-fn-packagist-funding",[134],"user-content-fnref-packagist-funding","20",[112,909,283,910],{},[128,911,912],{},[21,913,917],{"href":914,"ariaDescribedBy":915,"dataFootnoteRef":135,"id":916},"#user-content-fn-cpan-perl",[134],"user-content-fnref-cpan-perl","21",[112,919,143,920],{},[128,921,922],{},[21,923,927],{"href":924,"ariaDescribedBy":925,"dataFootnoteRef":135,"id":926},"#user-content-fn-hex-funding",[134],"user-content-fnref-hex-funding","22",[112,929,149,930],{},[128,931,932],{},[21,933,937],{"href":934,"ariaDescribedBy":935,"dataFootnoteRef":135,"id":936},"#user-content-fn-clojars-funding",[134],"user-content-fnref-clojars-funding","23",[112,939,286,940],{},[128,941,942],{},[21,943,947],{"href":944,"ariaDescribedBy":945,"dataFootnoteRef":135,"id":946},"#user-content-fn-hackage-org",[134],"user-content-fnref-hackage-org","24",[112,949,277,950],{},[128,951,952],{},[21,953,957],{"href":954,"ariaDescribedBy":955,"dataFootnoteRef":135,"id":956},"#user-content-fn-cran-r",[134],"user-content-fnref-cran-r","25",[112,959,186,960],{},[128,961,962],{},[21,963,967],{"href":964,"ariaDescribedBy":965,"dataFootnoteRef":135,"id":966},"#user-content-fn-homebrew-osc",[134],"user-content-fnref-homebrew-osc","26",[112,969,164,970],{},[128,971,972],{},[21,973,977],{"href":974,"ariaDescribedBy":975,"dataFootnoteRef":135,"id":976},"#user-content-fn-openvsx-eclipse",[134],"user-content-fnref-openvsx-eclipse","27",[112,979,586,980],{},[128,981,982],{},[21,983,987],{"href":984,"ariaDescribedBy":985,"dataFootnoteRef":135,"id":986},"#user-content-fn-helm-cncf",[134],"user-content-fnref-helm-cncf","28",[17,989,990,993],{},[53,991,992],{},"For-profit companies"," run registries as products or strategic infrastructure.",[109,995,996,1006,1016,1026,1036,1046,1056,1066,1076,1086,1096,1106],{},[112,997,114,998],{},[128,999,1000],{},[21,1001,1005],{"href":1002,"ariaDescribedBy":1003,"dataFootnoteRef":135,"id":1004},"#user-content-fn-npm-microsoft",[134],"user-content-fnref-npm-microsoft","29",[112,1007,123,1008],{},[128,1009,1010],{},[21,1011,1015],{"href":1012,"ariaDescribedBy":1013,"dataFootnoteRef":135,"id":1014},"#user-content-fn-nuget-microsoft",[134],"user-content-fnref-nuget-microsoft","30",[112,1017,146,1018],{},[128,1019,1020],{},[21,1021,1025],{"href":1022,"ariaDescribedBy":1023,"dataFootnoteRef":135,"id":1024},"#user-content-fn-pubdev-google",[134],"user-content-fnref-pubdev-google","31",[112,1027,155,1028],{},[128,1029,1030],{},[21,1031,1035],{"href":1032,"ariaDescribedBy":1033,"dataFootnoteRef":135,"id":1034},"#user-content-fn-conda-anaconda",[134],"user-content-fnref-conda-anaconda","32",[112,1037,204,1038],{},[128,1039,1040],{},[21,1041,1045],{"href":1042,"ariaDescribedBy":1043,"dataFootnoteRef":135,"id":1044},"#user-content-fn-juliahub-computing",[134],"user-content-fnref-juliahub-computing","33",[112,1047,152,1048],{},[128,1049,1050],{},[21,1051,1055],{"href":1052,"ariaDescribedBy":1053,"dataFootnoteRef":135,"id":1054},"#user-content-fn-puppet-perforce",[134],"user-content-fnref-puppet-perforce","34",[112,1057,167,1058],{},[128,1059,1060],{},[21,1061,1065],{"href":1062,"ariaDescribedBy":1063,"dataFootnoteRef":135,"id":1064},"#user-content-fn-ansible-redhat",[134],"user-content-fnref-ansible-redhat","35",[112,1067,161,1068],{},[128,1069,1070],{},[21,1071,1075],{"href":1072,"ariaDescribedBy":1073,"dataFootnoteRef":135,"id":1074},"#user-content-fn-chocolatey-company",[134],"user-content-fnref-chocolatey-company","36",[112,1077,215,1078],{},[128,1079,1080],{},[21,1081,1085],{"href":1082,"ariaDescribedBy":1083,"dataFootnoteRef":135,"id":1084},"#user-content-fn-winget-microsoft",[134],"user-content-fnref-winget-microsoft","37",[112,1087,635,1088],{},[128,1089,1090],{},[21,1091,1095],{"href":1092,"ariaDescribedBy":1093,"dataFootnoteRef":135,"id":1094},"#user-content-fn-go-google",[134],"user-content-fnref-go-google","38",[112,1097,638,1098],{},[128,1099,1100],{},[21,1101,1105],{"href":1102,"ariaDescribedBy":1103,"dataFootnoteRef":135,"id":1104},"#user-content-fn-deno-company",[134],"user-content-fnref-deno-company","39",[112,1107,170,1108],{},[128,1109,1110],{},[21,1111,1105],{"href":1102,"ariaDescribedBy":1112,"dataFootnoteRef":135,"id":1113},[134],"user-content-fnref-deno-company-2",[17,1115,1116,1119],{},[53,1117,1118],{},"Community projects"," run registries as volunteer efforts, often with fiscal sponsors.",[109,1121,1122,1124,1126,1128,1130,1132],{},[112,1123,189],{},[112,1125,468],{},[112,1127,198],{},[112,1129,158],{},[112,1131,329],{},[112,1133,458],{},[17,1135,1136,1139],{},[53,1137,1138],{},"Distribution projects"," maintain repositories as part of their distro.",[109,1141,1142,1144,1154,1164,1166,1168,1170,1172,1174,1177],{},[112,1143,433],{},[112,1145,436,1146],{},[128,1147,1148],{},[21,1149,1153],{"href":1150,"ariaDescribedBy":1151,"dataFootnoteRef":135,"id":1152},"#user-content-fn-fedora-redhat",[134],"user-content-fnref-fedora-redhat","40",[112,1155,439,1156],{},[128,1157,1158],{},[21,1159,1163],{"href":1160,"ariaDescribedBy":1161,"dataFootnoteRef":135,"id":1162},"#user-content-fn-ubuntu-canonical",[134],"user-content-fnref-ubuntu-canonical","41",[112,1165,447],{},[112,1167,444],{},[112,1169,309],{},[112,1171,312],{},[112,1173,218],{},[112,1175,1176],{},"FreeBSD",[112,1178,303],{},[95,1180,81],{"id":1181},"ecosystem-scope",[17,1183,1184],{},"What kind of software does this package manager handle?",[17,1186,1187,1190],{},[53,1188,1189],{},"Language-specific"," registries serve a single programming language ecosystem.",[109,1192,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227],{},[112,1194,114],{},[112,1196,117],{},[112,1198,120],{},[112,1200,126],{},[112,1202,143],{},[112,1204,286],{},[112,1206,283],{},[112,1208,149],{},[112,1210,146],{},[112,1212,277],{},[112,1214,204],{},[112,1216,502],{},[112,1218,289],{},[112,1220,140],{},[112,1222,635],{},[112,1224,483],{},[112,1226,158],{},[112,1228,170],{},[17,1230,1231,1234],{},[53,1232,1233],{},"System-level"," registries install operating system components and applications.",[109,1236,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261],{},[112,1238,259],{},[112,1240,262],{},[112,1242,265],{},[112,1244,268],{},[112,1246,186],{},[112,1248,458],{},[112,1250,349],{},[112,1252,271],{},[112,1254,274],{},[112,1256,300],{},[112,1258,303],{},[112,1260,161],{},[112,1262,215],{},[17,1264,1265,1268],{},[53,1266,1267],{},"Domain-specific"," registries serve particular use cases or industries.",[109,1270,1271,1273,1275,1277,1280,1282,1285,1287,1289],{},[112,1272,280],{},[112,1274,468],{},[112,1276,218],{},[112,1278,1279],{},"ROS",[112,1281,152],{},[112,1283,1284],{},"registry.terraform.io",[112,1286,167],{},[112,1288,586],{},[112,1290,164],{},[95,1292,85],{"id":1293},"version-retention",[17,1295,1296],{},"Does the registry keep old versions available? What happens when a published version needs to be removed?",[17,1298,1299,1302],{},[53,1300,1301],{},"Keeps all versions"," indefinitely. You can install any historical version.",[109,1304,1305,1315,1325],{},[112,1306,483,1307],{},[128,1308,1309],{},[21,1310,1314],{"href":1311,"ariaDescribedBy":1312,"dataFootnoteRef":135,"id":1313},"#user-content-fn-maven-permanent",[134],"user-content-fnref-maven-permanent","42",[112,1316,635,1317],{},[128,1318,1319],{},[21,1320,1324],{"href":1321,"ariaDescribedBy":1322,"dataFootnoteRef":135,"id":1323},"#user-content-fn-go-cache-permanent",[134],"user-content-fnref-go-cache-permanent","43",[112,1326,218,1327],{},[128,1328,1329],{},[21,1330,1334],{"href":1331,"ariaDescribedBy":1332,"dataFootnoteRef":135,"id":1333},"#user-content-fn-spack-versions",[134],"user-content-fnref-spack-versions","44",[17,1336,1337,1340],{},[53,1338,1339],{},"Yanking"," marks a version as unavailable for new installs but keeps it accessible for existing lockfiles.",[109,1342,1343,1345,1347],{},[112,1344,126],{},[112,1346,120],{},[112,1348,143],{},[17,1350,1351,1354],{},[53,1352,1353],{},"Time-limited deletion"," allows removal within a window, then versions become permanent.",[109,1356,1357,1367,1377,1387,1389,1391,1393,1395,1397],{},[112,1358,114,1359],{},[128,1360,1361],{},[21,1362,1366],{"href":1363,"ariaDescribedBy":1364,"dataFootnoteRef":135,"id":1365},"#user-content-fn-npm-unpublish",[134],"user-content-fnref-npm-unpublish","45",[112,1368,117,1369],{},[128,1370,1371],{},[21,1372,1376],{"href":1373,"ariaDescribedBy":1374,"dataFootnoteRef":135,"id":1375},"#user-content-fn-pypi-deletion",[134],"user-content-fnref-pypi-deletion","46",[112,1378,126,1379],{},[128,1380,1381],{},[21,1382,1386],{"href":1383,"ariaDescribedBy":1384,"dataFootnoteRef":135,"id":1385},"#user-content-fn-crates-deletion",[134],"user-content-fnref-crates-deletion","47",[112,1388,123],{},[112,1390,140],{},[112,1392,149],{},[112,1394,286],{},[112,1396,283],{},[112,1398,146],{},[17,1400,1401,1404],{},[53,1402,1403],{},"Latest only"," or limited retention. Old versions disappear when new ones are published.",[109,1406,1407,1417,1427,1437],{},[112,1408,186,1409],{},[128,1410,1411],{},[21,1412,1416],{"href":1413,"ariaDescribedBy":1414,"dataFootnoteRef":135,"id":1415},"#user-content-fn-homebrew-latest",[134],"user-content-fnref-homebrew-latest","48",[112,1418,259,1419],{},[128,1420,1421],{},[21,1422,1426],{"href":1423,"ariaDescribedBy":1424,"dataFootnoteRef":135,"id":1425},"#user-content-fn-apt-releases",[134],"user-content-fnref-apt-releases","49",[112,1428,447,1429],{},[128,1430,1431],{},[21,1432,1436],{"href":1433,"ariaDescribedBy":1434,"dataFootnoteRef":135,"id":1435},"#user-content-fn-arch-rolling",[134],"user-content-fnref-arch-rolling","50",[112,1438,444,1439],{},[128,1440,1441],{},[21,1442,1446],{"href":1443,"ariaDescribedBy":1444,"dataFootnoteRef":135,"id":1445},"#user-content-fn-alpine-releases",[134],"user-content-fnref-alpine-releases","51",[95,1448,1450],{"id":1449},"registry-size","Registry size",[17,1452,1453],{},"How many packages? Grouped by order of magnitude.",[17,1455,1456],{},[53,1457,1458],{},"10⁶+ (millions)",[109,1460,1461,1463,1465],{},[112,1462,114],{},[112,1464,635],{},[112,1466,117],{},[17,1468,1469],{},[53,1470,1471],{},"10⁵ (hundreds of thousands)",[109,1473,1474,1476,1478,1480,1482,1484,1486,1488,1490,1493,1495,1497],{},[112,1475,483],{},[112,1477,123],{},[112,1479,140],{},[112,1481,120],{},[112,1483,126],{},[112,1485,189],{},[112,1487,155],{},[112,1489,458],{},[112,1491,1492],{},"Arch AUR",[112,1494,436],{},[112,1496,433],{},[112,1498,439],{},[17,1500,1501],{},[53,1502,1503],{},"10⁴ (tens of thousands)",[109,1505,1506,1508,1510,1512,1514,1516,1518],{},[112,1507,146],{},[112,1509,149],{},[112,1511,143],{},[112,1513,286],{},[112,1515,277],{},[112,1517,300],{},[112,1519,444],{},[17,1521,1522],{},[53,1523,1524],{},"10³ (thousands)",[109,1526,1527,1529,1531],{},[112,1528,186],{},[112,1530,158],{},[112,1532,502],{},[95,1534,1536],{"id":1535},"mirroring-proxying","Mirroring \u002F Proxying",[17,1538,1539],{},"How hard is it to run your own registry or mirror?",[17,1541,1542,1545],{},[53,1543,1544],{},"Trivial"," means filesystem-based repos or source-host registries that need no special infrastructure.",[109,1547,1548,1550,1552,1554,1556],{},[112,1549,259],{},[112,1551,262],{},[112,1553,635],{},[112,1555,283],{},[112,1557,277],{},[17,1559,1560,1563],{},[53,1561,1562],{},"Supported"," means official tooling or documented processes exist for running mirrors or private registries.",[109,1565,1566,1576,1586,1596,1598,1600,1602,1604,1614,1624],{},[112,1567,114,1568],{},[128,1569,1570],{},[21,1571,1575],{"href":1572,"ariaDescribedBy":1573,"dataFootnoteRef":135,"id":1574},"#user-content-fn-npm-verdaccio",[134],"user-content-fnref-npm-verdaccio","52",[112,1577,117,1578],{},[128,1579,1580],{},[21,1581,1585],{"href":1582,"ariaDescribedBy":1583,"dataFootnoteRef":135,"id":1584},"#user-content-fn-pypi-devpi",[134],"user-content-fnref-pypi-devpi","53",[112,1587,483,1588],{},[128,1589,1590],{},[21,1591,1595],{"href":1592,"ariaDescribedBy":1593,"dataFootnoteRef":135,"id":1594},"#user-content-fn-maven-nexus",[134],"user-content-fnref-maven-nexus","54",[112,1597,123],{},[112,1599,120],{},[112,1601,126],{},[112,1603,140],{},[112,1605,143,1606],{},[128,1607,1608],{},[21,1609,1613],{"href":1610,"ariaDescribedBy":1611,"dataFootnoteRef":135,"id":1612},"#user-content-fn-hex-mirrors",[134],"user-content-fnref-hex-mirrors","55",[112,1615,158,1616],{},[128,1617,1618],{},[21,1619,1623],{"href":1620,"ariaDescribedBy":1621,"dataFootnoteRef":135,"id":1622},"#user-content-fn-luarocks-servers",[134],"user-content-fnref-luarocks-servers","56",[112,1625,149,1626],{},[128,1627,1628],{},[21,1629,1633],{"href":1630,"ariaDescribedBy":1631,"dataFootnoteRef":135,"id":1632},"#user-content-fn-clojars-mirrors",[134],"user-content-fnref-clojars-mirrors","57",[1635,1636,1639,1644],"section",{"className":1637,"dataFootnotes":135},[1638],"footnotes",[95,1640,1643],{"className":1641,"id":134},[1642],"sr-only","Footnotes",[1645,1646,1647,1663,1672,1716,1725,1734,1743,1752,1767,1776,1798,1807,1816,1830,1846,1855,1868,1881,1894,1914,1928,1941,1950,1963,1976,1989,2003,2016,2029,2038,2047,2056,2065,2074,2083,2092,2101,2110,2119,2135,2144,2153,2168,2182,2196,2210,2225,2234,2243,2252,2261,2270,2284,2304,2321,2336,2349],"ol",{},[112,1648,1650,1651,1655,1656],{"id":1649},"user-content-fn-cargo-index","Cargo originally required cloning the full crates.io-index git repo; the ",[21,1652,180],{"href":1653,"rel":1654},"https:\u002F\u002Frust-lang.github.io\u002Frfcs\u002F2789-sparse-index.html",[30]," now allows fetching only needed entries. ",[21,1657,1662],{"href":1658,"ariaLabel":1659,"className":1660,"dataFootnoteBackref":135},"#user-content-fnref-cargo-index","Back to reference 1",[1661],"data-footnote-backref","↩",[112,1664,1666,1667],{"id":1665},"user-content-fn-juliahub-git","JuliaHub has a database-backed front end but the underlying Julia General registry is a git repository. ",[21,1668,1662],{"href":1669,"ariaLabel":1670,"className":1671,"dataFootnoteBackref":135},"#user-content-fnref-juliahub-git","Back to reference 2",[1661],[112,1673,1675,1676,56,1681,56,1688,56,1695,56,1702,56,1709],{"id":1674},"user-content-fn-nix-guix-spack-hashing","Nix, Guix, and Spack use git repositories as registries of build recipes and package metadata, but they also use content-addressed stores for binary packages and for their installation layout. In Spack's case, there is also an index in every install tree and in every binary cache, so that the solve can attempt to use as many prebuilt packages as possible. ",[21,1677,1662],{"href":1678,"ariaLabel":1679,"className":1680,"dataFootnoteBackref":135},"#user-content-fnref-nix-guix-spack-hashing","Back to reference 3",[1661],[21,1682,1662,1686],{"href":1683,"ariaLabel":1684,"className":1685,"dataFootnoteBackref":135},"#user-content-fnref-nix-guix-spack-hashing-2","Back to reference 3-2",[1661],[128,1687,212],{},[21,1689,1662,1693],{"href":1690,"ariaLabel":1691,"className":1692,"dataFootnoteBackref":135},"#user-content-fnref-nix-guix-spack-hashing-3","Back to reference 3-3",[1661],[128,1694,226],{},[21,1696,1662,1700],{"href":1697,"ariaLabel":1698,"className":1699,"dataFootnoteBackref":135},"#user-content-fnref-nix-guix-spack-hashing-4","Back to reference 3-4",[1661],[128,1701,297],{},[21,1703,1662,1707],{"href":1704,"ariaLabel":1705,"className":1706,"dataFootnoteBackref":135},"#user-content-fnref-nix-guix-spack-hashing-5","Back to reference 3-5",[1661],[128,1708,365],{},[21,1710,1662,1714],{"href":1711,"ariaLabel":1712,"className":1713,"dataFootnoteBackref":135},"#user-content-fnref-nix-guix-spack-hashing-6","Back to reference 3-6",[1661],[128,1715,455],{},[112,1717,1719,1720],{"id":1718},"user-content-fn-racket-filesystem","pkgs.racket-lang.org stores packages as files, generates a JSON index, and serves via S3. It polls git sources for updates but doesn't use git as its storage layer. ",[21,1721,1662],{"href":1722,"ariaLabel":1723,"className":1724,"dataFootnoteBackref":135},"#user-content-fnref-racket-filesystem","Back to reference 4",[1661],[112,1726,1728,1729],{"id":1727},"user-content-fn-spack-content-addressing","Spack binary caches are content-addressed by hashes of inputs but also provide an index so that the solver can consider binaries. ",[21,1730,1662],{"href":1731,"ariaLabel":1732,"className":1733,"dataFootnoteBackref":135},"#user-content-fnref-spack-content-addressing","Back to reference 5",[1661],[112,1735,1737,1738],{"id":1736},"user-content-fn-arch-aur","The AUR (Arch User Repository) is unreviewed; official repos are curated. ",[21,1739,1662],{"href":1740,"ariaLabel":1741,"className":1742,"dataFootnoteBackref":135},"#user-content-fnref-arch-aur","Back to reference 6",[1661],[112,1744,1746,1747],{"id":1745},"user-content-fn-maven-verification","Requires proving domain ownership via DNS or hosting a file at the domain. ",[21,1748,1662],{"href":1749,"ariaLabel":1750,"className":1751,"dataFootnoteBackref":135},"#user-content-fnref-maven-verification","Back to reference 7",[1661],[112,1753,1755,1756,1761,1762],{"id":1754},"user-content-fn-elm-semver","Elm ",[21,1757,1760],{"href":1758,"rel":1759},"https:\u002F\u002Fpackage.elm-lang.org\u002Fhelp\u002Fdesign-guidelines",[30],"enforces semantic versioning"," by diffing package APIs and rejecting publishes that break compatibility without a major version bump. ",[21,1763,1662],{"href":1764,"ariaLabel":1765,"className":1766,"dataFootnoteBackref":135},"#user-content-fnref-elm-semver","Back to reference 8",[1661],[112,1768,1770,1771],{"id":1769},"user-content-fn-chocolatey-moderation","Three-stage automated review (validator, verifier, VirusTotal scan) plus human moderation. ",[21,1772,1662],{"href":1773,"ariaLabel":1774,"className":1775,"dataFootnoteBackref":135},"#user-content-fnref-chocolatey-moderation","Back to reference 9",[1661],[112,1777,1779,1780,1785,1786,1789,1790,1792,1793],{"id":1778},"user-content-fn-spack-namespaces","Every spack package repository has a namespace; the ",[21,1781,1784],{"href":1782,"rel":1783},"https:\u002F\u002Fgithub.com\u002Fspack\u002Fspack-packages",[30],"default one"," is called ",[562,1787,1788],{},"builtin",". Custom and\u002For private repositories have their own namespace but can layer on top of ",[562,1791,1788],{},". ",[21,1794,1662],{"href":1795,"ariaLabel":1796,"className":1797,"dataFootnoteBackref":135},"#user-content-fnref-spack-namespaces","Back to reference 10",[1661],[112,1799,1801,1802],{"id":1800},"user-content-fn-clojars-bytecode","Publishes JVM bytecode in JAR files, but these are built from source during the publish process. ",[21,1803,1662],{"href":1804,"ariaLabel":1805,"className":1806,"dataFootnoteBackref":135},"#user-content-fnref-clojars-bytecode","Back to reference 11",[1661],[112,1808,1810,1811],{"id":1809},"user-content-fn-homebrew-bottles","Bottles are prebuilt binaries for common macOS versions. ",[21,1812,1662],{"href":1813,"ariaLabel":1814,"className":1815,"dataFootnoteBackref":135},"#user-content-fnref-homebrew-bottles","Back to reference 12",[1661],[112,1817,1819,1820,1824,1825],{"id":1818},"user-content-fn-nix-substitutes","Binary substitutes from ",[21,1821,776],{"href":1822,"rel":1823},"https:\u002F\u002Fcache.nixos.org\u002F",[30]," avoid rebuilding from source. ",[21,1826,1662],{"href":1827,"ariaLabel":1828,"className":1829,"dataFootnoteBackref":135},"#user-content-fnref-nix-substitutes","Back to reference 13",[1661],[112,1831,1833,1834,56,1839],{"id":1832},"user-content-fn-spack-binaries","Spack supports binary caches but defaults to building from source. Spack publishes multiple builds of each package on each release. ",[21,1835,1662],{"href":1836,"ariaLabel":1837,"className":1838,"dataFootnoteBackref":135},"#user-content-fnref-spack-binaries","Back to reference 14",[1661],[21,1840,1662,1844],{"href":1841,"ariaLabel":1842,"className":1843,"dataFootnoteBackref":135},"#user-content-fnref-spack-binaries-2","Back to reference 14-2",[1661],[128,1845,212],{},[112,1847,1849,1850],{"id":1848},"user-content-fn-nuget-rids","Runtime Identifiers (RIDs) specify platform-specific assets. ",[21,1851,1662],{"href":1852,"ariaLabel":1853,"className":1854,"dataFootnoteBackref":135},"#user-content-fnref-nuget-rids","Back to reference 15",[1661],[112,1856,1858,56,1863],{"id":1857},"user-content-fn-pypi-psf",[21,1859,1862],{"href":1860,"rel":1861},"https:\u002F\u002Fwww.python.org\u002Fpsf-landing\u002F",[30],"Python Software Foundation",[21,1864,1662],{"href":1865,"ariaLabel":1866,"className":1867,"dataFootnoteBackref":135},"#user-content-fnref-pypi-psf","Back to reference 16",[1661],[112,1869,1871,56,1876],{"id":1870},"user-content-fn-crates-rust",[21,1872,1875],{"href":1873,"rel":1874},"https:\u002F\u002Frustfoundation.org\u002F",[30],"Rust Foundation",[21,1877,1662],{"href":1878,"ariaLabel":1879,"className":1880,"dataFootnoteBackref":135},"#user-content-fnref-crates-rust","Back to reference 17",[1661],[112,1882,1884,56,1889],{"id":1883},"user-content-fn-rubygems-central",[21,1885,1888],{"href":1886,"rel":1887},"https:\u002F\u002Frubycentral.org\u002F",[30],"Ruby Central",[21,1890,1662],{"href":1891,"ariaLabel":1892,"className":1893,"dataFootnoteBackref":135},"#user-content-fnref-rubygems-central","Back to reference 18",[1661],[112,1895,1897,1898,1903,1904,56,1909],{"id":1896},"user-content-fn-maven-lf","Originally ",[21,1899,1902],{"href":1900,"rel":1901},"https:\u002F\u002Fwww.sonatype.com\u002F",[30],"Sonatype",", now ",[21,1905,1908],{"href":1906,"rel":1907},"https:\u002F\u002Fwww.linuxfoundation.org\u002F",[30],"Linux Foundation",[21,1910,1662],{"href":1911,"ariaLabel":1912,"className":1913,"dataFootnoteBackref":135},"#user-content-fnref-maven-lf","Back to reference 19",[1661],[112,1915,1917,1918,56,1923],{"id":1916},"user-content-fn-packagist-funding","Funded by ",[21,1919,1922],{"href":1920,"rel":1921},"https:\u002F\u002Fpackagist.com\u002F",[30],"Private Packagist",[21,1924,1662],{"href":1925,"ariaLabel":1926,"className":1927,"dataFootnoteBackref":135},"#user-content-fnref-packagist-funding","Back to reference 20",[1661],[112,1929,1931,56,1936],{"id":1930},"user-content-fn-cpan-perl",[21,1932,1935],{"href":1933,"rel":1934},"https:\u002F\u002Fperlfoundation.org\u002F",[30],"Perl Foundation",[21,1937,1662],{"href":1938,"ariaLabel":1939,"className":1940,"dataFootnoteBackref":135},"#user-content-fnref-cpan-perl","Back to reference 21",[1661],[112,1942,1944,1945],{"id":1943},"user-content-fn-hex-funding","Six Colors AB, community-funded ",[21,1946,1662],{"href":1947,"ariaLabel":1948,"className":1949,"dataFootnoteBackref":135},"#user-content-fnref-hex-funding","Back to reference 22",[1661],[112,1951,1953,56,1958],{"id":1952},"user-content-fn-clojars-funding",[21,1954,1957],{"href":1955,"rel":1956},"https:\u002F\u002Fwww.clojuriststogether.org\u002F",[30],"Clojurists Together",[21,1959,1662],{"href":1960,"ariaLabel":1961,"className":1962,"dataFootnoteBackref":135},"#user-content-fnref-clojars-funding","Back to reference 23",[1661],[112,1964,1966,56,1971],{"id":1965},"user-content-fn-hackage-org",[21,1967,1970],{"href":1968,"rel":1969},"https:\u002F\u002Fwww.haskell.org\u002F",[30],"Haskell.org",[21,1972,1662],{"href":1973,"ariaLabel":1974,"className":1975,"dataFootnoteBackref":135},"#user-content-fnref-hackage-org","Back to reference 24",[1661],[112,1977,1979,56,1984],{"id":1978},"user-content-fn-cran-r",[21,1980,1983],{"href":1981,"rel":1982},"https:\u002F\u002Fwww.r-project.org\u002Ffoundation\u002F",[30],"R Foundation",[21,1985,1662],{"href":1986,"ariaLabel":1987,"className":1988,"dataFootnoteBackref":135},"#user-content-fnref-cran-r","Back to reference 25",[1661],[112,1990,1992,1993,56,1998],{"id":1991},"user-content-fn-homebrew-osc","Fiscally sponsored by ",[21,1994,1997],{"href":1995,"rel":1996},"https:\u002F\u002Fopencollective.com\u002Fopensource",[30],"Open Source Collective",[21,1999,1662],{"href":2000,"ariaLabel":2001,"className":2002,"dataFootnoteBackref":135},"#user-content-fnref-homebrew-osc","Back to reference 26",[1661],[112,2004,2006,56,2011],{"id":2005},"user-content-fn-openvsx-eclipse",[21,2007,2010],{"href":2008,"rel":2009},"https:\u002F\u002Fwww.eclipse.org\u002F",[30],"Eclipse Foundation",[21,2012,1662],{"href":2013,"ariaLabel":2014,"className":2015,"dataFootnoteBackref":135},"#user-content-fnref-openvsx-eclipse","Back to reference 27",[1661],[112,2017,2019,56,2024],{"id":2018},"user-content-fn-helm-cncf",[21,2020,2023],{"href":2021,"rel":2022},"https:\u002F\u002Fwww.cncf.io\u002F",[30],"Cloud Native Computing Foundation",[21,2025,1662],{"href":2026,"ariaLabel":2027,"className":2028,"dataFootnoteBackref":135},"#user-content-fnref-helm-cncf","Back to reference 28",[1661],[112,2030,2032,2033],{"id":2031},"user-content-fn-npm-microsoft","GitHub\u002FMicrosoft ",[21,2034,1662],{"href":2035,"ariaLabel":2036,"className":2037,"dataFootnoteBackref":135},"#user-content-fnref-npm-microsoft","Back to reference 29",[1661],[112,2039,2041,2042],{"id":2040},"user-content-fn-nuget-microsoft","Microsoft ",[21,2043,1662],{"href":2044,"ariaLabel":2045,"className":2046,"dataFootnoteBackref":135},"#user-content-fnref-nuget-microsoft","Back to reference 30",[1661],[112,2048,2050,2051],{"id":2049},"user-content-fn-pubdev-google","Google ",[21,2052,1662],{"href":2053,"ariaLabel":2054,"className":2055,"dataFootnoteBackref":135},"#user-content-fnref-pubdev-google","Back to reference 31",[1661],[112,2057,2059,2060],{"id":2058},"user-content-fn-conda-anaconda","Anaconda Inc ",[21,2061,1662],{"href":2062,"ariaLabel":2063,"className":2064,"dataFootnoteBackref":135},"#user-content-fnref-conda-anaconda","Back to reference 32",[1661],[112,2066,2068,2069],{"id":2067},"user-content-fn-juliahub-computing","Julia Computing ",[21,2070,1662],{"href":2071,"ariaLabel":2072,"className":2073,"dataFootnoteBackref":135},"#user-content-fnref-juliahub-computing","Back to reference 33",[1661],[112,2075,2077,2078],{"id":2076},"user-content-fn-puppet-perforce","Perforce ",[21,2079,1662],{"href":2080,"ariaLabel":2081,"className":2082,"dataFootnoteBackref":135},"#user-content-fnref-puppet-perforce","Back to reference 34",[1661],[112,2084,2086,2087],{"id":2085},"user-content-fn-ansible-redhat","Red Hat. ",[21,2088,1662],{"href":2089,"ariaLabel":2090,"className":2091,"dataFootnoteBackref":135},"#user-content-fnref-ansible-redhat","Back to reference 35",[1661],[112,2093,2095,2096],{"id":2094},"user-content-fn-chocolatey-company","Chocolatey Software. ",[21,2097,1662],{"href":2098,"ariaLabel":2099,"className":2100,"dataFootnoteBackref":135},"#user-content-fnref-chocolatey-company","Back to reference 36",[1661],[112,2102,2104,2105],{"id":2103},"user-content-fn-winget-microsoft","Microsoft. ",[21,2106,1662],{"href":2107,"ariaLabel":2108,"className":2109,"dataFootnoteBackref":135},"#user-content-fnref-winget-microsoft","Back to reference 37",[1661],[112,2111,2113,2114],{"id":2112},"user-content-fn-go-google","Google. ",[21,2115,1662],{"href":2116,"ariaLabel":2117,"className":2118,"dataFootnoteBackref":135},"#user-content-fnref-go-google","Back to reference 38",[1661],[112,2120,2122,2123,56,2128],{"id":2121},"user-content-fn-deno-company","Deno Company. ",[21,2124,1662],{"href":2125,"ariaLabel":2126,"className":2127,"dataFootnoteBackref":135},"#user-content-fnref-deno-company","Back to reference 39",[1661],[21,2129,1662,2133],{"href":2130,"ariaLabel":2131,"className":2132,"dataFootnoteBackref":135},"#user-content-fnref-deno-company-2","Back to reference 39-2",[1661],[128,2134,212],{},[112,2136,2138,2139],{"id":2137},"user-content-fn-fedora-redhat","Red Hat ",[21,2140,1662],{"href":2141,"ariaLabel":2142,"className":2143,"dataFootnoteBackref":135},"#user-content-fnref-fedora-redhat","Back to reference 40",[1661],[112,2145,2147,2148],{"id":2146},"user-content-fn-ubuntu-canonical","Canonical ",[21,2149,1662],{"href":2150,"ariaLabel":2151,"className":2152,"dataFootnoteBackref":135},"#user-content-fnref-ubuntu-canonical","Back to reference 41",[1661],[112,2154,2156,2157,2162,2163],{"id":2155},"user-content-fn-maven-permanent","Maven Central ",[21,2158,2161],{"href":2159,"rel":2160},"https:\u002F\u002Fcentral.sonatype.org\u002Ffaq\u002Fcan-i-change-a-component\u002F",[30],"does not allow deletion"," or modification of published artifacts. ",[21,2164,1662],{"href":2165,"ariaLabel":2166,"className":2167,"dataFootnoteBackref":135},"#user-content-fnref-maven-permanent","Back to reference 42",[1661],[112,2169,2171,2172,2176,2177],{"id":2170},"user-content-fn-go-cache-permanent","Once cached by ",[21,2173,635],{"href":2174,"rel":2175},"https:\u002F\u002Fproxy.golang.org\u002F",[30],", modules remain available indefinitely. ",[21,2178,1662],{"href":2179,"ariaLabel":2180,"className":2181,"dataFootnoteBackref":135},"#user-content-fnref-go-cache-permanent","Back to reference 43",[1661],[112,2183,2185,2186,2190,2191],{"id":2184},"user-content-fn-spack-versions","Spack packages can specify many versions, all of which stay in the registry until deleted by a maintainer. Old versions ",[2187,2188,2189],"em",{},"can"," be removed, but it depends on the package how frequently this is done. Users can go back to old versions of the repo to install removed versions. ",[21,2192,1662],{"href":2193,"ariaLabel":2194,"className":2195,"dataFootnoteBackref":135},"#user-content-fnref-spack-versions","Back to reference 44",[1661],[112,2197,2199,2204,2205],{"id":2198},"user-content-fn-npm-unpublish",[21,2200,2203],{"href":2201,"rel":2202},"https:\u002F\u002Fdocs.npmjs.com\u002Fpolicies\u002Funpublish\u002F",[30],"72-hour window"," for unpublishing, with exceptions for security issues. ",[21,2206,1662],{"href":2207,"ariaLabel":2208,"className":2209,"dataFootnoteBackref":135},"#user-content-fnref-npm-unpublish","Back to reference 45",[1661],[112,2211,2213,2214,2219,2220],{"id":2212},"user-content-fn-pypi-deletion","Can delete files and releases; ",[21,2215,2218],{"href":2216,"rel":2217},"https:\u002F\u002Fpeps.python.org\u002Fpep-0763\u002F",[30],"PEP 763"," proposes limiting this to 72 hours. ",[21,2221,1662],{"href":2222,"ariaLabel":2223,"className":2224,"dataFootnoteBackref":135},"#user-content-fnref-pypi-deletion","Back to reference 46",[1661],[112,2226,2228,2229],{"id":2227},"user-content-fn-crates-deletion","Versions can be yanked indefinitely; entire crates can be deleted within 72 hours of first publish. ",[21,2230,1662],{"href":2231,"ariaLabel":2232,"className":2233,"dataFootnoteBackref":135},"#user-content-fnref-crates-deletion","Back to reference 47",[1661],[112,2235,2237,2238],{"id":2236},"user-content-fn-homebrew-latest","Formulas point to the latest version; older versions require tapping homebrew-core history. ",[21,2239,1662],{"href":2240,"ariaLabel":2241,"className":2242,"dataFootnoteBackref":135},"#user-content-fnref-homebrew-latest","Back to reference 48",[1661],[112,2244,2246,2247],{"id":2245},"user-content-fn-apt-releases","Each Debian\u002FUbuntu release has its own repository snapshot. ",[21,2248,1662],{"href":2249,"ariaLabel":2250,"className":2251,"dataFootnoteBackref":135},"#user-content-fnref-apt-releases","Back to reference 49",[1661],[112,2253,2255,2256],{"id":2254},"user-content-fn-arch-rolling","Rolling release model; only current versions are available. ",[21,2257,1662],{"href":2258,"ariaLabel":2259,"className":2260,"dataFootnoteBackref":135},"#user-content-fnref-arch-rolling","Back to reference 50",[1661],[112,2262,2264,2265],{"id":2263},"user-content-fn-alpine-releases","Each Alpine release has its own repository. ",[21,2266,1662],{"href":2267,"ariaLabel":2268,"className":2269,"dataFootnoteBackref":135},"#user-content-fnref-alpine-releases","Back to reference 51",[1661],[112,2271,2273,2278,2279],{"id":2272},"user-content-fn-npm-verdaccio",[21,2274,2277],{"href":2275,"rel":2276},"https:\u002F\u002Fwww.verdaccio.org\u002F",[30],"Verdaccio"," is the most popular private npm registry. ",[21,2280,1662],{"href":2281,"ariaLabel":2282,"className":2283,"dataFootnoteBackref":135},"#user-content-fnref-npm-verdaccio","Back to reference 52",[1661],[112,2285,2287,2292,2293,2298,2299],{"id":2286},"user-content-fn-pypi-devpi",[21,2288,2291],{"href":2289,"rel":2290},"https:\u002F\u002Fgithub.com\u002Fdevpi\u002Fdevpi",[30],"devpi"," and ",[21,2294,2297],{"href":2295,"rel":2296},"https:\u002F\u002Fjfrog.com\u002Fartifactory\u002F",[30],"Artifactory"," provide PyPI-compatible private registries. ",[21,2300,1662],{"href":2301,"ariaLabel":2302,"className":2303,"dataFootnoteBackref":135},"#user-content-fnref-pypi-devpi","Back to reference 53",[1661],[112,2305,2307,2292,2312,2315,2316],{"id":2306},"user-content-fn-maven-nexus",[21,2308,2311],{"href":2309,"rel":2310},"https:\u002F\u002Fwww.sonatype.com\u002Fproducts\u002Fsonatype-nexus-repository",[30],"Nexus",[21,2313,2297],{"href":2295,"rel":2314},[30]," are widely used for hosting private Maven repositories. ",[21,2317,1662],{"href":2318,"ariaLabel":2319,"className":2320,"dataFootnoteBackref":135},"#user-content-fnref-maven-nexus","Back to reference 54",[1661],[112,2322,2324,2325,2330,2331],{"id":2323},"user-content-fn-hex-mirrors","Official ",[21,2326,2329],{"href":2327,"rel":2328},"https:\u002F\u002Fhex.pm\u002Fdocs\u002Fmirrors",[30],"mirror documentation"," with geographic mirrors available. ",[21,2332,1662],{"href":2333,"ariaLabel":2334,"className":2335,"dataFootnoteBackref":135},"#user-content-fnref-hex-mirrors","Back to reference 55",[1661],[112,2337,2339,2340,2343,2344],{"id":2338},"user-content-fn-luarocks-servers","Custom rock servers can be configured via ",[562,2341,2342],{},"rocks_servers"," in the config file. ",[21,2345,1662],{"href":2346,"ariaLabel":2347,"className":2348,"dataFootnoteBackref":135},"#user-content-fnref-luarocks-servers","Back to reference 56",[1661],[112,2350,2352,2357,2358],{"id":2351},"user-content-fn-clojars-mirrors",[21,2353,2356],{"href":2354,"rel":2355},"https:\u002F\u002Fgithub.com\u002Fclojars\u002Fclojars-web\u002Fwiki\u002FMirrors",[30],"Mirror documentation"," with instructions for running your own. ",[21,2359,1662],{"href":2360,"ariaLabel":2361,"className":2362,"dataFootnoteBackref":135},"#user-content-fnref-clojars-mirrors","Back to reference 57",[1661],{"title":135,"searchDepth":2364,"depth":2364,"links":2365},2,[2366,2367,2368,2369,2370,2371,2372,2373,2374,2375],{"id":97,"depth":2364,"text":98},{"id":374,"depth":2364,"text":375},{"id":523,"depth":2364,"text":69},{"id":676,"depth":2364,"text":73},{"id":845,"depth":2364,"text":846},{"id":1181,"depth":2364,"text":81},{"id":1293,"depth":2364,"text":85},{"id":1449,"depth":2364,"text":1450},{"id":1535,"depth":2364,"text":1536},{"id":134,"depth":2364,"text":1643},"https:\u002F\u002Fnesbitt.io\u002F2025\u002F12\u002F29\u002Fcategorizing-package-registries","nesbitt.io","package-management","2025-12-29","Sorting package registries by architecture, review model, namespacing, governance, and other structural differences.","md",false,null,{},true,"\u002Freports\u002Fcategorizing-package-registries",{"title":10,"description":2380},"reports\u002Fcategorizing-package-registries","is_ZlwhhiL43GEGgJZCnu1wY25ZFxa_viziWRTClqMQ",1780596102981]