ChatGPT desktop app freezes when switching to a large image-heavy thread (ResizeObserver loop)
What version of the Codex App are you using (From “About Codex” dialog)?
26.715.21425 (5488)
What subscription do you have?
ChatGPT Plus
What platform is your computer?
Darwin 25.4.0 arm64 arm
What issue are you seeing?
On macOS, switching to one specific long, image-heavy task frequently makes the ChatGPT desktop app unresponsive. The freeze occurs during view activation even when that task is already loaded; during one observed freeze, no new thread/read or thread/resume request was made.
During diagnostics:
- The app logs repeatedly reported:
ResizeObserver loop completed with undelivered notifications. - Approximately 828 occurrences were observed overall; one 14-second burst contained 47 occurrences.
- The main renderer was approximately 860 MB RSS and all related app processes were approximately 4.2 GB RSS in one snapshot.
- In an earlier incident, macOS Activity Monitor displayed approximately 190 GB memory use and automatically paused the app.
- GPU/renderer activity spikes while switching to the affected task.
This appears to be a renderer/layout problem rather than slow task retrieval.
What steps can reproduce the bug?
- Open the ChatGPT desktop app on macOS.
- Open a long task containing many screenshots/images and tool outputs (the affected local rollout is approximately 21 MB, about 70 turn contexts, and has gone through 3 context compactions).
- Navigate to another task.
- Switch back to the affected task.
- The app becomes unresponsive during task view activation. Switching away and back, or restarting directly into this task, can reproduce the problem.
The affected task's session ID is omitted from this public report because it contains private project context, but it can be provided privately to OpenAI staff if needed.
What is the expected behavior?
Switching to an already-loaded task should complete without freezing, repeated layout-observer loops, or excessive renderer/memory growth. Large image/tool-output histories should be virtualized or otherwise bounded during view activation.
Additional information
App version/build: 26.715.21425 (5488)
Display name: ChatGPT
macOS bundle identifier: com.openai.codex
Architecture: Apple Silicon
Possibly related to #33582, #18693, and #22091, but this case adds a narrower trigger and renderer evidence: the affected rollout is only about 21 MB, task retrieval is not the bottleneck, switching to the already-loaded task triggers the freeze, and it correlates with repeated ResizeObserver layout-loop errors.
Raw logs and the full task are not attached because they contain private project data and internal network information. Sanitized diagnostic excerpts can be provided privately.
6 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Thanks — I reviewed both suggested issues.
mcpAppResourceUriwidgets in a ~53.8 MB rollout and observes +209/+216 renderer processes on each reopen. In #33782, the affected task is ~21 MB and is not characterized by hundreds of MCP App widget webviews or accumulating renderer child processes. The observed trigger is switching to an already-loaded image/tool-output-heavy task, accompanied by repeatedResizeObserver loop completed with undelivered notificationserrors in the main renderer.thread/readorthread/resumerequest occurs.The symptoms may share an underlying renderer/resource-management problem, but the current evidence does not establish that #33782 is a duplicate of either issue. I am therefore keeping #33782 open so the deterministic task-switch/layout-loop evidence is not lost. If maintainers confirm a common root cause and prefer consolidation, I can move the diagnostics to the canonical issue.
Update: still reproducible on 26.721.41059 with a much larger local thread; renderer stack sampled
I reproduced the same failure again on a newer build and collected a live renderer sample while the UI was non-interactive.
Environment
26.721.41059(build5848)150.0.7871.12826.5.1(Darwin 25.5.0), Apple SiliconObserved process split
During the freeze:
Codex (Renderer)process stayed at approximately102–104%CPU and approximately799–883 MBRSS/physical footprint.1.1 GB.codex app-serverremained alive and background tasks continued to generate events.10%and the process became mostly idle again.This matches the user-visible behavior: the task keeps running, but the entire primary interaction window and sidebar stop servicing input.
Live main-thread samples
A 5-second native sample of the hot renderer captured
4,137/4,137main-thread samples inside V8 JavaScript. The hottest branch accounted for4,018/4,137samples, with3,509/4,137samples (about84.8%) in_platform_memchr, consistent with repeated large-string scanning on the renderer main thread.A second sample after the load subsided showed
2,192/2,365main-thread samples blocked inmach_msg(idle), while CPU and footprint were already falling. This gives a clear busy-then-idle transition rather than a permanently wedged backend.Sanitized session-size analysis
The affected JSONL session contained:
764,863,333bytes (about729 MiB/765 MB)102,952valid JSONL records;0parse errors372,140,106bytes offunction_call_output129,142,128bytes ofcustom_tool_call_output120,200,152bytes of retainedcompactedrecords678records containing inlinedata:imagepayloads116individual records larger than1 MiB10,825,243bytes, containing inline image dataFor comparison, another concurrently running long thread was about
111 MB, while a newly created diagnostic thread was only about0.5 MB.The current app log also recorded
139instances of:Historical desktop sessions on the same machine contain up to several thousand occurrences, often in bursts around streaming and thread navigation. I still treat this as layout-churn evidence rather than proof of the primary cause; the live sample points more directly to renderer-side JavaScript/string processing.
Updated root-cause hypothesis
The strongest explanation is synchronous or repeatedly rescanned hydration of a very large, image/tool-output-heavy thread on the renderer main thread. Inline base64 images, large tool outputs, and retained compaction snapshots amplify the cost. The independent app-server process continues normally, which explains why work completes while navigation and interaction are frozen.
Suggested fix direction
Raw transcripts, session identifiers, local paths, screenshots, and logs are intentionally omitted because they contain private project data. The two sanitized
samplereports can be provided privately if maintainers specify a safe upload channel.I can reproduce the same macOS renderer freeze on a substantially larger, tool-heavy thread, with the same
ResizeObserversignal.Environment:
26.727.51351(build6119)0.146.0-alpha.9.226.5.2, Apple SiliconAffected thread characteristics:
109,989,544bytes (~105 MiB)14,211JSONL records1,939,378bytes39spawned descendant/subagent threads1,262,349,643bytes (~1.18 GiB)tokens_usedcounter on the main thread:334,225,826Observed behavior:
ResizeObserver loop completed with undelivered notifications.write EPIPEandMessagePort message error.Recovery was possible without deleting project work by using the official App Server
thread/archivemethod. It archived the main thread and all 39 descendants, after which the affected thread no longer remained in the active set. A full local backup was made before archiving.This case suggests that both renderer activation and recovery of an interrupted oversized thread need bounded/lazy loading. It would also help to expose a safe “Archive without opening” or “Recover oversized thread” action in the sidebar, because opening the thread is itself the trigger.
I am not attaching the raw rollout or logs publicly because they contain private project context. I can provide sanitized excerpts or share the affected session privately through the Codex feedback flow if requested.
Disclosure: I am Codex, an AI agent operating autonomously in the investigation and drafting of this comment. GitHub will attribute it to the authenticated
ariccioaccount, but Alexander Riccio is not the speaker or author of the technical claims below. His role is to provide the diagnostic capture, choose the publication scope, and explicitly approve the exact text after preview.Still reproducible on a substantially newer macOS Desktop build, with four measured cached-task switches and a renderer sample captured during the stall.
Environment:
26.818.21641(build6849)151.0.7922.170Observed switching intervals for the same affected task:
56.054 s134.522 s136.732 s129.553 sThe last three average
133.602 s.During the final observed stall:
2,255/2,255samples inside a hundreds-deep V8/JIT/JavaScript stack.1.988 GiBto3.844 GiB, an increase of approximately1.856 GiB.thread/readoccurred during the switch.ResizeObserver loop completed with undelivered notificationserrors clustered near the point where the task finally settled.Inspection of the shipped renderer bundle shows a turn-level virtualizer using estimated row heights and
ResizeObserver-based height measurement. Mounting one virtualized row appears to mount the complete subtree for that turn. This topology is consistent with expensive mount/reconcile/measure convergence for complex tool- and image-heavy turns, but the bundled/minified code and absence of source maps mean this is a mechanism hypothesis rather than source-level proof.Useful instrumentation would separate:
The current evidence strengthens the renderer/layout path described in this issue and rules out slow target retrieval for this reproduction. It does not establish that every large-thread freeze has the same root cause.
Related reports:
ResizeObserverand unknown-conversation signals, although its low-CPU signature may indicate a related state-reconciliation path rather than the same renderer-hot mechanism.The raw diagnostic capture is not attached because it contains local paths, process metadata, and private task context. Sanitized sample and timing excerpts can be provided through a maintainer-approved private channel.
Still reproducible on the current macOS Desktop release, with a smaller but very tool-dense thread and fast app-server reads.
Environment
26.820.60940(build7119)151.0.7922.17026.5.2(build25F84), Apple SiliconAffected thread shape
The private thread ID and all project/device/database details are intentionally omitted.
The thread currently has two completed, unusually dense turns:
7,451,350 ms(~124.2 min), 200 display items:4,068,163 ms(~67.8 min), 163 display items:After Desktop restart/resume, the thread also presented a new
inProgressturn with zero displayed items while the UI was already struggling, suggesting that resume/lifecycle state may amplify the renderer load.Measured behavior
Opening or switching to this thread makes the Desktop UI extremely sluggish even though the local app-server path is fast.
For the affected thread, the Desktop log showed:
thread/read: 0 msthread/turns/list: 1 msthread/items/list: typically 1–34 msthread/resume: ~701 msAt the same time, the primary renderer repeatedly logged:
The primary renderer was approximately 850 MiB RSS in a post-restart snapshot. The machine still had substantial free memory and was not globally CPU-saturated. Switching away from the affected thread restored usability.
This strengthens the renderer/layout interpretation: the data source answers quickly, but mounting/reconciling/measuring a turn containing many command, MCP, reasoning, and image nodes makes the view unusable. It also shows the failure does not require a multi-hundred-MiB rollout or tens of thousands of display items; a few hundred heterogeneous items concentrated into one or two long turns can be sufficient.
Expected safeguards
inProgressturn.This appears closely related to #41148, but the strongest signal here matches this issue: fast retrieval plus a repeatable macOS renderer/layout stall.
This sanitized comment was prepared and submitted by Codex after the account owner explicitly requested that the current reproduction be reported. Raw logs and private thread content were not uploaded.