npm install
un gestor de paquetes Node.js
que no te entregará un RAT.
npm, pnpm y bun ejecutan los lifecycle scripts con acceso completo al host.
Un postinstall malicioso y se llevaron tu ~/.ssh.
stil aísla cada script dentro de una microVM Hull, bloquea versiones
recién publicadas, y aún así instala ~12× más rápido que bun.
// Benchmarks
Instalación en caliente — lockfile congelado, store con caché
197 paquetes · React 18 + Vite 6 + framer-motion + jspdf · Mac M-series
stil es ~12× más rápido que bun y ~62× más rápido que npm.
Monorepo — 3 workspaces, lockfile v2 congelado
apps/web depende de packages/ui y packages/utils vía workspace:*
los workspaces se resuelven a symlinks sin tocar el registry; el resto sale del store con clonefile(2).
// Esta misma página corre en stil
Esta landing está construida con Vite + TypeScript en una carpeta llamada
landing/. Para servirla durante desarrollo y compilarla para
producción usamos stil mismo — es nuestro mejor test bed.
$ cd landing/ $ stil install # resuelve vite + transitive + binarios nativos de rollup 186 packages planned $ stil run dev # vite arranca en milisegundos > dev > vite VITE v6.4.2 ready in 117 ms $ stil run build # tsc + vite build, dist/ listo para deploy ✓ built in 1.6s
// Por qué stil existe
Lifecycle scripts aislados
Los scripts corren dentro de una microVM Hull con seccomp KILL_PROCESS sobre el perfil node (32 syscalls). Sin red, sin ~/.ssh, sin ~/.aws. Cualquier intento de escape mata el proceso. Por defecto se omiten directamente.
Política de edad de 7 días
Las versiones recién publicadas se bloquean por defecto — los mantenedores y los advisories necesitan tiempo para detectar un compromiso. El resolver hace fallback automático a la última versión que cumple el constraint y la política de edad.
Store con verificación de integridad
sha512 / sha256 / sha1 verificados antes de que el tarball toque el disco. Almacenado una vez, hardlinkeado en cada proyecto — clonefile(2) en macOS, ~200 syscalls en lugar de los ~10k típicos.
Fetch HTTP/2 multiplexado
Handle Multi de libcurl, 8 conexiones paralelas a npmjs, decenas de streams por conexión. Caché persistente de packuments en ~/.stil-cache/ — la latencia de resolución entre runs desaparece.
Drop-in para Vite / Next / Astro
Resuelve optionalDependencies con filtros de os / cpu: los binarios nativos de plataforma (@rollup/rollup-darwin-arm64, esbuild, etc.) caen en disco y vite build funciona sin tocar nada.
Zig, no JavaScript
Un único binario estático de ~1 MB (~10 MB en Linux). Sin runtime de Node.js, sin bootstrap de npm, sin overhead de arranque. Boot en milisegundos, no medio segundo como tarda npm en cargarse.
// Monorepos & workspaces
Workspaces nativos al estilo npm/yarn. Cada paquete consume al otro vía
workspace:* y stil resuelve la dependencia a un symlink local
— sin round-trip al registry, sin entry duplicado en el store.
# package.json del monorepo { "name": "myrepo", "private": true, "workspaces": ["packages/*", "apps/*"] } # packages/ui/package.json { "name": "@myrepo/ui", "dependencies": { "@myrepo/utils": "workspace:*", "react": "^18" } } $ stil install # crea symlinks + hardlinks monorepo: 3 workspaces discovered 4 packages planned $ cd packages/utils && stil install # desde un sub-workspace, encuentra el root solo stil: in workspace 'utils', running install from monorepo root '/path/to/myrepo' $ stil run dev --filter '@myrepo/*' # corre dev en cada workspace que matchee [apps/web] > dev > vite
// Instalar
macOS — Apple Silicon o Intel
$ curl -fsSL https://stil.dev/install.sh | bash # o desde source: $ scripts/build.sh # Zig 0.15.2 en ~/.local/zig15 $ cp zig-out/bin/stil ~/.local/bin/stil $ ln -sf stil ~/.local/bin/stilr # `stilr dev` ≡ `stil run dev`
Linux — x86_64-musl (ELF estático, ~10 MB)
$ curl -fsSL https://stil.dev/install.sh | bash # o desde source: $ TARGET=x86_64-linux-musl scripts/build.sh # v0.2 ships con backend HTTP de Zig stdlib. # Path libcurl vendoreado (paridad macOS) viene en v0.2.1.
Uso diario
$ stil install # respeta política de 7 días $ stil install --frozen-lockfile # CI: salta el BFS, instala lo del lockfile $ stil add react@^18 -D # devDependency $ stil add chalk -w '@my/utils' # a un workspace específico $ stil update # sube todo a la última válida $ stil run dev # scripts.dev del package.json $ stil run dev --filter '@my/*' # corre en cada workspace
Tip multi-volumen (macOS)
# clonefile(2) y los hardlinks no cruzan volúmenes APFS. # Si tus proyectos viven en /Volumes/Foo, apuntá el store ahí también: $ export STIL_STORE=/Volumes/Foo/.stil-store
// vs otros gestores
| Característica | npm | pnpm | bun | stil |
|---|---|---|---|---|
| Lifecycle scripts aislados | ✗ | ✗ | ✗ | ✓ Hull microVM |
| Política de edad por defecto | ✗ | ✗ | ✗ | ✓ 7 días |
| Store content-addressed | ✗ | ✓ | ✓ | ✓ |
| Fetch HTTP/2 multiplexado | ✗ | ~ | ✓ | ✓ |
| Workspaces / monorepos | ✓ | ✓ | ✓ | ✓ |
| Registries privados / auth | ✓ | ✓ | ✓ | v0.3 |
| Instalación en caliente (197 pkg) | 13.0 s | ~3 s | 2.43 s | 0.21 s |