My college is surrounded by forest.
That sounds lovely on a brochure. It is significantly less lovely when you are trying to install a package and the progress bar has been sitting in the same position long enough for you to question the entire degree.
That is genuinely where this started. Not with a grand idea about package management. With a download that would not finish.
The thing that actually annoyed me
It was not the slowness.
It was sitting in a lab watching a tiny package fail to download for the fourth time that week — on the same laptop. Those exact bytes had been on this machine three times already. They were gone, because every project starts from nothing and every install begins by asking the internet for permission.
The internet being slow was a fact of life. Asking it for something I already had was just waste.
So: download a package once, keep it, never ask again.
The flex
I built it, then benchmarked it against the tools everyone uses.
It won.
I would love to say I treated that result with scientific caution. I did not. I told everyone. For about a week I was a person who had written a faster package manager than npm, and I made that everyone else's problem.
The uncomfortable truth, which took a while to say out loud: it was fast because it did less.
npm is slow partly because it is careful. Flux was quick because it skipped the careful parts. A car with no doors, seatbelts or brakes also accelerates very well.
The cache genuinely solved my actual problem. But "fastest package manager" was a benchmark of my own missing features, not of my engineering.
Then exams happened and the repo went quiet for a long time.
Bun
Bun showed up and was absurd.
Not "nice improvement" absurd. "Do that again, I think it failed" absurd. I ran an install and assumed it had silently broken, because nothing finishes that fast and actually works.
What it made me feel was not "I should use this". It was: someone went and did the version of this that I abandoned.
That reopened the repo.
What it does now
flux init Create a package.json
flux install <package> Install a package and record it
flux uninstall [package] Remove one, or all of them
flux update [package] Update one, or all of them
flux list List installed dependencies
flux outdated Show what has a newer version
flux info <package> Look up a package
flux run <script> Run a script from package.json
flux clear Empty the cacheMost have aliases — add, remove, ls — because muscle memory is a real constraint and fighting it is a losing battle.
Packages are cached per machine rather than per project, which is the whole point. On good internet that is a mild convenience. In a forest it is the difference between installing something and not, because the second project that needs the same package never touches the network at all.
Getting it without the thing you are replacing
There is a funny problem in writing a JavaScript package manager: normally you would install it with a JavaScript package manager. On bad internet, that is the exact trap you were escaping.
So it also ships as a standalone download that needs nothing else installed:
curl -fsSL https://raw.githubusercontent.com/callmegautam/flux/main/install.sh | shirm https://raw.githubusercontent.com/callmegautam/flux/main/install.ps1 | iexOn Windows it installs just for you and does not ask for admin rights, which matters more than you would think on a shared college machine where you are definitely not an administrator.
Or, if you already have npm and are not in a forest:
npm install -g @iamgautamsuthar/fluxWhat I am not going to pretend about
Flux is alpha, and the gaps are not cosmetic.
It installs the packages you name, but not the packages those packages need. Which means plenty of real-world installs will not work end to end. That is the big one.
Installs are not reproducible yet — there is no lockfile, so what you get today and what a teammate gets next month can differ. And when you ask for a version range, it takes the newest release rather than the newest one that actually matches what you asked for. That is wrong, and it is wrong in a way that will eventually bite someone.
I could have left this section out. But a package manager that quietly installs the wrong thing is worse than one that warns you it might.
The honest summary: Flux solves the network half of this well and the correctness half not at all. Both of those gaps are the next real work, and they are next precisely because they are what would make the speed mean anything. Being fast while skipping the hard part is not a win.
What I would do differently
I built the fun part, benchmarked the fun part, and then discovered the unfun part was the actual product.
Working out which versions of which packages you need is what a package manager fundamentally is. Downloading a file is a detail. I did the detail first because it was the bit I could finish in a weekend.
The version of me that started this wanted a faster install. What I got instead was an understanding of why the established tools are slow, and it turns out most of that slowness is not incompetence. It is care. Every careful step is there because someone got tired of that exact thing going wrong.
I set out to beat a tool and mostly ended up learning what it had been doing all along.
The cache still works, though. Still the fastest way I know to install a package in a forest.
