Skip to content

Prepare 3.4.10: version, release notes, and the sign-in docs - #37

Merged
Cam8863 merged 1 commit into
linuxfrom
release/3.4.10-prep
Aug 27, 2026
Merged

Cam8863 merged 1 commit into
linuxfrom
release/3.4.10-prep

Conversation

@guys-inc-ops

@guys-inc-ops guys-inc-ops Bot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Everything that has to be true before release-3.4.10-linux1 can be tagged. Two of these are hard blockers — the release job fails, or publishes something wrong, without them.

1. The version — blocker

The .deb version comes from app/package.json, so a release built from 3.4.9 declares 3.4.9 again. apt only upgrades on a higher version, so no existing user would ever receive it. And since the pool rebuild landed in #36, reprepro now skips the incoming package outright and the repository keeps serving the old binary — the one with the OAuth secret in it.

3.4.10, not 3.4.9-linux2. The latter looks like the natural fork revision and is greater to dpkg, but it is a semver prerelease, so it sorts below 3.4.9 for any comparison the application itself makes:

dpkg:   3.4.9-linux2 vs 3.4.9 -> GREATER
semver: 3.4.9-linux2 gt 3.4.9 -> false   | prerelease: [ 'linux2' ]
semver: 3.4.10       gt 3.4.9 -> true    | prerelease: null

3.4.10 is correct in both orderings, and 3.4.10-linux1 satisfies isInitialTag() so the notes script works with no code change to that path.

2. The release notes — blocker

generate-release-notes.ts requires a changelog.json entry for the upstream version behind an initial tag and calls process.exit(1) without one. 3.4.10 was absent, so the release job would have failed before publishing anything.

Adding the entry exposed a second problem. Every fork-authored entry was silently dropped:

release entry does not match any format: '[Improved] Upgrade Electron to v39.8.10, from v32.1.2, …'

The entry regex requires a - #1234 tail naming an upstream issue, and formatReleaseNote hardcodes desktop/desktop/issues/{id} — so a fork PR number in that position would render as a link to an unrelated upstream issue. Entries may now omit the tail, and no dangling - is emitted when there are no ids.

Rendered locally both ways before committing. 3.4.10 produces the notes below; 3.4.9-linux1 still produces 0 unparsed entries, 10 upstream issue links, and the contributor credit intact, so the upstream path is unregressed.

Rendered 3.4.10 notes
## Added
- Sign in to GitHub.com using the OAuth device flow: Desktop shows a one-time code to enter in your browser, instead of handing off through a redirect

## Fixed
- The published packages no longer contain an OAuth client secret. Desktop authenticates as a public client, so no secret is built into the application

## Improved
- Upgrade Electron to v39.8.10, from v32.1.2, picking up seven major versions of Chromium security fixes
- Upgrade DOMPurify to v3, which sanitises rendered Markdown in the application
- Pin patched versions of tar-fs, cross-spawn, ansi-regex and @babel/runtime in the packaged application
- Release binaries now carry a build provenance attestation, so a download can be traced to the workflow run that produced it
- The APT repository is signed with a rotated key, and published under a per-project prefix at apt.guysinc.pub/github-desktop

## Removed
- Signing out no longer revokes the token on github.com. Revoking a server-side token required a client secret, which is no longer shipped; sign out now discards the token locally. Revoke access at github.com/settings/applications

3. Documenting the sign-in change

The device flow is the most visible change in this release and nothing documented it. A user who sees a one-time code where a sign-in page used to be has no way to tell whether it is working as intended. New section in docs/known-issues.md says it is expected from 3.4.10, and why: a desktop application cannot keep a secret, and earlier builds shipped one.

4. Signing out no longer revokes

It discards the token locally; the authorization stays listed on github.com until removed there. That is security-relevant, and someone handing over a machine needs to find it. Documented with the actual remedy (github.com/settings/applications) rather than left as a surprise.

