Description

Updatecli is a single, statically linked binary with no runtime dependency. Every release publishes archives for Linux, macOS, and Windows, native packages for the common Linux distributions, and container images.

All assets are attached to the GitHub release page.

Note
Of the assets the project publishes itself, only Linux gets native packages (.deb, .rpm, .apk). macOS is covered by Homebrew or a .tar.gz archive, Windows by a .zip archive. Several distributions and package managers carry Updatecli on their own, see Community packages.

Homebrew

Homebrew works on both macOS and Linux and is the quickest way in.

Updatecli is published from its own third-party repository, called a tap, so add it first:

brew tap updatecli/updatecli

Then install:

brew install updatecli

To check for a newer version, use brew outdated updatecli; to upgrade, brew upgrade updatecli.

Linux

Debian and Ubuntu

Download the package matching your architecture, then install it:

# amd64
curl -sSL -o /tmp/updatecli_amd64.deb https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_amd64.deb
sudo apt install /tmp/updatecli_amd64.deb

# arm64
curl -sSL -o /tmp/updatecli_arm64.deb https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_arm64.deb
sudo apt install /tmp/updatecli_arm64.deb

# armv6
curl -sSL -o /tmp/updatecli_armv6.deb https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_armv6.deb
sudo apt install /tmp/updatecli_armv6.deb
Note
apt install needs a path, not a bare filename, to recognise a local file. A name without / is treated as a package name and the command fails with Unable to locate package.

Fedora, CentOS, and RHEL

# amd64
sudo dnf install https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_amd64.rpm

# arm64
sudo dnf install https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_arm64.rpm

# armv6
sudo dnf install https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_armv6.rpm

openSUSE

Tumbleweed and Leap 16.0 carry Updatecli in the distribution itself, see Community packages. To install a specific release, or on a version that does not package it, use the .rpm from the release page:

# amd64
sudo zypper install https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_amd64.rpm

# arm64
sudo zypper install https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_arm64.rpm

# armv6
sudo zypper install https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_armv6.rpm

Alpine

The .apk packages are not signed by an Alpine key, so --allow-untrusted is required:

# amd64
curl -sSL -o /tmp/updatecli_amd64.apk https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_amd64.apk
sudo apk add --allow-untrusted /tmp/updatecli_amd64.apk

Replace amd64 with arm64 or armv6 as needed.

Arch Linux (AUR)

yay -S updatecli-bin
Note
Two further entries, updatecli and updatecli-git, build from source but are currently orphaned and far behind, so prefer updatecli-bin.

The package installs the bash, zsh, and fish completions.

Archive

# amd64
curl -sSL -o /tmp/updatecli.tar.gz https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_Linux_x86_64.tar.gz

# arm64
curl -sSL -o /tmp/updatecli.tar.gz https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_Linux_arm64.tar.gz

# armv6
curl -sSL -o /tmp/updatecli.tar.gz https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_Linux_arm.tar.gz

tar -xzf /tmp/updatecli.tar.gz -C /tmp updatecli
sudo install -m 755 /tmp/updatecli /usr/local/bin/updatecli

macOS

Homebrew is the recommended route. To install from an archive instead:

# Apple silicon
curl -sSL -o /tmp/updatecli.tar.gz https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_Darwin_arm64.tar.gz

# Intel
curl -sSL -o /tmp/updatecli.tar.gz https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_Darwin_x86_64.tar.gz

tar -xzf /tmp/updatecli.tar.gz -C /tmp updatecli
sudo install -m 755 /tmp/updatecli /usr/local/bin/updatecli
Important
The archives are not notarized by Apple. Gatekeeper may quarantine the binary on first run; clear the flag with xattr -d com.apple.quarantine /usr/local/bin/updatecli.

Windows

The project publishes Windows builds as a .zip archive. A community-maintained Scoop package is also available; there is no winget or Chocolatey package at this time.

To install from the archive, in PowerShell:

# amd64
Invoke-WebRequest -Uri https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_Windows_x86_64.zip -OutFile updatecli.zip

# arm64
Invoke-WebRequest -Uri https://github.com/updatecli/updatecli/releases/download/v0.119.0/updatecli_Windows_arm64.zip -OutFile updatecli.zip

Expand-Archive -Path updatecli.zip -DestinationPath $env:LOCALAPPDATA\Updatecli

Then add %LOCALAPPDATA%\Updatecli to your PATH so updatecli.exe is found from any directory.

Community packages

Updatecli is also packaged by several communities outside the project. These entries are maintained by the distribution or bucket they belong to, not by Updatecli, so they can lag behind the latest release. For the newest version, use one of the routes above or the GitHub release page.

