Go version & toolchain manager. uv-grade speed. Single binary. Reproducible.
gv is to Go what uv is to Python: one fast Rust binary that owns toolchains,
project tooling, and reproducible installs — without the activation overhead and
shell pollution of legacy version managers.
- Reads
go.mod'stoolchainline as a first-class source. Existing managers ignore it;gvmakes it canonical. Zero migration cost. - Replaces
go installfor global tools. Pingopls,golangci-lint,dlv,mockgen,sqlcingv.toml, lock togv.lock, reproduce on CI. - Content-addressed store. SDKs and tools deduped by sha256 across projects (pnpm/uv-style).
- No shell activation required. Optional 1ms
execveshim for IDE compatibility. - Parallel downloads, parallel extraction. Tokio + reqwest + rustls. No OpenSSL.
GOTOOLCHAIN=localenforced.gvowns toolchain selection — no surprise downloads from the Go runtime.
🚧 Pre-alpha. Working today:
- Toolchain install / list / current / use-global / doctor
- Content-addressed store + symlink farm
go.modtoolchainline read as a first-class source.go-version+~/.config/gv/globalfallbacks- Tool pinning:
gv add tool goplsresolves viaproxy.golang.org, fetches the directory hash fromsum.golang.org(the canonical Go checksum DB), builds via the resolved Go toolchain, records everything ingv.lock gv sync --frozenfor CI: refuses to touch the lock, fails ifgv.tomldrifts ahead ofgv.lockgv-shim400KB binary for IDE-sideexecvedispatch
Track milestones.
# macOS / Linux — install.sh downloads the latest release for your platform
curl -fsSL https://raw.githubusercontent.com/O6lvl4/gv/main/install.sh | sh
# pin a version
GV_VERSION=v0.2.0 curl -fsSL https://raw.githubusercontent.com/O6lvl4/gv/main/install.sh | sh
# from source
cargo install --git https://github.com/O6lvl4/gv gv-cli# Windows — install.ps1 mirrors install.sh in PowerShell
iwr https://raw.githubusercontent.com/O6lvl4/gv/main/install.ps1 | iex
# pin a version
$env:GV_VERSION = "v0.2.0"
iwr https://raw.githubusercontent.com/O6lvl4/gv/main/install.ps1 | iexAfter installing, optionally hook the toolchain shim:
gv link # creates ~/.local/bin/{go,gofmt} → gv-shim
gv link --tools go,gofmt,godocThis makes go build etc. dispatch through gv-shim, which honors
go.mod's toolchain line and .go-version automatically.
brew install O6lvl4/tap/gvThe tap lives at O6lvl4/homebrew-tap
and is bumped automatically on every stable release by the bump-tap job in
.github/workflows/release.yml (driven by the
packaging/homebrew/gv.rb.template
template). Pre-release tags (those containing -, e.g. v0.2.0-rc1) skip the
bump.
Maintainer note: the bump job authenticates with a deploy key.
O6lvl4/homebrew-tapcarries a read-write SSH deploy key whose private half is stored as theTAP_DEPLOY_KEYsecret onO6lvl4/gv. Rotating is a two-stepgh repo deploy-key+gh secret setdance — no PATs needed.
gv add 1.25.0 # add toolchain (writes go.mod toolchain line)
gv add tool gopls # pin a tool
gv add tool golangci-lint@v1.64 # version-pinned tool
gv sync # reconcile installs with gv.lock
gv run go test ./... # run with the resolved toolchain
gv run gopls # tools work the same way
gv tree # visualize resolution
gv current # explain why this version is active
gv doctor # health checkGV_VERSIONenv vargo.modtoolchainline (walking up from CWD).go-version(walking up from CWD)~/.config/gv/global- Latest installed
gv current always prints the chosen version and the reason.
See docs/DESIGN.md.
MIT