Update popover: show the top changes and a readable version line

TE
4d ago
+569-33

What someone needs from this popover

The update popover opens when cmux finds a new build. The person reading it wants to know whether to install now or later, and three things decide that:

  1. What changed for me? Is there a fix I've been waiting for, or something new I want?
  2. Will it interrupt my work? Install and Relaunch restarts cmux, so a small update can wait for a natural break.
  3. How big a change is it? Two fixes or forty changes.

The popover on main shows Version: 0.65.0-nightly.3737789529201, Size: 236.5 MB, and Released: Oct 5, 2026. None of these answers the questions. The version is a build number, and the download size says nothing about what changed. To find out what changed, you have to open the release notes in a browser.

What this changes

This is an exploration, not a merge proposal. Main went back to the 0.64.25 popover twice (#16357, #17368), so the diff stays small and easy to compare against that baseline.

  • One readable line replaces the version row. Nightly: Nightly · Today at 12:20 PM · 23 changes. Stable: 0.65.1 · Oct 5. The Released date folds into this line.
  • Up to five changes appear inline, read from the feed item's <description>. #17434 (scripts/ci/nightly_release_notes.py) already writes that summary into the nightly appcasts: up to five Title (#123) lines, newest first, then and N more and Infrastructure: N. The popover drops the (#123) suffix and does not count infrastructure PRs as changes.
  • "and N more" links to the item's full release notes (sparkle:fullReleaseNotesLink), falling back to the existing release-notes link.
  • The Size row is gone.
  • Skip, Later, and Install and Relaunch are unchanged, and so is the release-notes link at the bottom.

The stable feed has no <description> today, so stable shows only the readable line. When the feed lists no changes ("No product PRs merged since the previous published build."), the popover shows the line without a count and without a list.

Not changed: the pill, the pending-detection view (still shows Version: while the check finishes), and the other popover states.

Captures

Captured on fleet capture minis (macOS 26.3.1 and 26.4) on Oct 5.

Before (real release builds checking the real feeds):

Stable: 0.64.25 finding 0.65.0Nightly: cmux NIGHTLY 3735594566602 finding 3737789529201
before stablebefore nightly

In the nightly still, another app's "Configuration Errors" alert on the shared mini covers the right edge. The Version, Size, and Released rows are still readable.

After (this PR at da39c2f, a tagged Debug build from the fleet):

Nightly, live feed (4 changes)Nightly, more than five changesStable (feed has no description)
after nightlyafter nightly longafter stable

How the "after" stills were made. Debug builds never run a manual Sparkle check (#6292), so the popover is forced with CMUX_UI_TEST_UPDATE_STATE=available. The second commit lets that forced item carry a feed item's description, pubDate, and length.

  • Nightly, live feed: the first item of the live nightly appcast, unchanged.
  • Nightly, more than five changes: a copy of that feed whose description I wrote in the exact #17434 shape: five recent PR titles, and 18 more, Infrastructure: 21.
  • Stable: the live stable item for 0.65.0.

Known side effect: with the inline list, the popover's first focusable control is now the "and 18 more" link, so the initial focus ring lands there instead of on Skip/Later.

Tests

UpdateSummaryTests (CmuxUpdaterUI package):

  • the five-line nightly summary with and 18 more and Infrastructure: 7 gives five titles, 18 remaining, and · 23 changes;
  • an older nightly shows its day instead of "Today";
  • stable gives 0.65.1 · Oct 5;
  • the empty-range sentence and an infrastructure-only summary list nothing;
  • a short list has no remainder.

Localization audit

There are three new keys, all in Resources/Localizable.xcstrings, translated for the 9 macOS locales (en, de, fr, ar, es, zh-Hant, zh-Hans, ko, ja):

  • update.popover.changeCount uses plural variations: one/other, plus many for fr and es, and all six Arabic categories. It is registered in scripts/localization-plurals.json.
  • update.popover.andMore
  • update.popover.channel.nightly is listed as an invariant channel name, matching cloudTree.device.build.nightly.

./scripts/localize-changes reports 0 parity errors. update.popover.size and update.popover.released are no longer used by this view; I left them in the catalog to keep the diff small.

Change titles come from PR titles, so they appear in English.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.


Summary by cubic

Replaces the update popover's version and size rows with one readable line and up to five change titles, so the person deciding between Install and Later can see what changed without leaving the app.

  • Nightly builds show Nightly · Today at 12:20 PM · 23 changes; stable shows 0.65.1 · Oct 5. The download size row and the Version:/Released: labels are gone.
  • Up to five changes come from the feed item's <description> (written by scripts/ci/nightly_release_notes.py); the (#123) PR suffix is stripped and infrastructure PRs are not counted.
  • and N more links to the full release notes when more changes exist.
  • Stable feed has no <description> today, so stable shows only the readable line; an empty or infrastructure-only range lists nothing.
  • Skip, Later, and Install and Relaunch are unchanged, as are all other popover states.

Adds UpdateSummary plus UpdateSummaryTests covering nightly/stable headlines, relative dates, change parsing, and remainder counts. Localization adds three keys (update.popover.changeCount, update.popover.andMore, update.popover.channel.nightly) for all nine macOS locales. Test support now lets the forced update item carry a feed description, publication date, and size via CMUX_UI_TEST_UPDATE_DESCRIPTION, _PUB_DATE, and _LENGTH, so captures can exercise the new summary.

Summary by CodeRabbit

  • New Features
    • Update popovers show a concise headline with the version or “Nightly” channel, release date, and number of changes.
    • Release notes display up to five change titles. When additional changes are available, a count indicates how many remain, with a link to the full notes when available.
    • Nightly release dates use relative wording for today and yesterday.
  • Localization
    • Update-summary labels and change counts are translated in supported languages, including plural forms.