Skip to content

Version pinning

Tools that NullForge installs from release archives are pinned, not latest. A cast converges every host to the pin; bumping a pin re-installs on the next cast.

Default pins

DEFAULT_VERSIONS in nullforge/smithy/versions.py:

Tool Used by
curl, doggo base
eza, tmux, nvim, direnv, nerd_fonts profiles
usque, wgcf WARP
cloudflared Zero Trust Tunnel
blocky DNS
telemt Telemt

Run nullforge runes from a checkout - or read the file - for the exact current pins.

Overriding per host

Inventory data key versions overlays the defaults:

hosts = [
    (
        "203.0.113.10",
        {
            "system": ...,
            "features": ...,
            "versions": {"blocky": "v0.34.0", "tmux": "3.7b"},
        },
    ),
]

Most tools also accept "latest", which resolves GitHub's latest-release URL.

latest weakens convergence

With latest, the guard reduces to "binary exists" - the host stops converging to a known version, and tools whose asset names embed the version (blocky, wgcf, usque, doggo, tmux, curl) will 404 on latest. Prefer explicit pins.

How the guard works

Installers check is_pinned_version_installed(tool, binary_path) before doing anything:

  1. The binary must exist.
  2. The tool's version command (eza --version, blocky version, ...) must report the pinned version. Tools with no version output (wgcf) are tracked through marker files under /var/lib/nullforge/versions.

Only when the guard fails does the installer download - which is also when the release's sha256 is resolved from GitHub metadata on the control node and verified on the target. Checksum resolution is best-effort: a repo that publishes no checksums installs unverified (a warning is logged).

Not pin-driven

Some installs deliberately sit outside the pin system: script-based installers (Docker, starship, zoxide, atuin, Xray, Nezha) and distro packages (Tor, HAProxy - which has its own version field). These are guarded by presence, not version.