
I wanted one number: how much work have I actually handed to AI models?
Not how many subscriptions I pay for. Not how impressive my usage feels on a busy day. One defensible number, built from evidence, across every tool and every machine and every profile and every provider.
Turns out that’s not 100% doable, and it took longer to count the work than it would have taken to do a fair amount of it. The counting turned out to be the interesting part.
The record now covers a rolling year: 690 million recovered tokens, 338 days with evidence out of 365, 97.6% of it from exact counters rather than estimates. Thirteen sources. Seventeen labels for what the work actually was. The single biggest day was 42 million tokens. See the public dashboard for yourself at ai-usage
Here is what I learned getting there, roughly in the order the lessons hurt.
1. No tool knows your total, and every tool implies it does
Each product shows its own slice and presents it as the picture. The IDE extension knows what the IDE did. The provider dashboard knows what the API did. The chat app knows what you typed into the chat app. None of them know about each other, and none of them say so.
Once I put all thirteen sources side by side, the shape surprised me. My top three sources are 31%, 30%, and 24% of the total. Any one of them, looked at alone, would have told me a confident and wrong story about how I work. The tool I would have named first if you had asked me cold is not the largest.
This is the part that generalizes past me. Anyone claiming a return on AI is almost certainly measuring one slice. Not dishonestly. Just because that is the only slice with a dashboard.
2. Unknown is not zero, and the difference makes a difference
The easiest way to make a chart look good is to treat a day with no data as a day with no usage. Twenty-seven of my last 365 days have no evidence. They are not neccessarily quiet days though. They are days where the evidence is gone, or was never written down, or lives on a machine I have not reached.
So the record refuses to write a zero unless it measured a zero. Missing days are drawn as missing, in a different visual language from quiet days. It makes the picture worse and it makes it true.
This sounds like a technicality until you notice how many charts in the wild depend on the opposite convention. A blank cell that means “I didn’t look” and a blank cell that means “nothing happened” render identically, and the reader cannot tell which one they are seeing.
3. I made the exact version of that mistake, in a status report
I checked whether other user accounts on my Mac had any AI history. The check I used returns the same answer for “this file does not exist” and “you do not have permission to read this file.” I reported two accounts as having never used the tool.
Wrong. Their home directories are simply unreadable from my account. Their usage is unknown and will stay unknown.
The same flaw was in the code, in a place where a directory that could not be read looked identical to a directory that was empty. No amount of data validation could have caught it, because the data it produced was perfectly consistent. Just incomplete.
That is the shape of the whole problem. The dangerous errors here do not produce broken output. They produce clean output that quietly means something else.
4. Counting the same work twice is easier than counting it once
Early on, one source was 3.2 times too large. The cause: a streaming response gets written to the log repeatedly as it arrives, each write under a fresh identifier. Counting the identifiers counts the same answer once per chunk.
Later I found ten duplicate entries worth about 7.3 million tokens, left over from changing how days are bucketed. When the day boundary moved, the old rows for the old boundary just stayed. The importer merges by date, and has no concept of a date that used to exist.
Then there is the harder version. My subscription usage and my API usage could easily be the same requests billed two ways. Deciding they were genuinely separate traffic took a real investigation, and the answer is recorded as a verdict with its evidence, because a future me will absolutely wonder.
Every one of these inflated the number in a flattering direction. None of them announced themselves.
5. Some counters exist only in flight
The worst case is not a counter that is hard to find. It is a counter that exists for one second and then no longer exists anywhere.
Several services return exact token counts in the response body, log them nowhere, and publish no usage endpoint. If the calling program prints the answer and throws away the rest, that measurement is gone permanently. There is nothing to recover later. I had been discarding those for months without knowing it.
The same is true of models running on my own machine. The server reports the cost of a request in its reply and does not record it. The local log notes that a request happened, not what it cost, and rotates itself away in about four days.
So the fix is not archaeology. It is instrumentation, going forward, at the exact moment the number exists. Everything before that is honestly unknown, and I would rather label it unknown than reconstruct a comfortable guess.
6. Retention deletes your history on a schedule you did not choose
I set the window back to November 2022, the day that ChatGPT launched, because that’s the true Zero Day of the era I’m trying to measure. Against that window, my recovered coverage is 42%.
But for me, that’s a low number, and the low number is the point. Providers keep what they keep. Local logs rotate. Old accounts close. Devices get wiped. Local LLMs don’t generally log activity. A record that started wherever my data happens to begin would have looked far more complete and told me far less.
There is a related discipline: proving that an empty interval is genuinely empty is worth doing once and writing down. I established that one provider had no activity at all before May 2025. That interval is now known-empty rather than unknown, and no future run wastes effort relearning it.
7. A large part of my own history will never be in here at all
This is the disclosure the record deserves, and it is bigger than the gaps a coverage percentage can express.
I have been running models on my own hardware since 2021. Almost none of that is in the record and almost none of it ever will be. The tooling that keeps a ledger did not exist for most of that time, and local runners generally report the cost of a request in the reply and write it down nowhere. To this day, most of my local usage does not appear here. My own rough estimate is that local work is still around 10% of what I do, and I cannot support that with a token count or place it on a calendar, so it stays out rather than getting smuggled in as a guess.
The image and video work is worse, because the products themselves are gone. Midjourney, the various image generators I passed through, and video tools including Sora represent history that no longer has a place to be exported from. Some of those surfaces have been retired, some never offered a usable export, and none of them accounted in the unit this record uses anyway. That data is not hard to reach. It is gone.
There is more of the same kind. Substantial 2022 and 2023 chat activity sits on an account I no longer have history for. Browser agent sessions leave dates but no costs. Some services publish no usage endpoint at all, so the only counter that ever existed was the one in the response I already discarded.
I apply no multiplier for any of this. It would be easy to inflate the headline by 10% for local work, add a gesture toward the image years, and call the result an estimate. That number would be unfalsifiable and I would start believing it. The record says recovered, states what it recovered, and leaves the rest visibly unknown.
Which means the honest reading of the total is: this is a floor. The real figure is larger by an amount I cannot responsibly name.
8. The interesting question was never the total
Once the counting worked, the number itself got boring fast. What held up was the composition.
The largest category of my delegated work is fixing bugs, at 20%. Building features is 18%. Maintaining documentation is 16%. Almost nothing at the top is the thing people imagine when they picture AI writing for you. It is repair, construction, and upkeep, in that order.
Labelling those days was mostly manual, and the hard part was admitting when I could not tell. A day where several projects ran at once does not have one honest answer. Those days are labelled unknown, or mixed, and mixed is defined specifically: the work is identified, its breakdown is not recoverable. Where I supplied a label purely from memory, it is marked as recollection rather than evidence.
I would rather have 132 honestly unknown days than 132 confident guesses.
9. Measurement changes what you are willing to say
Before this, I would have described my AI usage in adjectives. A lot. Heavily. Constantly. Those words survive any evidence, which is why they are comfortable.
Now I have a number with a stated fidelity, a coverage percentage, an explicit list of what is missing, and a visible boundary where attribution stops. It is less flattering and much more useful. It tells me my peak day was six times my weekly average, which says something about how this work actually arrives. It tells me which surfaces are doing the real load. It tells me which questions I still cannot answer.
The record does not have a target. There is no budget in it and no cost model, deliberately. Tokens are the unit and delegated work is the subject, because the moment a number like this gets a goal attached, it stops being a measurement and becomes a score.
The part worth stealing
If you take one thing from this: distinguish “I measured nothing” from “I did not measure.” Everything else in this project is downstream of that one rule, and every serious error I made was a version of collapsing the two.
A personal view of the record lives at sam-rogers.com/ai-usage. if you’re interested in a tool like this for yourself, please let me know. I’m trying to slow my roll on releasing open GitHub projects that nobody asked me for, but ask me and I’ll make it happen for you.