An emoji-first statusline for Claude Code that shows your session's mood.
Instead of a flat clock ticking up, watch your session evolve: π± fresh start β β warmed up β π₯ in flow β π launched β πͺ strong β π§ wizard hours β π§ zombie β π» past midnight.
Existing statuslines tell you facts. vibeline tells you how the session feels.
It's emoji-first on purpose, built for the long sessions β the kind where you forget what time it is. It keeps you connected to the session and to your own sense of time and space without asking you to read a single number.
I made it for me. If it's useful to you too, even better.
Two lines β identity on top, metrics below. Long session names never push anything off-screen.
Line 1 β where you are
- π§ model β Opus, π΅ Sonnet, or π Haiku
- π location β current folder + git branch, dirty file count, ahead/behind
- π¬ session name β whatever Claude Code has named this session
Line 2 β how it's going
- π― tasks β pending/in-progress/done for the current session's
TodoWritelist (1β 2β). Falls back to π code markers (TODO / FIXME / XXX / HACK) when no session tasks exist - π elapsed β how long you've been at it, with an emoji that evolves every stage
- π° cost β session spend, colored by tier. β‘ flashes when it grows
- π plan usage β session bar (πβπβπͺββοΈ) and weekly bar (πβπβπβπβπ) against your Max/Pro quota. Approximate, needs calibration per plan
- π’ context β 5-dot usage bar for the context window
- π clock β wall time, with a different icon for dawn / day / evening / night
1. Download the script:
curl -fsSL https://raw.githubusercontent.com/zeroblack/vibeline/main/install.sh | bashThis pulls statusline.sh into ~/.claude/, makes it executable, and asks if you want to register it automatically.
If you prefer to do it yourself:
curl -fsSL https://raw.githubusercontent.com/zeroblack/vibeline/main/statusline.sh -o ~/.claude/statusline.sh
chmod +x ~/.claude/statusline.sh2. Register it in ~/.claude/settings.json:
{
"statusLine": {
"type": "command",
"command": "/bin/bash ~/.claude/statusline.sh"
}
}3. Restart Claude Code. That's it.
Pick the value that matches your plan. The prefix ~ in the cost signals "theoretical" (you pay a flat fee, not per token), and the usage bars get the right quota baseline:
| Your plan | CCSL_PLAN |
Session baseline | Weekly baseline |
|---|---|---|---|
| Pro ($20/mo) | pro |
50M tokens | 325M tokens |
| Max 5x ($100/mo) | max5 |
250M tokens | 1.625B tokens |
| Max 20x ($200/mo) | max20 |
1B tokens | 6.5B tokens |
"command": "CCSL_PLAN=max5 /bin/bash ~/.claude/statusline.sh"A note on the numbers. Anthropic publishes plan limits as relative multipliers (Max 5x / Max 20x) and as ranges of Sonnet-hours per week β not as exact token quotas. The baselines above respect the 5x / 20x ratio officially, but the absolute numbers are calibrated best-guesses. The bars show
~to make this explicit. If yours don't match/usage, override them (see below).Legacy note:
CCSL_PLAN=maxstill works as an alias formax5for backwards compatibility.
- Open
/usagein Claude Code, note the session and weekly percentages - Compare to what vibeline shows (e.g. vibeline says
~67%,/usagesays53%) - Look up the raw tokens vibeline measured:
cat ~/.claude/cache/statusline/usage - Compute your real quota:
quota = tokens Γ· (real_pct / 100) - Lock it in:
"command": "CCSL_PLAN=max20 CCSL_SESSION_QUOTA_TOKENS=1000000000 CCSL_WEEK_QUOTA_TOKENS=6500000000 /bin/bash ~/.claude/statusline.sh"
Every option is an environment variable β you set them by prepending them to the command string in settings.json. No config file.
Hide cost and clock (privacy-friendly):
"command": "CCSL_SHOW_COST=0 CCSL_SHOW_CLOCK=0 /bin/bash ~/.claude/statusline.sh"Minimal β just model, folder, git, context bar:
"command": "CCSL_SHOW_TODOS=0 CCSL_SHOW_SESSION_NAME=0 CCSL_SHOW_ELAPSED=0 CCSL_SHOW_COST=0 CCSL_SHOW_CLOCK=0 /bin/bash ~/.claude/statusline.sh"Track custom keywords β add OPTIMIZE and REVIEW alongside the defaults:
"command": "CCSL_TODO_PATTERN='(TODO|FIXME|XXX|HACK|OPTIMIZE|REVIEW)' /bin/bash ~/.claude/statusline.sh"Set any of these to 0 to hide that segment. Leave them alone to keep the default layout.
| Variable | Default | What it controls |
|---|---|---|
CCSL_SHOW_COST |
1 |
π° cost segment |
CCSL_SHOW_ACTIVITY |
1 |
β‘ flash on cost growth |
CCSL_SHOW_TODOS |
1 |
π TODO counter |
CCSL_SHOW_SESSION_NAME |
1 |
π¬ session name |
CCSL_SHOW_ELAPSED |
1 |
evolving time emoji |
CCSL_SHOW_CONTEXT |
1 |
context usage bar |
CCSL_SHOW_CLOCK |
1 |
wall clock |
CCSL_SHOW_USAGE |
1 |
π plan usage bars (session + week) |
CCSL_PLAN |
api |
pro, max5, or max20 β unlocks cost prefix and usage bars (max is still accepted as alias for max5) |
CCSL_SESSION_QUOTA_TOKENS |
auto | override 5h session token quota (calibrate vs /usage) |
CCSL_WEEK_QUOTA_TOKENS |
auto | override weekly token quota |
CCSL_USAGE_TTL |
60 |
seconds to cache usage aggregation |
CCSL_TODO_PATTERN |
(TODO|FIXME|XXX|HACK) |
regex of keywords to count |
CCSL_TODO_TTL |
60 |
seconds to cache code marker count |
CCSL_TASK_TTL |
15 |
seconds to cache session task read |
CCSL_ACTIVITY_LINGER |
3 |
seconds β‘ stays visible |
CCSL_CACHE_DIR |
~/.claude/cache/statusline |
cache location |
CCSL_SESSIONS_DIR |
~/.claude/sessions |
Claude Code session store |
CCSL_PROJECTS_DIR |
~/.claude/projects |
Claude Code projects store (read for token aggregation) |
The model, folder, and git branch segments always show when relevant β they anchor line 1. If every variable on line 2 is set to 0, the second line disappears and you get a single-line statusline.
| Range | Emoji | |
|---|---|---|
| < 15m | π± | fresh start |
| 15m β 45m | β | warmed up |
| 45m β 90m | π₯ | in flow |
| 1.5h β 3h | π | launched |
| 3h β 4h | β‘ | charged |
| 4h β 5h | πͺ | strong |
| 5h β 6h | π¦Ύ | bionic |
| 6h β 8h | π | erupting |
| 8h β 10h | π§ | wizard hours |
| 10h β 12h | π¦ | night owl |
| 12h β 16h | π§ | zombie |
| 16h β 20h | π | skull |
| 20h β 24h | β οΈ | danger zone |
| > 24h | π» | ghost |
bash3.2+jqawkgit(optional, only for branch and TODO segments)- A terminal with emoji support
Tested on macOS and Linux. Works inside Claude Code's TUI, iTerm2, WezTerm, Alacritty, and Kitty.
rm ~/.claude/statusline.sh
rm -rf ~/.claude/cache/statuslineThen remove the statusLine key from ~/.claude/settings.json.
| Session (5h) | Week (7d) | ||
|---|---|---|---|
| < 50% | π calm | < 25% | π new moon |
| 50 β 75% | π riptide | 25 β 50% | π waxing crescent |
| 75 β 90% | πͺ cyclone | 50 β 75% | π first quarter |
| β₯ 90% | βοΈ storm | 75 β 90% | π waxing gibbous |
| β₯ 90% | π full moon |
ccstatusline is excellent and fully configurable. vibeline is a different take:
- Emoji as vocabulary, not decoration β every icon names its category, and the category has a progression (session evolves π±βββπ₯βπ§, the plan usage evolves πβπβπͺββοΈ, the week fills like the moon πβπβπβπ)
- Progression over counters β a 3-hour session should feel different than a 30-minute one, even before you read the number
- Zero config β one Bash file, no npm chain, no runtime beyond what every dev machine already has
Use ccstatusline if you want every possible number on screen. Use vibeline if you want one that tells you how long you've been at it with a π§ or a π§.
See CONTRIBUTING.md.
Token-window aggregation over local JSONL was inspired by ccusage by @ryoppippi β MIT-licensed. The math (rolling 5h session and 7-day windows, summing input + output + cache_creation + cache_read) follows their approach; vibeline reimplements it in Bash to stay dependency-free.
MIT β see LICENSE.
Built by Dioni.
