Skip to content

Packaging & Release

How talkrypt is built, packaged, hashed, and verified for every platform. Full detail: docs/PACKAGING.md, docs/packaging-policy.md. Scripts: scripts/.

One command

bash scripts/release.sh            # desktop + mobile, then one unified set of checksums
bash dist/verify.sh dist           # verify everything (bash)
pwsh  dist/verify.ps1 -Dir dist    # verify everything (PowerShell)

release.sh runs the desktop and mobile packagers and then hashes the whole dist/. Each step records (never hides) any target it can't build on the current host.

Scripts

Script Builds
scripts/package.sh Desktop: macOS .dmg+.tar.gz, Linux .tar.gz+.deb, Windows .zip
scripts/package-mobile.sh Android .apk (+ iOS .xcframework on a Mac with Xcode)
scripts/build-ios.sh iOS XCFramework + Swift bindings; --testflight to archive + upload
scripts/hash-dist.sh SHA-256 and SHA3-256 over all of dist/ + the verifiers
scripts/build-portable.sh Bare self-contained per-target talkrypt binaries

Artifacts

Platform Artifact
macOS talkrypt-<v>-macos.dmg (universal) + per-arch .tar.gz
Linux glibc …-{x86_64,aarch64}-unknown-linux-gnu.tar.gz + talkrypt_<v>_{amd64,arm64}.deb
Linux static (musl) …-…-linux-musl.tar.gz + talkrypt-static_<v>_{amd64,arm64}.deb
Windows talkrypt-<v>-x86_64-pc-windows-gnu.zip
Android talkrypt-<v>-android-arm64.apk
iOS talkrypt-<v>-ios-xcframework.zip (on a Mac with Xcode)

The glibc .deb is the package talkrypt; the fully-static musl .deb is talkrypt-static (it Conflicts/Provides talkrypt, so install one). Linux targets cross-compile via cross (Docker).

Dual-family integrity (SHA-256 + SHA3-256)

Every release ships two independent checksum files — SHA256SUMS (SHA-256, FIPS 180-4, Merkle–Damgård) and SHA3-256SUMS (SHA3-256, FIPS 202, Keccak sponge). Both must match for every file: the families are structurally unrelated, so a cryptanalytic break or deliberate collision in one cannot also satisfy the other.

verify.sh (bash) and verify.ps1 (PowerShell) check both, print OK/FAIL per file, and exit non-zero on any mismatch. They auto-detect a SHA3 backend (openssl 3.x / python3 / rhash, or .NET 8's SHA3_256 on Windows) and fall back gracefully. MANIFEST.txt lists sizes, both digests, and every skipped target with the reason (e.g. "no Xcode → iOS skipped"), never a silent omission.

Signing (the honest gap)

There is no trusted code-signing authority: macOS bundles are ad-hoc signed (Gatekeeper still warns), the .debs and the APK are not authority-signed, nothing is notarized. Integrity rests on the dual checksums and on building from source (SECURITY-AUDIT.md F-8).

Packaging political filter

Distributing the source is unconditional (Apache-2.0, builds everywhere). Endorsing a downstream channel (a distro repo, a tap, a store) is gated by docs/packaging-policy.md: a Tier-1 channel's host must have publicly committed to never implement government-mandated age-verification or identity-attestation. The gate is about endorsement, not access — anyone may build and run talkrypt.