skt — toolchain manager
Give skt a `<tool>@<version>` and a platform. It resolves the full version, downloads and checksum-verifies the artifact, extracts it into a content cache, and prints the resulting binary path. That's the whole job — your shell or your pipeline owns PATH.
What skt is
skt (skalpai toolchain) is a single static binary that installs developer
toolchains — language runtimes like go, node, rust, python, and CLIs
like kubectl, trivy, helm — at an exact, pinned version.
It is a version manager in the same family as mise, proto, and asdf, but
deliberately smaller in scope: it installs and reports, and nothing else.
Why skt exists
skt replaces the mise dependency in the skalpai toolchain. mise brought a
second runtime to bake and pin into CI images, a fragile global-pin/shim
mechanism, several MISE_* environment variables leaking into sandboxes, and a
plugin registry we did not own.
skt is built around three principles:
- Rootless. No
sudo, no system package manager, no write outside the cache directory. Everything lands under a cache you control. - No shims.
sktnever puts a wrapper script on your PATH or rewrites a global pin. It tells you where the binary is; you decide what to do with it. - JSON-first. Every command speaks machine-readable JSON with
--json, so a pipeline can consume the output without scraping text.
The model
skt has exactly one mental model — three layers:
- Host — the machine you run on.
sktdetects your OS and CPU architecture (normalised to Go-style tokens likelinux/amd64). - Versioned cache — installs live under
<cache>/<tool>/<resolved-version>/<os>-<arch>/. The cache key uses the resolved version, sonode@24andnode@24.16.0share one entry, and a partial pin upgrades automatically when upstream ships a new patch. - Binary path — the only output that matters.
sktreturns the directory containing the executable (and the executable itself); the caller prepends it to PATH.
{ "tool": "node", "requested": "24", "resolved": "24.16.0",
"bin_dir": "/cache/node/24.16.0/linux-x64/bin",
"bin": "/cache/node/24.16.0/linux-x64/bin/node", "cached": true }
A warm cache skips all network access and returns "cached": true.
Quick start
# Install a pinned Go and learn where it landed
skt install go@1.25.5 --json
# Resolve a partial pin to the concrete version, no download
skt resolve node@24
# Run a one-off command against a pinned runtime
skt exec node@24 -- node --version
Next
- Installing tools —
skt install, partial versions, the cache. - Command reference — the full CLI surface.
- Supported tools — runtimes, CLIs, and go-install tools.
- Recipes — add or override a tool with a TOML recipe.