arturlimaaa/terminito

A zero-spawn Claude Code status line: worktree, branch, context and quota — rendered in ~83ms on Windows, where a slow status line never renders at all.

0

stars

10

commits

Shell

primary language

Aug 22, 2026

updated

README

terminito

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.

Install

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.

What the rows mean

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.

Commands

CommandPurpose
terminitoThe status line. Reads the payload JSON on stdin.
terminito installWrite the statusLine key into settings.json (--print, --force)
terminito doctorDiagnose a status line that isn't appearing
terminito doctor --trace on|offRecord real renders, to prove Claude Code is invoking it
terminito lsEvery session with its worktree, branch and status (--verify checks each PID is alive)
terminito demoThe full colour ramp and every degradation state

Environment overrides

VariableEffect
TERMINITO_COLORtruecolor | 256 | none
TERMINITO_NOWepoch seconds; freezes the reset countdowns
TERMINITO_CEILINGstop the upward .git walk at this directory
TERMINITO_CLOCKpin a rung of the clock ladder (date, printf)
TERMINITO_MAX_WIDTHrow 1 column budget; 0 disables truncation (default 78)
TERMINITO_NO_TRACEnever write the invocation trace
NO_COLORany non-empty value disables colour
CLAUDE_CONFIG_DIRoverrides ~/.claude

Requires

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, so C:\Users\… arrives with its separators stripped and fails with no visible error at all.

Tests

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

Why it looks the way it does

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/.

License

MIT.

Contributors

arturlimaaa

10 commits

arturlimaaa/terminito

A zero-spawn Claude Code status line: worktree, branch, context and quota — rendered in ~83ms on Windows, where a slow status line never renders at all.

0

stars

10

commits

Shell

primary language

Aug 22, 2026

updated

README

terminito

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.

Install

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.

What the rows mean

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.

Commands

CommandPurpose
terminitoThe status line. Reads the payload JSON on stdin.
terminito installWrite the statusLine key into settings.json (--print, --force)
terminito doctorDiagnose a status line that isn't appearing
terminito doctor --trace on|offRecord real renders, to prove Claude Code is invoking it
terminito lsEvery session with its worktree, branch and status (--verify checks each PID is alive)
terminito demoThe full colour ramp and every degradation state

Environment overrides

VariableEffect
TERMINITO_COLORtruecolor | 256 | none
TERMINITO_NOWepoch seconds; freezes the reset countdowns
TERMINITO_CEILINGstop the upward .git walk at this directory
TERMINITO_CLOCKpin a rung of the clock ladder (date, printf)
TERMINITO_MAX_WIDTHrow 1 column budget; 0 disables truncation (default 78)
TERMINITO_NO_TRACEnever write the invocation trace
NO_COLORany non-empty value disables colour
CLAUDE_CONFIG_DIRoverrides ~/.claude

Requires

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, so C:\Users\… arrives with its separators stripped and fails with no visible error at all.

Tests

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

Why it looks the way it does

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/.

License

MIT.

Contributors

arturlimaaa

10 commits

Languages

Shell

98.9%

Ruby

1.1%