Silo v0.4.0 release notes
The CLI is reshaped around one-model-per-command, the Rust implementation is gone, and disk reclamation now runs automatically. Smaller surface, fewer footguns.
Silo v0.4.0 is a consolidation release. Over the last several months the codebase carried two implementations (Go and Rust), two sets of build/setup verbs, and a status command that tried to do three unrelated jobs. v0.4.0 collapses all of that.
Go is now the only implementation
The Rust implementation is gone. Everything ships from the Go tree. Install-time footprint, test matrix, and CI complexity all go down; the CLI surface stays identical.
CLI reshape: one model per command
The install verbs used to overlap. silo install installed; silo setup installed packages into a persisted rootfs; silo rebuild re-ran the stored setup; silo pull reconciled. Users had to remember which verb did which.
v0.4.0 picks one model per job and keeps the old names as deprecated aliases (removed in 0.6.0):
silo build <tool> -- <cmd>— persist dependencies into a rootfs layer. Absorbs the oldsetupandrebuildcommands.--rerun,--all,--removeare flags on the same verb.silo sync— reconcile the environment to.siloconf. Installs missing tools and warms the rootfs cache.silo pull/silo applystill work as aliases.silo doctor— runtime readiness only (kernel, initfs, bootstrap state). Split out of the oldstatus.silo current— effective tool config after.siloconfoverrides. Also split out ofstatus.
silo status is still there; it prints both doctor and current output for users who had it in muscle memory.
Install now refuses duplicates
silo install python used to silently re-install on top of an existing tool. That led to confusion when users wanted “use a different Python version for this project” and got “globally replace Python.” v0.4.0 refuses the second install and points at two alternatives:
silo install python --force— explicit global reinstall.silo use python@3.11— pyenv-style project pin in.siloconf, doesn’t touch the global install.
Disk reclamation
Three features landed together:
- LRU + age-based GC runs once per process at the top of
silo run. Cold entries evict when the cache exceeds the policy cap (default 8 GiB) or age limit (default 60 days). You can see what would happen withsilo cache gc --dry-run. - zstd cold tier.
silo cache compressdemotes entries to zstd (~4× smaller). On the next cache hit, they decompress back to raw (~1–3 s for 500 MB) and the fast clonefile path resumes. - Image deletion on uninstall.
silo uninstall pythonnow frees the rootfs cache entry and, if no other tool shares the image, removes the OCI image and orphan layer blobs.
Policy lives in .siloconf:
cache:
rootfs:
maxSizeMB: 8192
maxAgeDays: 60
tools:
maxSizeMB: 4096
maxAgeDays: 30
perMount:
rust/cargo: 8192
silo cache report summarises the ~/.silo/ footprint by bucket.
Project lifecycle
silo sync and silo clean replace an ad-hoc “nuke ~/.silo/ when things feel weird” workflow:
silo syncreads.siloconf, installs anything missing, and warms the rootfs cache. Safe to re-run.silo cleanreclaims rootfs cache + per-tool caches + stale VMs for the current project.--rootfs-only,--caches-only,--forcenarrow or widen.
Network proxy with allowlist
Per-tool outbound network can now be restricted to an explicit domain allowlist, with wildcard support:
overrides:
node:
network:
hostAccess: true
proxy:
allow:
- registry.npmjs.org
- "*.github.com"
deny:
- "*"
This is the default posture for claude-code installs — api.anthropic.com, github.com, registry.npmjs.org, pypi.org, nothing else.
Two-phase SIGINT
silo run now intercepts Ctrl-C twice. First press forwards SIGINT into the VM (graceful shutdown). Second press stops the container and deletes it. Previously a stuck container left a corrupt silo-* directory under ~/.silo/containers/ that required manual cleanup; the reaper at the top of the next silo run also catches these, but you rarely need it now.
Smaller quality-of-life wins
- Bootstrap downloads show a real progress bar with size hints (curl + parsing).
silo initauto-detects tools from marker files (package.json,requirements.txt,Cargo.toml,go.mod,deno.json).- Shimless
silo install --imagediscovers executables by exec’ing into the image. silo cache clean --saferemoves only orphans not referenced by any installed tool.
What’s next
The two priorities for 0.5:
- Bootstrap speedup — the ~5-minute first install is the biggest UX cliff. Prebuilt kernel + initfs artifacts should cut it to ~30 seconds.
- Homebrew distribution —
brew install rchekalov/silo/silonow works. (The fully-qualifieduser/tap/formulaform is required because an unrelatedsilocask already exists in homebrew-cask.) Release workflow bumps the formula on every tag.
Full changelog on GitHub. Bug reports welcome.
← all posts