Chronicle can drive replayd to 100% CPU and make CleanShot / ScreenCaptureKit hang on macOS 26.0
What issue are you seeing?
On one Mac, enabling Codex Chronicle appears to make macOS replayd spin at roughly 99-100% CPU. While this is happening, CleanShot X becomes very slow and ScreenCaptureKit calls can hang or time out. Disabling Chronicle and killing the stale Chronicle / replayd processes immediately restores CleanShot and ScreenCaptureKit behavior.
This looks like a Chronicle + macOS ScreenCaptureKit / replayd interaction. CleanShot seems to be affected because it shares the same macOS screen capture service, not necessarily because CleanShot is the root cause.
Environment
Main Mac where the issue reproduces:
macOS: 26.0 (25A354)
Architecture: arm64
Codex Desktop: 26.422.71525 (bundle version 2210)
Codex Chronicle binary: /Applications/Codex.app/Contents/Resources/codex_chronicle
codex_chronicle sha256: 6a599d41e5b2f4e5efd392526f43a26eff8df5971fe741e237da8247b1aa30e1
codex_chronicle mtime/size: Apr 29 10:40:18 2026, 4427728 bytes
CleanShot X: 4.8.8
Current display setup: built-in Color LCD + external P27FBA-RAGL 1920x1080 @ 100Hz
Codex app entitlements include:
com.apple.security.device.audio-input = true
Comparison Mac mini where Chronicle and CleanShot coexist normally:
macOS: 26.2 (25C56)
Codex Desktop: 26.422.62136
Codex CLI: codex-cli 0.124.0
CleanShot X: 4.8.8
Display: single external P27FBA-RAGL, 1920x1080 @ 100Hz
Observed load: codex_chronicle ~0.5-2.6%, replayd ~0.0-0.7%, CleanShot X ~0.0%
Chronicle latest.jpg stayed fresh on that machine
Symptoms observed on the affected Mac
When Chronicle is enabled:
codex_chroniclestarts and spawns a--list-displays-childprocess.replaydrises to approximately 99-100% CPU.- CleanShot X becomes noticeably slow.
- Chronicle does not produce a fresh
latest.jpgunder$TMPDIR/chronicle/screen_recording/. - Chronicle-generated memory summaries stopped updating. The latest local summary I found was from
2026-04-22 23:17 JST. - A minimal ScreenCaptureKit test that calls
SCShareableContentcan hang / time out while the system is in this state.
When Chronicle is disabled in Codex Settings and stale processes are killed:
replayddrops back to roughly 0.0-0.1% CPU.- CleanShot X becomes fast again.
- The same minimal ScreenCaptureKit test succeeds quickly. One successful run completed in
0.027sand returneddisplays 1,windows 25.
At the time of filing, Chronicle is intentionally disabled on this Mac as a workaround. Current process state is stable:
coreaudiod: 0.0% CPU
CleanShot X: 0.0% CPU
replayd: 0.0% CPU
no active codex_chronicle process
Reproduction / isolation steps already tried
- Enable Chronicle in Codex Desktop.
- Observe
codex_chroniclestart. - Observe
replaydclimbing to ~99-100% CPU. - Try CleanShot X capture; CleanShot becomes slow.
- Check Chronicle temp capture directory;
latest.jpgis missing or stale. - Run a small ScreenCaptureKit /
SCShareableContenttest; it can hang or time out. - Turn Chronicle off from Codex Settings.
- Kill stale
codex_chronicleand restart/killreplaydif needed. - Observe CleanShot and ScreenCaptureKit recover immediately.
I also tried removing the external display and leaving only the built-in display. Chronicle still triggered the bad state, so this does not appear to be caused solely by multi-display capture. However, multi-display capture may still be a contributing factor or amplifier.
Expected behavior
Chronicle should not put replayd into sustained 99-100% CPU, and it should not make other ScreenCaptureKit-based apps such as CleanShot X unusable.
If Chronicle cannot acquire screen capture cleanly, it should fail or back off rather than leaving replayd saturated and failing to write fresh capture frames.
Actual behavior
Chronicle appears to enter a bad capture state where replayd stays saturated, Chronicle capture output is not fresh, and other screen capture apps become slow until Chronicle is disabled and stale processes are cleared.
Related issues
This seems related to several recent Chronicle / macOS capture issues, but I did not find an exact CleanShot + replayd report:
- #19134: recurring macOS private-window-picker / screen-and-audio prompt after Allow
- #19126: Chronicle triggering high
coreaudiodCPU with Rogue Amoeba ARK / SoundSource - #19516: orphaned
codex_chronicleafter killed app causes lock-wait loop and high CPU - #19341: request for selected-display capture and pause/resume controls
The lifecycle aspect in #19516 is especially plausible here because this affected Mac had a Codex app freeze during an update before the issue was noticed.
Workaround
Keep Chronicle disabled on the affected Mac. If it has already entered the bad state, disable Chronicle, then stop stale helpers:
pkill -f '/Applications/Codex.app/Contents/Resources/codex_chronicle'
killall replayd
After that, CleanShot and ScreenCaptureKit recover.
Additional notes
The comparison with the Mac mini suggests that high refresh rate alone is probably not the whole explanation: the Mac mini is using the same external display at 100Hz and runs Chronicle + CleanShot normally. The affected Mac is still on macOS 26.0, while the healthy Mac mini is on macOS 26.2, so this may involve a macOS ScreenCaptureKit / replayd bug that newer macOS builds handle better.
4 Comments
Follow-up with a narrowed repro and likely fix direction from the same affected Mac.
Environment:
This is still the latest prod appcast entry I see. The installed helper matches the official prod zip helper. The beta helper for
26.506.31421/ bundle2619also fails the same way.Direct child request:
Result:
This also reproduces when:
/tmpcopy of the helper/tmpcopyreplaydTCC/unified logs show
TCC Allow; this does not look like a permission denial.I sampled the helper while it was stuck:
The timeout thread was sleeping in:
The important narrowed finding: default
SCShareableContentenumeration hangs on this machine, but filtered enumeration succeeds.Default API:
Result:
Equivalent Rust
screencapturekit = 1.5.4default call also hangs:Filtered API:
Result:
onScreenWindowsOnly: trueappears to be the key option:Suggested fix direction for Chronicle's display inventory path:
I used
exclude_desktop_windows(false)because it still returns the full display list locally; the important part appears to beon_screen_windows_only(true). Since the Chroniclelist_displayspath only needs display inventory, this should avoid the localreplaydhang caused by enumerating all/off-screen windows.With Chronicle disabled locally:
there is no active
codex_chronicleprocess,replaydreturns to idle, and filtered Swift/RustSCShareableContentprobes succeed.Confirming this on a third machine with identical Codex / macOS versions.
Environment
Quantified replayd saturation
While Chronicle was enabled,
replaydwas accepting short-lived client connections at a steady rate. Counted via:Result: ~70 distinct client PIDs in 2 minutes (range observed: 4097 -> 4395 over 120s). Each PID was a
codex_chronicle --screen-capture-childworker spawned by the parentcodex_chronicledaemon (PPID match confirmed viaps -axo pid,ppid,command). Each child died within milliseconds, consistent with the documented 5000ms ScreenCaptureKit timeout hitting on the defaultSCShareableContent::get()call described by @KaishuShito above.System-wide impact (beyond CleanShot)
The saturation breaks the entire macOS screen capture pipeline, not just third-party tools:
| Path | Behavior |
|---|---|
|
cmd+shift+3/cmd+shift+4| freezes, no file produced ||
cmd+shift+5(screenshot toolbar) | freezes || Shottr | freezes mid-capture |
|
/usr/sbin/screencapture -x /tmp/x.png(CLI) | fails withcould not create image from display|After
codex features disable chronicle+ killing the parentcodex_chroniclePID, all four paths recovered immediately, no reboot required.Reboots do not help
Worth flagging for anyone landing here: rebooting does not fix this. Codex auto-launches via macOS modern login items,
codex_chroniclerespawns within seconds of login, replayd is saturated again, and the system looks broken from a fresh boot. The only durable fix is the config toggle.Workaround confirmed durable
This writes
features.chronicle = falseto~/.codex/config.toml. After quitting and relaunching Codex.app, thecodex_chronicledaemon no longer spawns at all.replaydreturns to 0 client connections / 10s and all screenshot paths work normally. Codex itself (chat, plan mode, app-server, MCP servers, computer_use, browser_use) keeps functioning fully.Adding this here so future searchers find the systemic impact (not just CleanShot) and the durability of the workaround across restarts.
Adding another data point from a different machine, because it looks like the same Chronicle / ScreenCaptureKit /
replaydfailure mode, but with low aggregate CPU and Chrome window capture failures.Environment:
Observed symptoms:
WindowServer"Screenshots via streams..." messages.replaydloggedaccepted client connection PID: 6862; that PID was/Applications/Codex.app/Contents/Resources/codex_chronicle --screen-capture-child.TERMstopped the parentcodex_chronicleprocess, but the--screen-capture-childremained orphaned and had to be killed separately.Window-specific behavior:
screencapture -x -l <window_id>in about 0.23s and produced a valid PNG.getWindowForWindowId timed out/could not create image from windowerrors.replayd/ ScreenCaptureKit into a bad state where unrelated screenshot tools also degrade.Possible product-level fixes worth considering:
replaydaccess and multiplexes frames to Chronicle, computer-use, and explicit screenshot features, instead of allowing multiple independent capture loops.WindowServeremits repeated stream-screenshot warnings,SCShareableContenttimes out, or frame freshness stalls. Back off FPS/resolution or pause capture instead of retrying aggressively.codex_chronicle --screen-capture-childprocesses and resets capture state when the parent exits or frame output goes stale.I can provide additional redacted log snippets if they would help isolate the failure mode.
Adding an independent datapoint on a newer Codex Desktop build where the same Chronicle / ScreenCapture path appears to fan out into a
tccd->syspolicyd/securityd/trustd/logdlog storm.Environment:
Observed symptoms while Chronicle was enabled:
The most useful additional signal is that the apparent hot path was not only
replaydCPU. The logs show repeated ScreenCapture TCC checks for Codex/Chronicle, followed by repeated static code / trust evaluation and syspolicy ticket lookup.Sanitized
tccdattribution chain fromlog show --style compact --info --debug --predicate 'process == "tccd"':Repeated error from
tccd:Counts captured from local logs over the preceding 30 minutes:
Process state after disabling Chronicle:
There were also many MCP/Node helper processes in this session, but the direct evidence for this spike points to the ScreenCapture permission path:
This may be related to the broader syspolicyd reports in #25882 and process-lifecycle reports in #25744, but this datapoint is specifically the Chronicle ScreenCapture/TCC path and the repeated
com.openai.codex.code_sign_cloneLSApplicationRecord/static-code validation loop.