Show HN: EverythingStays – Immutable and Distributed Node.js Modules with IPFS
everythingstays.com
everythingstays.com
(It's a language-agnostic packaging tool built around IPFS)
Having something that works with both existing package.json dependencies and an extra field in the package.json, is the goal.
People should be able to use IPFS when it's available, and fall back to NPM central registry when needed.
Just want to tip you and others about IPM - Immutable Package Manager.
We are a group of people trying to do just this, we have a lot of healthy discussions going on if you'd like to collaborate or just merge these initiatives.
We have a couple of people investigating using gx which is an universal package manager based on IPFS, we call it gx-node.
We also investigate if there is a quicker way, wrapping npm instead to disable unpublishing of npm packages.
Please check it out over at http://ipmjs.org if you are interested.
I think the idea or rewriting what already works, is an wasted effort. Rather, having npm to just execute shellscripts to get the files from IPFS, JustWorks(TM)
Also, there is discussions about malicious packages and copyright infringement, something that is not a problem since it's up to people what they want to seed. And setting out to "solve" npm scripts...
Basically, if you want to reinvent everything what NPM already built + a little bit more, ipmjs seems fun.
If you want something practical and pragmatic that works today, EverythingStays is for you.
"I was surprised on how wrongly focused the attempt is"
I'd hope you would have added your 2 cents to our discussions since it would have been be really valuable. And you still should because there seems to be two main road maps for IPM right now, if I understand the discussions correctly:- extending npm, adding a immutable dependencies (similar to EverythingStays)
- extending gx to add npm-like functionality (re-invent npm in IPFS-land)
I am gonna add an "issue" in our repo referring to your project, and hopefully, we could somehow merge so we don't implement the same thing twice. :D
Make sense?
Feel free to open the issue and I'll chime in with what I think. Then we'll see if we agree or not :)
I think several people agree with you in our discussions, and the more I think about it myself, the more it make sense, short-term to extend npm and add immutable dependencies.
I, personally, like the idea of gx, but that is a more of a long-term achievement, developing an open-sourced, fully decentralized , platform independent package manager. :)
Here is the newly created issue if you want to shime in -> https://github.com/ipmjs/ipmjs/issues/13
Can you elaborate on which specific areas you're trying not to touch? In your previous comment, you mentioned "rewriting what already works" and "malicious packages and copyright infringement"; anything else?
> Prevent worm-like vulnerabilities when adding dependencies
> npm scripts, the good, the bad, and the dangerous
> Namespace all the things!
> Needs for frontend and backend package managers are different
> Involve the FSF
> Have you thought about malicious packages?
> Have you thought about copyright infringement?
> trademarking 'ipmjs' so we don't get kik'd
These are all issues I want to avoid. Also, I don't want to write yet another package manager, I'm trying to extend NPM and still allow the centralized way that we currently use today, but allow a optional offline-first approach.
Feel free to continue reading more about what I said in the ipmjs repository here: https://github.com/ipmjs/ipmjs/issues/13
TeX, Perl and Erlang have CTAN [1], CPAN and CEAN respectively and are now almost 25 years old. I would say the most important thing is having a large number of mirrors and it seems to me that mirroring a set of packages with an ordinary web or FTP server lowers the barrier to entry quite a bit. You will of course have to roll your own synchronization and discovery mechanism on top of that but it has been done and works.
And one thing that most likely won't work anyway is creating a distributed solution, releasing it into the wild and the problem is solved. Someone has to take ownership, issues will come up and someone has to take care of them, even if it is only fixing bugs or adapting the code to changing environments.
But that doesn't really change the picture, for me "interplanetary file system" has 5,910 results, "andrew file system" 46,300. The abbreviations IPFS and AFS have 289,000 and 27,700,000 results but both have several meanings and are therefore not representative. If you look at Google Trends, IPFS began rising as a search term in 2011 [1] well before the inception of Interplanetary File System but I failed to quickly figure out what it refers to.
[0] https://www.google.com/trends/explore#q=ipfs%2C%20ipfs%20cor...
IPFS is distributed and has no such single point of failure (SPOF).
Yeah, I agree. My point of this adventure is to have a large set of mirros, that are easy to setup.
> You will of course have to roll your own synchronization and discovery mechanism on top of that but it has been done and works
I'm not interested in implementing these things, and would rather compose existing parts to achieve my goals. IPFS is just one part of the puzzle.
You're right about the ownership. Everyone is dependently owning the issue of seeding their own modules. I will provide a public mirror that people can use if they want or not, and maybe some other organization steps forward to help with mirroring as well (npm maybe?)
Also, regarding the ability to "remove": could you clarify what this means? Given the nature of IPFS, is this really just the signaling the deprecation of a version or entire module using data posted to IPFS?
> regarding the ability to "remove":
I'm not sure what you mean, could you refer the sentence where you see this, so I'm sure to respond in a good way.
With IPFS, there will be no deletion or removal, how bad you may want it. The nodes you can control, you can tell them to stop sharing it, but the distributed nature of IPFS makes it impossible to guarantee that other people won't share it.
Conceptually though, the use case of remove is important, at least in the sense that an author wants to formally call out when a version contains breaking code, etc. I am wondering how an author can signal that the latest version is malware or should be ignored, or that the whole namespace, or even the author is no longer valid.
Without human intermediaries (the primary benefit of centralized systems), we lose the ability to mitigate or moderate when things go awry -- e.g. an author loses control over the "keys to the house".
As this concept gets developed, it would be good to develop protocols for identity management, release validation, module namespace registration, etc. Perhaps if not in IPFS, it can be implemented in blockchain tech like ethereum.
Today, the fate of a module is decided by NPM the
company, and they are not afraid of deleting your
module and letting someone else have it.
This is not what happened in the recent case, it was the author who deleted (unpublished) the module after the name (and the right to publish future versions) was taken away. If he hadn't unpublished them the already published versions would have stayed around indefinitely.With that said, npm did pull the ownership of kik. Think what you want to think about that, I think that shouldn't be possible.
That the author removed his own dependencies is true and you're right. The text doesn't convey that good enough and I will improve it.
Thanks a lot for the feedback.
I do like NPM as it is today, except for the central registry. I've made a huge facelift of the website, and also updated the content to reflect this.
It now contains better example, and easier to digest information.
Please take a new look and let me know what you think. http://everythingstays.com
So if you happen to use an unpopular module, or if your project ages, it's quite possible to literally lose your dependency. Package management that is built like this is almost useless. There has to be a central node of some kind.
Say you and others believe a full archive is needed to prevent that kind of problems. You set it up any way you would a centralized node, except it isn't centralized, it's jut another node in the network.
Decentralization has some disadvantages, but in terms of availability, I don't see how it can be anything else than strictly superior.
However, when it comes to package management I think we should look at the community first, technology second. The first concern is to set up a central node that everyone can safely mirror and is pretty much guaranteed to be there. Otherwise, what's the point? If I can't trust a package repository to store a package for a decade or so, why even use one?
What's lovely about CPAN and friends is that they are reliable. They're always there. Of course I can just host a node myself for the next 10 years, but that doesn't make everythingstays a good alternative to npm. If all we're doing is decentralizing packages with the assumption that people will host their own stuff, this could be implemented with BitTorrent plus a text file containing magnet links.
"Community first, technology second"? Do you mean this project only exists to use a cool technology and doesn't care about community? This thing here exists to try to solve a NPM problem. It is community first.
However, it is possible that NPM Inc decides in the future to seed all public packages, but not being able to remove ownership of the packages. Or another private company might come along and do that.
If you use an unpopular module, and you want it to exist, you better seed it, somehow.
The es-cli will help with this in the future, allowing you to spread your module across public and private nodes.
how I can automatically update to the last version of a package?
how the package manager know what is the last valid version?
It is sort of like revoking certificates I guess.
I would expect things like this coming from CERT or other security researchers in the coming months/years.
https://groups.google.com/forum/#!topic/ipfs-users/fr6dlQ8we...
With signing, you would revoke the keys used for the signing.