Customizable Claude Code statusline. Single bash file, no JavaScript, no network, no daemon.
The default preset rendered against a real Claude Code session:
Run --examples to see this and every other preset, theme, prefix style, separator, and bar rendered live in your terminal β the catalog below shows the same output as screenshots.
Text-only version (copy-pasteable)
π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) | π° $0.40 | π 5h ββββββββββ 50% π 3h 25m 13s | π 7d ββββββββββ 50% π 5d 2h 17m 0s
π true | πͺ xhigh | π example_dir | π³ main | πΏ feat/wizard | π +3 ~5 ?2 | π β2 β1 | β +128 | β -42 | β³ 3m 50s
The Claude Code ecosystem already has a dozen excellent statuslines, each great at one thing. We wanted one tool that:
- ships every useful field β model, cost, context %, cache hit ratio, rate limits (5h + 7d) with countdowns, git branch + status + ahead/behind, vim mode, agent name, session id, plus zero-cost local readouts (clock, battery, memory, load average, hostname)
- looks great out of the box (11 presets, 21 themes, 12 progress-bar styles, truecolor support)
- is trivial to install β one bash file +
jq, no Node, no Rust, no Python, no daemon - stays customizable down to the smallest detail (per-token prefix, format, bar style, and separator-after overrides)
- Single file, ~3,000 lines of bash 3.2+. Drop it anywhere on
$PATH. - Up to 4 lines of statusline, each a freely-arranged token sequence.
- 42 tokens: 29 from Claude Code's stdin JSON + 6 from
git+ 7 from local OS. - Many format variants per token β bars, percents, countdowns, combined views, compact model names, hourly cost projections, token-count combos, short-form durations, etc. Each token advertises only the formats that make sense for its data.
- 11 presets:
minimum,compact,focus,coder,default,modern,rates,claude,fancy,everything,maximum. - 21 themes: grouped by terminal compatibility β Auto / adaptive (3), Light terminals (6), Dark terminals (12).
- 12 progress-bar styles:
blocks,heavy,line,braille,dots,arrows,ascii, plus 5 sub-character precision variants βgradient,gradient_dots,gradient_fade,gradient_shade,gradient_braille. - 8 prefix styles:
none,label,emoji,nerd,ascii+emoji+label,label+emoji,nerd+label. - 19 separators across 4 families: ASCII (3), Unicode (10), Decorative (3), Powerline / Nerd-Font (3).
- Interactive TUI wizard with always-visible live preview pane and a dedicated Tokens & lines screen for add / change / delete / reorder, inline separator editing, and per-token overrides.
- Auto-detected color depth (truecolor / 256 / 16 / none) with
$NO_COLORhonored. - Threshold-based coloring with sane defaults β battery inverts (low % = critical), memory uses a relaxed table (80% is normal), context-remaining mirrors context-used in reverse.
- Configurable empty-data handling (default:
placeholdershowsβ; can switch tohideto drop empty tokens). - JSON Schema shipped at the repo root +
$schemafield in the auto-created config β VS Code, Cursor, JetBrains, and Neovim's LSP all give you autocomplete and inline docs while editing. - Project-level config at
./.statusline-bar.jsonoverrides home-dir config. - No network calls. Ever.
Clone the repo somewhere stable on your machine (anywhere works β ~/code, ~/.local/share, etc.) and point Claude Code at the script:
mkdir -p ~/.local/share
git clone https://github.com/Dworf/statusline-bar.git ~/.local/share/statusline-bar
chmod +x ~/.local/share/statusline-bar/statusline-bar.shTo upgrade later, cd ~/.local/share/statusline-bar && git pull.
Claude Code reads its settings from ~/.claude/settings.json (your user-level config). If the file doesn't exist yet, create it. If it already has other settings β model defaults, MCP servers, permissions, hooks, etc. β don't overwrite it: add the statusLine key alongside whatever's already there. The whole file is a single JSON object.
Existing config with other top-level keys β your file already has things like model, permissions, hooks, etc. Add only the statusLine block as one more sibling:
{
"statusLine": {
"type": "command",
"command": "/Users/YOUR_USERNAME/.local/share/statusline-bar/statusline-bar.sh"
}
}So your merged file ends up looking like this β statusLine is the new bit, everything else was already there:
{
"model": "...",
"permissions": { ... },
"statusLine": {
"type": "command",
"command": "/Users/YOUR_USERNAME/.local/share/statusline-bar/statusline-bar.sh"
}
}Heads up on JSON's no-trailing-commas rule: if your previously-last key didn't have a comma after its closing } or ], you need to add one when you append statusLine after it. Most JSON-aware editors (VS Code, Cursor, etc.) flag this automatically.
The command path must be absolute β ~ and $HOME aren't expanded. Replace YOUR_USERNAME (or paste the full path from realpath ~/.local/share/statusline-bar/statusline-bar.sh). On Windows: use the WSL or Git Bash path.
Restart Claude Code (or open a new session) and the statusline appears at the bottom. If it doesn't, run the script manually against the bundled sample input to confirm it works:
~/.local/share/statusline-bar/statusline-bar.sh < ~/.local/share/statusline-bar/test/sample-input.jsonYou should see a populated two-line statusline (model, context, cost, rate limits, git info, β¦) β the same layout you'd see in a real Claude Code session.
bash 3.2+ (ships everywhere) and jq. Install jq if you don't already have it:
| OS | Install |
|---|---|
| macOS | brew install jq |
| Debian / Ubuntu / WSL | sudo apt install jq |
| Fedora / RHEL | sudo dnf install jq |
| Arch | sudo pacman -S jq |
| Windows | winget install jqlang.jq (or choco install jq / scoop install jq) |
Check it's working: jq --version should print something like jq-1.7.1.
Optional: git (for git tokens), fc-list (for Nerd Font detection), pmset / /sys/class/power_supply (for the battery token).
A few separators (chevron, slant, chevron_thin) and the nerd / nerd+label prefix styles use Nerd Font glyphs. The wizard detects whether you have one installed and labels those options accordingly. If you don't, the script still works β every other separator / prefix style renders fine without.
Install a Nerd Font:
- macOS (Homebrew):
brew install --cask font-jetbrains-mono-nerd-font(any of the Nerd Fonts casks works β pick the family you like) - Linux (Debian/Ubuntu):
sudo apt install fonts-firacodefor FiraCode-Nerd-equivalent, or download a release zip from github.com/ryanoasis/nerd-fonts/releases and extract to~/.local/share/fonts/, thenfc-cache -f - Arch:
sudo pacman -S ttf-nerd-fonts-symbolsfor symbol-only, or anyttf-*-nerdpackage for a full family - Manual: download a
.zipfrom nerdfonts.com and install via your OS's font manager
Then set your terminal's font to the Nerd Font variant (e.g. "JetBrainsMono Nerd Font" instead of "JetBrainsMono"). Restart the terminal and the wizard's hint will switch to Nerd Font β detected.
Launch the interactive wizard:
statusline-bar.sh -w # or --wizardThe wizard opens on a main menu with rows for preset, theme, prefix style, separator, bar style, Tokens & lines (the full layout editor β see below), empty-data behavior, and color depth. Use:
- β/β to navigate, β/β to switch where applicable, Enter to drill in
- s save, r reset to defaults, q quit (prompts to save if unsaved changes)
- Esc goes back one level
The bottom pane is a live preview that re-renders as you change settings. The focused token / separator is underlined and wrapped in βΆ β markers so its real colors stay visible.
Picker screens for the single-choice settings (preset, theme, prefix, separator, bar) all follow the same pattern β list of options on the left, per-option sample on the right, full statusline preview at the bottom:
The Tokens & lines screen is the layout editor β line tabs at the top, token list with inline separators in the middle, live full preview at the bottom:
Drill into any token to edit its per-token prefix / format / bar style overrides:
Hit a from any line to add a token β the picker shows all 42 grouped by source, each row with a live sample and a β mark next to tokens already used somewhere:
You can keep the wizard open in one terminal and have a real Claude Code session running in another. Every time you press s save in the wizard, the new config lands on disk β and Claude Code picks it up on its next statusline refresh, using your actual live data (current cost, real rate-limit countdowns, real git status, etc.) instead of the wizard's synthetic preview.
Claude Code refreshes the statusline on each tick β basically anything that updates its UI. The easiest trigger is typing / in CC and selecting any slash command (e.g. /help, /status); CC re-reads the statusline config and re-runs the script immediately. Tweak in the wizard β save β tick CC β see the change live.
Inside Tokens & lines you get:
- A horizontal line tab strip (
[1] 2 3 +) ββ/βswitches the active line,βenters the token list,ddeletes a line, Enter on+adds a new one (up to 4). - Token rows + always-visible inline separator rows (
β pipe (global)/β star (override)). - a add a token, c change it, d delete, m mark for cross-line move, p paste, Shift+β/β move within the line.
- Enter on a token opens its per-override detail screen; Enter on a separator row opens a separator picker scoped to that one position.
statusline-bar.sh -e # full catalog
statusline-bar.sh -e tokens # just the tokens section
statusline-bar.sh -e themes # just themes
statusline-bar.sh -e bars # just bar styles
# presets | themes | prefixes | separators | bars | tokensPrints a catalog with one row per option, rendered live against synthetic data. Uses your real terminal's color depth, so themes visibly differ β what you see is what you'd get if you picked it. Pipe through less -R if you want pagination with ANSI. See the Showcase below for the full output.
- 42 tokens β 29 from Claude stdin (model, context, cost, rate limits, token counts, vim mode, agent name, session id, β¦) + 6 git + 7 OS (clock, battery, memory, load, β¦)
- 11 presets β 1-line:
minimum,compact,focus,coderΒ· 2-line:default,modern,rates,claudeΒ· 3-line:fancyΒ· 4-line:everything,maximum - 21 themes β Auto / adaptive:
default,solarized,graphiteΒ· Light:light,solarized-light,catppuccin-latte,tokyo-day,ayu-light,gardenΒ· Dark:dark,dracula,nord,gruvbox,tokyo-night,catppuccin,one-dark,rose-pine,monokai,mocha,silver,ocean - 8 prefix styles β
none,label,emoji,nerd,ascii+emoji+label,label+emoji,nerd+label - 19 separators β ASCII (3), Unicode (10), Decorative (3), Powerline (3)
- 12 bar styles β solid:
blocks,heavy,line,braille,dots,arrows,asciiΒ· sub-character precision:gradient,gradient_dots,gradient_fade,gradient_shade,gradient_braille - Token-specific formats β base set (
value,percent,progressbar,progressbar+percent,countdown,remaining,combined,flag) plus richer per-token formats: modelcompact/short/id/id_short, contexttokens/tokens+size/percent+tokens/progressbar+percent+tokens, costper_hour/with_rate, linescount, duration / api_durationshort, rate-limitcountdown_short/remaining_shortand combinedprogressbar+percent+countdown_short/progressbar+percent+remaining_short.
Globals can be overridden per-token via tokens.<id>.prefix, .format, .bar_style, .separator_after.
The same output you'd see from statusline-bar.sh --examples in your terminal, captured here as screenshots. Each <picture> element below auto-switches to a matching light or dark variant depending on your GitHub theme.
11 layouts, ranging from 3 tokens on one line to 42 on four. Individual close-ups first:
| minimum |
compact |
| focus |
coder |
| default |
modern |
| rates (dark theme) |
fancy (dark theme) |
The full 11-preset catalog at a glance:
21 palettes grouped by terminal compatibility β Auto/adaptive, Light, Dark. Each row shows the good/warn/crit/accent swatches, then a model + context render, then three threshold-colored bars at 25%/75%/95%:
8 ways to label a token β none, label, emoji, nerd, ascii, plus three combos. The same default preset rendered with three different prefix styles applied globally:
| emoji (default) | ascii | nerd |
Full prefix-style catalog (all 8 styles applied to model + context + cost):
19 separators across 4 families β ASCII, Unicode, Decorative, Powerline:
12 progress-bar styles β each row shows the same bar at 25 / 75 / 95% so good/warn/crit colors are all visible:
All 42 tokens grouped by source β Claude session (29), Git (6), Local OS (7) β each with a live sample and an inline β description:
Text-only catalog (copy-pasteable)
## Presets (factory layouts; switch via --preset NAME)
[ minimum ] π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) | π° $0.40
[ compact ] π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) | π° $0.40 | πΏ feat/wizard | β³ 3m 50s | π 5h 50%
[ focus ] π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) | π true | πͺ xhigh | π° $0.40
[ coder ] π€ Opus 4.7 (1M context) | πΏ feat/wizard | π +3 ~5 ?2 | β +128 | β -42 | β³ 3m 50s
[ default ] π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) | π° $0.40 | π 5h ββββββββββ 50% π 3h 25m 13s | π 7d ββββββββββ 50% π 5d 2h 17m 0s
[ default ] π true | πͺ xhigh | π example_dir | π³ main | πΏ feat/wizard | π +3 ~5 ?2 | π β2 β1 | β +128 | β -42 | β³ 3m 50s
[ modern ] π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) | πΏ feat/wizard | β 3 | βοΈ 5 | π° $0.40
[ modern ] π 5h ββββββββββ 50% | π 7d ββββββββββ 50% | β³ 3m 50s
[ rates ] π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) | π° $0.40
[ rates ] π 5h ββββββββββ 50% π 3h 25m 13s | π 7d ββββββββββ 50% π 5d 2h 17m 0s | πΎ ββββββββββ 97% | π‘ 39s
[ claude ] π€ Opus 4.7 (1M context) | π Browse | π§ 50% (49k/100k) | π° $0.40 | β³ 3m 50s
[ claude ] π true | πͺ xhigh | π¨ default | β‘οΈ | π·οΈ 2.1.139
[ fancy ] π€ Opus 4.7 (1M context) | π§ ββββββββββ 50% | π° $0.40 | β³ 3m 50s
[ fancy ] π 5h ββββββββββ 50% π 3h 25m 13s | π 7d ββββββββββ 50% π 5d 2h 17m 0s
[ fancy ] π example_dir | πΏ feat/wizard | π +3 ~5 ?2 | π true | πͺ xhigh | π ββββββββββ 92% | π 18:03
[ everything ] π€ Opus 4.7 (1M context) | π Browse | π browse00 | π§ 50% (49k/100k) | π₯ 49k | π€ 50 | πͺ 100k | π 50%
[ everything ] πΎ 97% | π° $0.40 | π‘ 39s | π 5h ββββββββββ 50% π 3h 25m 13s | π 7d ββββββββββ 50% π 5d 2h 17m 0s | π true | πͺ xhigh | π¨ default | π·οΈ 2.1.139 | π€ Explore | β¨οΈ INSERT | β‘οΈ | π
[ everything ] π example_dir | π³ main | π 0 | π² /tmp/example_dir/feature | π browse001.jsonl | πΏ feat/wizard | π +3 ~5 ?2 | β 3 | βοΈ 5 | β 2 | π β2 β1 | β +128 | β -42
[ everything ] β³ 3m 50s | π 18:03 | π
2026-05-11 | π₯οΈ mac | π€ alice | π 92% | 𧬠45% | π 1.2
[ maximum ] π€ Opus 4.7 (1M context) | π Browse | π browse00 | π§ ββββββββββ 50% (49k/100k) | π₯ 49k | π€ 50 | πͺ 100k | π ββββββββββ 50%
[ maximum ] πΎ ββββββββββ 97% | π° $0.40 | π‘ 39s | π 5h ββββββββββ 50% π 3h 25m 13s | π 7d ββββββββββ 50% π 5d 2h 17m 0s | π true | πͺ xhigh | π¨ default | π·οΈ 2.1.139 | π€ Explore | β¨οΈ INSERT | β‘οΈ | π
[ maximum ] π example_dir | π³ main | π 0 | π² /tmp/example_dir/feature | π browse001.jsonl | πΏ feat/wizard | π +3 ~5 ?2 | β 3 | βοΈ 5 | β 2 | π β2 β1 | β +128 | β -42
[ maximum ] β³ 3m 50s | π 18:03 | π
2026-05-11 | π₯οΈ mac | π€ alice | π ββββββββββ 92% | 𧬠ββββββββββ 45% | π 1.2
## Themes (color palettes; switch via --theme NAME β accent color on model + good/warn/crit bars)
good warn crit text
[ default ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ solarized ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) β°β°β°β±β±β±β±β±β±β± 25% β°β°β°β°β°β°β°β°β±β± 75% β°β°β°β°β°β°β°β°β°β° 95%
[ graphite ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ###....... 25% ########.. 75% ########## 95%
[ light ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ solarized-light ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) β°β°β°β±β±β±β±β±β±β± 25% β°β°β°β°β°β°β°β°β±β± 75% β°β°β°β°β°β°β°β°β°β° 95%
[ catppuccin-latte ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ tokyo-day ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ ayu-light ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ garden ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ dark ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ dracula ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ nord ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) β°β°β°β±β±β±β±β±β±β± 25% β°β°β°β°β°β°β°β°β±β± 75% β°β°β°β°β°β°β°β°β°β° 95%
[ gruvbox ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) β°β°β°β±β±β±β±β±β±β± 25% β°β°β°β°β°β°β°β°β±β± 75% β°β°β°β°β°β°β°β°β°β° 95%
[ tokyo-night ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ catppuccin ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ one-dark ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ rose-pine ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ monokai ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ mocha ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) β°β°β°β±β±β±β±β±β±β± 25% β°β°β°β°β°β°β°β°β±β± 75% β°β°β°β°β°β°β°β°β°β° 95%
[ silver ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ ocean ] β β β Aa π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) β°β°β°β±β±β±β±β±β±β± 25% β°β°β°β°β°β°β°β°β±β± 75% β°β°β°β°β°β°β°β°β°β° 95%
## Prefix styles (how each token is labeled; tokens.<id>.prefix to override per token)
[ none ] Opus 4.7 (1M context) | 50% (49k/100k) | $0.40
[ label ] Model: Opus 4.7 (1M context) | Ctx: 50% (49k/100k) | Cost: $0.40
[ emoji ] π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) | π° $0.40
[ nerd ] Opus 4.7 (1M context) | 50% (49k/100k) | $0.40
[ ascii ] [M] Opus 4.7 (1M context) | [C] 50% (49k/100k) | [$] $0.40
[ emoji+label ] π€ Model: Opus 4.7 (1M context) | π§ Ctx: 50% (49k/100k) | π° Cost: $0.40
[ label+emoji ] Model π€ Opus 4.7 (1M context) | Ctx π§ 50% (49k/100k) | Cost π° $0.40
[ nerd+label ] Model: Opus 4.7 (1M context) | Ctx: 50% (49k/100k) | Cost: $0.40
## Separators (string between tokens on the same line)
[ space ] π€ Opus 4.7 (1M context) π§ 50% (49k/100k) π° $0.40
[ pipe ] π€ Opus 4.7 (1M context) | π§ 50% (49k/100k) | π° $0.40
[ slash ] π€ Opus 4.7 (1M context) / π§ 50% (49k/100k) / π° $0.40
[ dot ] π€ Opus 4.7 (1M context) Β· π§ 50% (49k/100k) Β· π° $0.40
[ vbar ] π€ Opus 4.7 (1M context) β π§ 50% (49k/100k) β π° $0.40
[ dash ] π€ Opus 4.7 (1M context) β π§ 50% (49k/100k) β π° $0.40
[ bullet ] π€ Opus 4.7 (1M context) β’ π§ 50% (49k/100k) β’ π° $0.40
[ diamond ] π€ Opus 4.7 (1M context) β π§ 50% (49k/100k) β π° $0.40
[ arrow ] π€ Opus 4.7 (1M context) βΈ π§ 50% (49k/100k) βΈ π° $0.40
[ tri ] π€ Opus 4.7 (1M context) βΆ π§ 50% (49k/100k) βΆ π° $0.40
[ star ] π€ Opus 4.7 (1M context) β
π§ 50% (49k/100k) β
π° $0.40
[ sparkle ] π€ Opus 4.7 (1M context) β¦ π§ 50% (49k/100k) β¦ π° $0.40
[ gear ] π€ Opus 4.7 (1M context) β π§ 50% (49k/100k) β π° $0.40
[ check ] π€ Opus 4.7 (1M context) β π§ 50% (49k/100k) β π° $0.40
[ heart ] π€ Opus 4.7 (1M context) β₯ π§ 50% (49k/100k) β₯ π° $0.40
[ music ] π€ Opus 4.7 (1M context) βͺ π§ 50% (49k/100k) βͺ π° $0.40
[ chevron ] π€ Opus 4.7 (1M context) ξ° π§ 50% (49k/100k) ξ° π° $0.40
[ slant ] π€ Opus 4.7 (1M context) ξΌ π§ 50% (49k/100k) ξΌ π° $0.40
[ chevron_thin ] π€ Opus 4.7 (1M context) ξ± π§ 50% (49k/100k) ξ± π° $0.40
## Bar styles (each row: same bar at 25 / 75 / 95% β green good, yellow warn, red crit)
[ blocks ] ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ heavy ] β°β°β°β±β±β±β±β±β±β± 25% β°β°β°β°β°β°β°β°β±β± 75% β°β°β°β°β°β°β°β°β°β° 95%
[ line ] ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ braille ] β£Ώβ£Ώβ£Ώβ£β£β£β£β£β£β£ 25% β£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£β£ 75% β£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώ 95%
[ dots ] ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ arrows ] βΆβΆβΆβ·β·β·β·β·β·β· 25% βΆβΆβΆβΆβΆβΆβΆβΆβ·β· 75% βΆβΆβΆβΆβΆβΆβΆβΆβΆβΆ 95%
[ ascii ] ###....... 25% ########.. 75% ########## 95%
[ gradient ] βββ 25% ββββββββ 75% ββββββββββ 95%
[ gradient_dots ] βββΒ·Β·Β·Β·Β·Β·Β· 25% ββββββββΒ·Β· 75% ββββββββββ 95%
[ gradient_fade ] ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ gradient_shade ] ββββββββββ 25% ββββββββββ 75% ββββββββββ 95%
[ gradient_braille ] βββ‘Β·Β·Β·Β·Β·Β·Β· 25% ββββββββ‘Β·Β· 75% ββββββββββ‘ 95%
## Tokens (42 total β pick any combination via Tokens & lines wizard)
### Claude session (29 tokens, read from stdin JSON)
[ model ] π€ Opus 4.7 (1M context) β Current Claude model display name
[ session_name ] π Browse β Custom session name set via --name or /rename
[ session_id ] π browse00 β Session UUID (first 8 chars)
[ context ] π§ 50% (49k/100k) β % of context window used; rich formats include tokens used and window size
[ tokens_input ] π₯ 49k β Total input tokens this session (e.g. 202k)
[ tokens_output ] π€ 50 β Total output tokens this session (e.g. 265)
[ context_size ] πͺ 100k β Configured context window size (e.g. 1M)
[ context_remaining ] π 50% β % of context window still available
[ cache_hit ] πΎ 97% β % of input tokens served from cache
[ cost ] π° $0.40 β Session cost in USD (formatted $0.40)
[ duration ] β³ 3m 50s β Total wall-clock time since session start
[ api_duration ] π‘ 39s β Time spent waiting for API responses
[ lines_added ] β +128 β Lines of code added in this session (+128)
[ lines_removed ] β -42 β Lines of code removed in this session (-42)
[ rl_5h ] π 5h ββββββββββ 50% π 3h 25m 13s β 5-hour rate limit % + reset countdown
[ rl_7d ] π 7d ββββββββββ 50% π 5d 2h 17m 0s β 7-day rate limit % + reset countdown
[ thinking ] π true β Whether extended thinking is enabled
[ effort ] πͺ xhigh β Current reasoning effort (low/medium/high/xhigh/max)
[ output_style ] π¨ default β Active output style name
[ version ] π·οΈ 2.1.139 β Claude Code version
[ fast_mode ] β‘οΈ β Fast mode flag (shows only when true)
[ exceeds_200k ] π β Token-count-over-200k flag (shows only when true)
[ dir ] π example_dir β Workspace directory basename
[ worktree ] π³ main β Worktree name (--worktree sessions only)
[ vim_mode ] β¨οΈ INSERT β Current vim mode (NORMAL/INSERT/VISUAL)
[ agent_name ] π€ Explore β Name of the running --agent
[ added_dirs ] π 0 β Count of dirs added via /add-dir
[ git_worktree ] π² /tmp/example_dir/feature β Git worktree name (set for any linked worktree)
[ transcript ] π browse001.jsonl β Basename of the transcript file
### Git (6 tokens, populated when cwd is inside a git repo)
[ git_branch ] πΏ feat/wizard β Current git branch name
[ git_status ] π +3 ~5 ?2 β Combined +staged ~modified ?untracked counts
[ git_staged ] β 3 β Count of staged files
[ git_modified ] βοΈ 5 β Count of modified-but-unstaged files
[ git_untracked ] β 2 β Count of untracked files
[ git_ahead_behind ] π β2 β1 β Ahead/behind count vs upstream
### Local OS (7 tokens, from the machine running the statusline)
[ clock ] π 18:03 β Current time (HH:MM)
[ date ] π
2026-05-11 β Current date (YYYY-MM-DD)
[ hostname ] π₯οΈ mac β Short hostname
[ user ] π€ alice β Current user ($USER)
[ battery ] π 92% β Battery % (low % = critical color)
[ memory ] 𧬠45% β Memory used % (relaxed thresholds; 80% is normal)
[ load ] π 1.2 β 1-minute load average
Config lookup order (highest precedence first):
--config PATHflag$STATUSLINE_BAR_CONFIG./.statusline-bar.json(project-local β pin a per-project statusline)$XDG_CONFIG_HOME/statusline-bar/config.json~/.config/statusline-bar/config.json- Built-in defaults
The auto-created config includes a $schema field pointing at this repo's schema.json β VS Code, Cursor, JetBrains, and Neovim's LSP all give you autocomplete and inline docs while editing.
Validate any config with statusline-bar.sh -c --config PATH (or --check).
statusline-bar.sh [FLAGS] render from stdin (Claude Code mode)
statusline-bar.sh -w | --wizard interactive setup
statusline-bar.sh -e | --examples print a catalog of presets/themes/etc
statusline-bar.sh -c | --check validate config; exit 0/1
Flags:
-h, --help show help
-V, --version print version
-w, --wizard enter setup wizard
-e, --examples print the catalog
-c, --check validate config and exit
--config PATH use this config file instead of default
--preset NAME one-shot render with this preset
--theme NAME one-shot render with this theme
--no-color disable ANSI color output
statusline-bar.sh with no flags and no stdin prints the help (same as -h). When piped JSON arrives on stdin (i.e. Claude Code calls it), it renders the statusline.
First public release. Rolls up the v0.4.0 + v0.4.1 changes into a single tagged drop, with documentation tuned for new users.
Install / docs:
- Switched from
curl β¦/vX.Y.Z/statusline-bar.shtogit cloneβ clones to~/.local/share/statusline-bar, upgrade viagit pull, no version pinning to maintain. - Rewrote the Wire it up in Claude Code section to spell out the part new users trip on most:
~/.claude/settings.jsonis one JSON object β add thestatusLinekey alongsidemodel/permissions/hooks/ etc., don't overwrite the file. Includes minimal-config example, merged-with-existing example, the trailing-comma reminder, and a sanity-check command that pipestest/sample-input.jsoninto the script so you see a real two-line render before fiddling with Claude. - New Tune it live alongside Claude Code subsection documenting the workflow: leave the wizard open in one terminal, run a real CC session in another, save in the wizard, type any
/slash command in CC to force a statusline tick β see the new config rendered against your live data. - Full screenshots throughout the README: hero, wizard pickers, Tokens & lines editor, token-detail screens, plus a Showcase section with light/dark
<picture>switching for every catalog dimension (presets, themes, prefix styles, separators, bar styles, tokens). 33 screenshots organized into tables + showrooms.
Nerd Font glyph mapping (was the v0.1.0-era follow-up):
- Every one of the 42 tokens now has a Font Awesome glyph in its
nerdprefix field, stored as\uXXXXJSON escapes so the source stays plain ASCII and grep-friendly. Thenerd/nerd+labelprefix styles render real icons in any Nerd-Font-patched terminal.
Carrying forward from v0.4.0 (see the entry below for the full list): +4 presets (focus, coder, rates, claude β 11 total), +11 themes (segmented by terminal compat β 21 total), +4 bar styles (gradient_dots / gradient_fade / gradient_shade / gradient_braille β 12 total), context-token consolidation + 4 new companion tokens, ~15 new format variants (model compact/short/id/id_short, cost per_hour/with_rate, duration short, rate-limit countdown_short / remaining_short and combined, context tokens / tokens+size / percent+tokens / progressbar+percent+tokens, lines count), default empty_behavior β placeholder, save-no-exit + per-screen reset, themes-picker segmentation, catalog redesign, sample-data refresh.
Tests: 118 e2e cases passing.
A big content + UX pass: more variety in every catalog dimension, smarter defaults, and a redesigned --examples showcase.
More choices
- +4 presets (focus, coder, rates, claude) bringing the total to 11. New 1-liners cover "activity glance" and "git focus"; new 2-liners cover "usage / rate limits" and "Claude session state". Presets are now grouped by line count in the picker.
- +11 themes to 21 total, segmented in the picker by terminal compatibility (Auto / Light / Dark). Light additions:
solarized-light,catppuccin-latte,tokyo-day,ayu-light,garden. Dark additions:one-dark,rose-pine,monokai,mocha,silver,ocean. Accent colors diversified β 12 of the 21 themes used to be some shade of blue; the new spread covers cyan / purple / pink / magenta / peach / orange / silver / brown / monochrome too. - +4 bar styles (
gradient_dots,gradient_fade,gradient_shade,gradient_braille) joininggradientas the sub-character-precision family β each takes a different approach to showing the empty track + the partially-filled cell.
Tokens
- Context tokens consolidated and expanded.
context_pct+context_barmerge into a singlecontexttoken; four companion tokens added βtokens_input(π₯),tokens_output(π€),context_size(πͺ),context_remaining(π). New combined formats oncontext:tokens,tokens+size,percent+tokens,progressbar+percent+tokens. - Model gains
compact(drops " context" from inside the parens),short(drops the whole paren group),id(raw model id), andid_shortformats. - Cost gains
per_hour("$6.20/hr") andwith_rate("$0.40 ($6.20/hr)") β projected burn rate from session duration. - Lines added / removed gain
countformat (drops the leading +/-); now colored from the theme palette (good / crit). - Rate-limit
rl_5h/rl_7dgainprogressbar+percent+remaining, plus*_shortvariants of every countdown / remaining format (top-2-unit precision β "3h 25m" instead of "3h 25m 13s"). - Duration / api_duration gain a
shortformat.
Wizard polish
s saveno longer exits the wizard β it flashes aβ Saved to <path>confirmation and leaves you where you were. Useqto leave once saved.r resetis now scoped to the current screen: per-field on token_field, per-token on token_detail, lines + per-token overrides on Tokens & lines, full reset elsewhere.- Save and reset hints surfaced in every submenu's keybinding footer.
- Default empty_behavior changed from
hidetoplaceholderso first-time users seeβinstead of tokens silently dropping out. - Default context format upgraded to
percent+tokensso the new combined view shows by default. context_remainingcolored with inverse thresholds (high % = good, low % = crit) so it reads consistent with itscontextsibling.- Pressing
βon a Tokens & lines line tab now jumps to the last token of that line β symmetric withβreturning to the tab row at the bottom.
--examples catalog redesign
- Each section focuses on the dimension it advertises: Themes shows accent + threshold bars (no cost), Bar styles shows the same bar at 25 / 75 / 95% with threshold colors, Tokens shows every token alone with an inline
β description. Presets prints every line of multi-line layouts with the preset name as the row prefix. - New
--examples MODEargument acceptspresets/themes/prefixes/separators/bars/tokensto print just one section. - Sample data refreshed β rate-limit countdowns now show meaningful values (3h 25m 13s / 5d 2h 17m 0s) instead of
0s, all the optional Claude fields (vim mode, agent name, fast mode, exceeds-200k, git worktree, transcript path) are filled in with realistic examples, anchor date moved from year 2286 to 2026-05-11.
Other
- Nerd Font glyph mapping complete. Every token now has a Font Awesome glyph for the
nerd/nerd+labelprefix styles β model(laptop/cpu), branch(code-fork), folder, clock, etc. Stored as\uXXXXJSON escapes insideTOKENS_JSONso they survive copy-paste and are easy to find. This was listed as a known v0.3.0 follow-up. - New
MOCK_GIT_STATE=in_repofor catalog rendering so git tokens show realistic values in presets too. - Theme
default's accent inherits the terminal foreground color (no explicit color), so terminal-themed users keep their custom text color while semantic threshold colors still apply. - Tests: 118 e2e cases passing.
Tokens & lines β a full TUI for managing your statusline layout, plus a lot of preview-pane polish.
- New "Tokens & lines" screen replaces the old
Lines/Tokensplaceholders on the main menu. Manage every line and every token from one place:- Horizontal line tabs (
[1] [2] [3] +) at the top ββ/βswitches the active line,βenters the token list, Enter on+adds a new line (up to 4),ddeletes a line with confirmation if non-empty. - Token rows + inline separator rows (always visible, labeled
β pipe (global)orβ star (override)). aadd a token,cchange the token at cursor,ddelete,mmark for cross-line move,ppaste,Shift+ββmove within a line, Enter on a token opens its detail screen, Enter on a separator row opens a separator picker scoped to that one position (with a(use global)row that clears the override).β/βfrom inside the tokens zone also cycle through lines + the+tab (no need to climb back up).
- Horizontal line tabs (
- Token picker: 42 tokens grouped by source (Claude stdin / git / OS), each row showing a live
emoji+labelsample rendered with synthetic data (e.g.π€ Model: Opus 4.7 (1M context),π 5h ββββββββββ 50% π 0s).βmarks tokens already used somewhere. Cursor on a row tooltips its one-line description. Used by botha addandc change. - Token detail screen for per-token overrides:
prefix,format,bar_style, andReset to defaults. Each sub-picker opens with the cursor on the currently-active value, and the right-side example column renders the actual token under that option so you can compare outputs directly.rresets just this token (screen-aware shortcut). - Preview highlighting redesigned. The focused token / separator no longer reverse-video-inverts colors (which lied about how it would actually render). Now the focused content is underlined and wrapped in bold-bright-yellow
βΆ βmarkers β colors stay accurate. - Unsaved-changes prompt when you press
qorEscon the main menu with edits pending β choosessave+quit,ddiscard+quit, or any other key to cancel and keep editing. Previously the prompt wasn't reachable because of a subshell-captured-output bug. - Conditional "Reset to defaults" row appears at the bottom of the main menu when the config diverges from factory defaults, with a count of customizations.
- CLI cleanup:
--examplesnow always prints the catalog; theinteractiveandallsub-modes (and the sub-picker prompt) are gone.- Catalog output now uses your real terminal color depth β 10 themes visibly differ instead of looking identical.
- Prefix data cleanups for cleaner picker samples:
rl_5h/rl_7demojiβ±οΈ 5h/β±οΈ 7dβπ/π(removes the duplicated5h 5hunderemoji+label).lines_added/lines_removedlabels+:/-:βAdded:/Removed:.versionlabelvβVersion:.- VS-16 variation selectors added to
π·οΈ/β‘οΈ/β¨οΈ/π₯οΈso they render as wide emojis (consistent column count with other prefixes). git_ahead_behindiconβ(math symbol) βπ(proper emoji).
git_runhelper so git tokens work from a synthetic input (mock-on-PATH) even when the workspace dir doesn't exist on disk.- Lots of small wizard fixes from earlier in this cycle: cursor restoration on return from sub-menus, wrap-around navigation, per-item examples on every selection screen, theme menu columns (
good warn crit text bar style), live Nerd-Font detection labels, breadcrumbs on every screen, dynamicConfig:line in--help,-w/-c/-eshort-flag remap.
Known follow-ups for v0.4.0: per-token + global colors (text, prefix, separator), full Nerd-Font glyph mapping for the nerd / nerd+label prefix styles.
Tests: 115 e2e cases passing.
Wizard polish, CLI cleanup, and live Nerd-Font detection.
- Wizard live preview updates every time you move the cursor in any sub-menu (preset / theme / prefix / separator / bar / empty / depth) β the bottom pane now reflects the focused option, not the current saved config.
- Cursor memory β sub-menus open with the cursor on the currently-selected item, not row 0. Returning to a parent menu restores the cursor to the row you came from.
- Wrap-around navigation β
βat the top jumps to the last item;βat the bottom jumps to the first. - Per-item example previews on the right side of every sub-menu so you can compare all options at a glance: separator characters drawn literally (
a β b β c),modeltoken rendered in each prefix style, 10-char bars at 50% in each bar style, etc. - Theme menu columns β
good / warn / crit / text / bar styleheader above the swatches, withAashown in the theme's accent color (= what regular non-threshold tokens look like) plus the suggested bar style each theme uses whenglobal.bar_styleisnull. - Live Nerd-Font detection surfaced inline:
- Separator menu (chevron / slant / chevron_thin):
(Nerd Font β detected)/(Nerd Font β β install: nerdfonts.com)/(Nerd Font: status unknown) - Prefix menu (nerd / nerd+label): same detection plus a note that the per-token glyph map is empty in v0.2.0 and ships in a follow-up.
- Separator menu (chevron / slant / chevron_thin):
- Breadcrumbs on every screen β
statusline-bar βΈ Theme,statusline-bar βΈ Separator, etc. - Theme colors actually differ in the wizard preview now β the preview uses the real terminal color depth instead of hardcoded
none. - CLI flag remap:
-wfor wizard (was-c),-cfor--check,-efor--examples. - Bare invocation prints help instead of prompting
set up config? (y/n). Help text now includes the wizard hint and a dynamicConfig:line showing which file is in use (orno config file found β using built-in defaults). - Bug fixes:
_wiz_next_keyno longer hangs when a scripted input is exhausted (it now checks the parse-timeOPT_TUI_SCRIPTinstead of the consumed buffer).- bash 3.2 sparse-array trap in the cursor-stack pop path β arrays are now sliced rather than
unset-ed. - Wizard's
tui_cleanupsurvives non-TTY stty failures.
- Initial release. 39 tokens, 7 presets, 10 themes, 8 prefix styles, 19 separators, 8 bar styles, 9 formats, per-token overrides.
- Interactive TUI wizard for preset / theme / prefix / separator / bar / empty / color-depth.
--examples catalogand--examples allmodes.- Project-level config (
./.statusline-bar.json) andschema.jsonfor editor autocomplete. - 114 end-to-end test cases.
- Known follow-ups for v0.1.1: TUI line-editor (add / reorder / remove lines), TUI per-token overrides (prefix/format/bar/separator-after),
--examples interactivemode, full Nerd-font glyph mapping for thenerdprefix style.
Issues and PRs welcome at https://github.com/Dworf/statusline-bar.
Run the test suite before submitting:
./test/run-tests.shMIT β see LICENSE.
- Anthropic for Claude Code and the open statusline interface that makes this possible.
- The broader Claude Code statusline community β the many open-source statusline projects whose presets, layouts, themes, progress-bar styles, and rendering ideas inspired this one.