SafePass Release Process
This document describes the tag-based release workflow, artifact packaging, integrity verification, and supply-chain guarantees for SafePass.
Overview
SafePass releases are published as GitHub Draft Releases created automatically by .github/workflows/release.yml. Draft status allows the team to inspect built artifacts, check release notes, and conduct final manual review before making the release public.
Release Triggers
The release workflow is triggered by:
- Pushing a version tag:
git push origin v0.1.0(matchingv*.*.*orv*.*.*-*) - Manual trigger via Actions → SafePass draft release → Run workflow (
workflow_dispatch). Select the source ref and provide an existing version tag that points to the same commit.
The workflow checks the tag before building and checks it again before creating the release. Protect release tags from movement and deletion: these checks do not lock a tag during the workflow or provide a signed provenance attestation.
Release Artifacts
The workflow packages the following artifacts and publishes SHA-256 checksums. Platform signing and signed provenance are not yet configured:
| Platform / Target | Artifact Name | Description |
|---|---|---|
| Linux (Desktop) | safepass-<version>-linux-x64.tar.gz |
Flutter release client bundle for Linux desktop (x64) |
| Windows (Desktop) | safepass-<version>-windows-x64.zip |
Flutter release client bundle for Windows desktop (x64) |
| macOS (Desktop) | safepass-<version>-macos-universal.zip |
Flutter universal application bundle (.app) for Apple Silicon and Intel |
| Android | safepass-<version>-android.apk |
Release APK for Android devices |
| Chromium Extension | safepass-<version>-browser-chromium.zip |
Manifest V3 browser extension for Google Chrome, Brave, Chromium |
| Firefox Extension | safepass-<version>-browser-firefox.zip |
Manifest V3 browser extension for Mozilla Firefox |
| Native Messaging Host | safepass-<version>-native-host-linux-x64.tar.gzsafepass-<version>-native-host-windows-x64.zip |
Optional native host executable and registration installer |
| ASP.NET Core API | safepass-<version>-api-linux-x64.tar.gz |
Production build of the SafePass synchronization and OPAQUE API service |
| SPDX SBOM | dependencies.spdx.json |
SPDX 2.3 software bill of materials covering Cargo, npm, pub, and NuGet dependencies |
| Vulnerability Report | osv-results.json |
OSV-Scanner dependency vulnerability audit report |
| License Report | license-report.csv |
Full audit report of third-party package licenses against the repository policy |
| Checksums | checksums.sha256 |
SHA-256 cryptographic digests of all files in the release |
Local Packaging (Linux)
You can assemble all Linux-available artifacts and verify release packaging locally without triggering CI:
bash scripts/package-release-artifacts.sh --version 0.1.0-previewOptions:
--output-dir <DIR>: directory where archives will be assembled (default:.artifacts/releaseunder the repository root). An explicit relative path is resolved from the directory where the command is invoked.--version <VER>: release tag or version identifier.--skip-build: packages existing compiled outputs without running builds again.--components <LIST>: subsets of components (e.g.linux,extensions,api,supply-chain).
For API packaging with --skip-build, place the existing publish output in
.artifacts/api-publish under the repository root. For example, from the root:
dotnet publish services/api/SafePass.Api/SafePass.Api.csproj \
--configuration Release --output .artifacts/api-publish
bash scripts/package-release-artifacts.sh --version 0.1.0-preview \
--components api --skip-buildThe second command archives that output without invoking dotnet, so it can
also run on a packaging machine without the .NET SDK. If the publish directory
is missing, API packaging prints a notice and skips that component. Supply-chain
report generation is separate from compilation and still runs when selected.
Checksum Verification
Every release includes a checksums.sha256 manifest. To verify downloaded artifacts on Linux or macOS:
sha256sum --check --ignore-missing checksums.sha256On Windows (PowerShell):
Get-FileHash -Algorithm SHA256 safepass-*-windows-x64.zipCompare the output hash against the hash listed in checksums.sha256.
Code Signing & Provenance
When platform-specific developer signing credentials (Android keystore, Apple Developer Certificate/Notarization, and Windows Authenticode) are provisioned, signing steps will be linked into their respective build jobs before packaging (see the signing and provenance item in TODO.md).
Until then the Android signing inputs can be checked before a build:
python3 scripts/check-android-release-signing.py --require-keytoolIt fails on a missing SAFEPASS_ANDROID_* variable, an unreadable or
unsupported keystore, a wrong store or key password, an alias that is not a
private-key entry, and a certificate that expires too soon for Google Play
(lifetime below 25 years). Passwords reach keytool through the environment,
so they never appear in a process list or a build log.