A feature-rich status line for Claude Code with colors, rate limits, git info, session cost, worktree detection, and auto-compact warnings
15
stars
16
commits
Shell
primary language
Aug 26, 2026
updated
A feature-rich status line for Claude Code that displays model info, context usage, git status, rate limits, session cost, and more — quiet when everything is healthy, loud exactly where something needs attention. Zero-config by default, deeply customizable when you want it (thresholds, palette, glyph sets, per-segment toggles).
📖 Full documentation — installation · usage · configuration · tips · troubleshooting
Click to play, or watch it on the documentation site.

| Segment | Description |
|---|---|
| Model | Short model name (e.g., Opus 4.6 instead of Claude Opus 4.6) |
| Context | Usage percentage + token counts (e.g., 12% (42k/200k)) with color coding |
| Auto-compact warning | Steady bold ⚠ when context usage >= 80% |
| Directory | Truncated to last 2 path components |
| Git branch | Branch name with detailed status: staged (S:2), unstaged (U:1), untracked (A:3) |
| Git ahead/behind | ⇡2⇣1 arrows showing commits ahead/behind upstream |
| Worktree | ⎇wt indicator when running inside a git worktree |
| Session cost | $X.XX with configurable warn/critical thresholds and currency |
| Session duration | 5m, 1h30m, etc. |
| Lines changed | +156/-23 cumulative lines added/removed |
| Effort level | ● high, ◑ medium, ◔ low (from the session itself) |
| Badges | Subagent name, fast mode, thinking, vim, non-default output style, ⚠200k+ |
| Rate limits | █░ progress bars for 5-hour, 7-day, per-model, and extra usage with reset times |
One escalation scale drives every percentage-based segment (context, rate bars) — quiet when healthy, then:
CESL_WARN)CESL_HIGH); context also gains a steady bold ⚠CESL_CRIT)Session cost uses its own CESL_COST_WARN/CESL_COST_CRIT thresholds, and the model name is colored by model family (Opus, Sonnet, Haiku, Fable).
jq — JSON parsingcurl — fetching rate limit data from the Anthropic APIgit — branch and worktree detectiongit clone https://github.com/dsebastien/claude-epic-status-line.git
cd claude-epic-status-line
bash install.sh
statusline.sh to ~/.claude/statusline-command.sh~/.claude/settings.json:{
"statusLine": {
"type": "command",
"command": "bash '/home/YOUR_USER/.claude/statusline-command.sh'"
}
}
bash uninstall.sh
Or manually remove the statusLine key from ~/.claude/settings.json and delete ~/.claude/statusline-command.sh.
Everything is optional — with zero config the status line renders its default design. Settings layer as: script defaults < ~/.config/claude-epic-status-line/config.sh < CESL_* environment variables (environment wins).
install.sh scaffolds the config file with every knob present but commented out at its default value — open it to see what's tunable: escalation thresholds (CESL_WARN/CESL_HIGH/CESL_CRIT), cost thresholds, bar width, cache TTL, currency, glyph set (unicode/nerd/ascii), per-segment CESL_SHOW_* toggles, the full color palette, and per-model-family hues.
Debugging: pipe a status JSON through statusline.sh explain to see the raw input, every parsed value, the API/cache state, and your effective config.
Copy into your config.sh:
# Monochrome minimal — no hues, just states
CESL_COLOR_DIR='150;150;150'
CESL_COLOR_OPUS='200;200;200'
CESL_COLOR_SONNET='200;200;200'
CESL_COLOR_HAIKU='200;200;200'
CESL_COLOR_FABLE='200;200;200'
CESL_COLOR_MODEL='200;200;200'
# Wide dashboard — chunkier bars, ASCII-safe
CESL_BAR_WIDTH=20
CESL_GLYPHS=ascii
# Quiet mode — just model, context, and rate limits
CESL_SHOW_DIR=0
CESL_SHOW_COST=0
CESL_SHOW_DURATION=0
CESL_SHOW_LINES=0
CESL_SHOW_EFFORT=0
CESL_SHOW_BADGES=0
CESL_SHOW_GIT=0
The script receives JSON from Claude Code via stdin with session data (model, context window usage, cwd, cost, effort, rate limits, etc.). The stdin payload is parsed in a single jq call for performance (auxiliary data — cache validation, API enrichment — uses separate small jq invocations), then the status line segments are assembled.
The 5-hour and 7-day rate-limit bars come straight from that stdin data (Claude Code ≥ 2.1.140 recommended). The Anthropic usage API is queried only as enrichment — extra-usage credits and per-model weekly limits — using your OAuth token (resolved from CLAUDE_CODE_OAUTH_TOKEN, ~/.claude/.credentials.json, secret-tool on Linux, or macOS Keychain), cached in a per-user directory for CESL_CACHE_TTL seconds (60 by default). No token? Those rows simply don't render.
Works on Linux and macOS (bash 3.2+, BSD or GNU userland). Date formatting and credential resolution adapt automatically to the platform. Git and keychain lookups are bounded to ~2 seconds — via timeout(1) where available, or a built-in fallback on stock macOS — so a huge repository can never freeze your status line.
The full guide lives at dsebastien.github.io/claude-epic-status-line, and its sources are in docs/:
| Page | Covers |
|---|---|
| Overview | What it is, the video, key features |
| Installation | Requirements, quick and manual install, upgrading, uninstalling |
| Usage | Every segment explained, the rate-limit dashboard, the explain subcommand |
| Configuration | Every CESL_* knob with its default |
| Tips & best practices | Theme recipes, threshold tuning, parallel sessions |
| Troubleshooting | When something does not render |
| Release notes | What changed, and breaking changes |
If you find this useful, consider buying me a coffee.
Check out my other projects at dsebastien.net.
Inspired by kamranahmedse/claude-statusline.
MIT
16 commits
Shell
60.7%
TypeScript
39.3%
A feature-rich status line for Claude Code with colors, rate limits, git info, session cost, worktree detection, and auto-compact warnings
15
stars
16
commits
Shell
primary language
Aug 26, 2026
updated
A feature-rich status line for Claude Code that displays model info, context usage, git status, rate limits, session cost, and more — quiet when everything is healthy, loud exactly where something needs attention. Zero-config by default, deeply customizable when you want it (thresholds, palette, glyph sets, per-segment toggles).
📖 Full documentation — installation · usage · configuration · tips · troubleshooting
Click to play, or watch it on the documentation site.

