v0.4.2
Signedpublished August 14, 2026What changed
Fixed
- After a rollback, every later install run refused to upgrade — silently.
--rollbackpointsdevgrail-server:latestback at the displaced build, butversions.envis written before the health gate and so still names the release that was rolled off. The skip-if-unchanged check compared that file against the registry and asked only whether something was tagged:latest, so it concluded "already at vX — skipping" and did nothing: the host kept running the old binary whileversions.env, the installer's own closing banner and any script reading them all reported the new one./healthzwas the only thing telling the truth, and disagreeing with it looked like a stale response rather than the symptom it was. The only way forward was to deleteversions.envby hand, which nothing documented. The check now asks whether:latestis that version — it compares against the release tagdocker loadgave those exact bytes — and when it is not, moves the tag back to them rather than re-downloading images that are already on the host.--dry-runreports that state instead of calling it unchanged, and--rollbacknow says plainly thatversions.envnames the release it rolled off and that re-running goes forward again.
Container images
Installer files
Signature
ecdsa-p256-sha256key f1f1eaf642454d65
One signature covers every artifact above. It is made off this host, and neither this site nor the registry behind it can check it — that is the point, and it is why verifying it catches things a checksum from the same server cannot. How to verify it.
Verify devgrail-container (amd64)
curl -fsSL https://web-dev.trixibot.com/api/registry/releases/v0.4.2 -o release.json
# -j, not -r: -r appends a newline the signer never saw, and the check fails.
jq -j '.signature.payload' release.json > payload
jq -r '.signature.signature' release.json | base64 -d > payload.sig
openssl dgst -sha256 -verify devgrail-release.pem -signature payload.sig payload
# -> Verified OK
# The payload must name this release, so an older signed one cannot be replayed.
head -2 payload
# ...and it must name this exact file. -qxF: whole line, literal.
grep -qxF 'image devgrail-container 10 amd64 a1224587a2178c951a818744763ffd6f83a3393cc3597a6e8bbebc6d91cbf859' payload && echo "digest is covered by the signature"The signed payload — shown for reading, not for verifying
Copy this from the manifest with jq -j, never from this page: the signature covers exact bytes, and rendering here drops the trailing newline the signer included.
devgrail-release-signature-v1
release v0.4.2
asset docker-compose.yml 9 d716c3cd9ffd1f4a87caacb8d1b444646f9cf388949d8c2805d2676981307abc
asset install.sh 9 5003a27505f99c6ef5048466ea39f6a3dd8d7d39ac1db5e188cdeba3b0aca9e5
asset traefik-dynamic-http.yml 8 e344c8efd13c7d84996e2ebfbc75dcee2d995d8538c8a245c89c0e44fad0089b
asset traefik-dynamic.yml 9 d18fa561b8eb7d53b015284e0246b2d05953bf281b65269c1fae3d6883530db6
asset uninstall.sh 9 d8f09fe906e13f57bc308f6f2340972a62b010c367174ec79597c86a84c706be
image devgrail-container 10 amd64 a1224587a2178c951a818744763ffd6f83a3393cc3597a6e8bbebc6d91cbf859
image devgrail-container 10 arm64 3f586875d62d39aac09ea020586efd5f6eee7724616009c6d85d9893ee7c31e9
image devgrail-server 10 amd64 b35069206865fecfdef3ee3d8008a9972f447fffddf4814cd6cf390990b99bea
image devgrail-server 10 arm64 9fe4df69b6499e3f5d135a37181e65cf44b55de8363661ff1ae19b4449e95e28