wharfy 0.14.0 — a static latest.json for update checks

What’s new

wharfy release now writes a static latest.json to the same GitHub Release, alongside the archives and install.sh:

{
  "version": "0.14.0",
  "notes_url": "https://github.com/…/releases/tag/v0.14.0",
  "assets": {
    "macos-arm64":   "https://github.com/…/wharfy_0.14.0_darwin_arm64.tar.gz",
    "linux-x64":     "https://github.com/…/wharfy_0.14.0_linux_amd64.tar.gz",
    "linux-x64-deb": "https://github.com/…/wharfy_0.14.0_linux_amd64.deb",
    "windows-x64":   "https://github.com/…/wharfy_0.14.0_windows_amd64.zip"
  }
}

Its stable URL always points at the newest release:

https://github.com/<owner>/<repo>/releases/latest/download/latest.json

Why a static file

Whether a user installed through brew, scoop, apt, or curl | sh, “is there a newer version?” is the same question — but each vehicle answers it differently, and Windows often has no package manager at all. A static file at one stable URL answers it the same way everywhere: fetch, compare version to your own, done. No API, no per-vehicle logic.

The keys carry OS/arch (and package kind), so a product that wants to point the user at the right download can read the URL straight from assets. GoReleaser’s .deb/.rpm share the archive’s os/arch, so wharfy splits them by extension — a .deb never overwrites the linux-x64 archive entry.

What wharfy does, and doesn’t

wharfy generates the file, publishes it on every release, and defines the contract (schemas/latest.json). It does not inject an update checker into your binary — that can’t be done for an arbitrary, language-agnostic program. Reading latest.json and prompting the user is the product’s own runtime code; recommended shape is default-on, timeout, silent-on-failure, cached, opt-out.

Getting it

brew upgrade wharfy / scoop update wharfy / go install github.com/ShiroDoromoto/wharfy/cmd/wharfy@latest. On Linux, from the apt / yum repo.