Founder pricing: Pro at $9.99/mo forever for the first 50 members. 18 of 50 left Claim yours →
All posts

Claude Code statusline: the number that's shared, and the one that isn't

The SanuDesk team 6 min read
Claude Code statusline ai agents

Pane three shows 71% on the five hour limit, in red. You feel the small jolt of panic that number is built to cause, and you tab over to check pane one and pane two before you touch anything.

Both say 71%. Not close. Identical.

Nothing is broken. All three panes read the same clock: that is what the field actually is. Claude Code's status line reports some numbers per session and some for your whole account, on the same line, with no visual sign of which is which. Reading it correctly is the entire skill.

What actually lands in your Claude Code statusline

A status line is a script Claude Code runs for you and shows at the bottom of the interface. Configure it directly in ~/.claude/settings.json:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh"
  }
}

or generate the same file in plain language with /statusline show model name and context percentage with a progress bar.

Either way, Claude Code pipes a JSON object to your script's stdin and displays whatever it prints to stdout. That object carries far more than most scripts use: the model's name, current cost and duration, context window token counts, and, if you subscribe to Claude.ai Pro or Max, your rate limit usage.

That last one is where the trouble starts.

The rate limit number is not your session's alone

cost.total_cost_usd belongs to the session showing it: it accumulates call by call, resets to zero on /clear, and four panes showing four different honest numbers is exactly what four separate budgets should look like.

rate_limits.five_hour.used_percentage and its seven_day counterpart do not work that way. They report how much of your Claude.ai subscription's usage window you have burned, a window that belongs to the account, not the pane. Four Claude Code sessions signed into the same Pro or Max plan print the same percentage in every one, because all four are reading one shared clock.

Nothing in the line marks the difference: a cost figure and a rate limit figure sit side by side, formatted identically, one meaning "this pane" and the other meaning "everything you are running right now." Only the field name tells them apart.

The context window figures sit on the safe side: context_window.used_percentage is this session's own token load, unaffected by any other pane. It is the rate limit block specifically that crosses sessions, and also the one most likely to be red and urgent when it does.

What redraws the line, and what that costs you

The script does not run continuously. Claude Code triggers it on a new assistant message, when /compact finishes, on a permission or vim mode change, and on a refreshInterval timer if you set one. Rapid triggers debounce into one run 300ms later, and the whole thing runs locally: no API tokens spent.

That event model has one sharp edge. If your script shells out to git status or git diff on every redraw, a large repository makes it slow, and Claude Code cancels an in-flight script the moment a new trigger fires, so a heavy script can lose every race during a fast burst of messages and simply go dark. The documented fix is to cache expensive calls in a temp file keyed on session_id, not a process ID, since a fresh PID on every invocation would defeat the cache entirely.

One more failure mode has no error message: the status line needs the same workspace trust as hooks, and an untrusted folder just leaves the line blank until you run claude --debug to see why.

Subagent panels: several agents, one screen, still one engine

Claude Code ships one built-in answer to "show me more than one agent at a glance": subagentStatusLine. Configure it, and instead of the default name . description . token count row for each subagent in the panel under your prompt, your script controls it. It runs once per refresh tick, receives every visible subagent as one JSON object (width, plus a tasks array covering each one's model, tokens and context size), and writes back one line per row it wants to override.

It is genuinely useful, and scoped tightly: one coordinator, its own subagents, one terminal, one engine. It says nothing about the Codex session in your next tab or the Gemini session on a second monitor. The moment your fleet crosses a process boundary, this feature stops seeing it.

Where reading the status line goes wrong

A shared number reads like a private one. The instinct on seeing 71% in red is to protect that pane, when the number is actually telling you about every pane. The session you interrupt is rarely the one that earned the warning.

The model name on screen can go stale. It only repaints on the triggers above, so a mid-session model change or an --agent override will not show up until the next assistant message redraws the line.

A slow custom script fails silently. A non-zero exit or empty stdout leaves the row blank with no explanation, and a script that only lags under load can look fine in a quiet session and go dark exactly when several panes get busy at once.

There is no history, only a snapshot. Close the terminal and every number it showed is gone. Tools like ccstatusline reformat that same snapshot with more widgets; tools like ccusage rebuild a historical view from session transcripts afterward, precisely because the built-in line keeps none. The same one-glance limit applies to cost trends: a single line never shows the whole picture.

A grid that shows every session's line at once

A status line answers "what is true in this pane, right now." The moment you run more than one session, you are back to tabbing between terminals to collect that same answer several times, or building a tmux layout yourself to see them together.

SanuDesk is a desktop app built around that grid instead of asking you to assemble it. Your Claude Code, Codex and Gemini sessions tile side by side, so the state each one is in (mid-task, waiting on review, close to a limit) is something you glance at, not reconstruct pane by pane. A Kanban board sits beside the grid: deploy a card and it opens a fresh session already briefed. Recurring work becomes a Loop, journaled per run, and the whole thing is bring-your-own-model, so switching engines to dodge one account's shared clock costs nothing extra. The grid and board are in the free plan (see pricing).

Check whether your clock is shared, tonight

Open every Claude Code session you currently have running and type /statusline show the five hour and seven day rate limit percentage in each one.

If every pane lands on the same number, you have confirmed it yourself: one clock, however many sessions point at it, and a red warning in any one of them is a fleet-wide fact, not a pane-specific one. If the numbers differ, you are looking at more than one account or API key across those panes, worth knowing on its own.

Download SanuDesk free to see every session's state in one grid instead of four terminal tabs, or check how the grid, the board and Loops fit together on the features page.

Run your own fleet of agents

SanuDesk is a free desktop app that tiles your Claude Code and Codex sessions and gives every project a Kanban board your agents work from.