gwin · galewind-npm
GaleWind installs, updates, and shares your Node.js packages — with workspaces that let a whole folder of projects skip redownloading what they already have between them.
MIT licensed · Node.js 18+ · gwin and gwix on your PATH
$ npm install -g galewind-npm
$ gwin i prompts
✓ resolved from local cache 0.2s
✓ 1 package installed
$ gwin ci
✓ lockfile pins matched, skipped registry
✓ installed from cache 0.4s
One global install gives you two commands: gwin,
the main tool, and gwix, for running a
workspace package's CLI without adding it to your PATH.
# install gwin globally
npm install -g galewind-npm
# check what you're on
gwin -v
# install everything in package.json
gwin i
Global installs land in ~/.galewind/global.
The first time you install, update, or promote something globally,
gwin adds it to your PATH automatically — on Windows it writes
setup steps to ~/.galewind/PATH_SETUP.txt instead.
Two things in particular do the heavy lifting: a short-lived memory of package listings, and a cache that lets a clean install skip the registry altogether.
01
Gwin holds onto a package's listing — name, versions, download
location — for a few minutes after it looks it up. The same
package showing up twice in your dependency tree, or a second
gwin i shortly after the
first, reuses that answer instead of asking again.
02
If your lockfile's pinned versions are already sitting in the
shared download cache, gwin skips the "what version is this?"
round trip entirely and installs straight off disk. It's the
reason a clean gwin ci
feels close to instant.
03
The shared cache tracks hits and last-used times in a
.pkg_cache file, so once
it passes a size cap (3GB by default) it evicts whatever's been
used least — not just whatever's oldest on disk.
Register a parent folder as a workspace once, and every project inside it can use the same installed packages — no per-project downloads. Need a package that isn't in this workspace but lives in another one you've registered? Gwin reuses that copy too.
Workspace commands in the docs →# register a folder once
gwin -w "~/Projects" name "my-projects"
# every project inside shares this
gwin -w my-projects i lodash
# stop typing -w on every command
gwin bind -w my-projects
gwin i lodash