openSUSE (zypper)

Tumbleweed and Leap 16.0 ship updatecli in the distribution, so no extra repository is needed:

sudo zypper install updatecli

Leap 15.x does not package it, install the .rpm from the release page there instead.

Shell completions come as separate updatecli-bash-completion, updatecli-zsh-completion, and updatecli-fish-completion subpackages, which zypper pulls in on its own once the matching shell is installed.

See the openSUSE package page for the versions available per distribution.

Scoop

Scoop is a command line installer for Windows. Updatecli lives in the main bucket, which Scoop configures by default, so there is nothing to add first:

scoop install updatecli

To upgrade later, use scoop update updatecli.

The manifest tracks the GitHub releases automatically, so it usually follows a new version within a day. It installs the same .zip archive as the Windows section and does not set up shell completions, see Shell completion if you want those.

See the Scoop app list for the packaged version.

Nix

updatecli is in nixpkgs and builds on both Linux and macOS.

# Run it once, without installing
nix shell nixpkgs#updatecli

# Install it into your profile
nix profile install nixpkgs#updatecli

On NixOS, add it to your configuration instead:

environment.systemPackages = with pkgs; [
  updatecli
];

Without flakes enabled, the older command still works:

nix-env -iA nixpkgs.updatecli

The package is built from source with the release metadata injected, so updatecli version reports the real version rather than dev. It also installs the bash, zsh, and fish completions and the man page.

Docker

Container images are published to two registries:

Tip
Prefer the ghcr.io image. DockerHub applies pull rate limits to free accounts, which is a common cause of failures in CI. See "DockerHub rate limit" page.

Image variants

ghcr.io/updatecli/updatecli:latest

Debian-based. Includes git and the common tooling some plugins shell out to.

ghcr.io/updatecli/updatecli:latest-slim

Minimal image. Smaller, but without the extra tooling, so plugins that rely on an external command will not work.

Both are also published per release, for example ghcr.io/updatecli/updatecli:v0.119.0.

Usage

The image sets /home/updatecli as its working directory and updatecli as its entrypoint, so mounting your project there lets Updatecli discover updatecli.yaml or updatecli.d/ on its own:

# See what would change
docker run --rm -v "$PWD":/home/updatecli:ro ghcr.io/updatecli/updatecli:latest diff

# Apply the change (the mount must be writable)
docker run --rm -v "$PWD":/home/updatecli ghcr.io/updatecli/updatecli:latest apply

Go

go install github.com/updatecli/updatecli@latest
Note
A binary built this way reports dev as its version, because the release metadata is injected at release time rather than by go install.

asdf

asdf is a multi-platform version manager. Add the plugin, then install:

asdf plugin add updatecli
asdf install updatecli latest

To install a specific version, and to list what is available:

asdf install updatecli <version>
asdf list all updatecli

Once installed, select the version to use:

asdf set updatecli latest
Note
asdf set replaced asdf global and asdf local in asdf 0.16. On older releases, use asdf global updatecli latest and asdf list-all updatecli instead.

Verify the installation

updatecli version
VERSION

Application:	0.119.0
Golang     :	1.26.5 linux/amd64
Build Time :	2026-07-09T15:27:02Z

Verify the release integrity

Rather than signing every asset, Updatecli signs the checksums.txt file that lists the checksum of each one. Download checksums.txt and checksums.txt.sig from the release page.

Verify that the checksum file is genuine, using cosign:

cosign verify-blob \
  --certificate-identity-regexp "https://github.com/updatecli/updatecli" \
  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
  --bundle checksums.txt.sig \
  checksums.txt

Then verify the asset you downloaded against it:

sha256sum --ignore-missing -c checksums.txt

Container images are signed directly:

cosign verify \
  --certificate-identity-regexp "https://github.com/updatecli/updatecli" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
  ghcr.io/updatecli/updatecli:<version>

Replace <version> with the tag you pulled. Signatures are attached per manifest digest, so both release tags and latest verify.

Shell completion

The .deb, .rpm, .apk, AUR, openSUSE, and Nix packages install completions for bash, zsh, and fish automatically. For any other installation method, generate them yourself:

# bash
updatecli completion bash > /etc/bash_completion.d/updatecli

# zsh
updatecli completion zsh > "${fpath[1]}/_updatecli"

# fish
updatecli completion fish > ~/.config/fish/completions/updatecli.fish

# powershell
updatecli completion powershell | Out-String | Invoke-Expression

See "updatecli completion" reference for per-shell details.

Go Further