cmux NEXT: Cloud, the environment picker and Sandboxed runs are not behind Labs
Leo, 2026-10-30:
"WHAT GOOD REASON DO WE HAVE IN THE FIRST PLACE TO KEEP THIS STUFF IN FING LABS IF I FING ASKED FOR THESE F***ING FEATURES"
and earlier, on "Turn on Labs in Settings. Cloud first send refuses to run with Labs off.":
"that seems dumb. i dont like putting so much stuff in labs"
What changes
With labs.previewFeatures off (the default):
- The composer's environment picker (design/environment-picker.md) is the agent page's computer control in New Tab and in the chat composer. It has This Mac, My machines and Cloud and VMs sections, ⌥⌘1–9, New Cloud Machine, Open Cloud…, SSH…, Connect Phone…, Add Machine…, and saved environments on New Tab. Before this PR, Labs off gave the plain Computer menu. (
App.tsx:environments={preview}becomesenvironments.) - Move to Cloud / Bring Back Local in a started chat's picker, and Pause/Resume of a Cloud chat's machine in the chat menu (
cloudChat,cloudMachineRows). Before, both needed Labs. - Sandboxed runs: a new chat's Run as offers Sandboxed (New Cloud Machine's ⌥ face). The app's
sandbox.run, the CLI'sruns.sandbox.create(cmux run --sandboxed) andvm.agent_key.createno longer refuse withlabs_off. The two deadlabsOffstrings are removed fromRuns.xcstrings. - A fresh home with only this Mac keeps Add Machine… and New Cloud Machine… in the picker after a chat starts, which #27083 provided for the plain menu.
Safety checks that stay (not Labs)
- Cloud allowed by policy (
disabledFeatures.contains(.cloud),policyRefusal,mayCallCloud). - A signed-in account (
not_signed_in). - An explicit pick or command. A paid VM is only created when the person picks New Cloud Machine, Move to Cloud or Sandboxed and sends, or runs
cmux run --sandboxed. Nothing creates one automatically. Waiting on or cancelling an existing run stays open whatever the policy says.
What stays behind Labs, and why
labs.previewFeatures still gates the session coverage label in the chat header (a prototype policy detail), Stats, the music player, Click by Hint (Leo, 10-11: "who wants this feature", so opt-in by his call) and the App Store (Leo, 10-27: "remove app store for now"). What's New's palette entry is ungated in #29061. Not touched here: Voice Room (Lawrence's unofficial experiment), labs.machineJoin (its join routes answer only on the dev platform), labs.classicHome (a legacy fallback). Dev-only surfaces stay off by default (cmux#22662).
Overlap
- #28111 (cloud.startChat first send) removes the Labs checks in
CloudChatPick.swiftandCloudStartChat*. This PR leaves those files to it. - #28686 still adds a
labs_offcheck inCloudStartChat.swift; asked there to drop it. ItsApp.tsx,ComposerContext.tsxandEnvironmentPicker.tsxedits don't touch the lines this PR changes, apart from comments. - Specs: teamleaderleo/leo-workspace#1883 updates
design/environment-picker.mdanddesign/cloud-work-mode.md.
Before / after
Fresh home, New Agent Chat in /tmp, destination picker opened, labs.previewFeatures at its default (off). Real app at 2x on a fleet capture mini, light and dark, with synthetic data (a fresh home). Steps are in the capture marker's state.
Before (base 32761cbcfc64): the plain Computer menu with only Studio Mac, "Add a computer…" and "New Cloud Machine…".
Capture steps-b14387dd83-2x at 32761cbcfc64 (fleet build, capture mini, text checked for private data)
| Light | Dark |
|---|---|
![]() | ![]() |
After (e8e4fce175d7; later commits change only tests): the environment picker. This Mac (Studio Mac, ⌥⌘1, checked), Cloud and VMs (New Cloud Machine… "Keeps working while your Mac sleeps", Open Cloud…), New environment (SSH…, Connect Phone…, Add Machine…), plus New Worktree beside the folder.
Capture steps-b14387dd83-2x at e8e4fce175d7 (fleet build, capture mini, text checked for private data)
| Light | Dark |
|---|---|
![]() | ![]() |
I viewed the after images in both themes. Verdict: it's the picker Lab users already had, one searchable list in decision order with no repeated controls per row, and it fits on screen beside the composer. It would sit fine next to Claude desktop's environment picker.
Validation
- Fleet compile check of the app at
e8e4fce175d7: passed (job f3bab27d5885f7cd2a5de26f). - Webviews,
cmux-ci teston Blacksmith/Linux pool: typecheck plus 16 picker, composer, sandbox and New Tab test files. All pass except computer-picker-onboarding, whose last failure (the New Cloud Machine row was below the fold of a 650 px frame) is fixed at the head and passes alone (fleet job 91a45b5defca9d9a657b61d4). - Tests updated:
computer-picker-onboarding(first-computer setup through the environment picker) andmenu-pointer-close-focus/composer-location-strip(the control is now named "Environment"). - New Worktree is the control beside the folder in the environment picker, so the
agent-pane.start-foldergallery plays click it there andnew-tab-warm-first-framereads it in the location strip (the gallery health and webview own reds ata8506409).
🤖 Generated with Claude Code
Agent session: agent session



