[Windows] Invisible avatarOverlay causes system-wide mouse cursor stutter on AMD 780M
Summary
After Codex has been running for a short time, the physical mouse cursor starts moving in visible jumps across the entire Windows desktop. The stutter continues even when Codex is idle and CPU/disk load is low. Fully exiting Codex stops it immediately.
The issue was isolated to Codex's invisible transparent avatarOverlay window:
- Restarting only Codex's GPU process made the cursor immediately smooth, but the stutter returned after about 20–30 seconds.
- Closing the hidden
avatarOverlaywindow, then restarting the same GPU process, made cursor movement remain smooth. - Removing
selected-avatar-id = 'null-signal'fromC:\Users\cioci\.codex\config.tomlprevented the overlay from being recreated. The cursor remained smooth.
This looks like an Electron/Chromium GPU-composition interaction involving the invisible layered/click-through avatar window, AMD Radeon 780M, 120 Hz, and 175% display scaling.
Environment
- Device: Lenovo ThinkBook 16 G6+ AHP
- Lenovo model: 21LG
- Device identifying number: MP2NP6FG
- Windows user profile:
C:\Users\cioci - OS: Windows 11 Pro, 64-bit
- OS version/build: 10.0.26200 / 26200
- CPU: AMD Ryzen 7 8845H, 8 cores / 16 logical processors
- RAM: approximately 29.9 GB
- GPU: AMD Radeon 780M Graphics
- GPU driver: 32.0.11039.6002
- GPU driver date: 2024-12-02
- Display: 2560 × 1600, 120 Hz
- Windows scale factor observed in renderer command line: 1.75 (175%)
- Power plan: High performance
- External mouse: USB VID_258A / PID_2031
- Touchpad: ELAN I2C
- Both input devices reported status OK
- Codex package:
OpenAI.Codex_26.810.6296.0_x64__2p2nqsd0c76g0 - Codex package version: 26.810.6296.0
- Executable:
C:\Program Files\WindowsApps\OpenAI.Codex_26.810.6296.0_x64__2p2nqsd0c76g0\app\ChatGPT.exe - Embedded Chromium/Electron executable version: 151.0.7922.137
- Codex log directory:
C:\Users\cioci\AppData\Local\Packages\OpenAI.Codex_2p2nqsd0c76g0\LocalCache\Local\Codex\Logs\2026\08\15 - Report timestamp: 2026-08-15, Europe/Istanbul (UTC+03:00)
Reproduction
- Reboot Windows.
- Before launching Codex, move the mouse: movement is smooth.
- Launch Codex with an avatar selected:
``toml``
[desktop]
selected-avatar-id = 'null-signal'
avatar-overlay-mascot-width-px = 138
- Use Codex for some time.
- Stop active reasoning and leave Codex idle.
- Move the pointer across Codex and other Windows applications.
Actual result
The physical mouse cursor moves in jumps/stutters system-wide, despite no obvious resource saturation. The stutter persists while Codex is idle. Fully unloading Codex stops it immediately.
Expected result
An invisible/hidden avatar overlay must not affect Windows cursor presentation or desktop composition.
System-load checks while the problem was present
15-second baseline:
| Counter | Average | Maximum |
|---|---:|---:|
| Total CPU | 14.20% | 19.22% |
| DPC time | 0.23% | 1.65% |
| Interrupt time | 0.25% | 0.78% |
| Processor queue length | 0 | 0 |
| Average disk queue length | 0.01 | 0.03 |
| Available memory | 12,489 MB | 12,774 MB |
| Pages input/sec | 0.86 | 2.96 |
A later 10-second check after the workaround also showed low DPC/interrupt/disk queues:
- DPC average/max: 0.281% / 0.677%
- Interrupt average/max: 0.280% / 0.678%
- Processor queue: 0
- Disk queue average/max: 0.012 / 0.034
This does not resemble CPU starvation, paging, disk contention, or a generic HID/DPC problem.
Process and GPU observations
Codex process tree included:
- Electron main process
- dedicated
--type=gpu-process - multiple renderers
- utility/network/storage processes
- bundled
codex.exeapp server
Before the first GPU reset:
- Codex main PID: 5760
- Codex GPU PID: 19540
- GPU-process private memory: approximately 586 MB
- GPU-process handles: 2,745
- GPU 3D utilization while nominally idle: average approximately 0.98%, max approximately 2.34%
- DWM PID: 2416
- DWM private memory: approximately 942–988 MB
- DWM handles: approximately 3,360
- Codex used hardware GPU acceleration; no
--disable-gpuargument was present.
Renderer command lines included:
--device-scale-factor=1.75--num-raster-threads=4--enable-features=ReportStuckThrottle--disable-features=DropInputEventsWhilePaintHolding,...
A/B test 1: GPU process reset only
- Terminated only Codex GPU PID 19540.
- Codex immediately created replacement GPU PID 37768.
- Main Codex process and the active task remained alive.
- Cursor movement became immediately smooth.
- After approximately 20–30 seconds, the same cursor stutter returned.
This strongly implicated the Codex GPU/composition path but showed that restarting the GPU process alone was not a durable fix.
Hidden avatar overlay evidence
The Codex main process owned this top-level window while the avatar was not visibly shown:
Handle : 0x1405B2
Title : Codex
Class : Chrome_WidgetWin_1
Visible : False
Position : (-12, 344)
Size : 434 × 413
ExStyle : 0x2800A8
Layered : True
Transparent : True
ToolWindow : True
So Codex retained a hidden, layered, click-through tool window for the avatar.
Codex logs also repeatedly referenced an invisible avatar window:
rendererWindowAppearance=avatarOverlay
rendererWindowFocused=false
rendererWindowId=2
rendererWindowVisible=false
The invisible avatar renderer still participated in periodic feature/config refresh work. A same-day log also recorded repeated main-renderer errors:
[desktop-notifications][global-error] ResizeObserver loop completed with undelivered notifications.
One observed log filename was:
C:\Users\cioci\AppData\Local\Packages\OpenAI.Codex_2p2nqsd0c76g0\LocalCache\Local\Codex\Logs\2026\08\15\codex-desktop-50ea4197-dc2b-4aab-a8b3-7bbfc00a1799-9876-t0-i1-000200-0.log
A/B test 2: close avatarOverlay, then reset GPU
- Sent
WM_CLOSEonly to the hidden transparent avatar window. - Confirmed the main Codex window/task remained alive.
- Terminated only GPU PID 37768.
- Codex created replacement GPU PID 20940.
- Monitored the new process for 45 seconds.
Selected samples:
| Seconds | Private MB | Working set MB | Handles | Threads | CPU seconds |
|---:|---:|---:|---:|---:|---:|
| 0 | 344.7 | 106.8 | 1,417 | 37 | 0.77 |
| 10 | 301.0 | 109.2 | 1,413 | 39 | 1.53 |
| 20 | 229.5 | 109.7 | 1,419 | 39 | 1.69 |
| 30 | 247.7 | 113.3 | 1,416 | 40 | 2.31 |
| 40 | 433.4 | 118.3 | 1,416 | 40 | 3.34 |
| 44 | 445.5 | 121.5 | 1,418 | 40 | 3.89 |
Private memory continued to fluctuate/grow, but handle count remained stable. Most importantly, cursor movement stayed smooth beyond the previous 20–30 second failure point. The user explicitly confirmed: “плавность держится стабильно, фризы прекратились” (“smoothness remains stable; the freezes stopped”).
This distinguishes the overlay/composition behavior from a simple GPU-process handle leak.
Durable local workaround
Removed this line from C:\Users\cioci\.codex\config.toml:
selected-avatar-id = 'null-signal'
The avatar-overlay-mascot-width-px = 138 value remains but has no selected avatar.
After waiting and rechecking all top-level windows owned by Codex, only the ordinary non-layered main window remained:
Visible : True
Title : ChatGPT
Layered : False
Transparent : False
ToolWindow : False
The hidden layered/transparent Codex avatar window did not reappear, and cursor movement remained smooth. Hardware acceleration for the main application was not disabled.
Ruled-out separate issue
Earlier in the investigation, the main Electron process was repeatedly reading/hashing bundled Chrome-plugin binaries. A 10-second FileIO trace observed approximately:
- local cached plugin
codex.exe: 13.64 GB logical reads - plugin-appserver
codex.exe: 13.51 GB logical reads - code-mode host copies: approximately 5.4 GB combined
- total: approximately 33 GB logical reads in 10 seconds
- approximately 48 repeated cycles in that interval
Disabling chrome@openai-bundled in C:\Users\cioci\.codex\config.toml stopped that excessive file-I/O behavior. However, the mouse stutter still reproduced later while Codex was idle and system load was low, so that file-I/O loop was a separate bug and not the root cause of this cursor issue.
The in-app browser@openai-bundled plugin remained enabled.
Requested fix
- Do not create/retain the avatar overlay window when the avatar is hidden.
- Fully suspend or destroy the avatar renderer/composition surface while invisible.
- Investigate the Windows layered/click-through overlay's interaction with Chromium 151, DWM, AMD Radeon 780M, 120 Hz refresh, and 175% scale.
- Consider a visible setting to disable the avatar overlay without editing
config.toml. - If the overlay must remain alive, ensure it does not keep a GPU surface/compositor path active while
rendererWindowVisible=false.
A privileged WPR GPU/DesktopComposition trace was attempted, but the current Codex process did not have permission to enable the system-performance profile. No ETL was produced.
The reporter explicitly consents to publication of the environment and device details above and accepts the associated anonymity/privacy risk.
3 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I reproduced the same class of issue independently on an NVIDIA desktop system and submitted the in-app diagnostics.
OpenAI Feedback ID:
01a00880-9f7a-7601-8c8b-bd04ca10f0b1Environment
26200.916826.810.6296.0151.0.7922.13732.0.16.1062)Behavior and isolation
ChatGPT.exeprocesses together made cursor motion immediately smooth in Explorer. The processes were then resumed. This associates the symptom with the Codex desktop process group, although it does not isolate a particular subprocess.rendererWindowAppearance=avatarOverlay,rendererWindowVisible=false, andrendererWindowFocused=false.This is useful as an independent NVIDIA reproduction of the issue reported here; it is not limited to the AMD 780M configuration. I have not yet isolated the GPU process or closed only the avatar overlay, so the overlay/compositor mechanism remains a strong correlation rather than a confirmed cause in this reproduction.
Same problem here on 26.810.7004.0, Windows 11 26200. I spent an evening measuring this instead of sleeping, so here is what I found. Two things that I don't see in the other reports: the actual mechanism, and the fact that turning the avatar off in config.toml does nothing.
Disabling the avatar does not remove the overlay.
I commented out
selected-avatar-idin~/.codex/config.toml, fully exited the app, verified the file was not rewritten, then started Codex again. The overlay window was back:So the setting lives somewhere else (Local Storage leveldb, I assume), and editing the config is not a workaround. The window gets created on startup regardless, invisible, and I never opened the pet.
It is a low-level mouse hook, not CPU contention.
I wrote a probe that installs its own
WH_MOUSE_LLhook and timesCallNextHookEx. That call runs the rest of the hook chain synchronously, so its duration is exactly how long every other low-level hook in the system took. I also ran a 1ms tick thread at Highest priority to catch OS-level stalls, and sampled per-process CPU.Every stutter matched the hook chain time almost exactly:
Delivery lag (driver timestamp to my hook) stayed at 0. The scheduler recorded 0 stalls. So the events reach the OS fine and then sit inside somebody's hook.
The durations cluster at 302-314 ms across every run. That is
LowLevelHooksTimeout, which defaults to 300 ms. The system is waiting out the timeout on every mouse event while the hook owner is busy.Worth noting: I burned 5 cores with a synthetic load and got zero stutters. CPU pressure alone does not cause this, so this isn't just "the app is heavy".
A/B test, same app session, nothing else changed.
I closed only the overlay window with WM_CLOSE (strict filter: hidden + layered + click-through + topmost + title "Codex", so the main window is never touched), then re-ran the same measurement:
| | overlay alive | overlay closed |
|--------------------|---------------|----------------|
| stutters (120s) | 5 | 0 |
| max hook chain | 437 ms | 0.137 ms |
| mouse events seen | 79,896 | 102,727 |
Hook chain time dropped by a factor of ~3000 and the stutters disappeared. Note the second run has more mouse events, so it's not that I moved the mouse less. The app survived fine, only the overlay renderer process went away.
Why this hurts more than it looks.
The overlay is click-through (
WS_EX_TRANSPARENT), and forwarding mouse position into a click-through window is what needs the hook. Since the hook is serviced by a thread that is also doing real work, every mouse event in the entire OS waits on it. That's why the stutter hits mouse, keyboard and touchpad at once, in every application, while audio and video stay perfectly smooth. Games and editors get it too, from a decoration nobody can see.Also worth flagging: I get the stutter while the app sits idle and I'm not interacting with it at all. The overlay doesn't need my attention to run.
Workaround until this is fixed: kill the overlay window after each launch. Closing the app is not necessary.
Questions for whoever picks this up. Does the overlay need a low-level hook at all, or would
RegisterHotKey/ plain window messages cover it? If the hook is required, can it be moved to a dedicated thread that does nothing else? And can the window be destroyed rather than hidden when no avatar is selected, since right now the config setting has no effect on it.