Mathematica has a simple package manager in the PacletManager and I've been working recently on getting my code to be more easily distributable through it, going so far as to write a package to build a paclet server with it's own static site in the cloud (it's free, so why not?) (or you can also use GitHub)
The best part of this is that not only is it to install package from a paclet server, it's also pretty easy to see what's on a paclet server and if other people used them I'd be happy to build a GUI that would list all the packages on a server with download / update buttons, etc.
So how do we convince people to distribute their packages as paclets on paclet servers? Are people doing this already and I just never got the memo? Or is this just too much work for the average user? At this point I've got frameworks in place to make this all quite easy, if people don't mind using junk from a suspicious person like me. But it's truly not that hard to do by hand anyway, once you know what you have to do.
Kuba suggested I share the framework I've been developing for this kind of stuff. I wanted to add some tweaks to it so I'm just getting it up now, but it's here. It's spawned off of a more expansive package, BTools, so it shares documentation with that. You can look at that here. The package supports making sites and docs like that. It also supports building paclet servers like this, which is why it's even worth mentioning here at all. If people want to use it, but can't figure out how, I'm happy to debug, extend, add palettes, etc.
If you're happy enough setting up for PacletInfo.m files and
CloudDeploy-ing stuff yourself here's a simple way to do that.
Given a package, MyPack, which, e.g., looks like this:
MyPack MyPack.m + Kernel -init.m etc. PacletInfo.m
You can turn that into a paclet file with:
Then you can put that in a directory, say e.g. PacletServer, that looks like this:
PacletServer + Paclets - paclet_1 - paclet_2 - paclet_3 ...
You can build the PacletSite.mz file for that using:
Then put that in the cloud like this:
CopyFile[#, CloudObject[FileNameDrop[#,FileNameDepth["path/to/PacletServer"]-1], Permissions->"Public" ] ]&/@Select[FileNames["*","path/to/PacletServer",Infinity],Not@*FileExistsQ]
These three steps are all it takes to build a paclet server. My stuff just makes it a bit easier to extend this.