@npm-ken/pi-bar
Configurable status bar extension for the pi coding agent.
Package details
Install @npm-ken/pi-bar from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@npm-ken/pi-bar- Package
@npm-ken/pi-bar- Version
1.2.1- Published
- May 24, 2026
- Downloads
- 1,888/mo · 1,888/wk
- Author
- npm-ken
- License
- MIT
- Types
- extension
- Size
- 89.1 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./index.ts"
],
"image": "https://raw.githubusercontent.com/kenbanks-peng/pi-bar/main/screenshot.png"
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-bar
Configurable pi status bar extension.

Install
pi install npm:@npm-ken/pi-bar
pi-bar works immediately after install using the bundled default config.
Customize
Create this file and edit it:
~/.pi/pi-bar/config.toml
To start from the default config, copy config.toml from this repository or from the installed npm package and paste it to ~/.pi/pi-bar/config.toml
Common edits
Colors
[colors]
text_fg = "#cdd6f4"
model_bg = "#005b95"
thinking_bg = "#005b95"
activity_bg = "#313244"
activity_fg = "#2dd4bf"
ok = "#006b1d"
warn = "#a17a00"
alert = "#972e2d"
Use #rrggbb hex colors. Segments use these names with fg and bg.
Separators
Powerline/Nerd Font separators:
[statusbar.separators]
leading = "\uE0BA"
trailing = "\uE0BC"
Plain separators:
[statusbar.separators]
leading = ""
trailing = ""
Segments
Segments are listed as [[statusbar.segments]]. Reorder, remove, or add them in
that file.
[[statusbar.segments]]
type = "value"
template = "{model}"
empty_text = "no model"
fg = "text_fg"
bg = "model_bg"
Segment types:
value— text fromtemplatemeter— numeric value with threshold colorsdir— current working directorystatus— pi extension status, like MCP or LSPactivity— tool activity / working spinner
template replaces {tokens} with values for that segment type. Tokens are scoped per type, so {value} in a meter segment is not the same as {value} in an activity segment.
Template tokens:
value:{value}/{model}= full model id orempty_text,{short_model}= model id after the final/,{thinking}= current thinking level.dir:{value}/{dir}= current directory name,{path}= full current working directory.git:{remote_icon}= remote service icon,{branch_icon}= branch icon,{branch}= current branch,{staged}/{unstaged}= dirty booleans,{ahead}/{behind}= upstream counts,{service}= remote service,{service_icon}= default remote service icon,{remote}= origin URL. Seticons = { remote = "...", branch = "..." }on a git segment to override icons. Gitstatessupportid = "unstaged",id = "staged",id = "ahead", andid = "behind"withfg/bgcolors. The segmentbgis used when no state matches.meter:{value}= raw numeric meter value,{percent}= rounded value,{context_window}= human-readable model context window.status:{value}/{text}= normalized status text,{key}= status key, plus numeric tokens parsed from status text such as{errors}or{warnings}. MCP statuses also expose{servers}for theconnected/totalcount.activity:{source}=toolsorstreaming,{spinner}= current spinner frame,{tools}= comma-separated tool names,{streaming}= streaming state,{value}= source display value.
eval, collapsed_eval, and state-level eval still work for backwards compatibility. Prefer template and collapsed_template for new configs.
Status segments can set ignore = ["regex"] to skip matching status text. This is useful on key = "*" catch-all segments when a known status should not be rendered.
Adaptive / Responsive Collapsing
pi-bar supports optional configuration attributes to gracefully scale down the status bar on constrained terminal widths instead of truncating abruptly:
- A segment is eligible for collapse when it sets
collapse_order,collapsed_template, orcollapsed_eval. collapse_order: integer group number for responsive collapse order.1is the first group collapsed; higher groups are kept longer.collapsed_template: alternative template rendered when the segment is collapsed. Whencollapsed_templateis set withoutcollapse_order, the segment collapses with order1.- If
collapse_orderis set withoutcollapsed_templateorcollapsed_eval, the segment is hidden when its collapse order comes up.
Example Config
# A later-collapsing context utilization meter that collapses to a shorter format
[[statusbar.segments]]
type = "meter"
value_eval = "ctx.getContextUsage()?.percent ?? 0"
template = "{percent}% of {context_window}"
fg = "text_fg"
collapse_order = 4
collapsed_template = "{percent}%"
# An early-collapsing thinking indicator that hides entirely when space is limited
[[statusbar.segments]]
type = "value"
template = "{thinking}"
show_if = "model?.reasoning"
fg = "text_fg"
bg = "thinking_bg"
collapse_order = 2
# A first-collapsing status segment can omit collapse_order when collapsed_eval is present
[[statusbar.segments]]
type = "status"
key = "whatsapp"
template = " "
fg = "text_fg"
collapsed_template = " WA "
# A last-collapsing active tool spinner that collapses to just the spinner glyph
[[statusbar.segments]]
type = "activity"
fg = "activity_fg"
bg = "activity_bg"
min_width = 11
template = "{spinner} {value}"
collapsed_template = "{spinner}"
collapse_order = 5