| Segment | Description |
|---|---|
| Model | Short model name (e.g., Opus 4.6 instead of Claude Opus 4.6) |
| Context | Usage percentage + token counts (e.g., 12% (42k/200k)) with color coding |
| Auto-compact warning | Steady bold ⚠ when context usage >= 80% |
| Directory | Truncated to last 2 path components |
| Git branch | Branch name with detailed status: staged (S:2), unstaged (U:1), untracked (A:3) |
| Git ahead/behind | ⇡2⇣1 arrows showing commits ahead/behind upstream |
| Worktree | ⎇wt indicator when running inside a git worktree |
| Session cost | $X.XX with configurable warn/critical thresholds and currency |
| Session duration | 5m, 1h30m, etc. |
| Lines changed | +156/-23 cumulative lines added/removed |
| Effort level | ● high, ◑ medium, ◔ low (from the session itself) |
| Badges | Subagent name, fast mode, thinking, vim, non-default output style, ⚠200k+ |
| Rate limits | █░ progress bars for 5-hour, 7-day, per-model, and extra usage with reset times |
One escalation scale drives every percentage-based segment (context, rate bars) — quiet when healthy, then:
CESL_WARN)CESL_HIGH); context also gains a steady bold ⚠CESL_CRIT)Session cost uses its own CESL_COST_WARN/CESL_COST_CRIT thresholds, and the model name is colored by model family (Opus, Sonnet, Haiku, Fable).
jq — JSON parsingcurl — fetching rate limit data from the Anthropic APIgit — branch and worktree detectiongit clone https://github.com/dsebastien/claude-epic-status-line.git
cd claude-epic-status-line
bash install.sh
statusline.sh to ~/.claude/statusline-command.sh~/.claude/settings.json:{
"statusLine": {
"type": "command",
"command": "bash '/home/YOUR_USER/.claude/statusline-command.sh'"
}
}
bash uninstall.sh
Or manually remove the statusLine key from ~/.claude/settings.json and delete ~/.claude/statusline-command.sh.
Everything is optional — with zero config the status line renders its default design. Settings layer as: script defaults < ~/.config/claude-epic-status-line/config.sh < CESL_* environment variables (environment wins).
install.sh scaffolds the config file with every knob present but commented out at its default value — open it to see what's tunable: escalation thresholds (CESL_WARN/CESL_HIGH/CESL_CRIT), cost thresholds, bar width, cache TTL, currency, glyph set (unicode/nerd/ascii), per-segment CESL_SHOW_* toggles, the full color palette, and per-model-family hues.
Debugging: pipe a status JSON through statusline.sh explain to see the raw input, every parsed value, the API/cache state, and your effective config.
Copy into your config.sh:
# Monochrome minimal — no hues, just states
CESL_COLOR_DIR='150;150;150'
CESL_COLOR_OPUS='200;200;200'
CESL_COLOR_SONNET='200;200;200'
CESL_COLOR_HAIKU='200;200;200'
CESL_COLOR_FABLE='200;200;200'
CESL_COLOR_MODEL='200;200;200'
# Wide dashboard — chunkier bars, ASCII-safe
CESL_BAR_WIDTH=20
CESL_GLYPHS=ascii
# Quiet mode — just model, context, and rate limits
CESL_SHOW_DIR=0
CESL_SHOW_COST=0
CESL_SHOW_DURATION=0
CESL_SHOW_LINES=0
CESL_SHOW_EFFORT=0
CESL_SHOW_BADGES=0
CESL_SHOW_GIT=0
The script receives JSON from Claude Code via stdin with session data (model, context window usage, cwd, cost, effort, rate limits, etc.). The stdin payload is parsed in a single jq call for performance (auxiliary data — cache validation, API enrichment — uses separate small jq invocations), then the status line segments are assembled.
The 5-hour and 7-day rate-limit bars come straight from that stdin data (Claude Code ≥ 2.1.140 recommended). The Anthropic usage API is queried only as enrichment — extra-usage credits and per-model weekly limits — using your OAuth token (resolved from CLAUDE_CODE_OAUTH_TOKEN, ~/.claude/.credentials.json, secret-tool on Linux, or macOS Keychain), cached in a per-user directory for CESL_CACHE_TTL seconds (60 by default). No token? Those rows simply don't render.
Works on Linux and macOS (bash 3.2+, BSD or GNU userland). Date formatting and credential resolution adapt automatically to the platform. Git and keychain lookups are bounded to ~2 seconds — via timeout(1) where available, or a built-in fallback on stock macOS — so a huge repository can never freeze your status line.
The full guide lives at dsebastien.github.io/claude-epic-status-line, and its sources are in docs/:
| Page | Covers |
|---|---|
| Overview | What it is, the video, key features |
| Installation | Requirements, quick and manual install, upgrading, uninstalling |
| Usage | Every segment explained, the rate-limit dashboard, the explain subcommand |
| Configuration | Every CESL_* knob with its default |
| Tips & best practices | Theme recipes, threshold tuning, parallel sessions |
| Troubleshooting | When something does not render |
| Release notes | What changed, and breaking changes |
If you find this useful, consider buying me a coffee.
Check out my other projects at dsebastien.net.
Inspired by kamranahmedse/claude-statusline.
MIT
16 commits
Shell
60.7%
TypeScript
39.3%