Know how much time you're
spending in Claude.
We're all spending more time on Claude Code. But where do the hours actually go? This is a status bar that helps you keep tabs on your time across every session, so you always know where your day stands before you hit a rate limit or burn through your hours.
Runs locally · Zero API tokens consumed · macOS & Linux · Built on Claude Code's official status line
Why I made this
I use Claude Code every day. I'd get heads down on a problem, and hours would fly by before I came up for air. Sometimes that meant hitting a rate limit mid-task. Sometimes it meant looking up and realizing the day was already gone.
I wanted a time buddy right there in the terminal where I work. Something quietly keeping tabs on every session across the day, so I always knew where I stood before I burned through my hours.
So I wrote one.
Rob (rkrevolution)
Four problems it fixes
The moments that made me build this. Probably the reason you're here too.
Rate limits arrive without warning
You're in flow, then Claude refuses to respond. You don't know when it'll come back. Your momentum is gone.
Parallel agents, muddled totals
Running Claude across git worktrees, spawning subagents, or just juggling two terminals? Normal timers count the overlap twice. You can't tell if you've burned one hour or three.
"How long have I been here?"
A simple question with no honest answer. Walking away for an hour shouldn't count the same as actively coding, but most timers say it does.
No view of the whole week
The 7-day rate limit is real, but nothing warns you about it until you're already bumping into it.
Every field, explained
This is exactly what you see in your terminal. Hover a highlighted field, or the numbered entry below, to see what it tells you.
The layout
/compact.Cost: $X.XX field here instead.The logic behind it
No server. No telemetry. No API tokens consumed. Just four ideas working together, built on Claude Code's official status line.
Claude Code already sends everything you need
After every message, Claude Code runs your status line script and pipes in a JSON blob with the session ID, current model, context usage, cost, and your rate limits. That's all first-party. The script just reads what's there and formats it into something you can use at a glance.
One timestamp per session, and "end" keeps moving
Every Claude Code window is a session. The script records the moment it started, then pushes its end time forward to now every time Claude responds. If you walk away for an hour, the clock stops advancing. That's why idle time gets trimmed out of your daily total.
Overlapping sessions get merged into one honest interval
Run Claude across git worktrees, fan out parallel subagents, or just have two terminals open? Their time ranges get combined into a single merged interval. One hour of overlap counts as one hour, not two. That's what makes "Today" an honest number instead of an inflated one.
Everything lives on your machine
The whole system is one bash script reading from stdin and writing to stdout. Session data is saved to a local JSON file per day and auto-cleaned after 30 days. No network calls, no accounts, no tokens consumed. Per the official docs: "The status line runs locally and does not consume API tokens."
The key insight: "how long?" isn't one number
Most timers pick one definition and hide the rest. This one shows three, because each answers a different question, and together they tell the truth.
| Dimension | What it answers | Same scenario: 2 concurrent sessions, 1–3pm |
|---|---|---|
| Today | "How long was I really with Claude?" Parallel sessions combined into one. Time after you walked away doesn't count. | 2h (the honest answer) |
| Wall | "Sum of every session." The raw total, before merging. If Wall is bigger than Today, parallel sessions overlapped. | 3h (what a normal timer would show) |
| Active | "How long was Claude actually thinking?" Just the time Claude spent responding, not you typing. | 25m (the rest was you) |
Install in 2 minutes
One shell script, one settings tweak, done. Everything runs locally on your machine.
- Claude Code installed and working (claude.com/code)
- macOS or Linux (the script is bash)
- jq (see step 1 below to install it)
- A Claude.ai Pro/Max subscription to see rate-limit fields. API users see a daily
Cost: $X.XXfield instead.
Install jq
Used to parse the JSON Claude Code pipes in.
# macOS brew install jq # Linux sudo apt install jq
Download the script
Drop it in your Claude Code config directory and make it executable.
curl -o ~/.claude/ultimate-timer.sh \ https://raw.githubusercontent.com/rkrevolution/claude-statusline-timer/main/ultimate-timer.sh chmod +x ~/.claude/ultimate-timer.sh
Wire it into Claude Code
Edit ~/.claude/settings.json and add the statusLine key alongside your existing settings.
{
"statusLine": {
"type": "command",
"command": "bash ~/.claude/ultimate-timer.sh"
}
}
Launch Claude Code
The status bar appears at the bottom after your first message. That's it.
claude