Skip to content
Putting technology to work.
Insights to guide decisions and action.

Search articles

Abandoning the assumption that npm install runs arbitrary scripts: Exploring vlt 1.0

Table of contents · 6 items

Opening a repository from an inherited maintenance project and running npm install. Surprisingly few people can explain what actually happens during those few seconds.

Dependency packages can include lifecycle scripts like postinstall. These execute automatically upon installation and, crucially, run with the privileges of your development machine. Environment variables, SSH keys, and cloud credentials all come within reach at that moment. Even if direct dependencies number just 20, pulling in transitive dependencies routinely puts the count over 1,000 packages, making manual visual inspection impossible.

A package manager that reorganizes this very default of "run upon installation" reached version 1.0 in August 2026.

Three defaults flipped by vlt

vlt is a JavaScript package manager developed by former npm core team members. Designed to be npm-compatible, it acts as a drop-in replacement for projects with existing package.json files. What stands out in 1.0 is not raw performance, but its design of defaults.

First, lifecycle scripts do not run by default. Installation and building are separated; vlt install only fetches packages, while script execution is handled selectively via vlt build. That "runs the moment you install" scenario mentioned earlier does not happen by default.

Second, known malicious packages are blocked at install time. It integrates vulnerability databases like OSV alongside public malware feeds, scanning continuously across a secure npm mirror.

Third, the dependency graph can be inspected with queries. Over 60 selectors are available, around 30 of which are security-focused. You can query and extract matching packages from the dependency tree using conditions like :malware, :cve, :vuln, :unmaintained, :outdated, :eval, :fs, and :license.

In terms of performance, clean installs are reported to be up to 38% faster than npm. However, putting speed first as your reason to switch will lead you astray. If choosing purely for speed, multiple alternatives already exist; that is not where vlt distinguishes itself.

What breaks when choosing "do not run scripts"

Having defaults lean toward safety also means behaviors relied upon implicitly until now will stop working. Adopting it without looking here means only realizing it once CI turns red.

Things relying on install scriptsWhat happens
Native module builds (node-gyp family)Fails unless build steps are explicitly defined
Binary downloads (bundled browser/CLI family)Binary not found at runtime
Initial dev tool configuration (Git hook registration, etc.)Hooks are not registered, silently disabled
Automatic patch executionRuns without patches applied

The most troublesome are the fourth and third rows. Things that fail with an error are easy to catch, but hooks and patches run even if not applied, causing review and formatting automation to quietly die. During adoption, you need to verify not merely that "it ran," but that "what was supposed to run actually ran."

Diagram showing the inverted default behavior of install scripts between npm and vlt, and the types of dependencies requiring explicit configuration as a result

A realistic adoption path for custom development and maintenance

Assuming you handle multiple projects, moving everything at once is impractical. Taking phased steps in the following order is realistic:

  1. Start with newly created projects. Since they are unburdened by legacy dependencies, you can design explicit script configurations right from the start
  2. Run dependency graph queries purely as a CI inspection step. Without replacing your package manager, periodically checking for dependencies matching :malware or :vuln carries zero side effects
  3. For maintenance projects, align with major dependency update cycles. Since you are running regression tests anyway, mixing in default changes allows for clean troubleshooting

Before considering a migration, it is also worth checking how much of this your current package manager can already do. pnpm has also moved toward stricter handling of install scripts, a background we covered in pnpm 11 and supply chain defenses. If modifying existing tool settings suffices, that is the more cost-effective path.

Articulating what you are actually afraid of

Before selecting tools, what you want to clarify is which vector your company's risks come from.

If a development machine is compromised, customer credentials stored there are taken. If CI is compromised, it reaches your deployment targets. How attacks routed through public npm packages are constructed in practice is covered in Paths for arbitrary code execution in npm install, while the overall landscape of attacks via dependencies is summarized in Supply chain attack techniques and countermeasures.

If reading these two leads you to determine that "CI is our more vulnerable side," your priority might not be swapping package managers, but tightening CI permissions. Getting the sequence wrong yields minimal protection for the effort spent.

What to do next

First, try counting how many packages in the dependency tree of one active project have been left outdated. Even without installing vlt, you can obtain a rough count using existing tools. If that number reaches triple digits, proceeding to discussions on defaults is worthwhile. If it stays in double digits, establishing update routines first will be more effective.

Reevaluating maintenance frameworks, including dependency management and CI security design, is available through GleamHub's Development, AI, and Automation consultations. Because proper boundaries differ based on project scale and operational setups, we provide individualized estimates. Please consult us via Contact Us.

Sources

Share this articleXFacebook
Kakeru Suzuki

Fascinated by the possibilities of technology, has had a deep interest in programming and digital art since student days

Turn this article's theme into your company's next step

Concrete steps forward for your organization.

We organize your desired architecture, legacy systems, and operational requirements to formulate your next steps toward execution.

  • Desired architecture
  • Integration with existing environments
  • Operational requirements
Consult on development & operations initiatives

You can consult with us from the initial conceptual stage. Details from this article will be carried over to the inquiry form.

Receive the latest articles by email