skt install — installing tools
skt install resolves a version pin, downloads and verifies the artifact, extracts it into the cache, and prints the binary path. Run it again and it returns the cached entry without touching the network.
Basic usage
skt install <tool>@<version>
For example:
skt install go@1.25.5
skt install kubectl@1.31.0
skt install trivy@0.70.0
skt resolves the full version, downloads the matching artifact for your host
OS and architecture, verifies its sha256 checksum, extracts it into the cache,
and prints the resulting binary path.
Partial versions
You don't have to pin a full version. A partial pin resolves to the highest matching release at install time:
skt install node@24 # → latest 24.x available upstream
skt install node@24.16 # → latest 24.16.x
skt install node@24.16.0 # fully pinned
The cache is keyed by the resolved version, so node@24 and node@24.16.0
share a single cache entry once they resolve to the same release. A partial pin
upgrades automatically when upstream ships a new patch — re-running install
re-resolves and fetches the newer version if one exists.
Not every tool supports partial versions. Runtimes (
go,node,python,rust) andgo installmodules do; most fixed-release CLIs require a full version. See Supported tools.
The cache
Installs are content-addressed under a single cache root:
<cache>/<tool>/<resolved-version>/<os>-<arch>/
The default cache root is $XDG_CACHE_HOME/skt, falling back to ~/.cache/skt.
A marker file records the resolved binary path, so a warm cache short-circuits
every network call:
skt install go@1.25.5 # cold: downloads, verifies, extracts → "cached": false
skt install go@1.25.5 # warm: no network → "cached": true
Override the cache root with --cache-dir:
skt install go@1.25.5 --cache-dir /tmp/ci-cache
This is how a CI runner points every install at a persistent, shared cache volume.
JSON output
Pass --json to get a stable, machine-readable record on stdout:
skt install node@24 --json
{ "tool": "node", "requested": "24", "resolved": "24.16.0",
"bin_dir": "/home/you/.cache/skt/node/24.16.0/linux-x64/bin",
"bin": "/home/you/.cache/skt/node/24.16.0/linux-x64/bin/node",
"cached": false }
A caller prepends bin_dir to PATH, or invokes bin directly. skt never
modifies PATH or writes a shim — that is the caller's job.
Using the result
BIN_DIR=$(skt install go@1.25.5 --json | jq -r .bin_dir)
export PATH="$BIN_DIR:$PATH"
go version
For a one-off invocation without touching PATH, use skt exec.