[Windows App] Severe UI freezes correlate with Codex Micro HID/serial module; disabling it removes the hangs
What version of the Codex App are you using (From “About Codex” dialog)?
26.715.4045.0 Microsoft Store MSIX package: OpenAI.Codex
What subscription do you have?
[Fill in your subscription, e.g. Plus / Pro]
What platform is your computer?
Windows 11 x64, OS build 26100 32 GB RAM
What issue are you seeing?
The Codex Windows desktop app repeatedly becomes unresponsive during ordinary UI operations, including switching threads, opening or creating a task, typing, and sending a prompt.
Windows Task Manager does not permanently mark the app as hung, but the main ChatGPT.exe process repeatedly reports Responding=False for approximately 7.5–12 seconds. CPU usage is low during the freeze, and the renderer/GPU/backend processes remain alive.
Windows Event Viewer has also recorded Application Hang event 1002 for ChatGPT.exe.
After approximately two full days of troubleshooting, the strongest correlation I found is the private Codex Micro feature.
During a normal launch, the main ChatGPT.exe process loads these native modules:
- @worklouder/device-kit-oai/.../node-hid/build/Release/HID.node
- @worklouder/device-kit-oai/.../serialport/.../bindings.node
The installed app also contains feature gate 3207467860 and the strings "Codex Micro" and "@worklouder/device-kit-oai".
I do not own or have a Codex Micro / Work Louder device connected.
I then performed an A/B test using an experimental launcher that replaces only @worklouder/device-kit-oai with a no-device stub at startup.
The successful launch reported:
- mode: micro-disabled-worker-safe
- evaluation: codex-micro-disabled-worker-safe
In that process:
- HID.node and the serialport bindings were no longer loaded.
- The temporary localhost inspector port was closed after startup.
- 20 consecutive responsiveness samples were all Responding=True.
- So far, the UI freezes have not reproduced.
This strongly suggests that Codex Micro device discovery or communication is blocking the Windows Electron main process even when no Codex Micro device is present.
What steps can reproduce the bug?
- Launch Codex normally from the Windows Start menu.
- Switch between existing tasks, create a new task, or send a prompt.
- Observe intermittent severe UI freezes / Windows "Not Responding".
- Fully quit Codex.
- Launch it with the Codex Micro module stubbed.
- Repeat the same operations.
- The UI remains responsive and the Work Louder native modules are not loaded.
What is the expected behavior?
Codex should remain responsive during normal UI operations.
The private Codex Micro device service should not initialize when the feature is not being used or when no compatible device is present. Any HID/serial discovery should run asynchronously and must not block the Electron main process.
A supported feature flag for disabling Codex Micro would also provide a safe temporary workaround.
Additional information
Related general Windows freezing report:
https://github.com/openai/codex/issues/20214
Experimental workaround used for the A/B test:
https://gist.github.com/triesmon/bdc20a18ec34108e2608c1294c451f86
Codex thread ID:
019f7e4f-38b3-7100-ba9f-27ba06a4ac12
I can provide sanitized desktop logs and Windows Application Hang events privately.
6 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
This has been doing on for DAYS! and OpenAI seems to not care! Likely thousands of devices not working
Update to the latest version from the store, it seems to have fixed the issue
Additional controlled A/B evidence on the current Windows build. This appears to connect the Codex Micro reports here with the downstream
git.exe/taskkill.exe/ WMI storm in #34260.Environment:
OpenAI.Codex_26.715.8383.0_x64__2p2nqsd0c76g0status: not-detectedthroughout the testI did not restart Codex and did not modify the signed MSIX or
app.asar. With the same Electron main PID, I temporarily attached a loopback Inspector, replaced only the renderercodexMicroservice slot with a no-device stub, called the existing service's ownstop(), and immediately closed the Inspector.Ten-second Microsoft-Windows-Kernel-Process ETW windows before and after:
| State | Direct children of main PID | Rate | git.exe | taskkill.exe | powershell.exe | Primary WmiPrvSE core equivalent |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| Micro running | 648 | 64.36/s | 317 | 316 | 15 | 3.714 |
| Micro stopped | 19 | 1.89/s | 0 | 0 | 19 | 0.068 |
| Inspector closed, sustained | 21 | 2.09/s | 0 | 0 | 21 | 0.065 |
The direct process-start rate fell by about 97.1%, the primary provider-host CPU fell by about 98.2%, and the Git/taskkill churn disappeared completely. A later 10-second verification remained at 0 Git and 0 taskkill. The Codex main PID and start time did not change, and the Inspector was no longer listening.
This Codex process has no matching ChatGPT.exe Event 1000 faults since its start, so the problem is not limited to the older serialport ABI crash signature. On this machine, merely stopping the optional Micro service removes the process/WMI storm.
The current bundle has moved Windows discovery from broad
nodeHID.devices()to a native filteredfindCodexMicroInterfaces()topology watcher. However:@worklouder/device-kit-oaitransport before any matching device is confirmed.serviceManager.getState()creates the service and unconditionally starts the watcher, even when the user has no device.Suggested product changes:
getState()implicitly start the native service; expose a stable disabled/not-detected state until opt-in or a safe device-arrival signal.taskkillcleanup concurrency and replace repeated PowerShell/WMI full-process snapshots with a native process snapshot.I retained the four small ETL captures and can provide sanitized exports privately if useful.
Current-build follow-up: Store package 26.721.3996.0
I repeated the check on the current official Windows x64 Store package using read-only inspection and a normally launched, unmodified process.
Package identity
OpenAI.Codex_26.721.3996.0_x64__2p2nqsd0c76g026.721.31836Store/OkChatGPT.exeSHA-256:1aa14124b6586eae0f589e624c37854697789c4b57ab1103e04dc3920612291eapp.asarSHA-256:886ecd4906e918de164ac8eb1a6c4f1a77e051130b67b8a401c021b7f1cd6e50No present PnP device matched the current service's Work Louder VID
0x303Aand PIDs0x8360,0x8297, or0x8298.Live module map
The normal Electron main process had no
--inspectargument and mapped:@worklouder/device-kit-oai/.../@worklouder/wl-device-kit/.../@serialport/bindings-cpp/build/Release/bindings.noderesources/native/hid-topology-watcher.nodeNo Codex process mapped Work Louder's
HID.node.This is consistent with the newer Windows discovery implementation:
codex-micro-service-DS07ThMO.jscalls the filtered nativefindCodexMicroInterfaces()topology watcher on Windows; thenode-hiddevicesAsync()path is Linux-only. The service does not callWLDeviceDiscovery.findWLDevices()for Windows discovery.Current import graph
The optional service nevertheless still loads the full Work Louder transport before a matching device is known:
The independent base-kit request is material for existing diagnostic workarounds: intercepting only the exact
@worklouder/device-kit-oairequest no longer suppresses the native-bearing base kit on this build, because the service subsequently requests@worklouder/wl-device-kitdirectly.Interpretation
This confirms that
26.721.3996.0still eagerly maps the nested serialport native binding when no supported Work Louder hardware is present. It also confirms that the older broad synchronous WindowsHID.nodeenumeration path is not active in this process.Module presence alone does not prove that the serialport binding causes the observed lag. This startup independently logged a
31,453 msshell-environment timeout and a4,131 msapp-server initialization handshake, so those remain substantial alternative contributors. A controlled current-build A/B is still needed before attributing responsiveness problems to this remaining eager load.No signed package,
app.asar, application data, settings, credentials, conversations, plugins, or startup configuration was modified for these observations.Current-build A/B reproduction plus residual IPC stalls (
26.727.6591.0)I reproduced the severe Windows freezes on a newer Store build and then measured what remains after the Codex Micro path is disabled. The evidence points to two separate contributors:
Environment
OpenAI.Codex_26.727.6591.0_x64__2p2nqsd0c76g0(Status: Ok)2620032.0.16.1074Current package/runtime path
Read-only inspection of this build found:
@worklouder/device-kit-oaiversion0.1.11node-hidand@serialportnative dependencies.vite/build/service-4uQDVZZZ.js.vite/build/main-C1YkadXg.jsThis build no longer follows the older
WLDeviceDiscovery.findWLDevices()path described in some earlier reports. It uses a native HID topology watcher, but the service bundle still eagerly resolves/loads@worklouder/device-kit-oaiand its Work Louder dependency chain.I launched a new process paused before application JavaScript and instrumented only Node's module loader. Before allowing any suspicious native add-on to execute, the observed sequence was:
The test process was then terminated. The signed MSIX,
app.asar, application data, credentials, conversations, plugins, and MCP configuration were not modified.Controlled A/B result
For an unofficial diagnostic A/B test, I used a version- and hash-pinned external launcher. It replaces only the exact internal Micro service request above, and only when the parent is the exact main bundle, with a minimal service returning the existing
not-detectedstate. The loopback inspector was bound to127.0.0.1, closed immediately after injection, and had a fail-closed timeout.Self-test results:
@worklouderfile enteredrequire.cache;This confirms that the Codex Micro/Work Louder path remains a major contributor on
26.727.6591.0. An old workaround that only stubsWLDeviceDiscovery.findWLDevices()is not applicable to this build because the service implementation changed.Residual stalls after Micro is disabled
I then ran a separate 30-second, 10 Hz local measurement while switching among several large chats and sending a short prompt. The sampler recorded only process counters, input-activity timestamps (not keys/content), and
WM_NULLmessage-queue latency. It did not inspect chat contents, logs, commands, or file paths.Results after the Micro service had already been disabled:
2.016 s;codex.exeprocesses and two code-mode hosts were present;codex.exeand coincided with about41.3 MBread and9.6 MBwritten through Windows process I/O counters;26.4 MBread and9.0 MBwritten;142.6 MBwhile another read141.5 MBduring the capture (an inference: the near-symmetry is consistent with internal pipe/IPC transfer, although process I/O counters cannot prove the transport);266.0 MBread /36.2 MBwritten;149.7 MBread /147.7 MBwritten;2.64 GBto2.72 GB; total ChatGPT private memory remained around3.8 GB.There was ample free RAM, negligible paging, no sustained DPC/interrupt activity, and no new crash/WER report. CPU was not globally saturated, but on a 24-logical-processor system one fully occupied thread is only about 4.2% total CPU. The data is therefore consistent with a blocked/saturated Electron event loop plus IPC/backpressure rather than overall system resource exhaustion.
Suggested fix surfaces
For the severe Micro path:
For the residual stalls:
codex.exeprocesses against the state-retention scenarios tracked in #25779.The Micro workaround is unofficial and intentionally aborts after an app update. I am reporting the measurements rather than recommending that workaround to other users.