Two lines in the Dracula palette: model, folder, git branch with staged and modified counts, and effort on top; a context bar, cost, session time and five-hour usage below. Needs a Nerd Font, no network calls. Caches git status in /tmp/statusline-git-<session id>, one small file per session that it never deletes.
0 copies
Preview
Opus 4.8 │ app │ main high
██░░░░░░░░░░ 22% │ $0.41 │ 10m 12s │ 5h:26%
Opus 4.8 │ app │ main high
░░░░░░░░░░░░ 0% │ $0.00 │ 10m 12s
Sonnet 4.6 │ app │ feat/auth 1 medium
█████░░░░░░░ 48% │ $0.41 │ 10m 12s │ 5h:40%
Opus 4.8 │ app │ main max
██████████░░ 91% │ $4.12 │ 10m 12s │ 5h:88%
Fable 5 │ app │ main xhigh
███████░░░░░ 64% │ $0.41 │ 10m 12s │ 5h:33%
Haiku 4.5 │ app │ main
░░░░░░░░░░░░ 0% │ $0.41 │ 10m 12s │ 5h:52%
Opus 4.8 │ feature │ worktree-feature low
████░░░░░░░░ 37% │ $0.41 │ 10m 12s │ 5h:44%
Opus 4.8 │ scratch high
██░░░░░░░░░░ 22% │ $0.41 │ 10m 12s
What it does
Two lines in the Dracula palette: model, folder, git branch with staged and modified file counts, and effort on top; a context bar, cost, session time and five-hour usage below.
- Written in
- Bash
- Network access
- None
- Works in
- Terminal
How it works
- Reads the model, folder, context, cost, duration, effort and five-hour limit with jq.
- Counts staged and modified files with git diff --numstat and caches them for 5 seconds.
- The 12-cell context bar is green below 70%, yellow from 70% and red from 90%.
- Outside a repo the branch and counts drop out, and 5h shows only when it is sent.
Good to know
- Needs a Nerd Font for its icons, plus jq and git.
- Writes git status to /tmp/statusline-git-<session_id> and never deletes it, so one file stays per session.
- A bolt icon appears when fast_mode is true. The five-hour limit has no reset time.
Source
#!/usr/bin/env bash
input=$(cat)
# ---------- Dracula palette (24-bit truecolor) ----------
COMMENT=$'\033[38;2;98;114;164m'
CYAN=$'\033[38;2;139;233;253m'
GREEN=$'\033[38;2;80;250;123m'
ORANGE=$'\033[38;2;255;184;108m'
PINK=$'\033[38;2;255;121;198m'
PURPLE=$'\033[38;2;189;147;249m'
RED=$'\033[38;2;255;85;85m'
YELLOW=$'\033[38;2;241;250;140m'
BOLD=$'\033[1m'
RESET=$'\033[0m'
# ---------- Nerd Font glyphs ----------
# Written as raw UTF-8 byte escapes (\xHH) rather than \uXXXX so they
# render correctly regardless of the shell's locale settings.
ICO_MODEL=$'\xef\x8b\x9b' # nf-fa-microchip
ICO_DIR=$'\xef\x81\xbc' # nf-fa-folder_open
ICO_BRANCH=$'\xef\x90\x98' # nf-oct-git_branch
ICO_ADD=$'\xef\x81\x95' # nf-fa-plus_circle (staged)
ICO_MOD=$'\xef\x81\x80' # nf-fa-pencil (modified)
ICO_CTX=$'\xef\x87\x80' # nf-fa-database (context window)
ICO_COST=$'\xef\x85\x95' # nf-fa-dollar
ICO_CLOCK=$'\xef\x80\x97' # nf-fa-clock_o
ICO_BOLT=$'\xef\x83\xa7' # nf-fa-bolt (fast mode)
ICO_BRAIN=$'\xef\x83\xab' # nf-fa-lightbulb_o (effort/thinking)
ICO_HOURGLASS=$'\xef\x89\x92' # nf-fa-hourglass_half (rate limit)
BLOCK_FULL=$'\xe2\x96\x88' # █ (filled bar segment)
BLOCK_LIGHT=$'\xe2\x96\x91' # ░ (empty bar segment)
SEP="${COMMENT} \xe2\x94\x82 ${RESET}" # │ separator
# ---------- Parse session JSON ----------
MODEL=$(echo "$input" | jq -r '.model.display_name // "Claude"')
DIR=$(echo "$input" | jq -r '.workspace.current_dir // .cwd // ""')
DIRNAME="${DIR##*/}"
[ -z "$DIRNAME" ] && DIRNAME="~"
PCT_RAW=$(echo "$input" | jq -r '.context_window.used_percentage // 0')
PCT=$(printf '%.0f' "$PCT_RAW" 2>/dev/null)
[ -z "$PCT" ] && PCT=0
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
DUR_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')
EFFORT=$(echo "$input" | jq -r '.effort.level // empty')
FAST=$(echo "$input" | jq -r '.fast_mode // false')
SESSION_ID=$(echo "$input" | jq -r '.session_id // "nosession"')
FIVEH=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
# ---------- Git info, cached 5s so the status line stays snappy ----------
CACHE_FILE="/tmp/statusline-git-${SESSION_ID}"
BRANCH=""; STAGED=0; MODIFIED=0
cache_is_stale() {
[ ! -f "$CACHE_FILE" ] && return 0
local age=$(( $(date +%s) - $(stat -c %Y "$CACHE_FILE" 2>/dev/null || stat -f %m "$CACHE_FILE" 2>/dev/null || echo 0) ))
[ "$age" -gt 5 ]
}
if git -C "$DIR" rev-parse --git-dir > /dev/null 2>&1; then
if cache_is_stale; then
B=$(git -C "$DIR" branch --show-current 2>/dev/null)
S=$(git -C "$DIR" diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
M=$(git -C "$DIR" diff --numstat 2>/dev/null | wc -l | tr -d ' ')
echo "${B}|${S}|${M}" > "$CACHE_FILE"
fi
IFS='|' read -r BRANCH STAGED MODIFIED < "$CACHE_FILE"
fi
# ---------- Context-window progress bar ----------
BAR_WIDTH=12
FILLED=$(( PCT * BAR_WIDTH / 100 ))
[ "$FILLED" -gt "$BAR_WIDTH" ] && FILLED=$BAR_WIDTH
EMPTY=$(( BAR_WIDTH - FILLED ))
if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi
BAR=""
[ "$FILLED" -gt 0 ] && printf -v FILL "%${FILLED}s" && BAR="${FILL// /$BLOCK_FULL}"
[ "$EMPTY" -gt 0 ] && printf -v PAD "%${EMPTY}s" && BAR="${BAR}${PAD// /$BLOCK_LIGHT}"
# ---------- Cost & duration ----------
COST_FMT=$(printf '$%.2f' "$COST")
DUR_SEC=$(( DUR_MS / 1000 ))
MINS=$(( DUR_SEC / 60 ))
SECS=$(( DUR_SEC % 60 ))
# ---------- Line 1: model · directory · git ----------
LINE1="${BOLD}${PURPLE}${ICO_MODEL} ${MODEL}${RESET}${SEP}${CYAN}${ICO_DIR} ${DIRNAME}${RESET}"
if [ -n "$BRANCH" ]; then
GIT_SEG="${GREEN}${ICO_BRANCH} ${BRANCH}${RESET}"
{ [ "$STAGED" -gt 0 ]; } 2>/dev/null && GIT_SEG="${GIT_SEG} ${GREEN}${ICO_ADD}${STAGED}${RESET}"
{ [ "$MODIFIED" -gt 0 ]; } 2>/dev/null && GIT_SEG="${GIT_SEG} ${ORANGE}${ICO_MOD}${MODIFIED}${RESET}"
LINE1="${LINE1}${SEP}${GIT_SEG}"
fi
[ "$FAST" = "true" ] && LINE1="${LINE1} ${YELLOW}${ICO_BOLT}${RESET}"
[ -n "$EFFORT" ] && LINE1="${LINE1} ${PINK}${ICO_BRAIN}${EFFORT}${RESET}"
# ---------- Line 2: context bar · cost · duration · rate limit ----------
LINE2="${BAR_COLOR}${ICO_CTX} ${BAR}${RESET} ${BAR_COLOR}${PCT}%${RESET}${SEP}${YELLOW}${ICO_COST} ${COST_FMT}${RESET}${SEP}${COMMENT}${ICO_CLOCK} ${MINS}m ${SECS}s${RESET}"
if [ -n "$FIVEH" ]; then
FIVEH_R=$(printf '%.0f' "$FIVEH" 2>/dev/null)
LINE2="${LINE2}${SEP}${PURPLE}${ICO_HOURGLASS} 5h:${FIVEH_R}%${RESET}"
fi
printf '%b\n%b\n' "$LINE1" "$LINE2"
More status lines
One Dark Triptych
15 copies
Model: Opus 4.8 | Thinking: high | Context: [▰▰▱▱▱▱▱▱▱▱] 45k/200k (22%) | cwd: ~/app | ⎇ main | (+0,-0)
Cost: $0.41 | Block: 2hr 6m | Weekly: 7.0% | Session: 10m | In: 916.7 t/s | Out: 29.2 t/s | Cached: 2k | Session: [▰▱▱▱▱] 26.0%
Mem: 0.8G/1.0G | (*゚∀゚*) | Session ID: b8e1c0d2-4a6f-4e2a-9c1b-3f5d7a9e2c10
Catppuccin Wide Bars
0 copies
🤖 Opus 4.8 ⚡high 💡 │ 🎨 default │ ✅ git clean │ no env
📂 /home/user/app 🌿(main) │ 💰 0.41$ │ ⏰ 10m
🧠 Context █████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 22% used (44k/200k)
🚀 5H Limit ██████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 26% (Resets in 2h6m)
🌟 7D Limit ███░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 7% (Resets Oct 20 at 3pm)
Pace Dot Meters
94 copies
Opus 4.8 [high] ~/app main
16:20:55 | ⛁ ██░░░░░░░░ 22% | 5h ●◔○○○ 26% ↻2h7m | 7d ◔○○○○○○ 7% ↻2d1h │ $0.41 ⏱ 10m
Activity Feed
51 copies
Opus 4.8 high ✦ │ ctx 22% │ app (main) │ PR #1287 ● │ $0.41 · 10m +128 -34
Session ● ● ● ● ● ● ● ● ○ ○ ○ 74% left Resets in 2h 6m
Weekly ● ● ● ● ● ● ● ● ● ● ○ 93% left Resets in 2d 0h
Fable ● ● ● ● ● ● ● ● ● ○ ○ 85% left Resets in 2d 0h
◐ Read:index.ts ✓ Read×1 ✓ Bash×1 ✓ Edit×1 ✓ Grep×1
◐ code-reviewer Review the change for regressions
Pace Arrows
5 copies
Opus 4.8 (200K) high | app (main)
██░░░░░░░░ 22% 200K | 5h 26% ⇣32% 2h 7d 7% ⇣63% 2d
Simple two-lines
4 copies
app · main · Opus 4.8 · high
ctx 22% 44k · 5h 26% ↻2h6m · 7d 7% ↻2d0h · cost $0.41 · msg $0.757Related mods
Terminal
❯ /deck demo
⎿ deck: Sample plan running above the prompt, with sample routing until real ones arrive.
[-]
0: deck ▾ · 5 rows 22:11:41
⇄ Model route opus = opus jev: haiku · not applied effort ▁▃·· medi = kept ✕
✓ Orders module Done · 12/12 · 2/2 agents 100% ✕
● Context 44k / 200k 22% ✕
◔ Session · 5h 5h · 26% used ↻ 2:04:24 ✕
◔ Weekly · 7d 7d · 7% used ↻ 2d 0h 57m ✕
❯
⏵⏵ auto mode on (shift+tab to cycle) · ← for agents [ Deck 1 ]Claude Desktop

A cockpit for Claude Code: plan bars and subagent strips, context, usage limits with reset countdowns and burn rates, spend, the model route and a pet. Six bar styles, three collapsed looks. CLI and Desktop.
Terminal
BURN ▁ ▂ *▂▆ ▃ $0.41 = 0.04 burritos [-]
5h 26% in 2h 5m ▅▄█▅▅▆█▆███▅█ opus 4.8 44k in 1k out
wk 7% in 2d 0h █████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ lifetime $0.41 hide
❯ Claude Desktop

Live session cost odometer above the prompt: a burning fuse, real-world comparisons, threshold alerts
Terminal
❯ Run the tests again
● The repo is clean and the tests pass.
✻ Cooked for 0s · done 10:12 PM
☀ 44k │ 5h 26% │ 7d 7% │ cache 5% [-]
❯ Claude Desktop

One line above the prompt: context tokens with their weather, a bar per recent prompt, your 5-hour and 7-day limits against the time elapsed, the prompt cache with its time left, the session cost with the last prompt's share in dollars and in points of the 5-hour limit, and the subagents running. Labels in English, French or Russian. After Token Weather (Anthropic, Apache-2.0) and the ideas of usage-meter (HolyGrail) and prompt-cache-control (Daniel San).
Terminal
❯ /flightdeck open
⎿ flightdeck: Flightdeck opened. Focus it with ctrl+x tab; 1-6 expand cards, f/s/o open the gate
rows.
╭────────────────────────────────────────────────────────────────────────────────────────────────✕─╮
│ Opus 4.8 ○ idle · ctx ▰▱▱▱▱▱ 22% · $0.25 │
│ last turn 0s · 0 agents · 0 edits · 0 errors │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
❯
⚠ flightdeck: ctx 22%Claude Desktop

Flightdeck: a live agent dashboard for Claude Code. Main model vitals, an on-call architect, every permission check, subagent cards and swimlanes, a turn receipt and a session log, all from real session events