I switch between Claude Code, Codex and Cursor all day, and I got tired of checking how much of each limit I had left. Every check meant going to a different place for each tool, and I was doing it over and over just to decide which agent to use next.
So I built Token Slayer, a small always-on-top desktop widget. Each service gets a pixel hero. Remaining usage is the hero's HP. When an agent is working, the hero fights. When it's idle, the hero rests by a campfire.
What it does
- HP = remaining usage for Claude Code (5-hour and weekly), Codex (5-hour and weekly) and Cursor (monthly).
- Fights while your agent works. It watches local activity, so the hero reacts within a few seconds of a new turn.
-
Runway prediction. From the last 30 minutes of use, it estimates when you'll hit 0%. If that comes before the reset, it warns you (
OUT 1H20). - Leveling, made for using your plan, not hoarding it. You earn XP as you use your limits, and XP doubles ("BURNING TIME") when a weekly or monthly reset is close and you still have a lot left. Unused quota is gone at reset anyway.
- 64 achievements (a few hidden), a very rare legendary dragon, and a weekly record card you can paste anywhere.
- Customization: 17 free cosmetics (hero classes like pirate, chef or viking, incoming enemies, rest scenes), plus optional paid cosmetic packs. The app itself is free.
It runs on macOS and Windows. It has no analytics and no server of mine: it only talks to the usage services themselves (and to the license service if you buy a pack).
The parts that were harder than expected
1. "Is the agent working right now?" is surprisingly hard to answer.
My first version watched files with fs.watch. On macOS that misses a lot, because the apps append to files they already have open, and those appends often don't produce events. For Cursor I tried counting changes to its SQLite WAL, but that file also changes about every 30 seconds while you're doing nothing, so the signal was noisy. What finally worked was reading the last line of Cursor's agent transcript files: if the last entry isn't a turn_ended record and the file changed recently, a turn is in progress. (Credit where due: I learned this from the open-source Muster app.)
2. Local numbers drift from the real ones.
For Codex, the percentage I could derive from local session files said 78% left while the account page said 72%. Usage from other devices or the web never reaches your local files. I switched to the server-side numbers and kept the local ones only as a fallback.
3. Some "usage APIs" are not public APIs.
Claude and Cursor usage come from endpoints their own apps use, not documented public APIs. They can change without notice, so the app treats every error as "unknown" and keeps showing the last good value instead of guessing. One fun bug: Cursor started returning 401 for a perfectly valid token. The cause was a stale cookie in Electron's shared cookie jar riding along with my request. Sending requests without the cookie jar fixed it.
4. A brief "0%" from a server shouldn't level you up.
Once, a service briefly reported 0% used and then the real value. The app counted the jump as fresh usage, and my Cursor hero shot to level 12 overnight. Now sudden jumps and drops within the same reset window are held for a second reading before they count.
Try it
- Download (free, macOS and Windows): https://token-slayer.vercel.app/en
- The Windows build isn't code-signed yet, so SmartScreen warns the first time (More info → Run anyway). Every release has a
SHA256SUMS.txt.
I'd love feedback, especially from people on Windows or on plans I haven't tested. Which other agents should it support?
Drafted with AI assistance; the project, the bugs and the fixes are mine.

Top comments (0)