4.8 KiB
Releasing
This project ships through tag-driven CI. A tag of the form v{REPO_VERSION}+claude{CLAUDE_DESKTOP_VERSION} on main triggers the release job in .github/workflows/ci.yml, which builds for both architectures, attaches the artifacts to a GitHub Release, and updates the APT, DNF, and AUR repositories.
There are two flavors of release:
- Upstream-tracking retag. A
check-claude-versionworkflow runs daily, detects new Claude Desktop releases, bumps theCLAUDE_DESKTOP_VERSIONrepo variable, patches URLs and SRI hashes inscripts/setup/detect-host.shandnix/claude-desktop.nix, and pushes a new tag with the sameREPO_VERSIONand a new+claude{X.Y.Z}suffix. No human action required. These do not get CHANGELOG entries — they're tracked in the tag suffix. - Project release. You bumped
REPO_VERSIONbecause you shipped project changes. Follow the checklist below.
Pre-release checklist
-
CI is green on
main. All required workflows (CI, tests, shellcheck) passed on the commit you're about to tag.gh run list --branch main --limit 5 -
CHANGELOG.mdis updated. The[Unreleased]section now reflects what you're about to ship. Move it under a new[v{REPO_VERSION}]heading with today's date. -
Local tests pass.
bats tests/ shellcheck scripts/**/*.sh build.shSee
CLAUDE.mdfor the canonical lint command. -
AppImage artifact boots on a clean system. The
test-artifacts.ymlreusable workflow already runs a--doctorsmoke test against each format in CI (#592), but if you've touched the launcher or patch surface, build locally and confirm:./build.sh --build appimage --clean no ./test-build/claude-desktop-*.AppImage --doctor -
The version variables are in sync.
gh variable get REPO_VERSION gh variable get CLAUDE_DESKTOP_VERSION grep -oP 'x64/\K[0-9]+\.[0-9]+\.[0-9]+' scripts/setup/detect-host.sh | head -1The grep value should match the
CLAUDE_DESKTOP_VERSIONvariable. If not, pull the latest URLs frommain— thecheck-claude-versionworkflow may have updated them onmainwithout rebasing your branch (CLAUDE.mdhas the recipe).
Bumping and tagging
# 1. Bump the project version (this is a GitHub Actions variable, not a file).
gh variable set REPO_VERSION --body "2.0.13"
# 2. Tag with both versions in the tag name.
git tag "v2.0.13+claude$(gh variable get CLAUDE_DESKTOP_VERSION)"
# 3. Push the tag — this is what kicks off the release build.
git push origin "v2.0.13+claude$(gh variable get CLAUDE_DESKTOP_VERSION)"
The REPO_VERSION variable bump can happen before or after the tag push; CI reads neither directly. The variable exists so future workflow runs know the current project version.
What CI does on tag push
The release job in ci.yml is gated on startsWith(github.ref, 'refs/tags/v'). After test-flags, build-amd64, build-arm64, and test-artifacts pass:
- Downloads all nine assets (six packages -- amd64 + arm64, each in deb/rpm/AppImage -- plus two
.zsyncdelta files and areference-source.tar.gz). - Pulls release notes from the separate
aaddrick/claude-desktop-versionsrepo if available; falls back to the autogenerated changelog otherwise. - Creates the GitHub Release and attaches the nine assets.
- Hands off to
update-apt-repo,update-dnf-repo, andupdate-aur-repo, which publish to the Cloudflare-fronted package repos (docs/learnings/apt-worker-architecture.mdfor the redirect chain).
After the release lands
- Verify the Release page. Nine assets attached, sizes look right, release notes rendered.
- Smoke-test one artifact. Download the AppImage and run
--doctoragainst it. - Watch
apt-repo-heartbeat. The next daily run validates the redirect chain end-to-end. If it opens a tracking issue, walk the chain indocs/learnings/apt-worker-architecture.md.
If something goes wrong mid-release
- Build fails. Push the fix to
main, then re-tag with a new+claudesuffix (or a+rebuild.Nsuffix if upstream hasn't moved). The original tag stays — releases are append-only. - A bad release shipped. Mark the GitHub Release as a pre-release / draft and ship a follow-up. Don't delete artifacts that may already be cached by the APT/DNF Worker.
- The
check-claude-versionworkflow conflicts with your local branch. Pull URL changes frommainbefore pushing your tag — the workflow autobumpsscripts/setup/detect-host.shbetween your work and your tag.