v0.2 — workspaces · update · monorepos

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

npm 11.6
npm ci
13.0 s
bun 1.2
bun
2.43 s
stil 0.2
0.21 s

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:*

stil 0.2
stil install --frozen-lockfile
21 ms

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ísticanpmpnpmbunstil
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 / authv0.3
Instalación en caliente (197 pkg)13.0 s~3 s2.43 s0.21 s