Home

Awesome

Software Galaxies

This repository combines visualizations of major software package managers.

All visualizations are available here: http://anvaka.github.io/pm/#/

Please read operating manual - it is short and describes basic navigation principles.

Repository was create for my talk at CascadiaJS 2015

After conference update - video - slides

Friends, you are awesome! I can't express how much I appreciate all your kind words and warm feedback. It really means a world for me. Thank you!

Individual Visualizations

Each graph is indexed individually, and data is pushed to gh-pages branch of galactic-data.

<table> <tbody> <tr> <td align="center"> <h3>Bower</h3> <a href="http://anvaka.github.io/pm/#/galaxy/bower?l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/bower_fly_first.png"> </a><br /> <a href="https://github.com/anvaka/allbower">indexer</a> | <a href="http://anvaka.github.io/pm/#/galaxy/bower?l=1">demo</a> </td> <td align="center"> <h3>PHP Composer</h3> <a href="http://anvaka.github.io/pm/#/galaxy/composer?l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/composer_fly_first.png"> </a><br /> <a href="https://github.com/anvaka/allcomposer">indexer</a> | <a href="http://anvaka.github.io/pm/#/galaxy/composer?l=1">demo</a> </td> <td align="center"> <h3>Ruby gems</h3> <a href="http://anvaka.github.io/pm/#/galaxy/rubygems?l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/ruby_fly_first.png"> </a><br /> <a href="https://github.com/anvaka/allgems">indexer</a> | <a href="http://anvaka.github.io/pm/#/galaxy/rubygems?l=1">demo</a> </td> </tr> <tr> <td align="center"> <h3>npm</h3> <a href="http://anvaka.github.io/pm/#/galaxy/npm?l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/npm_fly_first.png"> </a><br /> <a href="https://github.com/anvaka/allnpm">indexer</a> | <a href="http://anvaka.github.io/pm/#/galaxy/npm?l=1">demo</a> </td> <td align="center"> <h3>Go</h3> <a href="http://anvaka.github.io/pm/#/galaxy/gosearch?l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/go_fly_first.png"> </a><br /> <a href="https://github.com/anvaka/allgo">indexer</a> | <a href="http://anvaka.github.io/pm/#/galaxy/gosearch?l=1">demo</a> </td> <td align="center"> <h3>R language</h3> <a href="http://anvaka.github.io/pm/#/galaxy/cran?cx=-2482&cy=-5685&cz=-291&lx=0.2264&ly=-0.6790&lz=0.4330&lw=0.5480&ml=200&s=2.75&l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/cran_fly_first.png"> </a><br /> <a href="https://github.com/anvaka/allcran">indexer</a> | <a href="http://anvaka.github.io/pm/#/galaxy/cran?cx=-2482&cy=-5685&cz=-291&lx=0.2264&ly=-0.6790&lz=0.4330&lw=0.5480&ml=200&s=2.75&l=1">demo</a> </td> </tr> <tr> <td align="center"> <h3>Debian</h3> <a href="https://anvaka.github.io/pm/#/galaxy/debian?cx=-201&cy=-6170&cz=-6841&lx=0.5676&ly=-0.7456&lz=0.2400&lw=0.2536&ml=150&s=1.75&l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/debian_fly_first.png"> </a><br /> <a href="https://github.com/anvaka/alldebian">indexer</a> | <a href="https://anvaka.github.io/pm/#/galaxy/debian?cx=-201&cy=-6170&cz=-6841&lx=0.5676&ly=-0.7456&lz=0.2400&lw=0.2536&ml=150&s=1.75&l=1">demo</a> </td> <td align="center"> <h3>Arch Linux</h3> <a href="https://anvaka.github.io/pm/#/galaxy/arch?cx=870&cy=-3968&cz=-2010&lx=0.7695&ly=-0.3554&lz=0.3109&lw=0.4299&ml=150&s=1.75&l=1&v=no-aur"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/archlinux_fly_first.png"> </a><br /> <a href="https://github.com/phiresky/crawl-arch">indexer</a> | <a href="https://anvaka.github.io/pm/#/galaxy/arch?cx=870&cy=-3968&cz=-2010&lx=0.7695&ly=-0.3554&lz=0.3109&lw=0.4299&ml=150&s=1.75&l=1&v=no-aur">demo</a> </td> <td align="center"> <h3>Arch Linux + AUR</h3> <a href="https://anvaka.github.io/pm/#/galaxy/arch?cx=870&cy=-3968&cz=-2010&lx=0.7695&ly=-0.3554&lz=0.3109&lw=0.4299&ml=150&s=1.75&l=1&v=including-aur"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/archlinux_aur_fly_first.png"> </a><br /> <a href="https://github.com/phiresky/crawl-arch">indexer</a> | <a href="https://anvaka.github.io/pm/#/galaxy/arch?cx=2655&cy=859&cz=7898&lx=0.2160&ly=0.0620&lz=0.8560&lw=0.4656&ml=150&s=1.75&l=1&v=including-aur">demo</a> </td> </tr> <tr> <td align="center"> <h3>NuGet</h3> <a href="https://anvaka.github.io/pm/#/galaxy/nuget?l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/nuget_fly_first.png"> </a><br /> <a href="https://github.com/anvaka/allnuget">indexer</a> | <a href="https://anvaka.github.io/pm/#/galaxy/nuget?l=1">demo</a> </td> <td align="center"> <h3>Homebrew</h3> <a href="https://anvaka.github.io/pm/#/galaxy/brew?cx=-803&cy=-3622&cz=-1640&lx=0.3774&ly=-0.7360&lz=0.4338&lw=0.3573&ml=200&s=2.75&l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/brew_fly_first.png"> </a><br /> <a href="https://github.com/anvaka/allbrew">indexer</a> | <a href="https://anvaka.github.io/pm/#/galaxy/brew?cx=-803&cy=-3622&cz=-1640&lx=0.3774&ly=-0.7360&lz=0.4338&lw=0.3573&ml=200&s=2.75&l=1">demo</a> </td> <td align="center"> <h3>PyPI</h3> <a href="https://anvaka.github.io/pm/#/galaxy/python?cx=-2700&cy=377&cz=5622&lx=-0.0869&ly=-0.2315&lz=-0.0338&lw=0.9684&ml=150&s=1.75&l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/composer_fly_first.png"> </a><br /> <a href="https://github.com/anvaka/allpypi">indexer</a> | <a href="https://anvaka.github.io/pm/#/galaxy/python?cx=-2700&cy=377&cz=5622&lx=-0.0869&ly=-0.2315&lz=-0.0338&lw=0.9684&ml=150&s=1.75&l=1">demo</a> </td> </tr> <tr> <td align="center"> <h3>Fedora</h3> <a href="https://anvaka.github.io/pm/#/galaxy/fedora?cx=1539&cy=409&cz=7141&lx=0.0164&ly=0.1453&lz=-0.0027&lw=0.9892&ml=150&s=1.75&l=1"> <img src="https://raw.githubusercontent.com/wiki/anvaka/pm/images/debian_fly_first.png"> </a><br /> <a href="https://github.com/shaded-enmity/allrpm">indexer</a> | <a href="https://anvaka.github.io/pm/#/galaxy/fedora?cx=1539&cy=409&cz=7141&lx=0.0164&ly=0.1453&lz=-0.0027&lw=0.9892&ml=150&s=1.75&l=1">demo</a> </td> <td align="center"> <h3>Rust Crates</h3> <a href="https://anvaka.github.io/pm/#/galaxy/crates?cx=6617&cy=467&cz=353&lx=0.0169&ly=0.7328&lz=0.0495&lw=0.6785&ml=200&s=1.75&l=1&v=2020-02-19T00-00-00Z"> <img src="https://i.imgur.com/vAPK5lT.png"> </a><br /> <a href="https://github.com/brandly/allcrates">indexer</a> | <a href="https://anvaka.github.io/pm/#/galaxy/crates?cx=6617&cy=467&cz=353&lx=0.0169&ly=0.7328&lz=0.0495&lw=0.6785&ml=200&s=1.75&l=1&v=2020-02-19T00-00-00Z">demo</a> </td> <td align="center"> <h3>Elm</h3> <a href="https://anvaka.github.io/pm/#/galaxy/elm?cx=-247&cy=-1794&cz=1804&lx=0.4062&ly=0.1564&lz=-0.3016&lw=0.8483&ml=150&s=1.75&l=1&v=2020-02-21T00-00-00Z"> <img src="https://i.imgur.com/44Sj8Js.png"> </a><br /> <a href="https://github.com/brandly/allelm">indexer</a> | <a href="https://anvaka.github.io/pm/#/galaxy/elm?cx=-247&cy=-1794&cz=1804&lx=0.4062&ly=0.1564&lz=-0.3016&lw=0.8483&ml=150&s=1.75&l=1&v=2020-02-21T00-00-00Z">demo</a> </td> </tr> </tbody> </table>