Also corrected while in there: the organization-access entry described this as an OAuth App and linked the OAuth App approval flow. It is a GitHub App (Ov23li… prefix), so those are the wrong screens — the application does not appear in them at all. This was already wrong before this release; fixing it now that sign-in is in front of people. Both replacement links checked for 200.

Checks run locally

tsc -p script/tsconfig.json --noEmit clean · eslint clean (it lints changelog.json too) · prettier --check clean · markdownlint shows 69 violations before and after, so no new ones (the file has a large pre-existing baseline and it is not in CI).

Four things that all have to be true before a release can be cut, and none
of which are true today.

**The version.** The .deb version comes from app/package.json, so a release
built from 3.4.9 declares 3.4.9 again. apt only upgrades on a higher
version, so no existing user would ever receive it - and since the pool
rebuild landed, reprepro now skips the incoming package entirely and the
repository keeps serving the old binary. 3.4.10 rather than 3.4.9-linux2
because the latter is greater to dpkg but a *semver prerelease*, so it sorts
below 3.4.9 for any comparison the application itself makes. Verified both
ways round rather than reasoned about.

**The release notes.** generate-release-notes.ts requires an entry in
changelog.json for the upstream version behind an initial tag, and exits 1
without one - so the release job fails before it publishes anything. Adding
3.4.10 fixes that, but exposed a second problem: every fork-authored entry
was silently dropped, because the entry regex requires a "- #1234" tail
naming an upstream issue. Our changes have no upstream issue, and a fork PR
number in that position would render as a link to an unrelated issue in
desktop/desktop. Entries may now omit the tail. Confirmed by rendering both
3.4.10 and 3.4.9 - the upstream notes still produce issue links and
contributor credit.

**The sign-in change.** The device flow is the most visible change in this
release and nothing documented it. A user who sees a one-time code where a
sign-in page used to be has no way to tell whether it is working as
intended.

**Signing out.** It no longer revokes the token on github.com, because
revoking one requires the client secret this application deliberately no
longer ships. That is a security-relevant regression and it needs to be
written down where someone handing over a machine will find it.

While there: the organization-access entry described this as an OAuth App
and linked the OAuth App approval flow. It is a GitHub App, so those are the
wrong screens - the application does not appear in them at all. Already
wrong before this release; corrected now that the release puts sign-in in
front of people. Both replacement links checked.
@guys-inc-ops
guys-inc-ops Bot requested a review from Cam8863 as a code owner August 27, 2026 15:05
@Cam8863
Cam8863 merged commit 7a9d2dd into linux Aug 27, 2026
6 checks passed
@Cam8863
Cam8863 deleted the release/3.4.10-prep branch August 27, 2026 15:32
Cam8863 pushed a commit that referenced this pull request Aug 27, 2026
The version chosen in #37 cannot be used. This repository inherited 301
release-* tags from the lineage it forked from, running up to
release-3.4.14-linux1, and release-3.4.10-linux1 has existed since
2025-02-09. Release tags are immutable under the org ruleset, so none of
3.4.10 to 3.4.14 can be reused. I checked dpkg and semver ordering when
picking 3.4.10 and did not check whether the tag was free.

3.5.0 rather than 3.4.15. Both are free and both are clean in dpkg and
semver ordering, but either one decouples this fork's numbering from
upstream's - the difference is only whether that is visible. A minor bump
says so, where skipping five patch numbers looks like an accident. It is
also the more honest description of what is in here: seven major versions of
Electron and a rewritten sign-in are not a patch release.

3.4.9-linux2 was the truthful alternative and was rejected on cost. It is a
semver prerelease, so it sorts *below* 3.4.9 - release-notes.ts builds a
SemVer from the running version and filters for releases newer than it,
which would make the app offer 3.4.9's notes as "what's new" to someone who
had just upgraded past it.

Release notes re-rendered for 3.5.0-linux1: 0 unparsed entries.

Co-authored-by: guys-inc-ops[bot] <321481384+guys-inc-ops[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant