iOS remote client times out loading long desktop Codex sessions and has no retry path
Summary
When using the iOS client to remotely control/access Codex Desktop, long-running sessions are prone to timing out while loading messages/session state. After the timeout, the iOS UI does not appear to retry automatically, and there is no clear manual retry path.
The visible error in the iOS UI is localized Chinese:
加载消息时出错:Codex 请求超时。
Roughly: "Error loading messages: Codex request timed out."
Environment
- Remote client: iOS Codex/ChatGPT remote-control flow
- Host: Codex Desktop
- Date observed: 2026-06-16
- Exact iOS/Desktop versions: not captured yet
Reproduction
- Start or continue a Codex Desktop session.
- Let the session become long enough that the thread/history contains a substantial amount of content.
- Open the same session from iOS through the remote-control flow.
- Attempt to load/resume/pull the long session messages.
Expected behavior
The iOS client should recover long sessions reliably. If a request times out, it should either:
- retry automatically with backoff,
- load messages incrementally/paginated instead of requiring one large fetch,
- resume from the last successfully fetched point, or
- show a clear manual retry action.
Actual behavior
For long sessions, the iOS client frequently times out while loading messages/session state. After the timeout, the UI displays:
加载消息时出错:Codex 请求超时。
There does not appear to be an automatic retry mechanism or an obvious retry button, so transient network/server delays become a hard failure from the user's point of view.
Impact
Long-running Codex Desktop sessions become unreliable from iOS, especially over mobile or weaker networks. This makes it difficult to monitor or resume active desktop work remotely once the conversation history grows large.
Suggested direction
This would be more robust with incremental/paginated message loading, request retry/backoff for timeout failures, and a visible retry action in the timeout state.
2 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Sanitized reproduction with app-server evidence
I reproduced this on an Apple Silicon macOS host with two active long-running threads. This comment intentionally omits task IDs/titles, workspace paths, repository names, source code, commands, commit hashes, network addresses, account identifiers, and conversation content.
Environment
Sanitized thread sizes
Both selected threads were alive and producing new events.
What happens on each iOS Remote connection
The app-server logs show that a single mobile connection does not fetch only the selected thread's recent visible messages. Instead it repeatedly:
thread/turns/listfor selected thread A from the beginning;thread/turns/listfor another unrelated loaded thread from the beginning;thread/turns/listfor selected thread B twice concurrently.One connection therefore parses approximately 2.10 GiB of rollout history. The 718.7 MB thread takes about 3.0-3.1 seconds per full scan, and the duplicate requests overlap.
Across six consecutive connections, the same pattern repeated. The client disconnected roughly four seconds after the history requests began; the host then logged:
The client reconnected and restarted the same full-history work, producing a retry/load storm.
Integrity and resource checks
This appears to be an eager hydration/fan-out problem rather than corrupt state or insufficient host resources.
Expected protocol/UI behavior
On remote connection or thread selection, return only:
The initial response should exclude old tool outputs, hidden reasoning/event records, images/blobs, and unrelated loaded threads. Older text should load lazily when scrolling. Heavy tool output should require a separate explicit fetch.
Additionally:
thread/turns/listcalls for the same thread;This is consistent with the requested direction in #21211 and #25779, and complements the Android evidence in #38023. The iOS-specific additional finding here is the cross-thread fan-out plus duplicate full read of the largest thread on every connection.