Codex talks to the ChatGPT backend over WebSocket by default. If your network path involves Clash, a corporate proxy, cross-border transit, or Cloudflare challenge pages, that long-lived WebSocket gets killed easily — and you end up staring at Reconnecting... 1/5 over and over. Turn off WebSocket and switch to plain HTTP streaming requests, and the problem mostly disappears.
Why WebSocket Breaks Behind Proxies#
The WebSocket protocol starts with an HTTP Upgrade request; only after the server returns 101 does it switch to the long-lived connection. That long-lived connection is exactly where the problem sits — proxy servers, firewalls, and CDN nodes all run timeout policies on idle connections, and Cloudflare’s challenge mechanism can inject an interstitial page mid-path. Any link in that chain kills the connection, and the Codex client starts Reconnecting.
HTTP streaming (SSE / chunked responses) doesn’t have this problem, because every request stands on its own — there’s no persistent bidirectional channel to keep alive.
Fix 1: A per-directory env proxy#
The fastest to take effect. Create a .env file in the project directory:
| |
Replace 7890 with your proxy client’s port. Codex reads this environment variable at startup, and all requests go through the proxy you specified.
Pros: works in 30 seconds, no config file changes. Cons: only applies to the current directory; you have to set it up again for each project.
Good for quickly confirming whether a proxy is the culprit.
Fix 2: Disable WebSocket in config.toml#
Edit ~/.codex/config.toml and add one line under the corresponding provider config:
| |
This tells Codex not to attempt the WebSocket upgrade and to use HTTP streaming directly.
Pros: set it once and it applies globally; no per-launch flags. Cons: the first token and mid-stream event updates may be a touch slower — hardly noticeable in practice.
This is the most recommended fix — the smallest change with stable results.
Fix 3: Enable TUN mode in your proxy client#
If your proxy client supports TUN (Clash Premium, mihomo, etc.), just turn TUN mode on:
| |
TUN mode takes over all traffic at the system network layer, so Codex’s requests go through the proxy automatically — no application-level configuration needed at all.
Pros: global transparent proxying; every app benefits, not just Codex. Cons: requires admin rights, some proxy clients don’t support it, and it can affect other networked apps.
For people already in the habit of running TUN.
Fix 4: A custom HTTP provider#
The most thorough fix: define a new provider that speaks pure HTTP. Edit ~/.codex/config.toml:
| |
This creates a chatgpt_http provider pointing at the ChatGPT backend API, using the Responses API protocol with WebSocket explicitly disabled.
Pros: avoids WebSocket entirely at the protocol level; model capabilities are completely unchanged (still gpt-5.5, still the Responses API). Cons: it’s a custom provider — if Codex later changes the ChatGPT backend paths or the provider field definitions, you may need to adjust along with them.
For when Fix 2 isn’t enough, or when frequent disconnects are hurting your work.
Which One to Pick#
Your network is already stable — change nothing; keep WebSocket’s real-time feel.
Occasional disconnects — Fix 2, supports_websockets = false; one line of config does it.
Constant Reconnecting — Fix 4 with a custom provider, or Fix 3 TUN mode; pick between the two based on what your proxy client can do.
Just experimenting — Fix 1 env proxy; 30 seconds to verify whether the proxy is the problem.
Related Posts#
- https://blog.baifan.site/en/codex-ssh-remote-development-guide/: Codex SSH remote development setup
