cmux-next: one background for the app, or one that turns on its own
Merged
TE
16d ago+2157+2157+0123456789012345678901234567890123456789-314-314-012345678901234567890123456789
Leo: the happy path is one background for the whole app, or a rotating one like macOS's rotating wallpaper, cycling through a folder or a set on an interval. That should be the easy default in the picker. Change Background… applies to All Workspaces, and per-workspace stays possible but secondary.
The picker (Settings > Appearance > Background)
The first tiles are now the happy path:
- No wallpaper
- Shuffle Paintings, previously "Shuffle Daily". It's the same
dailyvalue and turns through the same painting set. - Shuffle Your Images: turns through the images you added, which live in the Backgrounds folder.
- Shuffle a Folder…: choose any folder in the cmux folder picker, and its pictures take turns.
- Choose Image…, Browse More Art and From a Link, as before.
Below that row:
- While a shuffle is chosen, the card shows Change Picture: Every 15 Minutes, Every Hour or Every Day.
- A folder other than Your Images shows as its own chosen tile, "Shuffling Trips".
- All Workspaces | This Workspace now sits under the happy-path row, not above it. Change Background… still opens on All Workspaces, as #19969 decided.
Settings
appearance.backgroundRotationis new:"15m","hourly"or"daily". The default is"daily", so an existing Shuffle Daily turns exactly as before. It's agent-settable, likeappearance.background.appearance.backgroundalso takesfolder:<absolute path>. The pictures directly in that folder take turns, ordered by name (BackdropShuffle).- Each picture shows once before any repeats.
BackdropRotationuses the same coprime stride as Shuffle Daily. - Turns land on the local quarter hour, hour or midnight, and a clock or time-zone change re-picks at once.
- Each picture shows once before any repeats.
TerminalThemeSetting's daily timer now turns any shuffle at its period's end (showShuffledArt).- A workspace's own
folder:turns daily, like itsdailydoes. - New page op
cmux.settings.backdrop.choose_folder, and the host list's newbackdrop_folderfield.
The exported schema (schemas/settings/*, the sources stamp, MDM docs, plans/cmux-next/action-surfaces.json) is not edited by hand. The PR autofix regenerates it from the Swift descriptors. Until it does, the page doesn't have the Change Picture row, and the strings check flags the removed settings.choice.shuffleDaily.
Review follow-ups (29aa0a343caa):
- Change Picture stays in the card without a shuffle, turned off, so search and a deep link still find it.
- The pane background action says "Shuffle Paintings" too.
Tests
- Committed first:
- 622c3bee6dfa:
BackgroundRotationTests(CmuxNextAppTests). Shuffle Paintings with Every Hour turns each hour. Unset stays daily. A folder of three pictures plus a text file shows each picture once over three quarter hours. - 3e8827f78f50:
backgroundShuffle.test.tsx. It checks the first four tiles, that Shuffle Your Images writesfolder:<backgrounds folder>, that Shuffle a Folder… calls the app, that a shuffled folder shows by name, and that This Workspace comes after the shuffles.
- 622c3bee6dfa:
- Red on the base:
bun test src/pages/settings/backgroundShuffle.test.tsxgives 0 pass, 5 fail.- The Swift tests fail on the base by reading: the rotation key isn't read and
folder:is refused.
- On the head:
backgroundShuffle,hostCardsandappearanceUndogive 29 pass, 0 fail.- The Change Picture check needs the regenerated schema. Against a local export that includes the row,
backgroundShufflegives 6 pass, 0 fail; against the unregenerated base export it fails. - The full
bun test src/pages/settingsgives 204 pass, 2 fail. The 2 failures (categories.test"every page row has exactly one home" andeditors.test"every schema row renders the editor for its kind") also failed on the head of #22566 and are about other rows; I didn't run them on the base. bun run typecheckpasses.
- Swift: this host is Linux with no Swift toolchain, so nothing compiled or ran here. CI is the first run.
python3 scripts/verify-local.py --affected origin/feat-cmux-next: everything passes exceptlocalizationandpackage-groups, which fail the same way on the base.- Localization:
- 7 picker strings (CmuxNextSettingsWindow) and 7 settings strings (CmuxNextSettings) are new, in all 21 locales.
localization_catalog.py check --catalog …reports nothing for them.shuffleDaily,shuffleDailyHelpandsettings.choice.shuffleDailyare removed.
Changelog
- Added: In cmux NEXT, the background can shuffle your own images or any folder, and change every 15 minutes, every hour or every day. The picker leads with these, and a workspace's own background comes after them.
🤖 Generated with Claude Code