Skip to main content

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 ssg CLI installers stream from the download CDN at download.sigmashake.com; Linux containers can also pull the public GHCR image at ghcr.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.

ChannelVerification method
npm (discontinued)npm info @sigmashake/ssg dist.integrity
PyPI (discontinued)JSON API + sha256sum
Homebrew (discontinued)Formula sha256 field checked by brew at install
winget (discontinued)InstallerSha256 field checked by winget at install
apt (discontinued)GPG-signed InRelease + SHA256 in Packages
Download CDN — CLIchecksums.sha256 at GitHub Releases (see §11)
Docker / GHCR — CLIOCI 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 canaryEndpoints live; manifest rows pending first publish cycle (see §13)

1. npm (discontinued)

This channel is discontinued. @sigmashake/ssg on npm is no longer updated. Native CLI installers now stream through download.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. sigmashake on PyPI is no longer updated. Native CLI installers now stream through download.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/ssg Homebrew formula is no longer updated. Native CLI installers now stream through download.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.SSG winget manifest for the CLI is no longer updated. Native Windows installs now stream through download.sigmashake.com via the PowerShell installer at install.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.com is no longer updated. Native Linux installs now stream through download.sigmashake.com via the one-line installer at install.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:

HeaderValue
Digestsha-256=<base64(raw-sha256-bytes)> (RFC 3230)
x-sigmashake-sha256SHA-256 in lowercase hex

The worker resolves the hash through a three-level fallback chain:

  1. Native R2 checksum (set at upload time for new pipeline uploads)
  2. R2 custom metadata sha256 field (set by upload routes when the authenticated caller supplies X-Sha256 or ?sha256= on multipart init)
  3. .sha256 sidecar 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:

GapImpact
Canary manifest currently emptyThe /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 headersAs 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 unsignedRoots are anchored to the hub but carry signature = "unsigned" pending operator-side signing tooling
Linux CLI checksums.sha256Host-OS gated; the current GH release was built on macOS, so only darwin hashes appear in the checksum file
macOS Sparkle appcast has no edSignatureThe 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-queryableThe 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 claimWe 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