Verify Your Download
This page gives every verification command a stranger needs to confirm they received unmodified SigmaShake binaries — without trusting our word and without reading our source code.
We promise published-artifact integrity: what we ship matches what you get. We do not promise reproducible builds (you cannot recompile and expect a bit-identical binary from our source).
Quick summary by channel
Distribution channels. The native
ssgCLI installers stream from the download CDN atdownload.sigmashake.com; Linux containers can also pull the public GHCR image atghcr.io/sigmashakeinc/ssg. The npm (@sigmashake/ssg), PyPI (sigmashake), Homebrew tap, winget CLI manifest, and apt repository channels are discontinued — artifacts there are no longer updated and should not be used. Sections §1–§5 below are retained as historical reference for operators who may still have binaries from those channels on disk.
| Channel | Verification method |
|---|---|
npm info @sigmashake/ssg dist.integrity | |
JSON API + sha256sum | |
Formula sha256 field checked by brew at install | |
InstallerSha256 field checked by winget at install | |
GPG-signed InRelease + SHA256 in Packages | |
| Download CDN — CLI | checksums.sha256 at GitHub Releases (see §11) |
| Docker / GHCR — CLI | OCI index digest + per-platform manifests (see §12) |
| Download CDN — Fleet | .sha256 sidecar + fleet/latest.json + Digest/x-sigmashake-sha256 response headers (after deploy) |
| Download CDN — Linux Desktop (Wails/Go) | .sha256 sidecar + stable-linux-x64-update.json + Digest/x-sigmashake-sha256 response headers (after deploy) |
| Download CDN — macOS Desktop (Swift/Sparkle) | .sha256 sidecar + desktop/swift/latest.json + Digest/x-sigmashake-sha256 response headers (after deploy) |
| Download CDN — Windows Desktop (C#/.NET) | sha256 field in desktop/windows/latest.json + .sha256 sidecar |
| Supply-chain canary | Endpoints live; manifest rows pending first publish cycle (see §13) |
1. npm (discontinued)
This channel is discontinued.
@sigmashake/ssgon npm is no longer updated. Native CLI installers now stream throughdownload.sigmashake.com; Linux containers can use GHCR. The verification commands below apply only to historical builds still present on disk.
The npm registry embeds a SHA-512 SRI digest in every package record.
# Query the registry directly — no download needed
npm info @sigmashake/ssg dist.integrity dist.tarball
Live output (verified 2026-06-10):
dist.integrity = 'sha512-zgw0eKebf4wdQMxifmgDbpH5ACDJKumabLpkBqJtVohbM1+AX0PVmZtNZcyzV9edsr9cdPBU2AiZ0V8nShYvPw=='
dist.tarball = 'https://registry.npmjs.org/@sigmashake/ssg/-/ssg-0.29.155.tgz'
To verify a tarball you already have on disk:
# Download and check
npm pack @sigmashake/ssg
# npm prints the computed SHA-1 (legacy) and warns if the hash deviates.
# For SHA-512 SRI comparison, pipe the tarball through openssl:
curl -sL "$(npm info @sigmashake/ssg dist.tarball)" | \
openssl dgst -sha512 -binary | openssl base64 -A
# Compare with the value of dist.integrity (strip the "sha512-" prefix).
2. PyPI (discontinued)
This channel is discontinued.
sigmashakeon PyPI is no longer updated. Native CLI installers now stream throughdownload.sigmashake.com; Linux containers can use GHCR. The verification commands below apply only to historical builds still present on disk.
PyPI stores per-file SHA-256 digests in its JSON API.
# Look up the current version
curl -sS https://pypi.org/pypi/sigmashake/json | \
python3 -c "import json,sys; print(json.load(sys.stdin)['info']['version'])"
Live output (verified 2026-06-10): 0.29.151
# Get sha256 for a specific version
curl -sS https://pypi.org/pypi/sigmashake/0.29.151/json | \
python3 -c "
import json, sys
d = json.load(sys.stdin)
for u in d['urls']:
print(u['filename'])
print(' sha256:', u['digests']['sha256'])
print(' url: ', u['url'])
"
Live output (verified 2026-06-10):
sigmashake-0.29.151-py3-none-any.whl
sha256: acb2fd8273648a20bf80d9636ee5bda8c7ffb0e67a0dba910794a81dfeaeb60b
url: https://files.pythonhosted.org/packages/.../sigmashake-0.29.151-py3-none-any.whl
To verify a wheel you have already downloaded:
sha256sum sigmashake-0.29.151-py3-none-any.whl
# Must match the sha256 above exactly.
3. Homebrew (macOS) (discontinued)
This channel is discontinued. The
sigmashakeinc/tap/ssgHomebrew formula is no longer updated. Native CLI installers now stream throughdownload.sigmashake.com; Linux containers can use GHCR. The verification commands below apply only to historical builds still present on disk.
The Homebrew formula in sigmashakeinc/homebrew-tap embeds a per-platform SHA-256
that Homebrew checks before installing:
brew install sigmashakeinc/tap/ssg
# Homebrew downloads the tarball from GitHub Releases, verifies sha256, and aborts
# on mismatch before touching your system.
To inspect the formula's expected hash before installing:
brew fetch --formula sigmashakeinc/tap/ssg
# Prints the verified sha256 alongside the download URL.
The canonical formula file is at sigmashake-dist/homebrew/ssg.rb in the monorepo.
The SHA-256 values in that file and the Homebrew tap MUST agree with the GitHub
Release assets. Any divergence is a supply-chain anomaly.
4. winget (Windows) (discontinued)
This channel is discontinued. The
SigmaShake.SSGwinget manifest for the CLI is no longer updated. Native Windows installs now stream throughdownload.sigmashake.comvia the PowerShell installer atinstall.sigmashake.com/install.ps1; Linux containers can use GHCR. The verification commands below apply only to historical builds still present on disk.
The winget manifest (SigmaShake.SSG) carries an InstallerSha256 that winget
verifies at install time before execution. A Pro subscription is required — subscribe
at sigmashake.com/pricing before installing.
winget install SigmaShake.SSG
# winget downloads the zip, computes SHA-256, and refuses to install on mismatch.
To inspect the current manifest hash without installing:
winget show SigmaShake.SSG
The canonical manifest source is sigmashake-dist/winget/SigmaShake.SSG.installer.yaml.
5. apt (Debian / Ubuntu) (discontinued)
This channel is discontinued. The APT repository at
apt.sigmashake.comis no longer updated. Native Linux installs now stream throughdownload.sigmashake.comvia the one-line installer atinstall.sigmashake.com; Linux containers can use GHCR. The verification commands below apply only to historical builds still present on disk.
The APT repository at https://apt.sigmashake.com is GPG-signed:
- Signing key fingerprint:
A6A1FA60DC38EE17CA443389F562E7E136D128FA(RSA-4096, expires 2031-05-25) - Key file:
https://apt.sigmashake.com/sigmashake.gpg
Every package index (dists/stable/InRelease) carries an inline GPG signature over
a SHA-256 hash of each Packages file. apt verifies the full chain before
installing any .deb.
# Fetch and inspect the GPG-signed Release file
curl -sS https://apt.sigmashake.com/dists/stable/InRelease | head -5
# Should start: -----BEGIN PGP SIGNED MESSAGE-----
# Verify the Release file signature offline
curl -sS https://apt.sigmashake.com/sigmashake.gpg | gpg --import
curl -sS https://apt.sigmashake.com/dists/stable/InRelease | gpg --verify
# Inspect SHA-256 of the package
curl -sS "https://apt.sigmashake.com/dists/stable/main/binary-amd64/Packages" | \
awk '/^Package: ssg/{found=1} found && /^SHA256:/{print; found=0}'
Live output (verified 2026-06-10):
-----BEGIN PGP SIGNED MESSAGE-----
...
SHA256: 1e1489b64ea6f8a464aefce30c67e6d125f8264414b68698053ba640be450f29
6. Download CDN — inline integrity headers
As of the worker change on 2026-06-10 (pending deploy), the download CDN sets two response headers on artifact files whenever a checksum source is available:
| Header | Value |
|---|---|
Digest | sha-256=<base64(raw-sha256-bytes)> (RFC 3230) |
x-sigmashake-sha256 | SHA-256 in lowercase hex |
The worker resolves the hash through a three-level fallback chain:
- Native R2 checksum (set at upload time for new pipeline uploads)
- R2 custom metadata
sha256field (set by upload routes when the authenticated caller suppliesX-Sha256or?sha256=on multipart init) .sha256sidecar object (companion file at<key>.sha256, already present for Wails and fleet artifacts)
Headers are not set when none of these sources exist. A missing header means the sidecar path has not been populated yet, not that the artifact is suspect — the primary verification method remains the sidecar and out-of-band checksum files documented in the sections below.
Verify the inline header (Wails example):
# Fetch headers only — does not download the binary
curl -sI https://download.sigmashake.com/desktop/wails/stable-linux-x64-SigmaShakeDesktop.tar.gz \
| grep -i 'x-sigmashake-sha256\|digest'
Expected output (after deploy):
digest: sha-256=IF+s0aIr8gzLId18nCzDGWI9tAuVl22nmfy2h7jTon...
x-sigmashake-sha256: 205afcd1a22bf20ccb21d7c9c2cc3196523db40b95976da79facb287b8d3a27b
Cross-check with the sidecar:
curl -sS https://download.sigmashake.com/desktop/wails/stable-linux-x64-SigmaShakeDesktop.tar.gz.sha256
# Must match x-sigmashake-sha256 above.
These two sources use different code paths (response header vs. separate R2 object fetch). Agreement between them provides independent confirmation without requiring a full binary download.
7. Download CDN — Fleet
The Fleet CDN channel provides two independent hash sources that must agree:
Source A: .sha256 sidecar file
# Get sha256 for the linux-amd64 tarball
curl -sS https://download.sigmashake.com/fleet/stable/1.0.0/sigmashake-fleet-1.0.0-linux-amd64.tar.gz.sha256
Live output (verified 2026-06-10):
f065b9f61a990cf1035cc7d9d013af59afb9144f55ebf81012af059d870e8996 sigmashake-fleet-1.0.0-linux-amd64.tar.gz
Source B: fleet/latest.json
curl -sS https://download.sigmashake.com/fleet/latest.json | \
python3 -c "import json,sys; d=json.load(sys.stdin); print(d['artifacts']['linux-amd64-tarball']['sha256'])"
Live output (verified 2026-06-10): f065b9f61a990cf1035cc7d9d013af59afb9144f55ebf81012af059d870e8996
Both sources must agree. After downloading:
sha256sum sigmashake-fleet-1.0.0-linux-amd64.tar.gz
# Must match both sources above.
8. Download CDN — Linux Desktop (Wails/Go)
The Wails update channel publishes a .sha256 sidecar and embeds the same hash in the
update manifest:
Source A: .sha256 sidecar
curl -sS https://download.sigmashake.com/desktop/wails/stable-linux-x64-SigmaShakeDesktop.tar.gz.sha256
Live output (verified 2026-06-10):
205afcd1a22bf20ccb21d7c9c2cc3196523db40b95976da79facb287b8d3a27b stable-linux-x64-SigmaShakeDesktop.tar.gz
Source B: update manifest
curl -sS https://download.sigmashake.com/desktop/wails/stable-linux-x64-update.json | \
python3 -c "import json,sys; d=json.load(sys.stdin); print('version:', d['version'], '\nhash:', d['hash'])"
Live output (verified 2026-06-10):
version: 0.1.111
hash: 205afcd1a22bf20ccb21d7c9c2cc3196523db40b95976da79facb287b8d3a27b
Both must agree. The hash field is SHA-256 hex of the .tar.gz file.
9. Download CDN — macOS Desktop (Swift/Sparkle)
The native Swift/AppKit macOS desktop ships signed .dmg artifacts through the
desktop/swift/ R2 channel. Sparkle polls desktop/swift/appcast.xml for updates;
desktop/swift/latest.json is the display pointer read by ssg probe desktop.
Source A: .sha256 sidecar
# Replace <filename> with the actual .dmg filename from latest.json
curl -sS https://download.sigmashake.com/desktop/swift/latest.json | \
python3 -c "import json,sys; d=json.load(sys.stdin); print('version:', d['version'])"
# Then fetch the sidecar for the named artifact:
curl -sS "https://download.sigmashake.com/desktop/swift/<filename>.sha256"
Source B: Digest / x-sigmashake-sha256 response headers
# Fetch headers only — does not download the binary
curl -sI "https://download.sigmashake.com/desktop/swift/<filename>.dmg" \
| grep -i 'x-sigmashake-sha256\|digest'
Both sources use the same three-level fallback chain described in §6. After downloading:
# macOS
shasum -a 256 SigmaShakeDesktop-<version>.dmg
# Must match the sidecar value.
Note: Sparkle checks macOS code-signing (Gatekeeper) at mount time. The appcast does not
currently carry a Sparkle Ed25519 edSignature field — that gap is listed in the
Limitations section below.
10. Download CDN — Windows Desktop (C#/.NET)
The Windows desktop channel embeds a SHA-256 in desktop/windows/latest.json:
curl -sS https://download.sigmashake.com/desktop/windows/latest.json | \
python3 -c "import json,sys; d=json.load(sys.stdin); print('version:', d['version'], '\nsha256:', d['sha256'])"
Live output (verified 2026-06-10):
version: 0.1.116
sha256: 5410758aed1614d7879299080306d68c2df0c2ee1eff9c431a1030c1d5ac5f92
After downloading the installer, verify before running it:
# PowerShell
(Get-FileHash "SigmaShakeDesktop-Setup-0.1.116.exe" -Algorithm SHA256).Hash.ToLower()
# Must match sha256 above.
11. CLI — GitHub Releases checksums
The CLI binary tarballs are served from GitHub Releases. A checksums.sha256 file is
published alongside each release. Note: the file is host-OS gated — the current
release was built on macOS and therefore only contains darwin-x64 and darwin-arm64
hashes. Linux and Windows hashes appear when the corresponding build host runs.
# Fetch the checksum file for a specific release
curl -sL https://github.com/sigmashakeinc/ssg/releases/download/v0.29.156/checksums.sha256
Live output (verified 2026-06-10):
# ssg 0.29.156 — SHA256 checksums
# Generated: 2026-06-07T00:42:08Z
# Host OS: darwin — targets: darwin-x64 darwin-arm64
ce0aa94c18dcb1fb473cfaf2315e52915495b93f4bea346d531ce0e5b57edf9a ssg-darwin-x64
18db7cee472af734fc5aeb3d9534b68cb0207954f47b21243aa143984b6e4c6d ssg-darwin-arm64
f5199a6b821a8247d2c0ccad92f2c9a4e00acf3834212b5afa405f0119cf25e6 ssg-darwin-x64.tar.gz
4cef529fac400b7d64f65120fb76020f5f4fbc8bb666b3d51b85aad01341989b ssg-darwin-arm64.tar.gz
To verify a downloaded tarball:
sha256sum ssg-darwin-arm64.tar.gz
# Must match the line for ssg-darwin-arm64.tar.gz above.
12. Docker / GHCR
The public Docker image is published as a multi-arch OCI index:
docker buildx imagetools inspect ghcr.io/sigmashakeinc/ssg:1.0.7
Live output (verified 2026-06-28):
Name: ghcr.io/sigmashakeinc/ssg:1.0.7
MediaType: application/vnd.oci.image.index.v1+json
Digest: sha256:d41e347e6aa8b00d0d311782c7c1f0d69687f78585b33bdad147505f46534b39
Manifests:
Platform: linux/amd64
Platform: linux/arm64
Runtime smoke:
docker run --pull=always --rm ghcr.io/sigmashakeinc/ssg:1.0.7 --version
# 1.0.7
The mutable tags 1.0 and latest currently resolve to the same OCI index
digest. Pin 1.0.7 or the digest above for reproducible deployments.
13. Supply-chain canary
The supply-chain canary at canary.sigmashake.com re-fetches and re-hashes each
published artifact every 15 minutes and writes the result to a signed manifest.
It currently covers four channels: npm, PyPI, VS Code Marketplace, and
download.sigmashake.com (r2-download).
Infrastructure status (verified 2026-06-10)
The canary Worker and its Ed25519 public key are live:
# Liveness probe
curl -sS https://canary.sigmashake.com/healthz
# {"ok":true,"service":"sigmashake-canary"}
The canary manifest currently has zero artifact rows. The
post-publish-record.ts pipeline that writes signed rows after each publish has
not yet run against the live estate. The verify endpoint and the pubkey endpoint are
fully operational; the artifact ledger will populate on the next publish cycle.
Fetch and cache the public key
The Ed25519 SPKI public key authenticates every manifest row. Fetch it once and store it offline:
curl -sS https://canary.sigmashake.com/.well-known/canary-pubkey
Live output (verified 2026-06-10):
{
"algorithm": "Ed25519",
"format": "spki-hex",
"issued_by": "sigmashake-canary",
"active_public_key_hex": "302a300506032b65700321009df75e2d00cb7af16b90463524b422e5282efcc1cdc1f4e8f59caa935fe1689f",
"keys": [
{
"kid": "canary-39c90dfa47a321fe",
"public_key_hex": "302a300506032b65700321009df75e2d00cb7af16b90463524b422e5282efcc1cdc1f4e8f59caa935fe1689f",
"state": "active",
"activated_at": 1779391872,
"revoked_at": null
}
]
}
Convert the hex key to a PEM file for offline use:
curl -sS https://canary.sigmashake.com/.well-known/canary-pubkey | python3 -c "
import sys, json, binascii, base64
data = json.load(sys.stdin)
hex_key = data['active_public_key_hex']
der = binascii.unhexlify(hex_key)
b64 = base64.b64encode(der).decode()
print('-----BEGIN PUBLIC KEY-----')
for i in range(0, len(b64), 64):
print(b64[i:i+64])
print('-----END PUBLIC KEY-----')
" > canary-pubkey.pem
# Confirm openssl recognises it as Ed25519
openssl pkey -pubin -in canary-pubkey.pem -noout -text
# Should print: ED25519 Public-Key:
Live output (verified 2026-06-10): openssl printed ED25519 Public-Key: and the
32-byte public key matching the hex above.
Query a manifest row (once rows exist)
# npm example
curl -sS "https://canary.sigmashake.com/api/v1/verify/npm/%40sigmashake%2Fssg/0.29.155"
# PyPI example
curl -sS "https://canary.sigmashake.com/api/v1/verify/pypi/sigmashake/0.29.151"
# VS Code Marketplace example
curl -sS "https://canary.sigmashake.com/api/v1/verify/vscode-marketplace/sigmashake.sigmashake-ssg/0.1.9"
A populated row returns:
{
"registry": "npm",
"package": "@sigmashake/ssg",
"version": "0.29.155",
"filename": "ssg-0.29.155.tgz",
"sha256": "<hex>",
"byte_size": 12345678,
"signed_at": 1779391900,
"signing_kid": "canary-39c90dfa47a321fe",
"provenance": "publish-time",
"r2_manifest_key": "artifacts/<id>.json",
"last_verification": {
"status": "ok",
"verified_at": 1781068000,
"observed_sha256": "<hex>",
"http_status": 200,
"duration_ms": 120
}
}
The /api/v1/verify response contains the recorded hash and the last observed hash
from the independent re-verification. If sha256 and last_verification.observed_sha256
agree and status is ok, the artifact has not drifted since the last 15-minute check.
The row's Ed25519 signature is stored in the database but is not returned by this
endpoint (it is embedded in the R2 object at r2_manifest_key). Full offline
signature verification requires fetching that object. The operator-side tooling for
this is on the provenance roadmap.
Canary coverage (as of 2026-06-10)
Channels monitored (re-fetched and re-hashed every 15 minutes):
- npm (
@sigmashake/ssg) - PyPI (
sigmashake) - VS Code Marketplace (
sigmashake.sigmashake-ssg) - download.sigmashake.com (r2-download)
Channels NOT yet canary-monitored: Homebrew, winget, apt, Flatpak, Docker / GHCR,
the three desktop update feeds (Wails stable-*-update.json, Sparkle appcast.xml,
Windows latest.json). GHCR is public but not yet on the canary. Extending coverage to these channels is tracked on the
provenance roadmap.
Hourly Merkle anchoring
Every hour the canary computes a Merkle root over all manifest rows and anchors it to
the hub transparency log (hub.sigmashake.com). The manifest_roots D1 table records
each root alongside a chain link (prev_root_hash). Re-writing a past row silently
requires compromising both the canary D1 database and the hub transparency log
simultaneously.
Current status: roots are written and anchored. The rows themselves carry
signature = "unsigned" and signing_kid = "pending" until the operator-side
root-signing tooling (Priority 1 of the provenance roadmap) is wired in. A signed
root means even a full canary-plus-R2 compromise cannot rewrite history without
detection.
Limitations and honest gaps
The following verification mechanisms are not yet available:
| Gap | Impact |
|---|---|
| Canary manifest currently empty | The /api/v1/verify endpoint works but returns 404 until post-publish-record.ts has run for at least one publish cycle |
RFC-3230 Digest + x-sigmashake-sha256 HTTP headers | As of the worker change on 2026-06-10 (pending deploy), these headers fire whenever a checksum source is available: the worker resolves sha256 from native R2 checksums, then R2 custom metadata, then a .sha256 sidecar object. Wails (Linux), Swift (macOS), Windows, and fleet artifacts already have sidecars in place, so these channels will serve integrity headers immediately after deploy. Legacy Tauri artifacts and Voice artifacts without a sidecar continue to serve no header rather than a wrong header. The frozen desktop/electrobun/ R2 channel is no longer published to; existing objects there may or may not have sidecars. |
| Canary Merkle roots are unsigned | Roots are anchored to the hub but carry signature = "unsigned" pending operator-side signing tooling |
Linux CLI checksums.sha256 | Host-OS gated; the current GH release was built on macOS, so only darwin hashes appear in the checksum file |
macOS Sparkle appcast has no edSignature | The Swift desktop update feed does not currently carry a Sparkle Ed25519 signature; Sparkle's own code-signing check applies at install time via macOS Gatekeeper |
| Homebrew and winget hashes are not live-queryable | The SHA-256 values are in the formula / manifest source files and in the downloaded tarballs; there is no separate public hash endpoint |
| No reproducible-build claim | We promise the published artifact matches what you download; we do not promise that recompiling from source produces a bit-identical binary |
Provenance questions or discrepancies: security@sigmashake.com