Configuration

Everything about statusline.config.json, the file npx agy-powerline configure edits. It lives in the install folder (~/.agy-powerline/, or AGY_POWERLINE_HOME). The bar reads it on every refresh, so a running agy session picks up changes without a restart.

Most people never edit it by hand: configure covers widgets, order, presets, themes, layout and powerline glyphs. You can also build your bar in the browser with live previews, then download or import it. This page is for everything else.

Editors that read JSON Schema, such as VS Code and JetBrains IDEs, complete setting names, widget ids and theme ids and flag typos when the file starts with this line:

"$schema": "https://agy-powerline.com/schema/v1.json",

init writes it in a new config, and export and the browser configurator put it in the files they write. The bar ignores it; add it by hand to a config made before.

Configurator keys

Tabs at the top lead to Widgets (w), Presets (o), Themes (t), Layout (l) and Powerline (p); a tab's letter opens it from any other tab, and ← → or Tab / Shift+Tab move between them. Each screen shows its list, a live preview of your bar with on/off chips for the toggles (with their keys, on the widget list), and its keys at the bottom. In ASCII mode it uses plain +-| boxes, and without color it stays readable.

The editor fits your window. It fills the full width, so the preview has the room your bar gets in agy. From 80 columns the descriptions line up in a column; from 140 columns the list and a details panel share the width evenly, and the details show the selected item: a widget drawn on its own with its options and presets, a preset's rows, a theme's colors, or what a Powerline setting does. In a short window the tagline, blank lines, notes and preview chips make way first, then long lists scroll inside their panel, with the rows out of view counted in its border (↑ 4 more, ↓ 12 more). Resizing the window redraws it.

Enter on a widget opens its options: color, label (shown or value only), and what that widget takes, such as the short model name, the reset timers' format, the custom badge's text, the caution and danger levels, blink, the pace marker and the meter style. ↑ ↓ pick an option, ← → or Enter change it, x sets it back to its default, and Esc returns to the list. Each change is saved right away and shows in the preview. A Shell Command's cmd is shown but edited only in the config file. The preview title says when it shows a theme, preset or layout you haven't applied yet, and the preset that matches your widgets is marked current.

