How do go-ipfs and js-ipfs compare?

From @JustinDrake on Wed Nov 23 2016 13:53:01 GMT+0000 (UTC)

I’m curious to get a feel for how go-ipfs and js-ipfs compare. Below are specific questions:

  1. How many people are working on the respective implementations?
  2. How old are the two implementations?
  3. Which implementation is most stable (e.g. most tested)?
  4. Which implementation is mostly used in production?
  5. How does performance compare across the two implementations?

    Copied from original issue:

I’d love to see an answer to this one … more useful would be some kind of table showing what key features are present/absent in the different apps, for example the absence of IPNS in js-ipfs and absence of pubsub in js-api-ipfs (if I understood another email correctly) make full implementation of much functionality hard or impossible as neither JS approach works.

I feel like I saw a table comparing the feature sets of go-ipfs and js-ipfs in one of the github repositories. @daviddias does that exist or was I just imagining it?

I think the closest you’ll get is the implementation table on the website ( but it doesn’t lists features of libp2p but rather the implementations used by the end-bundles, so can be a bit hard to figure out what exists where.

For example, libp2p-floodsub is the implementation that gives us pubsub, but it’s not obvious unless you already knew that floodsub => pubsub support.

Following on that question, I understand the canonical implementation is go-ipfs, and js-ipfs does not have all the features. In this case, in which context people use js-ipfs?