Branch, model with effort level, a context bar and the five-hour quota with reset countdown. Only calls the usage API when stdin lacks rate limits.
MIT licensed · original source
14 copies
Using the Claude desktop app? Add your status line with statusline-anywhere.
Preview
Clean repo
🌿 main │ Opus 4.8/hi │ 🟢 Ctx ▓▓░░░░ 22% │ ⏳ 🟢 ▓▓░░░░ 26% ↻ 2h7m │ $0.41 ⏱ 10m
New session
🌿 main │ Opus 4.8/hi │ 🟢 Ctx ░░░░░░ 0%
Dirty branch
🌿 feat/auth★ │ Snt 4.6/hi │ 🟢 Ctx ▓▓▓░░░ 48% │ ⏳ 🟢 ▓▓▓░░░ 40% ↻ 1h11m │ $0.41 ⏱ 10m
Near-full
🌿 main │ Opus 4.8/hi │ 🔴 Ctx ▓▓▓▓▓▓ 91% │ ⏳ 🔴 ▓▓▓▓▓▓ 88% ↻ 17m │ $4.12 ⏱ 10m
1M context
🌿 main │ Fable 5/hi │ 🟡 1M ▓▓▓▓░░ 64% │ ⏳ 🟢 ▓▓░░░░ 33% ↻ 3h29m │ $0.41 ⏱ 10m
Post-compact
🌿 main │ Haiku 4/hi │ 🟢 Ctx ░░░░░░ 0% │ ⏳ 🟡 ▓▓▓▓░░ 52% ↻ 4h1m │ $0.41 ⏱ 10m
Worktree
🌿 worktree-feature │ Opus 4.8/hi │ 🟢 Ctx ▓▓▓░░░ 37% │ ⏳ 🟢 ▓▓▓░░░ 44% ↻ 2h49m │ $0.41 ⏱ 10m
Non-git
🌿 (no git) │ Opus 4.8/hi │ 🟢 Ctx ▓▓░░░░ 22% │ $0.41 ⏱ 10m
Source
#!/bin/bash
# ════════════════════════════════════════════════════════════════════════════
# Claude Code — Status Line with real-time usage tracking
#
# Dependencies: bash, jq, curl
# License: MIT
#
# Default: 🌿 main★ │ Snt 4.6 │ 🟢 Ctx ▓▓▓░░░ 42% │ ⏳ 🟡 ▓▓░░░░ 35% ↻ 2h30m │ $0.12 ⏱ 1h4m
# ════════════════════════════════════════════════════════════════════════════
# ── Configuration (override via environment variables) ────────────────────────
TIMEZONE="${TIMEZONE:-}" # e.g. "America/New_York", empty = system default
REFRESH_INTERVAL="${REFRESH_INTERVAL:-300}" # seconds between API calls (0 = every render, risks rate limiting)
SHOW_WEEKLY="${SHOW_WEEKLY:-0}" # set to 1 to show weekly + sonnet quotas
USAGE_FILE="${USAGE_FILE:-$HOME/.claude/usage-exact.json}"
CREDENTIALS_FILE="${CREDENTIALS_FILE:-$HOME/.claude/.credentials.json}"
SETTINGS_FILE="${SETTINGS_FILE:-$HOME/.claude/settings.json}"
# ── Helpers ───────────────────────────────────────────────────────────────────
tz_date() {
local tz="$1"; shift
if [ -n "$tz" ]; then TZ="$tz" date "$@"; else date "$@"; fi
}
format_remaining() {
local secs="$1"
[ "$secs" -le 0 ] 2>/dev/null && return
local h=$(( secs / 3600 )) m=$(( (secs % 3600) / 60 ))
if [ $h -gt 0 ]; then echo "${h}h${m}m"
elif [ $m -gt 0 ]; then echo "${m}m"
else echo "<1m"
fi
}
# Cross-platform ISO 8601 → epoch (GNU date -d || BSD date -j)
iso_to_epoch() {
local iso="$1"
date -d "$iso" +%s 2>/dev/null && return
# macOS/BSD fallback: strip the offset/Z and fractional seconds, then parse the
# core as UTC (-u). The API always sends +00:00, so the stripped wall-clock IS
# UTC; without -u, date -j would read it as local time and skew the countdown.
local core="${iso%[+-][0-9][0-9]:*}" # strip +HH:MM / -HH:MM suffix
core="${core%Z}" # strip trailing Z
core="${core%%.*}" # strip .fractional
date -juf "%Y-%m-%dT%H:%M:%S" "$core" +%s 2>/dev/null
}
file_mtime() {
if stat --version &>/dev/null; then
stat -c %Y "$1" 2>/dev/null || echo 0
else
stat -f %m "$1" 2>/dev/null || echo 0
fi
}
cache_age_sec() {
[ ! -f "$USAGE_FILE" ] && echo 999999 && return
local age=$(( $(date +%s) - $(file_mtime "$USAGE_FILE") ))
[ "$age" -lt 0 ] && age=0
echo "$age"
}
# Coerce to a bare non-negative integer. Drops the decimal part then strips any
# non-digit. Critical: percentages/resets flow into $(( )), where a value like
# "x[$(cmd)]" would execute cmd via arithmetic array-subscript evaluation.
num() {
local v="${1%%.*}"
v="${v//[^0-9]/}"
echo "$(( 10#${v:-0} ))" # 10# forces base 10 — a leading zero would be read as octal
}
# make_bar <percent> → sets BAR_COLOR and BAR_STR (6-block bar)
make_bar() {
local pct; pct="$(num "$1")"
[ "$pct" -gt 100 ] && pct=100
local filled=$(( (pct + 16) / 17 )); [ $filled -gt 6 ] && filled=6 # 17 = ceil(100/6): round onto 6 blocks
local empty=$(( 6 - filled ))
BAR_STR=""
local i
for ((i=0; i<filled; i++)); do BAR_STR+="▓"; done
for ((i=0; i<empty; i++)); do BAR_STR+="░"; done
if [ "$pct" -lt 50 ]; then BAR_COLOR="🟢"
elif [ "$pct" -lt 80 ]; then BAR_COLOR="🟡"
else BAR_COLOR="🔴"
fi
}
# render_quota <emoji> <percent> <reset_epoch> → "emoji color bar pct% [↻ remain]".
# A reset moment already in the past means the window rolled over → usage back to 0%.
# Needs NOW set by the caller.
render_quota() {
local emoji="$1" reset="$3" remain="" pct
pct="$(num "$2")"
if [ -n "$reset" ] && [ "$reset" -gt "$NOW" ] 2>/dev/null; then
remain=$(format_remaining $(( reset - NOW )))
elif [ -n "$reset" ] && [ "$reset" -le "$NOW" ] 2>/dev/null; then
pct=0
fi
make_bar "$pct"
local out="${emoji} ${BAR_COLOR} ${BAR_STR} ${pct}%"
[ -n "$remain" ] && out="${out} ↻ ${remain}"
echo "$out"
}
# ── Read JSON input from stdin ────────────────────────────────────────────────
JSON=$(cat)
# ── Parse all stdin fields in a single jq call ───────────────────────────────
# Joined on US (0x1f), not "|": a "|" in a branch path or model name would shift
# every field. US is non-whitespace so read preserves empty fields (absent
# rate_limits). rate_limits.* is native since Claude Code 2.1.x (Pro/Max) —
# preferred over the API call when present.
IFS=$'\x1f' read -r J_MODEL_DISPLAY J_MODEL_RAW J_CTX_PCT J_CTX_SIZE J_COST J_DURATION J_CWD \
J_RL_5H_PCT J_RL_5H_RESET J_RL_7D_PCT J_RL_7D_RESET \
< <(echo "$JSON" | jq -r '[
(if .model | type == "object" then .model.display_name // "" else "" end),
(if .model | type == "string" then .model else "" end),
(.context_window.used_percentage // 0 | tostring | split(".")[0]),
(.context_window.context_window_size // 0),
(.cost.total_cost_usd // ""),
(.cost.total_duration_ms // ""),
(.workspace.current_dir // ""),
(.rate_limits.five_hour.used_percentage // ""),
(.rate_limits.five_hour.resets_at // ""),
(.rate_limits.seven_day.used_percentage // ""),
(.rate_limits.seven_day.resets_at // "")
] | join("\u001f")' 2>/dev/null)
# ── Model ─────────────────────────────────────────────────────────────────────
MODEL="$J_MODEL_DISPLAY"
MODEL=$(echo "$MODEL" | sed 's/Default (\(.*\))/\1/' | sed 's/Claude //' | sed 's/ (.*//')
[ -z "$MODEL" ] && MODEL="$J_MODEL_RAW"
case "$MODEL" in
claude-sonnet-4-6*|Sonnet\ 4.6*) MODEL="Snt 4.6" ;;
claude-sonnet-4-5*|Sonnet\ 4.5*) MODEL="Snt 4.5" ;;
claude-opus-4-6*|Opus\ 4.6*) MODEL="Opus 4.6" ;;
claude-opus-4-5*|Opus\ 4.5*) MODEL="Opus 4.5" ;;
claude-haiku-4*|Haiku\ 4*) MODEL="Haiku 4" ;;
esac
# strip control bytes — model name comes from untrusted JSON (terminal OSC injection)
MODEL="${MODEL//[$'\x01'-$'\x1f'$'\x7f']/}"
# ── Effort level (from settings.json — not yet in stdin JSON) ────────────────
EFFORT_LABEL=""
if [ -f "$SETTINGS_FILE" ]; then
case "$(jq -r '.effortLevel // empty' "$SETTINGS_FILE" 2>/dev/null)" in
low) EFFORT_LABEL="lo" ;;
medium) EFFORT_LABEL="md" ;;
high) EFFORT_LABEL="hi" ;;
max) EFFORT_LABEL="mx" ;;
esac
fi
# ── Context window ────────────────────────────────────────────────────────────
CTX_PERCENT="$(num "${J_CTX_PCT:-0}")"
CTX_LABEL="Ctx"
[ "$J_CTX_SIZE" -ge 900000 ] 2>/dev/null && CTX_LABEL="1M" # ≥900k → extended 1M context
make_bar "$CTX_PERCENT"
CTX_COLOR="$BAR_COLOR" CTX_BAR="$BAR_STR"
# ── Session cost + duration ───────────────────────────────────────────────────
COST_STR="" DURATION_STR=""
if [[ "$J_COST" =~ ^[0-9]+(\.[0-9]+)?([eE][+-]?[0-9]+)?$ ]] && [ "$J_COST" != "0" ]; then
COST_STR=$(printf '$%.2f' "$J_COST" 2>/dev/null)
fi
if [ -n "$J_DURATION" ] && [ "$J_DURATION" != "0" ] && [ "$J_DURATION" != "null" ]; then
DURATION_STR=$(format_remaining $(( $(num "$J_DURATION") / 1000 )))
fi
# ── Git branch ────────────────────────────────────────────────────────────────
CWD="$J_CWD"
BRANCH="" DIRTY=""
if [ -n "$CWD" ] && [ -d "$CWD" ]; then
BRANCH=$(git -C "$CWD" --no-optional-locks symbolic-ref --short HEAD 2>/dev/null)
if [ -n "$BRANCH" ] && git -C "$CWD" --no-optional-locks diff --quiet HEAD 2>/dev/null; then
[ -n "$(git -C "$CWD" --no-optional-locks ls-files --others --exclude-standard 2>/dev/null)" ] && DIRTY="★"
else
[ -n "$BRANCH" ] && DIRTY="★"
fi
fi
[ -z "$BRANCH" ] && BRANCH="(no git)"
[ "${#BRANCH}" -gt 30 ] && BRANCH="${BRANCH:0:27}..."
# ── Refresh usage via Anthropic OAuth API ────────────────────────────────────
refresh_usage_api() {
[ ! -f "$CREDENTIALS_FILE" ] && return 1
local token
token=$(jq -r '.claudeAiOauth.accessToken // empty' "$CREDENTIALS_FILE" 2>/dev/null)
[ -z "$token" ] && return 1
local resp
resp=$(curl -s --max-time 3 \
"https://api.anthropic.com/api/oauth/usage" \
-H "Authorization: Bearer $token" \
-H "anthropic-beta: oauth-2025-04-20" \
-H "Content-Type: application/json" 2>/dev/null)
echo "$resp" | jq -e '.five_hour.utilization' >/dev/null 2>&1 || return 1
local tmp
tmp=$(mktemp "${USAGE_FILE}.XXXXXX") || return 1
if echo "$resp" | jq '{
timestamp: (now | todate),
source: "api",
metrics: {
session: {
percent_used: .five_hour.utilization,
percent_remaining: (100 - .five_hour.utilization),
resets_at: .five_hour.resets_at
},
week_all: {
percent_used: .seven_day.utilization,
percent_remaining: (100 - .seven_day.utilization),
resets_at: .seven_day.resets_at
},
week_sonnet: (if .seven_day_sonnet then {
percent_used: .seven_day_sonnet.utilization,
percent_remaining: (100 - .seven_day_sonnet.utilization),
resets_at: .seven_day_sonnet.resets_at
} else null end)
}
}' > "$tmp"; then
mv "$tmp" "$USAGE_FILE"
else
rm -f "$tmp"; return 1
fi
}
# Native stdin rate_limits (Pro/Max, CC ≥2.1.x) cover session + weekly-all. The
# API is only needed for the Sonnet quota (SHOW_WEEKLY) or as a fallback when the
# stdin field is absent — so most renders make no network call at all.
HAVE_STDIN_SESSION=0
[ -n "$J_RL_5H_PCT" ] && [ "$J_RL_5H_PCT" != "null" ] && HAVE_STDIN_SESSION=1
NEED_API=1
[ "$HAVE_STDIN_SESSION" = 1 ] && [ "$SHOW_WEEKLY" != "1" ] && NEED_API=0
[[ "$REFRESH_INTERVAL" =~ ^[0-9]+$ ]] || REFRESH_INTERVAL=300
# Lock outside world-writable /tmp to avoid a symlink/clobber on shared hosts.
LOCK_FILE="${XDG_RUNTIME_DIR:-$HOME/.claude}/statusline-refresh.lock"
if [ "$NEED_API" = 1 ] && [ "$(cache_age_sec)" -gt "$REFRESH_INTERVAL" ]; then
# 2>/dev/null: if the lock dir is missing, skip the refresh quietly (no stderr noise)
( flock -n 9 || exit 0; refresh_usage_api ) 9>"$LOCK_FILE" 2>/dev/null
fi
# ── Resolve usage metrics: native stdin (preferred) → API cache (fallback) ────
BLOCK_DISPLAY="" WEEK_SONNET_DISPLAY=""
NOW=$(date +%s)
SESS_PCT="" SESS_EPOCH="" SESS_FROM_CACHE=0
WEEK_PCT="" WEEK_EPOCH="" SONNET_PCT=""
# Leave the epoch empty when no reset is sent — num("") is "0", which render_quota
# would read as a past reset and wrongly zero the live percentage.
if [ "$HAVE_STDIN_SESSION" = 1 ]; then
SESS_PCT="$J_RL_5H_PCT"
[ -n "$J_RL_5H_RESET" ] && [ "$J_RL_5H_RESET" != "null" ] && SESS_EPOCH="$(num "$J_RL_5H_RESET")"
fi
if [ "$SHOW_WEEKLY" = "1" ] && [ -n "$J_RL_7D_PCT" ] && [ "$J_RL_7D_PCT" != "null" ]; then
WEEK_PCT="$J_RL_7D_PCT"
[ -n "$J_RL_7D_RESET" ] && [ "$J_RL_7D_RESET" != "null" ] && WEEK_EPOCH="$(num "$J_RL_7D_RESET")"
fi
# Cache only fills metrics stdin didn't provide. resets_at parsed as ISO 8601
# (API format); the Sonnet weekly quota is API-only (absent from stdin).
if [ -f "$USAGE_FILE" ]; then
IFS=$'\x1f' read -r CACHE_SOURCE U_SESS_PCT U_SESS_RESETS U_WEEK_PCT U_WEEK_RESETS U_SONNET_PCT \
< <(jq -r '[
(.source // "legacy"),
(.metrics.session.percent_used // ""),
(.metrics.session.resets_at // ""),
(.metrics.week_all.percent_used // ""),
(.metrics.week_all.resets_at // ""),
(.metrics.week_sonnet.percent_used // "")
] | join("\u001f")' "$USAGE_FILE" 2>/dev/null)
if [ -z "$SESS_PCT" ] && [ -n "$U_SESS_PCT" ] && [ "$U_SESS_PCT" != "null" ]; then
SESS_PCT="$U_SESS_PCT"; SESS_FROM_CACHE=1
[ "$CACHE_SOURCE" = "api" ] && [ -n "$U_SESS_RESETS" ] && SESS_EPOCH="$(iso_to_epoch "$U_SESS_RESETS")"
fi
if [ "$SHOW_WEEKLY" = "1" ]; then
if [ -z "$WEEK_PCT" ] && [ -n "$U_WEEK_PCT" ] && [ "$U_WEEK_PCT" != "null" ]; then
WEEK_PCT="$U_WEEK_PCT"
[ "$CACHE_SOURCE" = "api" ] && [ -n "$U_WEEK_RESETS" ] && WEEK_EPOCH="$(iso_to_epoch "$U_WEEK_RESETS")"
fi
[ -n "$U_SONNET_PCT" ] && [ "$U_SONNET_PCT" != "null" ] && SONNET_PCT="$U_SONNET_PCT"
fi
fi
# ── Render ────────────────────────────────────────────────────────────────────
[ -n "$SESS_PCT" ] && [ "$SESS_PCT" != "null" ] && \
BLOCK_DISPLAY="$(render_quota "⏳" "$SESS_PCT" "$SESS_EPOCH")"
if [ "$SHOW_WEEKLY" = "1" ]; then
WEEK_INT="" WEEK_COLOR="" WEEK_RESET_LABEL="" SONNET_INT="" SONNET_COLOR=""
if [ -n "$WEEK_PCT" ] && [ "$WEEK_PCT" != "null" ]; then
WEEK_INT="$(num "$WEEK_PCT")"; make_bar "$WEEK_INT"; WEEK_COLOR="$BAR_COLOR"
if [ -n "$WEEK_EPOCH" ]; then
# GNU date -d @epoch || BSD date -r epoch
WEEK_RESET_LABEL=$(tz_date "${TIMEZONE}" -d "@$WEEK_EPOCH" +"%a %Hh" 2>/dev/null \
|| tz_date "${TIMEZONE}" -r "$WEEK_EPOCH" +"%a %Hh" 2>/dev/null)
WEEK_RESET_LABEL=$(echo "$WEEK_RESET_LABEL" | tr '[:upper:]' '[:lower:]')
fi
fi
if [ -n "$SONNET_PCT" ] && [ "$SONNET_PCT" != "null" ]; then
SONNET_INT="$(num "$SONNET_PCT")"; make_bar "$SONNET_INT"; SONNET_COLOR="$BAR_COLOR"
fi
if [ -n "$WEEK_INT" ] && [ -n "$SONNET_INT" ]; then
WEEK_SONNET_DISPLAY="📅 ${WEEK_COLOR} ${WEEK_INT}% / Snt ${SONNET_COLOR} ${SONNET_INT}%"
[ -n "$WEEK_RESET_LABEL" ] && WEEK_SONNET_DISPLAY+=" ↻ ${WEEK_RESET_LABEL}"
elif [ -n "$WEEK_INT" ]; then
WEEK_SONNET_DISPLAY="📅 ${WEEK_COLOR} ${WEEK_INT}%"
[ -n "$WEEK_RESET_LABEL" ] && WEEK_SONNET_DISPLAY+=" ↻ ${WEEK_RESET_LABEL}"
elif [ -n "$SONNET_INT" ]; then
WEEK_SONNET_DISPLAY="Snt ${SONNET_COLOR} ${SONNET_INT}%"
fi
fi
# ── Stale indicator — ⚠ in place of color dot. Only when session came from the
# cache: stdin rate_limits are always fresh, so cache age is irrelevant there.
IS_STALE=0
if [ "$SESS_FROM_CACHE" = 1 ] && [ -f "$USAGE_FILE" ] && [ "$REFRESH_INTERVAL" -gt 0 ] 2>/dev/null; then
[ "$(cache_age_sec)" -gt $(( REFRESH_INTERVAL * 3 )) ] && IS_STALE=1 # 3 missed refresh windows
fi
if [ "$IS_STALE" = 1 ] && [ -n "$BLOCK_DISPLAY" ]; then
# Exactly one color dot is present; the other two replacements are no-ops.
BLOCK_DISPLAY="${BLOCK_DISPLAY/🟢/⚠}"
BLOCK_DISPLAY="${BLOCK_DISPLAY/🟡/⚠}"
BLOCK_DISPLAY="${BLOCK_DISPLAY/🔴/⚠}"
fi
# ── Assemble ──────────────────────────────────────────────────────────────────
PARTS=()
[ -n "$BRANCH" ] && PARTS+=("🌿 $BRANCH$DIRTY")
if [ -n "$MODEL" ] && [ -n "$EFFORT_LABEL" ]; then
PARTS+=("$MODEL/$EFFORT_LABEL")
elif [ -n "$MODEL" ]; then
PARTS+=("$MODEL")
fi
[ -n "$CTX_PERCENT" ] && PARTS+=("$CTX_COLOR $CTX_LABEL $CTX_BAR ${CTX_PERCENT}%")
[ -n "$BLOCK_DISPLAY" ] && PARTS+=("$BLOCK_DISPLAY")
[ -n "$WEEK_SONNET_DISPLAY" ] && PARTS+=("$WEEK_SONNET_DISPLAY")
# Cost + duration (only if non-zero)
if [ -n "$COST_STR" ] && [ -n "$DURATION_STR" ]; then
PARTS+=("$COST_STR ⏱ $DURATION_STR")
elif [ -n "$COST_STR" ]; then
PARTS+=("$COST_STR")
fi
RESULT=""
for part in "${PARTS[@]}"; do
[ -z "$RESULT" ] && RESULT="$part" || RESULT="$RESULT │ $part"
done
echo "${RESULT}"
What it shows
- Current git branch, with a ★ marker when the working tree has uncommitted or untracked changes
- Shortened model name (e.g. Snt 4.6, Opus 4.8, Haiku 4)
- Effort level abbreviation (lo/md/hi/mx) read from settings.json, appended to the model name
- Context window usage as a color-coded six-block bar with percentage
- A 1M label in place of Ctx when the context window size is 900k tokens or more
- Five-hour rate-limit usage as a color-coded bar with percentage and a reset countdown
- Optional weekly and weekly-Sonnet quota percentages with a reset day/hour label when SHOW_WEEKLY=1
- Session cost in USD
- Session duration
- A ⚠ marker replacing the quota color dot when cached usage data is more than three refresh intervals old
- (no git) in the branch slot when the current directory is not a git repository
Requirements
- bash (uses arrays, process substitution, and [[ ]] tests)
- jq, for parsing stdin JSON, settings.json, credentials, and the API response
- curl, for the fallback call to the Anthropic usage API
- git, for branch name and dirty-state detection
- flock, to prevent concurrent API refreshes
- date and stat, with both GNU and BSD/macOS variants supported
- Read access to the Claude OAuth token in ~/.claude/.credentials.json for the API fallback
- Network access to api.anthropic.com, only when stdin lacks rate-limit data or SHOW_WEEKLY=1
- A terminal font with emoji and Unicode block characters (▓ ░ 🌿 ⏳ ↻); no Nerd Font glyphs are used
Behavior notes
- The five-hour quota segment disappears entirely when the input has no rate_limits field and no cached usage data exists, as in the brand-new session and scratch-directory scenarios
- Cost and duration are shown together only when cost is non-zero; with total_cost_usd of 0 the whole segment is dropped, including the duration
- The context label switches from Ctx to 1M in the 1,000,000-token context scenario
- Bar colors shift with usage: 🟢 below 50%, 🟡 from 50–79%, 🔴 at 80% and above, seen across the 22%, 52%, 64%, 88%, and 91% scenarios
- A null context used_percentage renders as an empty bar at 0%, as in the post-compact and brand-new session scenarios
- The dirty marker ★ appears on the modified feature branch but not on the clean main or worktree branches
- The effort suffix stays /hi in every scenario because it is read from settings.json, not from the effort field in the stdin JSON
- Display names are shortened by pattern: Sonnet 4.6 becomes Snt 4.6 and Haiku 4.5 becomes Haiku 4, while Opus 4.8 and Fable 5 pass through unchanged
- The reset countdown after ↻ scales with the resets_at value, from 17m up to 4h1m across scenarios
- vim mode, PR details, session name, agent name, output style, and added directories in the input have no effect on the output
More status lines
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
Overage Watcher
6 copies
Opus 4.8 | app@main | ctx 44k/200k (22%) | cost $0.41 | 5h 26% | 7d 7%Nerd Font Duo
0 copies
Opus 4.8 │ ▰▰▰▰▱▱▱▱▱▱▱▱▱▱▱▱ 22% │ $0.41
app │ mainUsage Dot Bars
20 copies
Opus 4.8 │ ✍️ 22% │ app (main) │ ● high
current ●●○○○○○○○○ 26% ⟳ 6:59pm
weekly ○○○○○○○○○○ 7% ⟳ aug 1, 5:52pmEverything Bar
17 copies
Opus 4.8 | app@main | 44k/200k (22%) | effort: high | 5h 26% @18:59 | 7d 7% @Sat Aug 1, 17:52One Dark Triptych
13 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