A Claude Code status line that tells you, at a glance, which worktree and branch this session is on, and how much context and quota you have left.
⎇ northwind-service-roster feat/source-roster-cursor ◆ Opus
ctx ██████▌░░░ 68% 5h ████░░░░░░ 41% 2h13m wk ██░░░░░░░░ 23% 4d
One bash file, no dependencies, and the render path spawns nothing.
brew install arturlimaaa/tap/terminito && terminito install
Without Homebrew — and on Windows, where Git Bash is the target:
git clone https://github.com/arturlimaaa/terminito ~/terminito && ~/terminito/terminito install
install writes the statusLine key into ~/.claude/settings.json and keeps
a .bak beside it. Claude Code picks it up on its next message — no restart.
Re-running it is a no-op. If you already have a different status line it stops
and tells you, rather than overwriting; install --force replaces it, and
install --print gives you the snippet to paste yourself.
Nothing appearing? terminito doctor. If everything there is green but the row
is still missing, terminito doctor --trace on answers the one question the
checks cannot: whether Claude Code is really invoking it.
Row 1 — where you are. ⎇ for a linked worktree, ◉ plus an amber name
for the main checkout, because the main checkout is where an accidental commit
costs most. The label is the directory basename; the repo name is added only
when the directory doesn't already imply it. In the branch, the namespace
recedes and the leaf keeps full weight — feat/ grey, source-roster-cursor
lit.
Row 2 — what you have left. Coloured area is what you have spent, so a
fresh session is quiet grey rather than thirty saturated cells announcing that
nothing has happened. Half cells (▌) double the resolution inside ten
columns, so 95% and 100% are not the same picture at the end of the scale where
you actually act.
The countdown is what makes the quota bar mean anything: 91% 4m is fine, wait
it out — 91% 4h51m means stop and switch model. Same bar, opposite decisions.
The two rows join into one when the terminal is wide enough to hold them.
| Command | Purpose |
|---|---|
terminito | The status line. Reads the payload JSON on stdin. |
terminito install | Write the statusLine key into settings.json (--print, --force) |
terminito doctor | Diagnose a status line that isn't appearing |
terminito doctor --trace on|off | Record real renders, to prove Claude Code is invoking it |
terminito ls | Every session with its worktree, branch and status (--verify checks each PID is alive) |
terminito demo | The full colour ramp and every degradation state |
| Variable | Effect |
|---|---|
TERMINITO_COLOR | truecolor | 256 | none |
TERMINITO_NOW | epoch seconds; freezes the reset countdowns |
TERMINITO_CEILING | stop the upward .git walk at this directory |
TERMINITO_CLOCK | pin a rung of the clock ladder (date, printf) |
TERMINITO_MAX_WIDTH | row 1 column budget; 0 disables truncation (default 78) |
TERMINITO_NO_TRACE | never write the invocation trace |
NO_COLOR | any non-empty value disables colour |
CLAUDE_CONFIG_DIR | overrides ~/.claude |
bash 3.2+. That is the whole list — no jq, no Node, no Python, and git is
never invoked (it reads .git/HEAD itself).
Runs on Windows Git Bash, macOS (both stock /bin/bash 3.2.57 and Homebrew
bash 5), and Linux. CI runs the same golden files on all three, and asserts
that bash 3.2 and bash 5 emit byte-identical output.
On Windows, use forward slashes or
~in the settings path. Git Bash treats unquoted backslashes as escape characters, soC:\Users\…arrives with its separators stripped and fails with no visible error at all.
bash tests/run.sh # goldens, and every command's contract
bash tests/portability.sh # bash 3.2 scan, BASH_COMPAT=32, the clock ladder
bash tests/perf.sh # the 300ms debounce budget
Every non-obvious decision here — the spawn-free render path, the baked colour
ramp, the CP437 glyph subset, the locked lane widths, the 78-column budget —
has a measurement or a failure behind it. Those are in
DESIGN.md, with the benchmarks in bench/.
MIT.
10 commits
Shell
98.9%
Ruby
1.1%
A Claude Code status line that tells you, at a glance, which worktree and branch this session is on, and how much context and quota you have left.
⎇ northwind-service-roster feat/source-roster-cursor ◆ Opus
ctx ██████▌░░░ 68% 5h ████░░░░░░ 41% 2h13m wk ██░░░░░░░░ 23% 4d
One bash file, no dependencies, and the render path spawns nothing.
brew install arturlimaaa/tap/terminito && terminito install
Without Homebrew — and on Windows, where Git Bash is the target:
git clone https://github.com/arturlimaaa/terminito ~/terminito && ~/terminito/terminito install
install writes the statusLine key into ~/.claude/settings.json and keeps
a .bak beside it. Claude Code picks it up on its next message — no restart.
Re-running it is a no-op. If you already have a different status line it stops
and tells you, rather than overwriting; install --force replaces it, and
install --print gives you the snippet to paste yourself.
Nothing appearing? terminito doctor. If everything there is green but the row
is still missing, terminito doctor --trace on answers the one question the
checks cannot: whether Claude Code is really invoking it.
Row 1 — where you are. ⎇ for a linked worktree, ◉ plus an amber name
for the main checkout, because the main checkout is where an accidental commit
costs most. The label is the directory basename; the repo name is added only
when the directory doesn't already imply it. In the branch, the namespace
recedes and the leaf keeps full weight — feat/ grey, source-roster-cursor
lit.
Row 2 — what you have left. Coloured area is what you have spent, so a
fresh session is quiet grey rather than thirty saturated cells announcing that
nothing has happened. Half cells (▌) double the resolution inside ten
columns, so 95% and 100% are not the same picture at the end of the scale where
you actually act.
The countdown is what makes the quota bar mean anything: 91% 4m is fine, wait
it out — 91% 4h51m means stop and switch model. Same bar, opposite decisions.
The two rows join into one when the terminal is wide enough to hold them.
| Command | Purpose |
|---|---|
terminito | The status line. Reads the payload JSON on stdin. |
terminito install | Write the statusLine key into settings.json (--print, --force) |
terminito doctor | Diagnose a status line that isn't appearing |
terminito doctor --trace on|off | Record real renders, to prove Claude Code is invoking it |
terminito ls | Every session with its worktree, branch and status (--verify checks each PID is alive) |
terminito demo | The full colour ramp and every degradation state |
| Variable | Effect |
|---|---|
TERMINITO_COLOR | truecolor | 256 | none |
TERMINITO_NOW | epoch seconds; freezes the reset countdowns |
TERMINITO_CEILING | stop the upward .git walk at this directory |
TERMINITO_CLOCK | pin a rung of the clock ladder (date, printf) |
TERMINITO_MAX_WIDTH | row 1 column budget; 0 disables truncation (default 78) |
TERMINITO_NO_TRACE | never write the invocation trace |
NO_COLOR | any non-empty value disables colour |
CLAUDE_CONFIG_DIR | overrides ~/.claude |
bash 3.2+. That is the whole list — no jq, no Node, no Python, and git is
never invoked (it reads .git/HEAD itself).
Runs on Windows Git Bash, macOS (both stock /bin/bash 3.2.57 and Homebrew
bash 5), and Linux. CI runs the same golden files on all three, and asserts
that bash 3.2 and bash 5 emit byte-identical output.
On Windows, use forward slashes or
~in the settings path. Git Bash treats unquoted backslashes as escape characters, soC:\Users\…arrives with its separators stripped and fails with no visible error at all.
bash tests/run.sh # goldens, and every command's contract
bash tests/portability.sh # bash 3.2 scan, BASH_COMPAT=32, the clock ladder
bash tests/perf.sh # the 300ms debounce budget
Every non-obvious decision here — the spawn-free render path, the baked colour
ramp, the CP437 glyph subset, the locked lane widths, the 78-column budget —
has a measurement or a failure behind it. Those are in
DESIGN.md, with the benchmarks in bench/.
MIT.
10 commits
Shell
98.9%
Ruby
1.1%