local development

git clone https://github.com/anvaka/pm
cd pm
npm i
npm start

This will start local development sever with auto-rebuild.

Your own graphs

This section has detailed instructions about how to use the tool with your own graphs. Before you read any further, if your graph is smaller than 10k nodes, consider using ngraph.pixel or VivaGraph both should be able to provide interactive layout.

If you have an interesting graph but don't have JavaScript experience, please feel free to reach out to me and I'll try to make visualization for you (my email is anvaka@gmail.com).

Otherwise, if you want to hack on your own, please keep reading.

Graph

First, you will need a graph in ngraph.graph format. The ngraph.graph has detailed documentation about how to create graph, but it also has several loaders from popular graph formats (e.g. dot, gexf)

Layout

Now that you have a graph we need to compute the layout.

If your graph is smaller than 200k nodes, consider using ngraph.offline.layout. This module was created exactly for the purpose of the pm project, it is well documented, and should be easy to get started with. You can also read layout.js of all[gems|go|bower] packages to see more examples.

If your graph is much larger than 200k nodes, then consider using ngraph.native - this module is harder to work with (as it requires C++ knowledge), but it is much faster.

The secret GitHub visualization is using ngraph.native.

Data format

Once layout is computed, we are ready to visualize. Just save the graph using ngraph.tobinary and store it along with latest positions file (produced by layout) into a folder.

