๐ Check out the official landing page here: YAS! Yet Another Statusline Most common form is displaying the first few rows, which include the loaded plugins & skills. Extra sections appear below them as needed
> /plugin marketplace add tmck-code/yet-another-statusline> /plugin install yas@yet-another-statusline
What's inside
๐ Check out the official landing page here: YAS! Yet Another Statusline
Most common form is displaying the first few rows, which include the loaded plugins & skills. Extra sections appear below them as needed
Requires Python 3.10+, and a Nerd Font to render the icons.
curl -fsSL https://raw.githubusercontent.com/tmck-code/yet-another-statusline/main/ops/install.sh | bash
Alongside statusLine.command, the installer also wires a UserPromptSubmit
hook (yas-prompt-hook.py) that records per-session prompt timestamps, enabling
accurate turn-scoped subagent display. It is upserted idempotently โ foreign
hooks are preserved, stale paths are rewritten on upgrade โ and removed on
uninstall.
Or install manually:
claude plugin marketplace add tmck-code/yet-another-statusline
claude plugin install yas@yet-another-statusline
claude -p "/yas:init"
If you need to install non-interactively (e.g. in CI/docker)
curl -fsSL https://raw.githubusercontent.com/tmck-code/yet-another-statusline/main/ops/install.sh | YAS_NO_TTY=1 bash
# install with specific python version e.g. 3.15
curl -fsSL https://raw.githubusercontent.com/tmck-code/yet-another-statusline/main/ops/install.sh | YAS_NO_TTY=1 YAS_PYTHON=3.15 bash
/yas:configRun /yas:config any time to re-run the wizard against the already-installed
plugin โ switch theme/glyph mode, toggle labels, change the soft limit, or move
to Python 3.15. It re-wires settings.json without re-registering the
marketplace or reinstalling the plugin.
A dummy session to demonstrate the layout:
The statusline also renders differently according to available width
| mode | width | screenshot |
|---|---|---|
| "medium" | <=80 pixels | |
| "narrow" | <=55 pixels |
Every configurable knob resolves through one fixed precedence chain (highest wins):
CLI flag โ canonical YAS_* env var โ legacy-alias env var โ yas.toml โ built-in default
The first source in that chain that is present and valid wins; an absent or
invalid source falls through to the next (an empty-string env var counts as
absent). Canonical YAS_* env vars always win over their deprecated legacy
aliases when both are set โ the aliases keep working but are deprecated.
| Knob | Env var | Legacy alias | yas.toml key | Default |
|---|---|---|---|---|
max_width | YAS_MAX_WIDTH | โ | [layout].max_width | 140 |
full_width | YAS_FULL_WIDTH | โ | [layout].full_width | false |
soft_limit | YAS_SOFT_LIMIT | โ | [tokens].soft_limit | 150000 |
token_window | YAS_TOKEN_WINDOW | STATUSLINE_TOKEN_WINDOW | [tokens].token_window | 60 |
theme | YAS_THEME (also --theme CLI) | CLAUDE_STATUSLINE_THEME | [appearance].theme | claude-dark |
bg_shift | YAS_BG_SHIFT (also --bg-shift CLI) | โ | [appearance].bg_shift | warm |
glyph_mode | YAS_GLYPH_MODE (also --glyph-mode CLI) | โ | [appearance.glyphs].mode | nerdfont |
single_width | YAS_GLYPH_SINGLE_WIDTH (also --glyph-single-width CLI) | โ | [appearance.glyphs].single_width | false |
context_state | YAS_CONTEXT_STATE | โ | [context].state | false |
context_labels | YAS_CONTEXT_LABELS | โ | [context].labels | Smart,Coasting,Foggy,Cooked,Dumb |
context_thresholds | YAS_CONTEXT_THRESHOLDS | โ | [context].thresholds | 25,50,70,90 |
show_render_time | YAS_SHOW_RENDER_TIME | โ | [layout].show_render_time | false |
show_tool_uses | YAS_SHOW_TOOL_USES | โ | [layout].show_tool_uses | false |
labels | YAS_LABELS | โ | [layout].labels | false |
justify | YAS_JUSTIFY | โ | [layout].justify | false |
show_day_stats | YAS_SHOW_DAY_STATS | โ | [tokens].show_day_stats | true |
theme โ 14 built-in themes; unknown or unset falls back to claude-dark:
claude-dark, catppuccin-mocha, dracula, gruvbox-dark, nord, one-dark, solarized-dark, tokyo-night, palenightclaude-light, catppuccin-latte, gruvbox-light, one-light, solarized-lightbg_shift โ warm or cool.glyph_mode โ all four modes preserve column geometry; an unknown value falls back to nerdfont:
nerdfont โ default; full fidelity, needs a Nerd Font.ascii โ every non-ASCII glyph โ width-1 ASCII; maximum compatibility.unicode โ only Nerd Font PUA icons โ non-PUA Unicode; keeps box/block/arrow glyphs.github โ GitHub-paste-safe: folds every glyph a browser renders double-wide (the box-drawing frame, block/sparkline ramp, and EAW-ambiguous punctuation/icons) to a width-1, EAW-narrow/ASCII stand-in, so a render stays column-aligned when pasted into a GitHub markdown code block.single_width โ orthogonal boolean that folds double-width dynamic content (wide emoji, CJK in branch names/paths) to width-1; combinable with any glyph_mode. The statusline's own glyphs are already width-1, so column geometry is preserved.full_width โ when true, makes the box fill the terminal and ignore max_width.show_render_time โ when true, annotates the bottom-right border with the previous run's wall-clock render time (e.g. โฆ47.2msโโโฏ). Off by default; each run shows the prior run's timing, so it is blank on a session's first render.show_tool_uses โ when true, adds a row (wide layout only) under the tokens/cost band, listing per-tool tool_use counts.labels โ when true, paints small superscript field captions into the border/separator rows (wide layout only). Note: this is a different knob from [context].labels, which is the five-word state list โ see Context state word. The two share a key name but live in different sections and take different types.justify โ when true, aligns fields into columns instead of packing them left (wide layout only).show_day_stats โ when true (the default), shows today's cumulative token and cost totals alongside the session's, as session/day pairs. Note: this key lives under [tokens], not [layout], unlike the other display toggles.--theme NAME / --bg-shift DIR also accept the --theme=NAME / --bg-shift=DIR form. Pass them in the statusLine.command of your ~/.claude/settings.json.~/.claude/statusline-theme (contents = a theme name) still works as the lowest-priority theme fallback, below [appearance].theme.context_state adds a morphing word to the context line that names how full the
context window is โ Smart โ Coasting โ Foggy โ Cooked โ Dumb โ so you can read
the state at a glance instead of doing percentage math. It is off by default;
enable it with YAS_CONTEXT_STATE=1 or [context].state = true.
The word is tinted with the same threshold colour as the context bar and sits just before it; in a narrow box it sheds first (the bar and percentage stay).
context_labels โ exactly 5 comma-separated words (Smart,Coasting,Foggy,Cooked,Dumb by default).context_thresholds โ exactly 4 strictly-ascending integers in 1..99 (25,50,70,90 by default), the start percentage of bands 2โ5.The percentage driving the word is YAS's soft-limit fill ratio (the same
basis as the context bar), so the word and the bar always agree โ the word turns
Dumb exactly as the bar fills toward the compaction soft_limit.
Credit: the state-word idea and its default labels/thresholds are ported from Dumbometer by Maximo Correa Rosas (MIT). See
NOTICE. Dumbometer maps the word to the full context window; YAS maps it to the soft-limit fill ratio for bar consistency.
yas.tomlyas.toml lives in CLAUDE_CONFIG_DIR (defaults to ~/.claude/). It is not
auto-created โ its absence simply means all-defaults โ and /yas:init never
writes it. See yas.example.toml for a fully-commented
template; copy it to ~/.claude/yas.toml and uncomment what you want.
[layout]
max_width = 140
[tokens]
soft_limit = 150000
token_window = 60
[appearance]
theme = "claude-dark"
bg_shift = "warm"
[appearance.glyphs]
mode = "nerdfont"
single_width = false
[context]
state = false
labels = ["Smart", "Coasting", "Foggy", "Cooked", "Dumb"]
thresholds = [25, 50, 70, 90]
yas.tomlrequires Python 3.11+ โ it is parsed with the stdlibtomllib. On Python 3.10 the file is silently skipped; environment variables work on every Python version.
Bad config never crashes the statusline. A malformed yas.toml is ignored
wholesale, and a single bad / out-of-range / wrong-type value drops only that
one knob back to its default. When any yas.toml value is rejected, a compact
warning row โ โ yas.toml: N values ignored (...) โ appears at the bottom of
the box listing the rejected knob names. Detailed per-value reasons go to stderr
only when YAS_DEBUG is set.
soft_limit overridesBeyond the global [tokens].soft_limit, you can declare per-model overrides as
an inline array under [tokens]:
[tokens]
model = [
{ match = "opus", soft_limit = 200000 }, # the whole Opus family
{ match = "opus-4-8[1m]", soft_limit = 1000000 }, # 1M-context variant (longer match wins)
]
match is a case-insensitive plain substring (no glob/regex), tested
against the model's id and display name.match wins; ties break by array
order (first wins). If no entry matches, the global soft_limit is used. So to
single out a variant from its family, give the variant the longer, more
specific match (above, opus-4-8[1m] outranks opus for the 1M model).soft_limit from any
source โ including the YAS_SOFT_LIMIT environment variable. This is the
one documented exception to the "env beats yas.toml" rule: specificity beats
source precedence (there is intentionally no per-model env var). It lets you
raise the compaction-risk threshold for a 1M-context model variant distinctly
from the rest of its family.| var | default | description |
|---|---|---|
CLAUDE_CONFIG_DIR | ~/.claude | base dir for config/state files (yas.toml, theme file, width file, token-rate log, output payloads) |
YAS_DEBUG | (unset) | when set, prints detailed per-value config-rejection reasons to stderr |
COLUMNS | (unset) | terminal-width fallback when tmux / width-file detection fail |
Width is detected by the first source that returns a positive value:
tmux display-message -p '#{pane_width}'~/.claude/terminal-width fileCOLUMNS env varshutil.get_terminal_size() / /dev/tty ioctlRemove the statusline config and uninstall the plugin in one step:
curl -fsSL https://raw.githubusercontent.com/tmck-code/yet-another-statusline/main/ops/install.sh | bash -s -- --uninstall --full
Or uninstall manually:
claude -p "/yas:uninstall"
claude plugin uninstall yas@yet-another-statusline
claude plugin uninstall only deletes the plugin cache โ it leaves statusLine.command
in ~/.claude/settings.json pointing at the now-missing script, so the statusline keeps
trying to run. Run the uninstall script (or /yas:uninstall) first to remove that
config, then uninstall the plugin. Reload Claude Code afterwards.
make test # run pytest suite
make demo # animated demo at current terminal width
make statusline/test # same as demo โ use during development
make demo/img # render snapshots into demo/
make mon/run # launch multi-session monitor TUI
Enable the git pre-commit hooks (runs ruff / mypy / pytest on staged Python before each commit):
make hooks
Edits to the checkout take effect immediately โ no reinstall step.
git clone https://github.com/tmck-code/yet-another-statusline
cd yet-another-statusline
Wire statusLine.command in ~/.claude/settings.json to point at the checkout:
"statusLine": {
"async": true,
"command": "python3 \"/path/to/yet-another-statusline/claude/statusline_command.py\"",
"type": "command"
}
Note: if you also have the plugin installed,
claude plugin installwill overwritestatusLine.commandback to the plugin cache path. Either uninstall the plugin or bump the version in.claude-plugin/plugin.jsonbefore reinstalling to keep your local path.
For accurate turn-scoped subagent display, also wire the UserPromptSubmit hook
(hooks/yas-prompt-hook.py) so per-session prompt timestamps are recorded:
"hooks": {
"UserPromptSubmit": [
{ "matcher": "", "hooks": [
{ "type": "command", "command": "python3 \"/path/to/yet-another-statusline/hooks/yas-prompt-hook.py\"" }
] }
]
}
The
curl โฆ | bashinstaller wires this hook for you (upserted idempotently โ foreign hooks preserved, stale paths rewritten on upgrade โ and removed on uninstall); it is only a manual step for a git-clone install. Without it, the statusline falls back to a time-window heuristic for which subagents to show.
This prompts before setting core.hooksPath. CI runs the same checks on every push, so the hook is fast local feedback rather than the gate.
.claude/
.claude-plugin/
marketplace.json
permissions-allow.json
plugin.json
agents/
pr-screenshotter.md
verifier.md
yas-editor.md
delegate-routing.json
README.md
settings.json
skills/
tmck-code-statusline/
ARCHITECTURE.md
SKILL.md
yas-demo-text/
scripts/
demo-text.sh
strip-ansi.sh
SKILL.md
yas-pr/
yas-pr-screenshots/
scripts/
shoot.sh
SKILL.md
SKILL.md
.github/
hooks/
pre-commit
pre-push
pull_request_template.md
workflows/
ci.yml
.gitignore
claude/
CLAUDE.md
mon/
mon.py
__init__.py
discovery.py
layout.py
lifecycle.py
tui.py
statusline_command.py
yas/
__init__.py
app.py
config.py
constants.py
context_state.py
info/
__init__.py
clear.py
git.py
openspec.py
skills.py
subagents.py
tasks.py
toolcounts.py
transcript.py
workflows.py
layout.py
render/
__init__.py
borders.py
gradient.py
metrics.py
pill.py
tasks_view.py
text.py
renderer.py
session.py
themes.py
tokens.py
CODING_STANDARDS.md
CONTEXT.md
hooks/
hooks.json
yas-prompt-hook.py
LICENSE
Makefile
NOTICE
openspec/
changes/
archive/
2026-05-25-add-burndown-trend/
.openspec.yaml
design.md
proposal.md
specs/
rate-limit-burndown/
spec.md
tasks.md
2026-05-25-subagent-burn-metrics/
.openspec.yaml
design.md
proposal.md
specs/
subagent-burn-metrics/
spec.md
tasks.md
2026-05-31-statusline-user-config/
.openspec.yaml
design.md
proposal.md
specs/
statusline-config/
spec.md
tasks.md
2026-06-01-add-info-gather-seam/
.openspec.yaml
design.md
proposal.md
specs/
statusline-info/
spec.md
statusline-packaging/
spec.md
tasks.md
2026-06-01-agents-done-cohort/
.openspec.yaml
design.md
proposal.md
specs/
prompt-boundary-hook/
spec.md
subagent-cohort/
spec.md
tasks.md
2026-06-01-reorganise-yas-package/
.openspec.yaml
design.md
proposal.md
specs/
statusline-packaging/
spec.md
tasks.md
2026-06-01-split-statusline-modules/
.openspec.yaml
design.md
proposal.md
specs/
statusline-packaging/
spec.md
tasks.md
2026-06-01-task-checklist-timers/
.openspec.yaml
design.md
proposal.md
specs/
task-checklist/
spec.md
tasks.md
2026-06-02-add-cache-countdown/
.openspec.yaml
design.md
proposal.md
specs/
cache-countdown/
spec.md
statusline-info/
spec.md
tasks.md
2026-06-02-add-community-themes/
.openspec.yaml
design.md
proposal.md
specs/
.gitkeep
no-spec-changes.md
tasks.md
2026-06-05-add-install-script/
.openspec.yaml
design.md
proposal.md
specs/
install-script/
spec.md
tasks.md
2026-06-05-harden-untrusted-input/
.openspec.yaml
design.md
proposal.md
specs/
untrusted-input-hardening/
spec.md
tasks.md
2026-06-06-fix-context-percentage/
.openspec.yaml
design.md
proposal.md
specs/
context-percentage-accuracy/
spec.md
tasks.md
2026-06-06-fix-mon-config-dir/
.openspec.yaml
design.md
proposal.md
specs/
mon-config-dir/
spec.md
tasks.md
2026-06-06-fix-session-elapsed/
.openspec.yaml
design.md
proposal.md
specs/
session-elapsed-accuracy/
spec.md
tasks.md
2026-06-06-fix-terminal-width/
.openspec.yaml
design.md
proposal.md
specs/
terminal-width-resolution/
spec.md
tasks.md
2026-06-07-side-by-side-tasks-subagents/
.openspec.yaml
design.md
proposal.md
specs/
side-by-side-sections/
spec.md
subagent-cohort/
spec.md
subagent-row-layout/
spec.md
task-checklist/
spec.md
tasks.md
2026-06-08-compact-tokens-row/
.openspec.yaml
design.md
proposal.md
specs/
compact-tokens-row/
spec.md
statusline-config/
spec.md
tasks.md
2026-06-08-openspec-bar-colour-hash/
.openspec.yaml
design.md
proposal.md
specs/
openspec-bar-colour/
spec.md
tasks.md
2026-06-08-subagent-activity-snippet/
.openspec.yaml
design.md
proposal.md
specs/
subagent-row-layout/
spec.md
tasks.md
2026-06-10-harden-subagent-finished-detection/
.openspec.yaml
design.md
proposal.md
specs/
subagent-cohort/
spec.md
tasks.md
2026-06-10-path-include-or-omit/
.openspec.yaml
design.md
proposal.md
specs/
path-display/
spec.md
tasks.md
2026-06-16-display-workflow-agents/
.openspec.yaml
design.md
proposal.md
specs/
workflow-cohort/
spec.md
tasks.md
2026-06-16-improve-workflow-display/
.openspec.yaml
design.md
proposal.md
specs/
subagent-row-layout/
spec.md
workflow-phase-display/
spec.md
workflow-two-column-agents/
spec.md
tasks.md
2026-06-16-restyle-top-row/
.openspec.yaml
design.md
proposal.md
specs/
cache-countdown/
spec.md
top-row-format/
spec.md
tasks.md
2026-06-17-add-clear-timer/
.openspec.yaml
design.md
proposal.md
specs/
statusline-info/
spec.md
top-row-format/
spec.md
tasks.md
2026-06-17-justify-wide-top-row/
.openspec.yaml
design.md
proposal.md
specs/
justify-top-row/
spec.md
statusline-config/
spec.md
tasks.md
2026-06-18-add-layout-labels/
.openspec.yaml
design.md
proposal.md
specs/
section-labels/
spec.md
statusline-config/
spec.md
tasks.md
2026-06-18-glyph-mode/
.openspec.yaml
design.md
proposal.md
specs/
glyph-mode/
spec.md
statusline-config/
spec.md
tasks.md
2026-06-19-remove-jq-bootstrap-uv/
.openspec.yaml
design.md
proposal.md
specs/
install-script/
spec.md
tasks.md
2026-06-20-interactive-installer/
.openspec.yaml
design.md
proposal.md
specs/
install-script/
spec.md
tasks.md
2026-06-28-tool-use-counts-row/
.openspec.yaml
design.md
proposal.md
specs/
statusline-info/
spec.md
tool-counts-row/
spec.md
tasks.md
2026-07-04-branch-name-slash-support/
.openspec.yaml
design.md
proposal.md
specs/
git-branch-display/
spec.md
tasks.md
2026-07-26-add-subagent-line-counts/
.openspec.yaml
design.md
proposal.md
specs/
compact-tokens-row/
spec.md
line-counts/
spec.md
statusline-info/
spec.md
subagent-row-layout/
spec.md
tasks.md
config.yaml
specs/
cache-countdown/
spec.md
compact-tokens-row/
spec.md
... 150 moreFAQ
yas is a Claude Code plugin with 7 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes tmck-code-statusline, yas-demo-text, yas-pr-screenshots. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.