Mac-to-Mac remote control fetches remote thread/list but sidebar remains on local conversations

Open 💬 3 comments Opened Jun 5, 2026 by 1Fr3dG
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

Summary

Codex Desktop on one Mac can connect to another Mac via Settings > Connections > Control other devices, and the controller logs show that the remote websocket app-server connection is healthy and that the remote thread list is successfully fetched.

However, the main Codex Desktop sidebar/home view never shows the remote Mac's projects or conversations. It continues to render only the controller Mac's local projects/conversations, and the main route remains under /local/....

This seems related to other remote-history issues, but this case is a narrower downstream failure: the remote thread/list does happen and appears to return non-empty results.

Environment

  • Controller: macOS 26.5.1 (25F80)
  • Controller Codex.app: 26.602.30954 (3575)
  • Controller local app-server reported version: 0.137.0-alpha.4
  • Target: another Mac/iMac on the same account, shown in UI as al-imac.local
  • Target remote app-server reported version through controller logs: 0.137.0-alpha.4
  • Remote transport: websocket, host id shape remote-control:<redacted>

What works

  • Both Macs can run local Codex normally.
  • The controller Codex.app settings UI can see the remote iMac as connected.
  • In Settings, selecting the top-left host dropdown can switch the settings context to al-imac.local.
  • ChatGPT mobile can connect to/control the same iMac.
  • Direct/manual checks of the target show it has existing Codex threads; in this case there were 3 remote threads.
  • Controller logs show remote connection success and a remote thread-list recovery with conversationCount=3.

Reproduction

  1. Run Codex Desktop on two Macs under the same account.
  2. Enable remote control on the target iMac.
  3. On the controller Mac, open Settings > Connections > Control other devices and connect/select the target al-imac.local.
  4. Confirm the target appears connected in settings.
  5. Return to the main Codex Desktop sidebar/home view.

Expected behavior

The main Codex Desktop UI should provide a way to switch to the remote host and show the remote host's projects/conversations, so existing conversations on the iMac can be continued from the controller Mac.

This matches the remote-connections documentation expectation that a remote client can use the connected host's projects/threads and continue existing threads.

Actual behavior

The settings UI can select the remote host, but the main app sidebar remains local-only:

  • only controller-local projects/conversations are visible
  • no iMac projects/conversations appear
  • the main route remains /local/<local-thread-id>
  • repeated main/sidebar refreshes request hostId=local

Log evidence

Sanitized excerpts from the controller Mac's Codex Desktop log:

[AppServerConnection] Starting app-server connection hostId=remote-control:<redacted> transport=websocket
[AppServerConnection] Current reported app-server version: currentVersion=0.137.0-alpha.4 hostId=local
[AppServerConnection] Current reported app-server version: currentVersion=0.137.0-alpha.4 hostId=remote-control:<redacted>

[electron-message-handler] remote_connections.connection_state_changed error=null hostId=remote-control:<redacted> state=connected
[electron-message-handler] remote_connections.manager_state_set hostId=remote-control:<redacted> nextError=null nextState=connected previousError=null previousState=connecting source=host_connection_state_changed

[AppServerConnection] response_routed broadcastFallback=false conversationId=null durationMs=24239 errorCode=null hadInternalHandler=false hadPending=true method=thread/list originWebcontentsId=1 requestId=<redacted> targetDestroyed=false
[electron-message-handler] websocket_reconnect_marked_threads_needing_resume conversationCount=3 markedCount=0 previousRoleCount=0 previousStreamingCount=0
[electron-message-handler] websocket_reconnect_recovery_done currentConversationExistsOnTargetHost=false currentConversationId=null hostId=remote-control:<redacted> refreshRecentConversationsFailed=false resumedCurrentConversation=false

After that, selecting the remote host in Settings produces a remote-context request:

[electron-fetch-handler] codex-home request hostId=remote-control:<redacted> ...

But returning to the main app still keeps local route/list state:

[electron-fetch-handler] codex-home request hostId=local ...
[electron-message-handler] IAB_LIFECYCLE received browser sidebar owner sync browserTabId=null conversationId=<local-thread-id> originWebContentsId=1 ownerRoutePath=/local/<local-thread-id> windowId=1

This pattern repeats across multiple refreshes.

Why this may be useful

Related issues I found:

  • #22762: Android remote control did not load host history, but that report says no thread/list requests were observed.
  • #23482: macOS remote control stalls with app-server responsive but remote manager disconnected.
  • #25589: iOS sends thread/list and gets an empty list.
  • #22438: Desktop SSH remote persisted sessions do not appear after restart.

This report differs because the controller reaches connected, the remote app-server reports a current version, thread/list is routed successfully, and recovery sees conversationCount=3 with refreshRecentConversationsFailed=false. The failure seems to happen after the remote list is available: the visible main UI remains bound to the local route/list instead of switching/hydrating the remote host's conversations.

Hypothesis

The Settings host selector may only affect settings-context requests, while the main home/sidebar route remains bound to /local/.... Remote thread/list results may be fetched during connection recovery but not propagated into the visible conversation list, or there may be no accessible host switcher in the main desktop UI for remote-control:* hosts.

Full logs can be provided privately if needed; the public issue body intentionally omits account IDs, client IDs, and token-related fields.

View original on GitHub ↗

3 Comments

github-actions[bot] contributor · 2 months ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #25092

Powered by Codex Action

sergiuliano · 1 month ago

Confirmed another Mac-to-Mac reproduction on 2026-07-23:

  • Controller: Mac laptop running the Codex/ChatGPT desktop app.
  • Target: iMac, powered on and running active Codex GUI tasks.
  • The iMac appears connected under Settings > Connections > Control other devices on the laptop.
  • The laptop desktop app has no Remote section or visible host switcher in its main sidebar, so the iMac’s existing tasks cannot be opened there.
  • The same remote-task workflow is available from the ChatGPT mobile app.

Expected: the desktop app should expose a host/connection selector and list the connected iMac’s projects and active/existing Codex threads, matching the mobile Remote experience. No logs or account/device identifiers are attached.

markolofsen · 1 month ago

This looks like a host-context propagation bug rather than a remote transport bug. The important signal in the report is that thread/list succeeds for remote-control:<id> with conversationCount=3, then the visible home/sidebar path keeps issuing codex-home / owner-route work against hostId=local.

The invariant I would check is: once the user selects a remote host, every visible conversation-list consumer needs the same host identity, not just the Settings panel and websocket recovery path. Concretely, I would trace three IDs separately:

  1. the connected app-server host id (remote-control:<id>),
  2. the host id attached to each fetched thread/conversation row,
  3. the host id used by the sidebar route/cache key when grouping conversations.

If any of those falls back to local, the UI can have valid remote data in memory and still render an empty/local-only sidebar. That also explains why mobile can work while desktop does not: mobile may be routing the whole conversation-list surface through the selected remote host, while desktop only switches settings-context requests.

I build cmdop, so biased — this class of bug is why I try to keep stable machine/session identity separate from the client view that happens to be attached. No link here because this is a Codex bug report, but the boundary I’d test is exactly “remote host selected” vs “local route still owns the visible thread catalog.”