Is something in the ChatGPT desktop app quietly spending your quota while you're not using it? Find out in about three seconds.
Full write-up (70-day timeline, controlled on/off data, raw logs): https://machblink.com/chronicle
A read-only shell script that surfaces every local trace of the background screen-capture summarization pipeline in the ChatGPT desktop app for macOS (the "Chronicle" research preview, and its successor "Computer History").
No dependencies. No network calls except one optional request to OpenAI's own usage endpoint, using the token already on your machine. Nothing is modified, nothing is uploaded, nothing is phoned home.
"My Codex/ChatGPT quota drains while the app sits idle" has been reported many times since May 2026. The reports are real, but the answer people usually get is "check your usage page" — and the usage page is precisely where this particular consumer does not appear.
On my machine the pipeline ran for at least 70 days. Over the 8 days still covered by my local logs it captured 82,791 screenshots and made 6,002 background model calls. I could not find it by asking ChatGPT, by contacting official support, by signing out of all devices, or by deleting and reinstalling the app. I found it by reading local logs and Time Machine snapshots.
This script is the shortcut, so nobody else has to do that.
| # | Check | What it tells you |
|---|---|---|
| 1 | App version, sidecar binary present | Whether your build ships the capture component |
| 2 | codex_chronicle process | Whether it is running right now |
| 3 | ~/.codex/config.toml [features] | Whether the feature is enabled |
| 4 | Consent flags in global state | Whether consent was ever accepted (it persists across updates) |
| 5 | $TMPDIR/chronicle cache | Size, and whether new frames landed in the last hour |
| 6 | Local summary files | How many background summaries exist, and their date range |
| 7 | ~/Library/Logs/com.openai.codex | Per-day frame counts and background model call counts |
| 8 | (optional) Official usage endpoint | Your current 5-hour and weekly usage |
| 9 | Cross-check | Config says off, but is it actually still running? (#27773 reports it may not stop) |
The point of this repository is that software should not do things on your machine that you have not looked at. It would be inconsistent to then ask you to run a stranger's script. So here is every check as a command you can read and paste yourself. All read-only.
# 1. Is it running right now? (no output = no)
pgrep -lf codex_chronicle
# 2. What does the config say? (look for chronicle = true)
grep -A3 '^\[features\]' ~/.codex/config.toml
# 3. Screenshot cache size, and files written in the last hour
D="$(getconf DARWIN_USER_TEMP_DIR)chronicle"; du -sh "$D"; find "$D" -type f -mmin -60 | wc -l
# 4. How many background summaries are on disk
ls ~/.codex/memories/extensions/chronicle/resources | wc -l
# 5. Frames captured and model calls per day, from your own logs
for d in ~/Library/Logs/com.openai.codex/*/*/*/; do
f=$(grep -ahc 'wrote sparse memory frame' "$d"*.log 2>/dev/null | awk '{s+=$1}END{print s+0}')
[ "${f:-0}" -gt 0 ] || continue
c=$(grep -ahc 'starting codex exec summary session' "$d"*.log 2>/dev/null | awk '{s+=$1}END{print s+0}')
echo "${d#*com.openai.codex/} frames=$f calls=$c"
done
Command 5 is the important one. wrote sparse memory frame is a captured
frame; starting codex exec summary session is a model call billed to your
quota.
Prefer to have your own assistant walk you through it? Paste these and ask it to explain the output — but ask it to run and explain these exact commands, not to write its own. Those two event names came from reading real log files; an assistant guessing from general knowledge will get them wrong and report that everything is fine.
Same checks, formatted output, plus consent flags, the disabled-but-still-running cross-check, and an optional quota sample.
curl -O https://raw.githubusercontent.com/hankwangtw/chronicle-quota-check/main/chronicle-quota-check.sh
less chronicle-quota-check.sh # read it first
bash chronicle-quota-check.sh
There is deliberately no curl … | bash one-liner.
Options:
bash chronicle-quota-check.sh --usage # also sample your official quota
bash chronicle-quota-check.sh --days 30 # scan 30 days of logs (default 14)
== Live background processes ==
✗ codex_chronicle is RUNNING right now
== Codex config (~/.codex/config.toml) ==
✗ features.chronicle = true (screen capture pipeline ENABLED)
== Log evidence, last 14 days ==
· 2026-08-26 frames captured: 5539 background summary calls: 1450
· 2026-08-25 frames captured: 3521 background summary calls: 2986
✗ totals: 23047 frames, 6033 background model calls across 8 day(s)
Turn Memory off under Settings → Personalization. This is what worked on my machine, and it is first here for a reason: the dedicated Chronicle page only exists while the feature is enabled, so by the time you go looking for it, it may already be gone. The Memory toggle is always there.
Verified on my machine: the app logged
sidecar state changed … next=disabled previous=running and
screen recording shutdown requested at the moment I toggled it, and no
capture event has been logged since.
The cascade is one-way. I turned Memory back on 49 minutes later; the
config now reads memories = true with chronicle = false, and capture did
not resume. So you do not have to give up Memory permanently to stop this.
If the Chronicle / computer-activity page is present, you can also disable it there directly.
Verify it actually stopped. Setting the config flag is not always enough (#27773):
pgrep -f codex_chronicle # no output = not running
If it still prints a PID after you have quit the app, terminate it with
pkill -f codex_chronicle, then re-run this script.
Confirm the next day. Today's frame count should be zero.
Every figure here is labelled, because the difference matters.
| Figure | Basis |
|---|---|
| 82,791 screenshots / 6,002 background calls (Aug 20–30) | Measured — counted from log events |
| 1,307 summary files, Jun 29 – Aug 30 | Measured, but a lower bound: logs rotate and two windows are uncovered |
| Pipeline active from at least Jun 21 | Measured — earliest artifact in a Time Machine snapshot |
| ≈210 million input tokens | Estimated — 1,307 summaries × ~160K tokens/call. The per-call figure is itself derived from bucket size (~150 frames) × observed per-frame token cost. Reasonable range: 140–280 million. Recompute it yourself; the method is in the write-up |
| "This is why your quota is draining" | Not claimed. This is one confirmed cause of idle drain, on one machine, not a diagnosis of yours. That is what the script is for |
Blind spots I know about: local logs rotate after roughly two weeks, so absence of old evidence is not evidence of absence. I have no visibility into server-side accounting; my causal evidence is behavioural — the drain stopped when the feature was disabled and has not resumed.
I am not the first to point at this. These came before me and deserve the credit:
codex_chronicle process directlyWhat I am adding is a longer measured timeline, a controlled before/after, and a tool you can run yourself.
"You opted into a research preview. What did you expect?" Fair, and OpenAI did disclose the cost — the original Chronicle documentation had a Rate limits section stating the background agents "consume rate limits quickly." The gap this script addresses is not disclosure, it is observability: once running, the consumption appears in no usage surface, no per-conversation breakdown, and no local token record. You cannot see it, so you cannot attribute it, so you cannot make an informed decision about it.
"n=1. How do you know this is widespread?" I don't, and I don't claim it. Chronicle was opt-in, and I have no data on how many people enabled it. What is documented is that idle-drain complaints are common and that this is one confirmed mechanism behind some of them.
"Didn't OpenAI already fix this?" On Aug 23 the Codex lead publicly identified high p95 usage in Computer History — Chronicle's successor — among other causes, and fixes plus a full usage reset followed on Aug 24. That fix concerned the newer system. On this machine, the older screenshot pipeline was still running on Aug 30, seventeen days after the successor shipped. Run the script and see which one you have.
"Is this safe to run?"
It is read-only. The only write it performs is to your terminal. The only
network request is optional and goes to chatgpt.com with your own local
token — the same call the app makes. Read it first; it is short.
The complete 70-day investigation — timeline, methodology, log excerpts, support transcript, and the before/after measurements — is here: machblink.com/chronicle
MIT. Do whatever you want with it.
Maintained by Hank Wang (@hankwangtw), the author of MachBlink.
5 commits
Shell
100.0%
Is something in the ChatGPT desktop app quietly spending your quota while you're not using it? Find out in about three seconds.
Full write-up (70-day timeline, controlled on/off data, raw logs): https://machblink.com/chronicle
A read-only shell script that surfaces every local trace of the background screen-capture summarization pipeline in the ChatGPT desktop app for macOS (the "Chronicle" research preview, and its successor "Computer History").
No dependencies. No network calls except one optional request to OpenAI's own usage endpoint, using the token already on your machine. Nothing is modified, nothing is uploaded, nothing is phoned home.
"My Codex/ChatGPT quota drains while the app sits idle" has been reported many times since May 2026. The reports are real, but the answer people usually get is "check your usage page" — and the usage page is precisely where this particular consumer does not appear.
On my machine the pipeline ran for at least 70 days. Over the 8 days still covered by my local logs it captured 82,791 screenshots and made 6,002 background model calls. I could not find it by asking ChatGPT, by contacting official support, by signing out of all devices, or by deleting and reinstalling the app. I found it by reading local logs and Time Machine snapshots.
This script is the shortcut, so nobody else has to do that.
| # | Check | What it tells you |
|---|---|---|
| 1 | App version, sidecar binary present | Whether your build ships the capture component |
| 2 | codex_chronicle process | Whether it is running right now |
| 3 | ~/.codex/config.toml [features] | Whether the feature is enabled |
| 4 | Consent flags in global state | Whether consent was ever accepted (it persists across updates) |
| 5 | $TMPDIR/chronicle cache | Size, and whether new frames landed in the last hour |
| 6 | Local summary files | How many background summaries exist, and their date range |
| 7 | ~/Library/Logs/com.openai.codex | Per-day frame counts and background model call counts |
| 8 | (optional) Official usage endpoint | Your current 5-hour and weekly usage |
| 9 | Cross-check | Config says off, but is it actually still running? (#27773 reports it may not stop) |
The point of this repository is that software should not do things on your machine that you have not looked at. It would be inconsistent to then ask you to run a stranger's script. So here is every check as a command you can read and paste yourself. All read-only.
# 1. Is it running right now? (no output = no)
pgrep -lf codex_chronicle
# 2. What does the config say? (look for chronicle = true)
grep -A3 '^\[features\]' ~/.codex/config.toml
# 3. Screenshot cache size, and files written in the last hour
D="$(getconf DARWIN_USER_TEMP_DIR)chronicle"; du -sh "$D"; find "$D" -type f -mmin -60 | wc -l
# 4. How many background summaries are on disk
ls ~/.codex/memories/extensions/chronicle/resources | wc -l
# 5. Frames captured and model calls per day, from your own logs
for d in ~/Library/Logs/com.openai.codex/*/*/*/; do
f=$(grep -ahc 'wrote sparse memory frame' "$d"*.log 2>/dev/null | awk '{s+=$1}END{print s+0}')
[ "${f:-0}" -gt 0 ] || continue
c=$(grep -ahc 'starting codex exec summary session' "$d"*.log 2>/dev/null | awk '{s+=$1}END{print s+0}')
echo "${d#*com.openai.codex/} frames=$f calls=$c"
done
Command 5 is the important one. wrote sparse memory frame is a captured
frame; starting codex exec summary session is a model call billed to your
quota.
Prefer to have your own assistant walk you through it? Paste these and ask it to explain the output — but ask it to run and explain these exact commands, not to write its own. Those two event names came from reading real log files; an assistant guessing from general knowledge will get them wrong and report that everything is fine.
Same checks, formatted output, plus consent flags, the disabled-but-still-running cross-check, and an optional quota sample.
curl -O https://raw.githubusercontent.com/hankwangtw/chronicle-quota-check/main/chronicle-quota-check.sh
less chronicle-quota-check.sh # read it first
bash chronicle-quota-check.sh
There is deliberately no curl … | bash one-liner.
Options:
bash chronicle-quota-check.sh --usage # also sample your official quota
bash chronicle-quota-check.sh --days 30 # scan 30 days of logs (default 14)
== Live background processes ==
✗ codex_chronicle is RUNNING right now
== Codex config (~/.codex/config.toml) ==
✗ features.chronicle = true (screen capture pipeline ENABLED)
== Log evidence, last 14 days ==
· 2026-08-26 frames captured: 5539 background summary calls: 1450
· 2026-08-25 frames captured: 3521 background summary calls: 2986
✗ totals: 23047 frames, 6033 background model calls across 8 day(s)
Turn Memory off under Settings → Personalization. This is what worked on my machine, and it is first here for a reason: the dedicated Chronicle page only exists while the feature is enabled, so by the time you go looking for it, it may already be gone. The Memory toggle is always there.
Verified on my machine: the app logged
sidecar state changed … next=disabled previous=running and
screen recording shutdown requested at the moment I toggled it, and no
capture event has been logged since.
The cascade is one-way. I turned Memory back on 49 minutes later; the
config now reads memories = true with chronicle = false, and capture did
not resume. So you do not have to give up Memory permanently to stop this.
If the Chronicle / computer-activity page is present, you can also disable it there directly.
Verify it actually stopped. Setting the config flag is not always enough (#27773):
pgrep -f codex_chronicle # no output = not running
If it still prints a PID after you have quit the app, terminate it with
pkill -f codex_chronicle, then re-run this script.
Confirm the next day. Today's frame count should be zero.
Every figure here is labelled, because the difference matters.
| Figure | Basis |
|---|---|
| 82,791 screenshots / 6,002 background calls (Aug 20–30) | Measured — counted from log events |
| 1,307 summary files, Jun 29 – Aug 30 | Measured, but a lower bound: logs rotate and two windows are uncovered |
| Pipeline active from at least Jun 21 | Measured — earliest artifact in a Time Machine snapshot |
| ≈210 million input tokens | Estimated — 1,307 summaries × ~160K tokens/call. The per-call figure is itself derived from bucket size (~150 frames) × observed per-frame token cost. Reasonable range: 140–280 million. Recompute it yourself; the method is in the write-up |
| "This is why your quota is draining" | Not claimed. This is one confirmed cause of idle drain, on one machine, not a diagnosis of yours. That is what the script is for |
Blind spots I know about: local logs rotate after roughly two weeks, so absence of old evidence is not evidence of absence. I have no visibility into server-side accounting; my causal evidence is behavioural — the drain stopped when the feature was disabled and has not resumed.
I am not the first to point at this. These came before me and deserve the credit:
codex_chronicle process directlyWhat I am adding is a longer measured timeline, a controlled before/after, and a tool you can run yourself.
"You opted into a research preview. What did you expect?" Fair, and OpenAI did disclose the cost — the original Chronicle documentation had a Rate limits section stating the background agents "consume rate limits quickly." The gap this script addresses is not disclosure, it is observability: once running, the consumption appears in no usage surface, no per-conversation breakdown, and no local token record. You cannot see it, so you cannot attribute it, so you cannot make an informed decision about it.
"n=1. How do you know this is widespread?" I don't, and I don't claim it. Chronicle was opt-in, and I have no data on how many people enabled it. What is documented is that idle-drain complaints are common and that this is one confirmed mechanism behind some of them.
"Didn't OpenAI already fix this?" On Aug 23 the Codex lead publicly identified high p95 usage in Computer History — Chronicle's successor — among other causes, and fixes plus a full usage reset followed on Aug 24. That fix concerned the newer system. On this machine, the older screenshot pipeline was still running on Aug 30, seventeen days after the successor shipped. Run the script and see which one you have.
"Is this safe to run?"
It is read-only. The only write it performs is to your terminal. The only
network request is optional and goes to chatgpt.com with your own local
token — the same call the app makes. Read it first; it is short.
The complete 70-day investigation — timeline, methodology, log excerpts, support transcript, and the before/after measurements — is here: machblink.com/chronicle
MIT. Do whatever you want with it.
Maintained by Hank Wang (@hankwangtw), the author of MachBlink.
5 commits
Shell
100.0%