Artifacts & Proofs
Everything Pollis ships publicly (desktop app, terminal client, verifier), with the transparency-log proof that the bytes you download are the bytes we published.
pollis-verify command-line tool (source-available; see the
FAQ on licensing) or query the
public verification API directly (rate limits apply). Only the CLI gives a
verdict that doesn't depend on trusting us.
New to this? Learn: reading this page explains what a root is, what an inclusion tick means, and what a green badge does not prove.
Latest releases
The current version of each output and where to get it. For the desktop app, the table lists every installer and whether its bytes are committed to the public binaries transparency log.
Loading desktop release…
Loading release proofs…
Loading CLI release…
Re-checks everything on this page against the one pinned key, without trusting our server. Prebuilt
Linux and macOS binaries (with .sha256 files) ship on the pollis-verify-*
releases, but building from source is better: a verifier we hand you is one we could have tampered with.
The licence is PolyForm Noncommercial 1.0.0. That is source-available, not OSI open source; it limits what
you may ship, not what you may audit.
-
cargo build -p verifiable-log-serve --bin pollis-verifyproduces./target/debug/pollis-verify
Daily transparency self-audit
Pollis publishes three append-only Merkle logs: the commit log (conversation history), account keys (published identity keys) and binaries (release hashes). A scheduled job re-audits all three daily and republishes their signed tree heads, which let anyone holding the pinned log key check that each log is append-only and unforked. This section only displays the current heads; it cannot prove consistency in your browser. The verification docs and the transparency-publish workflow / run logs show how to check it yourself.
Loading signed tree heads…
The one key you trust
Every signature above, on every tree head and every release, is checked against one pinned public key. It is an ML-DSA-44 (post-quantum) key, so signed statements about history stay checkable long after they were made (#668). It is new key material: the earlier Ed25519 key and its seed were retired, not re-encoded.
Checking served key against the pinned constant…
This is the only check your browser performs: it compares the key the server serves, character by
character, with the constant in this page. If the constant were missing, the page would say no check
ran rather than imply a match. Every other verdict here is computed by the server; re-run it with
pollis-verify to check it yourself.
WHAT AN AUDITOR RUNS
-
pollis-verify remote https://verify.pollis.comre-audit all three whole logs over HTTP -
pollis-verify release https://verify.pollis.com <tag>verify one release's shipped binaries are in the log -
pollis-verify group https://verify.pollis.com <conversation_id>verify one conversation's commit history is fork-free -
pollis-verify account https://verify.pollis.com <user_id>verify one user's published key history
VERIFICATION API
Base: https://verify.pollis.com. Example read endpoints anyone can fetch:
/v1/sth/latest.json, /v1/binaries/sth/latest.json, and
/verify/release/<tag>.
The second anchor: Sigstore, SLSA and the SBOM
Everything above trusts one Pollis-held key. These checks trust no Pollis key at all. Every release
artifact also carries a keyless cosign signature and a SLSA build-provenance attestation,
both recorded in Sigstore's public Rekor log, which Pollis does not operate and cannot
retract from. The signing identity is the release workflow, so a signature asserts
"this file came out of desktop-release.yml at this tag", not "someone at Pollis
approved this".
1 · FETCH THE ARTIFACT AND ITS EVIDENCE
Use the version-pinned path. releases/latest/ holds installers only, with no signature,
certificate or attestation, so verification against it cannot work.
-
BASE=https://cdn.pollis.com/releases/v1.17.4 ART=pollis-v1.17.4-windows.exe REPO=pollis-app/pollis # the signer: actuallydan/pollis up to v1.17.2 curl -sSLO "$BASE/$ART" # the artifact curl -sSLO "$BASE/$ART.sig" # cosign detached signature curl -sSLO "$BASE/$ART.pem" # cosign signing certificate curl -sSLO "$BASE/$ART.intoto.jsonl" # SLSA build-provenance attestationSubstitute any released tag and any of-macos.dmg,-windows.exe,-linux.AppImage,-linux.deb,-linux.rpm.REPOis the repository that built the tag: the project moved fromactuallydan/pollistopollis-app/pollisafter v1.17.2, and a release's certificate names the repository it was built in.
2 · VERIFY THE COSIGN SIGNATURE
-
cosign verify-blob \ --certificate-identity-regexp "^https://github\.com/$REPO/\.github/workflows/desktop-release\.yml@refs/tags/v.*$" \ --certificate-oidc-issuer https://token.actions.githubusercontent.com \ --signature "$ART.sig" \ --certificate "$ART.pem" \ "$ART"PrintsVerified OK. Don't drop the identity pattern: without it cosign accepts a signature from any Sigstore identity. cosign 3.x prints a deprecation notice for--signatureand--certificate; the check still passes.
3 · VERIFY THE SLSA BUILD PROVENANCE
-
gh attestation verify "$ART" \ --bundle "$ART.intoto.jsonl" \ --repo "$REPO" \ --cert-identity-regex "^https://github\.com/$REPO/\.github/workflows/desktop-release\.yml@refs/tags/v.*$" \ --cert-oidc-issuer https://token.actions.githubusercontent.comPrints✓ Verification succeeded!and names the workflow and tag.ghprints that banner only to a terminal, so in a script check for exit status0. The flag is--cert-identity-regex(no trailing "p"). -
slsa-verifier verify-artifact "$ART" \ --provenance-path "$ART.intoto.jsonl" \ --source-uri "github.com/$REPO" \ --source-tag v1.17.4The same check with a standalone verifier, if you'd rather not have GitHub's CLI grade GitHub's attestation.
4 · READ THE DEPENDENCY LIST (SBOM)
Each release publishes a CycloneDX SBOM at $BASE/pollis-<tag>.cdx.json, built from
Cargo.lock and pnpm-lock.yaml at the tagged commit. It is a provenance subject,
so its digest is in Rekor with the installers and a later replacement would be detectable. Verify it like
any other artifact, then read it:
-
curl -sSL "$BASE/pollis-v1.17.4.cdx.json" | jq '.components | length'SBOMs begin at the first release after 16 August 2026; earlier tags have no.cdx.jsonand the URL returns 404. See the limits below.
Where this guarantee ends:
cosign and SLSA prove build provenance: these bytes came from that workflow, at that tag, in that repository, and the record sits in a public log Pollis does not control. They do not prove the bytes reproduce from source (that is the separate rebuild check, which covers the Linux AppImage only), and they do not prove the source was good. A workflow building bad source produces a valid attestation.
GitHub Actions is inside the trust boundary, as the whitepaper states. Anyone who can alter the release workflow, or GitHub itself, can mint a signature that verifies. This anchor takes Pollis's key out of the trust path, not GitHub.
Provenance is not a release gate, and two early releases shipped without it. Signatures and attestations stay on the CDN indefinitely, but installers older than the last three releases are pruned; GitHub Releases is the permanent archive for those.
The SBOM lists what the lockfiles resolved to, not what the linker consumed. Vendored C and C++ compiled
in build scripts (notably webrtc-sys and webrtc-audio-processing-sys) is not
listed. The SBOM is also not yet a leaf in the binaries transparency log.
What these proofs do and don't say:
The binaries log and payload hashes prove the published bytes match and are committed to a public append-only log. They do not show that every platform reproduces byte-for-byte from source. Linux payload reproduction is documented (reproducible-builds-residuals.md); macOS and Windows are published-bytes-match only.
The transparency logs prove that commit history, published keys and binaries were not forked, rolled back or shown differently to different people, trusting only the pinned log key. They do not prove the server behaves correctly in real time, and they provide no anonymity.
The Delivery Service is a hosted service, not a download, so it isn't listed here. Its
/version endpoint reports the git SHA of the running build.