docs/install-script-latest-release-verification.md
curl -fsSL https://myflow.sh/install.sh | sh Installs the Latest Flow ReleaseUse this runbook whenever you need to prove that the public installer is actually pulling the current latest stable Flow release.
The fastest repo-local check is now:
./scripts/verify-install-latest-release.sh
Or through Flow:
f verify-install-latest-release
This is the check that matters for users:
curl -fsSL https://myflow.sh/install.sh | sh
After a stable release, these values must all agree:
Cargo.toml package versionvX.Y.Zreleases/latest tag~/.flow/bin/fIf any one of those differs, the public install story is broken.
The script performs all of these checks:
Cargo.toml via scripts/check_release_tag_version.pyreleases/latest until it matches the expected tagHOMEDefault usage:
./scripts/verify-install-latest-release.sh
Useful options:
./scripts/verify-install-latest-release.sh --latest-timeout 300
./scripts/verify-install-latest-release.sh --tag v0.1.3
./scripts/verify-install-latest-release.sh --skip-asset
./scripts/verify-install-latest-release.sh --keep-temp
Run this after:
install.shThe installer is correct only if all of these are true:
Cargo.tomlIf the one-command script fails, use the manual steps below to see exactly where the mismatch is.
Read the package version from the repo:
python3 - <<'PY'
import pathlib, re
text = pathlib.Path("Cargo.toml").read_text(encoding="utf-8")
match = re.search(r'^version\s*=\s*"([^"]+)"', text, re.MULTILINE)
if not match:
raise SystemExit("failed to read Cargo.toml version")
print(match.group(1))
PY
If you already know the expected tag, validate it directly:
python3 scripts/check_release_tag_version.py v0.1.3
That script should fail hard on mismatches.
Check the public API that the installer uses:
curl -fsSL https://api.github.com/repos/nikivdev/flow/releases/latest \
| python3 -c 'import sys,json; print(json.load(sys.stdin)["tag_name"])'
This should print the expected stable tag, for example:
v0.1.3
Optional cross-checks:
gh release list --limit 5
gh release view v0.1.3 --json tagName,publishedAt,isDraft,isPrerelease,url
This is the main test. Use a fresh HOME and a minimal PATH so an existing install cannot leak in.
tmp_home="$(mktemp -d)"
echo "$tmp_home"
HOME="$tmp_home" PATH="/usr/bin:/bin:/usr/sbin:/sbin" sh -c \
'curl -fsSL https://myflow.sh/install.sh | sh'
HOME="$tmp_home" "$tmp_home/.flow/bin/f" --version
Expected result:
~/.flow/bin/f exists under the temp homef --version reports the latest stable versionExample expected output:
flow 0.1.3
Use this one-shot comparison:
latest_tag="$(curl -fsSL https://api.github.com/repos/nikivdev/flow/releases/latest \
| python3 -c 'import sys,json; print(json.load(sys.stdin)["tag_name"])')"
tmp_home="$(mktemp -d)"
HOME="$tmp_home" PATH="/usr/bin:/bin:/usr/sbin:/sbin" sh -c \
'curl -fsSL https://myflow.sh/install.sh | sh >/dev/null'
installed_version="$(HOME="$tmp_home" "$tmp_home/.flow/bin/f" --version \
| python3 -c 'import sys,re; m=re.search(r"flow ([0-9][^ ]*)", sys.stdin.read()); print(m.group(1) if m else "")')"
echo "latest_tag=$latest_tag"
echo "installed_version=$installed_version"
test "v$installed_version" = "$latest_tag"
If that final test fails, the installer path is not trustworthy.
If the fresh install reports the wrong version, download the release asset directly.
Choose the target for your machine:
aarch64-apple-darwinx86_64-apple-darwinx86_64-unknown-linux-gnuaarch64-unknown-linux-gnuExample for macOS Apple Silicon:
latest_tag="$(curl -fsSL https://api.github.com/repos/nikivdev/flow/releases/latest \
| python3 -c 'import sys,json; print(json.load(sys.stdin)["tag_name"])')"
tmp_dir="$(mktemp -d)"
cd "$tmp_dir"
curl -fsSLO \
"https://github.com/nikivdev/flow/releases/download/${latest_tag}/flow-aarch64-apple-darwin.tar.gz"
tar -xzf flow-aarch64-apple-darwin.tar.gz
./f --version
Interpretation:
Symptom:
python3 scripts/check_release_tag_version.py vX.Y.Z failsMeaning:
Fix:
Cargo.tomlreleases/latest still returns the old tagSymptom:
releases/latest still returns the old tag for a short timeMeaning:
Fix:
releases/latest flipsSymptom:
releases/latest returns the new tagMeaning:
Fix:
fSymptom:
f --versionMeaning:
PATHFix:
which -a f
~/.flow/bin/f --version
After publishing a stable tag:
python3 scripts/check_release_tag_version.py vX.Y.Zreleases/latest returns vX.Y.Z./scripts/verify-install-latest-release.shDo not mark the release done until step 4 is green.