The folder structure should look like this:

.
└── my-pm-data-server
    └── my-graph
        ├── manifest.json
        └── version-1
            ├── labels.json         /* this file is produced by ngraph.tobinary */
            ├── links.bin           /* this file is produced by ngraph.tobinary */
            └── positions.bin       /* this file is produced by ngraph.native   */

The file manifest.json describes what version of the graph are available and has the following content:

{
  "all": ["version-1"],
  "last": "version-1"
}

Inside my-pm-data-server we launch a web server. I personally prefer http-server. Once it is installed globally (npm i http-server -g), you can launch it like this:

http-server --cors -p 9090

This will start a local data server at http://127.0.0.1:9090/

Update the config.js in this repository to point to your data server, and your graph should be accessible at

http://127.0.0.1:8081/#/galaxy/my-graph

Note

The galactic-data follows the same data structure as described above. Use it for the reference if you need an example

The secret visualization

The last shown visualization was secret GitHub followers visualization. It shows all GitHub users who has more than two followers.

The visualization has more than 1,100,000 nodes, and renders at 60 fps when flying around. The FPS drops when you hover-over nodes to 20-30, This is because we are doing hit-testing, to find what's under cursor.

With this many nodes, it runs well in the browser. Unfortunately it requires more than 1GB of RAM. Which may or may not crash your phone browser - sorry about this.

With all warnings said, here are the links:

Feedback

Please do not hesitate to provide your feedback or bug fixes. Even if it is something small like fixing a typo - I'd be glad to hear from you!