KeyAction
↑↓Move cursor (with circular wrap-around at top/bottom; theme preview updates live)
←→, Tab, Shift+TabSwitch tab (Widgets, Presets, Themes, Layout, Powerline)
wWidgets (your widget list)
Shift+↑↓Reorder widgets
EnterEdit the selected widget's options (see below)
aAdd widget (includes live type-to-filter search across catalog)
sInsert Flex Separator after the current item
nInsert New Line (next widgets go on the next row)
x, Delete, BackspaceRemove
oPresets (default, compact, agent, git, tokens, quotas, full)
tThemes (select Custom or press c/e to open in-TUI color editor)
lLayout (Pills, Lines or Classic)
pPowerline (style, separators, start and end caps)
jToggle joins (adjacent widgets share one pill, Pills layout)
vToggle space between rows (a blank line between rows)
eToggle emojis
mToggle minimalist mode (values only, no icons or labels)
rToggle the quota pace marker
bToggle alert blink (flash on critical quota/context breaches)
iToggle ASCII mode (plain-text caps/joins, no emojis)
dReset configuration to defaults
gOpen GitHub repository in browser (⭐ Repo)
EnterConfirm selection in Add/Themes/Presets/Layout/Powerline lists
EscBack to previous list / widget list
q or Ctrl-CSave and quit (q doesn't quit while typing in the Add search or a code point)

Widgets

Most values come from the JSON Antigravity pipes on stdin; host, os and ram read from the machine agy runs on, and token totals across conversations read from agy's local database. A widget with nothing to show hides itself: a model, quota, reset time, context window or token usage that is missing from the payload (or unusable) is left out, not shown as Unknown, 0% or now.

Widget options

Any widget accepts these options:

{ "id": "git", "color": "#ff8800", "textColor": "#1a1a1a", "bold": false, "raw": true }
OptionConfigurationExample
Folder depth{ "id": "cwd", "depth": 2 }~/Documents/repos/app/src → ~/…/app/src
Maximum width{ "id": "git", "maxWidth": 10 }feature-with-a-long-name → feature-w… (feature... in ASCII mode)

Minimalist mode turns raw on for every widget, which makes the bar much narrower on small terminals. Set "minimalist": true or press m in configure. A widget with "raw": false keeps its label even then.

Quota pace marker

Every 5h, 7d, third-party and Argon quota meter carries a marker, a larger dot ● in the default Pills meter and ┃ in the others (| in ASCII mode), at the point the quota window has reached. The bar fills from the left as quota is used (the light dots are the fill), so you can read it at a glance:

⏳ •••••●••••••  72.0% rem    fill behind the marker: you're using quota slower than time passes
📅 •••••••••●••  21.0% rem    fill past the marker: at this rate the quota runs out before it resets

The marker needs no extra data: it comes from the reset time Antigravity already sends and the fixed 5-hour and 7-day window lengths. It's hidden when the reset is further away than the window itself. Turn it off with "pacing": false (or r in configure), or per widget with "pace": false.

Meter styles

Pills draw meters as small dots, Lines as larger ones and Classic as blocks. "meterStyle" picks another look for every meter, and "meter" on a meter widget (fiveHourBar, weeklyBar, thirdPartyFiveHour, thirdPartyWeekly, argonWeekly, context) for that one; the widget's value wins. configure sets the per-widget one (Enter on a meter widget, then Meter).

{ "meterStyle": "geometric", "widgets": [{ "id": "fiveHourBar", "meter": "blocks" }] }
IdFilledEmptyExample (50%)
pips (Pills' own)• in a light color• in a dark colorthe default Pills meter
cellsbackground colordarker backgroundsolid colored blocks
dots (Lines' own)●● in a track colorthe default Lines meter
blocks█░█████░░░░░
shade▓░▓▓▓▓▓░░░░░
line━─━━━━━─────
geometric▰▱▰▰▰▰▰▱▱▱▱▱
squares■□■■■■■□□□□□
braille⣿⣀⣿⣿⣿⣿⣿⣀⣀⣀⣀⣀
bars▮▯▮▮▮▮▮▯▯▯▯▯
rings●○, faded●●●●●○○○○○
ramp█, ok to caution to danger░ in the track color█████░░░░░

Reset times and clock

fiveHourReset and weeklyReset can show when the quota resets instead of how long until it does:

{ "id": "fiveHourReset", "format": "time" }

How times look is set once for every widget under "clock":

{ "clock": { "hour12": false, "timeZone": "Europe/Paris", "locale": "fr-FR" } }

Unknown zones and locales are ignored. Everything comes from Node's built-in Intl; nothing is downloaded.

Alerts and thresholds

Quota and context widgets change color as they get low or full: the theme's ok color, then caution, then danger. Critical ones can also blink.

{
  "thresholds": {
    "quotaWarn": 20,
    "quotaCrit": 10,
    "contextWarn": 70,
    "contextCrit": 85,
    "blink": true
  }
}
{
  "widgets": [
    { "id": "weeklyBar", "showBelow": 50 },
    { "id": "contextPct", "showAbove": 60 }
  ]
}

Shell command widget (exec)

Runs a shell command of your choice and shows the first line of its output:

{
  "id": "exec",
  "cmd": "git stash list | wc -l",
  "label": "Stash",
  "icon": "📦",
  "interval": 10,
  "timeout": 500,
  "color": "git"
}

Safety rules for exec:

Recipes

Each one is a widget to add to widgets. node -e commands work the same in Windows cmd and macOS/Linux shells; the others say when they differ.

A field of the session. Any value in the session JSON, here the model id:

{
  "id": "exec",
  "cmd": "node -e \"console.log(JSON.parse(require('fs').readFileSync(0,'utf8')).model.id)\"",
  "payload": true,
  "interval": 0,
  "label": "Model id"
}

Git stash count. macOS/Linux: "cmd": "git stash list | wc -l". Windows: "cmd": "git stash list | find /c /v \"\"".

Node version.

{ "id": "exec", "cmd": "node -v", "label": "Node", "interval": 300 }

Kubernetes context. kubectl can be slow to start, so it gets a longer timeout and interval:

{
  "id": "exec",
  "cmd": "kubectl config current-context",
  "icon": "☸️",
  "timeout": 2000,
  "interval": 30
}

AWS profile. The environment agy was started with:

{ "id": "exec", "cmd": "node -e \"console.log(process.env.AWS_PROFILE || '')\"", "label": "AWS" }

Days left until a date.

{
  "id": "exec",
  "cmd": "node -e \"console.log(Math.ceil((new Date('2026-12-31') - Date.now()) / 864e5) + ' days')\"",
  "icon": "📆",
  "interval": 3600
}

Today's agy tokens (ccusage). ccusage reads agy's local conversation data too; ccusage antigravity daily prints the tokens per day. This shows today's total, formatted like the bar (📈 agy: 1.2M today), and hides when there's none:

{
  "id": "exec",
  "cmd": "ccusage antigravity daily --last 1 --json --offline | node -e \"let s='';process.stdin.on('data',c=>s+=c).on('end',()=>{let n=0;try{n=Number(JSON.parse(s).totals.totalTokens)||0}catch{}if(n)console.log((n>=1e6?(n/1e6).toFixed(1)+'M':n>=1e3?(n/1e3).toFixed(1)+'K':n)+' today')})\"",
  "icon": "📈",
  "label": "agy",
  "interval": 300,
  "timeout": 5000
}

Another statusline script. Any script that reads the session JSON on stdin and prints one line, colors included:

{
  "id": "exec",
  "cmd": "node /path/to/my-statusline.js",
  "payload": true,
  "colors": true,
  "interval": 0,
  "timeout": 1000
}

Pills: powerline styles, glyphs and row gaps

Powerline styles

A style sets start caps, end caps and separators in one go. Switch with npx agy-powerline caps <style> or cycle Style in the TUI (p):

StyleCapsJoinLook
round (default)/``Rounded capsules with rounded joins
angled/``Traditional Powerline arrows
slanted/``Diagonal cuts at both ends and between
flatnonenoneFlush rectangular blocks

Custom caps and separators

Every glyph is configurable under "powerline", written as a hex code point:

"powerline": {
  "enabled": true,
  "separators": ["E0B0", "E0B4"],
  "separatorInvert": [false, false],
  "startCaps": ["E0B6"],
  "endCaps": ["E0B4"]
}

In the TUI, press p, then Enter on Separators, Start caps or End caps: ← → cycle presets (triangle, round, diagonal), a/i add or insert, x removes, c clears, h types any code point, and v toggles invert on a separator.

Space between rows

Pills fill the whole height of a terminal line, so stacked rows touch. "rowGap": true puts a blank line between rows, in every layout (in Lines and Classic it gives the text more air); it's off by default because the bar then takes more lines (three rows become five). Toggle it with v in configure, or Space between rows in the Powerline tab (p).

Custom theme

Set "theme": "custom" (or run npx agy-powerline theme custom), and define a customTheme object with Hex (#RRGGBB or #RGB), RGB array [r, g, b], or "rgb(r, g, b)". configure also has a color editor (t, then Custom).

{
  "theme": "custom",
  "customTheme": {
    "name": "Cyberpunk",
    "base": "dark-ocean",
    "colors": {
      "model": "#ff007f",
      "context": "#00ffff",
      "fiveHour": [80, 250, 123],
      "weekly": "rgb(189, 147, 249)",
      "git": "#ffb86c",
      "meta": "#f8f8f2",
      "caution": "#f1fa8c",
      "warn": "#ff5555"
    }
  }
}

Every built-in theme is tested to keep text at WCAG AA contrast (4.5:1) on pills and on its terminal background, and to keep the three status colors (ok, caution, danger) clearly different. The color-blind themes also keep the status colors apart under simulated protanopia, deuteranopia and tritanopia.

Gradients

A gradient gives each row one color sweep from left to right, on top of any theme:

{ "gradient": "sunset" }
{ "gradient": "#ff5f6d-#ffc371" }

Or from the command line: npx agy-powerline gradient sunset, npx agy-powerline gradient "#ff5f6d-#ffc371", npx agy-powerline gradient off. npx agy-powerline gradient --list shows every preset in its colors.

Share or back up your config

export writes your config to a file, and import loads one, on another machine or after an experiment:

npx agy-powerline export my-bar.json     # or: npx agy-powerline export > my-bar.json
npx agy-powerline import my-bar.json

Terminals: ASCII mode, colors, narrow windows

No Nerd Font? Enable ASCII mode: caps and separators become plain text ([ ], < >, /; joins default to >), dot meters become #/-, markers become *, and emojis turn off. Toggle with i in the TUI, set "ascii": true, pass render --ascii, or export AGY_POWERLINE_ASCII=1.

Narrow terminals: the bar never runs past the terminal_width Antigravity reports. A row that is too wide first drops icons and labels (values only, as in minimalist mode), then shortens the model name (3.8 Flash·High) and the Lines meters (12 dots instead of 25), then hides its least important widgets one by one (custom text, version and cache counters first; the model and the 5h quota last), and as a last resort is cut with …. Widths count wide emojis and East Asian characters as two columns.

The README's three-row Pills bar in a 74-column window: values only, the short model name, and the project hidden:

agy-powerline's three-row Pills bar in a 74-column window, values only: short model name, context and git branch; Gemini 5h and 7d quotas; Claude/GPT and Argon weekly quotas

Limited color support? Color depth resolves per refresh, strongest hint first: render --color <truecolor|256|none>, then NO_COLOR (disables color), then AGY_POWERLINE_COLOR, then "color" in the config ("auto" default), then terminal heuristics (COLORTERM=truecolor/24bit → truecolor, *256color* TERM → 256-color 38;5/48;5 codes, dumb → no color). Bold/dim are kept; only fg/bg color is dropped in none mode, and Pills meters draw their fill with █/░ (#/- in ASCII mode) instead of color.

Try a look without saving it

render can override the saved preset, layout, theme, pill caps and gradient for one preview. The preset is applied first (it sets the widgets), then layout, theme, caps and gradient. These flags never write to statusline.config.json:

cat payload.json | npx agy-powerline render --preset compact --layout lines --theme light-paper --caps flat --gradient sunset
npx agy-powerline render --demo --theme light --layout pills --caps angled --gradient off

The same flags can follow the installed script in statusLine.command, so agy uses that look on each refresh without changing the saved config:

'/usr/bin/node' '/home/you/.agy-powerline/statusline.js' --theme light-paper --layout lines

On Windows, append them to statusline.cmd; the launcher forwards its arguments to the runtime:

C:/Users/you/.agy-powerline/statusline.cmd --theme light-paper --layout lines

--theme accepts a theme id or the dark, light and colorblind aliases. --layout accepts pills, lines or classic; --caps accepts round, angled, slanted or flat; --gradient accepts a preset, 2 to 6 hex stops joined by -, or off. The CLI exits with an error before rendering if a value is invalid. In the installed runtime, an invalid or unknown flag is ignored so the bar still renders; valid overrides still apply, and one diagnostic is written without logging the supplied value.

Next steps