Codex Mobile remote-control tasks with custom provider disappear from thread list after refresh
What version of the Codex App are you using?
Codex Desktop: 26.519.81530
Codex CLI: 0.133.0
What platform is your computer?
macOS 26.3.1 (a) (25D771280a)
What issue are you seeing?
When Codex Desktop on macOS is configured to use a custom OpenAI-compatible Responses API provider, Codex Mobile remote control can start a new task and the Mac host executes it successfully. However, after refreshing the Codex Mobile thread/task list, that task disappears from the mobile list.
The task is not deleted locally. It remains present in the Mac host's local Codex state (~/.codex/state_5.sqlite) and rollout JSONL under ~/.codex/sessions/....
This appears related to custom-provider thread list/history filtering, but the user-visible symptom is specifically in Codex Mobile remote control:
- Mobile can create/send the task to the Mac host.
- The Mac host executes the task using the custom provider.
- The live task is visible while it is running.
- After refreshing/reopening the mobile list, the task is no longer visible.
- Threads created with the normal
openaiprovider are visible in the mobile history/list. - Existing local
custom_responses_provider/custom-provider Mac threads are not discoverable from the mobile history/list.
The custom provider is configured in ~/.codex/config.toml similarly to:
model = "gpt-5.5"
model_provider = "custom_responses_provider"
[model_providers.custom_responses_provider]
name = "Custom Responses Provider"
base_url = "<redacted OpenAI-compatible /v1 endpoint>"
wire_api = "responses"
env_key = "CUSTOM_RESPONSES_API_KEY"
The Mac host is still logged in to the ChatGPT/OpenAI account for Codex Mobile remote control. Remote control enrollment is present and working: mobile remote control can reach the Mac and submit work.
What steps can reproduce the bug?
- On Codex Desktop for macOS, configure a custom model provider in
~/.codex/config.toml, for examplemodel_provider = "custom_responses_provider"withwire_api = "responses". - Keep Codex Desktop logged in to the ChatGPT/OpenAI account used by Codex Mobile.
- Connect Codex Mobile to the Mac host through remote control.
- From Codex Mobile, start a new task/thread on that Mac host.
- Observe that the Mac host receives the task and executes it successfully through the custom provider.
- Refresh or reopen the Codex Mobile task/thread list.
- Observe that the newly created custom-provider task disappears from the mobile list.
- Switch the Mac host back to the normal
openaiprovider and create a task. That task appears in the mobile history/list as expected.
What is the expected behavior?
Codex Mobile should list and allow reopening/continuing local Mac-host threads created through remote control even when the host used a custom model provider.
More specifically:
- A task created from Codex Mobile and executed on the Mac host with
model_provider != "openai"should remain visible after mobile list refresh. - The mobile history/list should include local host threads across providers, or at least include threads for the currently connected host regardless of provider.
- Opening a custom-provider thread from mobile should route continuation back to the same Mac host and preserve the thread's persisted model provider.
What is the actual behavior?
- The custom-provider task runs successfully on the Mac host.
- It may appear temporarily while live/running.
- After refreshing the Codex Mobile list, it disappears.
- Local Mac state still contains the thread and rollout file.
- Normal
openaiprovider threads remain visible in the mobile history/list.
Local evidence
On the affected machine, local SQLite state shows custom-provider threads are persisted and not archived:
model_provider source thread_source archived n
-------------- ------ ------------- -------- --
custom_provider cli user 0 1
custom_provider vscode user 0 7
openai cli 0 17
openai exec 0 12
openai vscode 0 34
openai vscode user 0 8
Remote control enrollment exists locally, and the mobile-to-Mac execution path works:
app_server_client_name server_name websocket_url_len
---------------------- ------------------------ -----------------
Codex Desktop <local Mac host name> 56
The custom-provider threads also have rollout JSONL files under ~/.codex/sessions/YYYY/MM/DD/.
Related issues
This seems related to existing custom-provider history/list issues, but this report is specifically about Codex Mobile remote-control visibility after refreshing the mobile list:
- https://github.com/openai/codex/issues/20184
- https://github.com/openai/codex/issues/19088
- https://github.com/openai/codex/issues/20004
- https://github.com/openai/codex/issues/15494
- https://github.com/openai/codex/pull/19287
Security notes
No API key or private provider URL is included here. Thread titles and message content are intentionally omitted.
4 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Thanks for the duplicate suggestions. I reviewed #24462, #24464, #24749, and #24737.
They look related to the broader Codex Mobile Remote persisted thread-list / refresh path, especially the "appears briefly, then disappears" behavior. This issue adds one more specific dimension that I did not see covered in those reports: the visibility problem is reproducible when the connected desktop host is using a custom OpenAI-compatible Responses provider, while threads created with the normal
openaiprovider on the same host/account remain visible in the mobile history/list.So this may share the same underlying mobile remote enumeration/indexing bug, but the provider filter/custom-provider dimension seems important for diagnosis. If maintainers prefer to consolidate this into one of the existing mobile remote list issues, that is fine; I wanted to capture the custom-provider contrast and local evidence separately.
I did a source-level pass over the public app-server/thread-list path and this looks like a plausible root cause / minimal fix direction.
At current
main(bf72be59278e23002a352a53207182985cabb9d0),ThreadListParams.model_providersis documented as:Relevant source:
codex-rs/app-server-protocol/src/protocol/v2/thread.rslines 993-996:When present but empty, includes all providers.codex-rs/thread-store/src/types.rslines 188-190:None means implementation default, while an empty vector means all providers.codex-rs/app-server/src/request_processors/thread_processor.rslines 3468-3477 implements that default as current-provider filtering:That behavior seems consistent with the symptom here:
thread/listor an equivalent path.modelProviders: null/ omitsmodelProviders, the app-server applies the current-provider default filter rather than returning all local host threads.This also matches the existing remote-thread-store test shape:
codex-rs/app-server/tests/suite/v2/remote_thread_store.rslines 144-152 explicitly sendsmodel_providers: Some(Vec::new())when listing remote-created threads, which is the all-provider form.Suggested minimal fix direction:
modelProviders: []when the UI is asking for local host history, unless the user explicitly selected a provider filter.modelProviders: [provider]for UI flows that intentionally filter by provider.null/ omitted for Mobile Remote history refresh, because today that means current-provider default rather than all providers.Possible regression coverage:
model_provider = "openai"and one withmodel_provider = "custom_responses_provider".thread/listparams used by Mobile Remote refresh.modelProviderslist filters intentionally.I am not opening an unsolicited PR because
docs/contributing.mdsays external code contributions are by invitation only. If this diagnosis matches the intended architecture and maintainers would like a targeted PR, I can prepare a minimal patch/regression test around the public app-server/protocol path.I hit a related Codex Remote failure class and built a small conformance-style
artifact that may help separate "thread list/indexing" bugs from the broader
remote attachment contract.
Repo: https://github.com/iamitp/codex-remote-attach-lab
This is not a claim that #24780 has the same root cause. This issue looks
specifically tied to custom-provider history enumeration. The thing I wanted to
add is a runnable way to classify the user-visible remote state from app-server
evidence:
Live Attached: this client is connected to the live thread.Running Elsewhere: work appears active, but this client is not attached.Launchable: thread exists and can be resumed, but no live turn is attached.Reconnecting: recent transport loss with a plausible recovery path.Mirrored Recent: recent metadata exists, but live attachment is not proven.Stale Mirror: old metadata exists and should not be shown as live.Offline: no app-server transport is reachable.The lab uses the public
codex app-serverprotocol:thread/loaded/list;thread/list;thread/resumefor a target thread;My diagnosis: Codex Remote is framed as a control plane, and a control plane
needs a first-class attachment truth contract. On foreground/reopen/host switch,
the client should prove whether it is attached to live work, running elsewhere,
launchable, stale, or offline before showing the user a generic reconnecting
state.
Potential maintainers' uses:
running-thread resume, and stale metadata;
history;
thread/attach/statusview with host, loaded, active, subscribed,last-event, and supported-action fields.
I saw the contributing guide says external code contributions are by invitation
only, so I am not opening an unsolicited PR. If this matches the intended
architecture, I can prepare a small invited PR around diagnostics/docs/tests or
keep this as an external conformance reference.