Development
Deployments
Release workflows, binary assets, desktop notarization, and Homebrew tap automation.
Deployments
Tagged releases run through .github/workflows/ci.yml.
Release checks
Pull requests, pushes to main, and release tags run RustSec audits of both Cargo.lock and desktop/src-tauri/Cargo.lock, plus pnpm audit --audit-level low for the desktop lockfile. The audits include development dependencies and use current advisory data. Rust vulnerabilities and frontend advisories at any severity fail CI; advisory service failures also fail the check. RustSec maintenance and unsoundness warnings remain visible for review, including upstream GTK and font dependencies, and are not silently ignored.
Every release must pass the root formatting, compilation, Clippy, and test checks and the desktop frontend/shell checks on Linux, macOS, and Windows. Run the local equivalents in AGENTS.md, including all three audits, then confirm the final commit’s CI results before tagging. Every release build depends on both audit jobs, so a failed audit prevents publication.
The tag version must match all four package/config versions and have a non-empty docs/releases/<version>.md. GitHub Releases use that file’s first heading as the release title and its contents as the release notes. After publication, check the assets and updater manifest along with the Homebrew, WinGet, and website dispatch jobs.
Release Assets
The release workflow builds and uploads these TUI binaries:
| Platform | Asset |
|---|---|
| Linux AMD64 | tokenuse-linux-amd64 |
| Linux ARM64 | tokenuse-linux-arm64 |
| macOS Intel | tokenuse-darwin-amd64 |
| macOS Apple Silicon | tokenuse-darwin-arm64 |
| Windows AMD64 | tokenuse-windows-amd64.exe |
Each asset has a matching .sha256 checksum file.
Desktop Apps
Tagged releases also build desktop app bundles:
| Platform | Assets |
|---|---|
| macOS ARM64 | tokenuse-desktop-macos-arm64.dmg |
| Windows AMD64 | tokenuse-desktop-windows-amd64-setup.exe, tokenuse-desktop-windows-amd64-setup.exe.sig, tokenuse-desktop-windows-amd64.msi |
| Linux AMD64 | tokenuse-desktop-linux-amd64.AppImage, tokenuse-desktop-linux-amd64.AppImage.sig, tokenuse-desktop-linux-amd64.deb, tokenuse-desktop-linux-amd64.rpm |
| Linux ARM64 | tokenuse-desktop-linux-arm64.AppImage, tokenuse-desktop-linux-arm64.AppImage.sig, tokenuse-desktop-linux-arm64.deb, tokenuse-desktop-linux-arm64.rpm |
Each asset has a matching .sha256 checksum file.
The release also uploads latest.json, the static manifest consumed by the Windows/Linux Tauri updater. The manifest points Windows to the normalized NSIS setup installer and Linux to the normalized AppImage assets. .deb and .rpm packages remain manual GitHub Release installs.
The macOS desktop release job builds the Apple Silicon DMG, signs it with a Developer ID Application certificate, notarizes through App Store Connect, verifies the mounted DMG, and uploads the normalized artifact to the GitHub Release. Windows and Linux desktop assets are not OS code-signed for now and should be verified with their checksum files before installing. Their .sig files are Tauri updater signatures, not Authenticode or Linux package signatures.
Required Secrets
The macOS desktop release job requires:
| Secret | Purpose |
|---|---|
APPLE_CERTIFICATE |
Base64-encoded Developer ID Application .p12 certificate |
APPLE_CERTIFICATE_PASSWORD |
Password for the exported certificate |
KEYCHAIN_PASSWORD |
Temporary CI keychain password |
APPLE_API_ISSUER |
App Store Connect issuer ID |
APPLE_API_KEY |
App Store Connect key ID |
APPLE_API_PRIVATE_KEY |
App Store Connect .p8 private key contents |
TAURI_SIGNING_PRIVATE_KEY |
Tauri updater private key content for Windows/Linux update artifacts |
TAURI_SIGNING_PRIVATE_KEY_PASSWORD |
Optional Tauri updater private key password |
HOMEBREW_TAP_TOKEN |
Token with push access to russmckendrick/homebrew-tap |
WINGET_CREATE_GITHUB_TOKEN |
Classic PAT with public_repo and workflow scopes and push access to the russmckendrick/winget-pkgs fork |
Use a Developer ID Application certificate for direct-download DMGs. Apple Distribution is for App Store distribution, and Developer ID Installer is for .pkg installers.
Homebrew Tap
After the GitHub Release is created, .github/workflows/update-tap.yml updates:
Formula/tokenuse.rbfor the TUI on macOS and Linux.Casks/tokenuse-desktop.rbfor the Apple Silicon macOS desktop DMG.
The tap downloads checksums from the newly published release before writing the formula and cask. Linux desktop assets are published only to GitHub Releases for now.
WinGet
After the GitHub Release is created, .github/workflows/update-winget.yml submits the Windows desktop app to WinGet as RussMckendrick.TokenUse. It uses gh repo sync to fast-forward the russmckendrick/winget-pkgs fork from microsoft/winget-pkgs, then runs vedantmgoyal9/winget-releaser to open a manifest pull request against upstream pointing at tokenuse-desktop-windows-amd64.msi. The classic PAT needs both public_repo and workflow because upstream changes can include files under .github/workflows/. The installer regex is pinned to the MSI for two reasons: the raw TUI binary tokenuse-windows-amd64.exe in the same release must never be picked up as an installer, and komac (which winget-releaser runs under the hood) fails to emulate the Tauri NSIS setup installer (it aborts in the WebView2 branch of the installer script), while the MSI yields a clean wix manifest with ProductCode and UpgradeCode metadata.
The action only updates packages that already exist in winget-pkgs; the initial RussMckendrick.TokenUse version was bootstrapped manually with komac new. The workflow can also be re-run for a given tag via workflow_dispatch. WinGet installs the MSI silently and each manifest pins the installer SHA256, so no Authenticode signature is required, though users may see a SmartScreen prompt. Note the in-app Config-page updater ships the NSIS installer; WinGet users should update via winget upgrade to keep a single Apps & Features entry.
If the automatic fork sync fails, verify the PAT scopes and run gh repo sync russmckendrick/winget-pkgs --source microsoft/winget-pkgs with that token before re-running the workflow. Do not force the sync unless the fork intentionally contains commits that should be discarded.