cmux NEXT: import suggestion cards on Home, New Tab and Settings
What
cmux now looks at what's on this Mac and offers to bring it over, as cards:
- Browsers: Chrome, Arc, Safari, Zen (and the other Chromium and Firefox browsers the importer already knows). The card says what was found ("3 profiles · history, bookmarks and cookies") and what you get ("Sites you're signed into in Chrome stay signed in here…").
- Agents: Claude Code and Codex. Their chats are already indexed, so the card opens Search Chats.
- Terminals: Ghostty (cmux already uses its config; the card opens it) and iTerm2 (turns its colors into a cmux theme).
- cmux Classic: imports the saved workspaces through the existing
workspace.importClassicaction.
One click starts the import as a background job. The job ledger (Application Support/cmux-next/<bundle>/import-jobs.json) survives a quit: on the next launch an interrupted job shows Resume, and one that needs nothing from the person resumes by itself. Not Now hides a card until the scan finds something new for that source.
Chief can raise a card: cmux import suggest --browser chrome --site github.com --reason "…" adds "Import Chrome cookies for github.com" with Chief's reason, ahead of the others. Pressing Import runs browser.importCookies with that domain only. The Chief prompt now mentions the command next to import-cookies.
Where the cards show
- Home: a strip of up to two cards over the transcript column, with Show All, which opens Settings › Import.
- New Tab: the notice slot under the composer (next to the dictation notice), in
App.tsx. That's the only line in acpmux's layout I touched; the cards themselves live inwebviews/src/ui/ImportCards.tsx. @ New Tab owner: if you'd rather give this a named host slot, tell me where and I'll move it. - Settings › Import: a new category that lists every card, including done, failed and dismissed ones (with Show Again).
They're on by default. Debug Settings has a toggle, browserImport.suggestionCards.
How detection stays cheap and quiet
The scanner only checks paths it already knows (profile folders, ~/.claude/projects, ~/.codex/sessions, the Ghostty config, the iTerm2 plist, Classic's snapshot) with FileManager stats and a small directory count. It never touches the Keychain. It never lists or probes ~/Library/Containers or Group Containers, because that triggers macOS's "access data from other apps" prompt, so browsers whose data lives in a container are skipped. Safari is counted once History.db is readable, which means Full Disk Access is on; without it, the card says so and opens the right System Settings pane. The scan runs off the main actor at launch and when the app becomes active, at most once every 10 minutes.
Layout
CmuxNextImportSuggestions, from the first commit: the scanner, the card deck, job state and strings. Pure model code, with tests.CmuxNextImportCards, new: the center, the actions (import.list,import.card,import.suggest,import.open), the Home strip and the source helpers. The App suppliesImportCardsHost, which wraps the importer, the import store and the Settings window.AgentPaneImportCards: pushes the cards to New Tab pages and takes button presses back (importCards.act), the same wayAgentPaneNowPlayingdoes.- App source lines are net -3:
InstalledImportBrowsersmoved out ofBrowserImportOfferService.
There's no app-wide background-tasks surface yet, so progress shows only on the card itself (Home, New Tab, Settings). Once a tasks view exists, the job ledger is ready to feed it.
Changelog
- Added: Import suggestion cards on Home, New Tab and Settings › Import that bring over your browsers, Claude Code and Codex chats, Ghostty and iTerm2 setups, and cmux Classic workspaces in one click.
Observed
prepush-gate.py: no new violations.check-app-size.sh: no source-line growth (95498 ≤ 95501). The namespace lint is clean. The new catalogs passcheck-l10n.shin all 21 languages andlocalization_catalog.py checkwith 0 parity errors.- Fleet compile-check (
--app) and the suite run (ImportScannerTests, ImportCardDeckTests, AgentPaneImportCardsTests): results to follow in a comment.
Not run
- No local app build, as this repo's rules require. The Home strip (AppKit) has no screenshot until a native capture runs. The web cards' screenshots come from the gallery entry
ui.import-cards(New Tab row, Chief request, running/paused, Not Now play, Settings list, empty). - Generated files (the settings schema and action surfaces) come from autofix, so the web Settings page shows the Import category once autofix regenerates them.
Agent session: cosmic-gray
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Adds import suggestion cards that scan this Mac for browsers, agents, and terminals — Chrome, Arc, Safari, Zen, Claude Code, Codex, Ghostty, iTerm2, and cmux Classic — and offer to bring them over in one click. The cards show on Home, New Tab, and the new Settings › Import category; imports run as resumable background jobs saved to disk so a quit or crash lets them resume. The scan reads folder listings only)Skip. Everything the cards show is shared with the host's existing import paths; nothing new is read.
- Cards are on by default (
browserImport.suggestionCards); Not Now hides a card until the scan finds something new, and a finished or dismissed card stays gone through relaunches. - Only the person's click starts an import at once: agent and page callers get a native confirmation first, and
import.cardrefuses start, resume, and retry from the CLI, MCP, and scripts. Chief-raised cookie cards import only the site that raised them; requests for public suffixes or IP addresses are refused. - Keychain reads are cached per job, so importing several profiles of one browser prompts once; imports run as that agent's caller for consent.
- New actions
import.list,import.card,import.suggest, andimport.openare offered in the palette and CLI; Settings › Import lists every card, including dismissed, done, and failed ones (Show Again).
Capture steps-937809a7f6 at ec173c1c8fcb (fleet build, capture mini, text checked for private data)
| Light | Dark |
|---|---|
![]() | ![]() |
Import cards on an empty Chief conversation (a Chief cookie request plus the cmux Classic card). The cards are opaque and the first-run rows start below them; the mascot hides when it no longer fits, as it already did on short windows.

