Module Counts

  • Include
  • Clojars (Clojure)
  • CPAN
  • CPAN (search)
  • CRAN (R)
  • Crates.io (Rust)
  • Drupal (php)
  • DUB (dlang)
  • Gopm (go)
  • Hackage (Haskell)
  • Hex.pm (Elixir/Erlang)
  • Julia
  • LuaRocks (Lua)
  • Maven Central (Java)
  • MELPA (Emacs)
  • Nimble (Nim)
  • npm (node.js)
  • nuget (.NET)
  • Packagist (PHP)
  • Pear (PHP)
  • Perl 6 Ecosystem (perl 6)
  • PyPI
  • Rubygems.org
  • Vim Scripts
  • time period
  • all time
  • last year
  • last 90 days
  • last 30 days
  • last 7 days
Feb 17 Feb 18 Feb 19 Feb 20 Feb 21 Feb 22 Feb 23 Avg Growth
Clojars (Clojure) 21099 21105 21112 21128 21137 21141 21144 8/day
CPAN 36145 36149 36151 36157 36161 36162 36164 3/day
CPAN (search) 36145 36149 36151 36157 36161 36162 36166 4/day
CRAN (R) 12162 12162 12174 12172 12165 12178 12188 5/day
Crates.io (Rust) 14004 14019 14038 14070 14092 14115 14129 20/day
Drupal (php) 39798 39802 39805 39828 39836 39845 39859 10/day
DUB (dlang) 1215 1215 1216 1215 1217 1217 0/day
Gopm (go) 20013 20013 20013 20016 20018 20023 20026 2/day
Hackage (Haskell) 12302 12305 12313 12313 12315 12321 12328 4/day
Hex.pm (Elixir/Erlang) 5822 5825 5830 5837 5847 5852 5856 6/day
Julia 1712 1712 1712 1713 1713 1725 1725 2/day
LuaRocks (Lua) 1710 1713 1713 1716 1721 1723 1726 3/day
Maven Central (Java) 221130 221182 221241 221398 221585 221801 221887 128/day
MELPA (Emacs) 3732 3743 3748 3749 3748 3748 3747 2/day
Nimble (Nim) 589 591 593 594 594 596 597 1/day
npm (node.js) 585670 585990 586419 586887 587456 588010 588626 480/day
nuget (.NET) 104937 105002 105054 105111 105190 105300 105430 88/day
Packagist (PHP) 175799 175879 176001 176130 176245 176422 176553 123/day
Pear (PHP) 602 602 602 602 602 602 602 0/day
Perl 6 Ecosystem (perl 6) 1039 1039 1039 1039 1039 1039 1039 0/day
PyPI 129920 130085 129860 129964 130070 130200 130309 86/day
Rubygems.org 140689 140711 140739 140767 140797 140815 140830 23/day
Vim Scripts 5519 5519 5520 5520 5520 5523 1/day

Data is collected by scraping the relevant websites once a day via a cron job and then stored in a Postgresql database for later retrieval. Growth rates are calculated by averaging data over the last week. I'm gathering counts of separate modules, so multiple versions of the same module/package/gem only count once (foo-1.2, foo-1.3 and bar-1.0 would count as 2 total).

(Sept 10, 2017) Update Crates.io for their new data URL and add Nimble, the Nim package manager. Many thanks to Alex Libman for pointing me to it.

(Aug 6, 2017) Go back to single-threaded fetch, as doing it in parallel seems to be causing intermittent sampling failures. Update DUB entry for new wording on their site.

(May 14, 2017) Upgrade to Rails 5.1, ruby 2.4.1, switch from unicorn to puma, and add Vim Scripts repository. I can't believe I've had emacs for so long and no one has mentioned vim has its own repository.

(Apr 2, 2017) Added Julia to list. Thanks to Bargava Subramanian for pointing it out. Return CSV download feature.

(Mar 17, 2017) Bower and GoDoc haven't been pulling numbers for a long time, and it doesn't seem to just be a matter of the number moving somewhere new. I'm removing them both, and adding Gopm.io, which seems to be more in-line with most languages' ideas about what a package manager is. Big thanks to Jesse Aldridge for pointing me to it.

(May 30, 2016) Much thanks to Hiroki Noda for adding DUB (dlang). Fixed Hex.pm sampling, and removed link to CSV download until I can re-engineer it.

(Apr 8, 2016) Updates to Rubygems.org and Npmjs.org broke both of those samplers.

I'd like to add more repositories. If you have suggestions, please send them to erik@debill.org.

CPAN and CPAN (search) used to be two conflicting sources for data about how many modules are in CPAN. During spring of 2011 CPAN got a site refresh and the numbers came into line with each other. It looks funny on the graph, but it's an interesting bit of history.

GoDoc is weird. It's not a true package repository in the same sense as all the others, but as far as I can tell it's the closest GoLang has. Be aware that it pretty drastically overcounts the number of packages. Don't use the raw numbers to compare with other languages. You can still watch the line to see changes in velocity, though.

If you'd like to check out the data in more detail, you are welcome to download it in a CSV file.