[{"data":1,"prerenderedAt":1395},["ShallowReactive",2],{"guide:/guides/claude-code-statusline":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"tag":10,"date":11,"body":12,"_type":1389,"_id":1390,"_source":1391,"_file":1392,"_stem":1393,"_extension":1394},"/guides/claude-code-statusline","guides",false,"","Claude Code statusline: the data your script gets","Claude Code runs your statusline script with a JSON payload on stdin. Here is every field it carries, which ones can be missing, and the one that quietly goes stale.","Config","2026-09-13",{"type":13,"children":14,"toc":1380},"root",[15,32,39,84,204,209,318,323,329,334,818,824,829,960,988,994,999,1125,1130,1138,1151,1159,1172,1178,1188,1193,1220,1239,1245,1263,1276,1296,1339,1344,1350,1363,1374],{"type":16,"tag":17,"props":18,"children":19},"element","p",{},[20,23,30],{"type":21,"value":22},"text","A Claude Code statusline is a shell script. Claude Code runs it, hands it a JSON payload on standard input, and renders whatever the script prints. That is the entire contract, and it is worth knowing because the payload carries far more than the model name, and because one of its fields lies to you when a session sits idle. If you have not set one up yet, it lives in ",{"type":16,"tag":24,"props":25,"children":27},"a",{"href":26},"/guides/claude-code-settings-json",[28],{"type":21,"value":29},"your settings.json",{"type":21,"value":31}," alongside your hooks.",{"type":16,"tag":33,"props":34,"children":36},"h2",{"id":35},"configure-it",[37],{"type":21,"value":38},"Configure it",{"type":16,"tag":17,"props":40,"children":41},{},[42,44,51,53,59,61,67,69,75,77,82],{"type":21,"value":43},"Add a ",{"type":16,"tag":45,"props":46,"children":48},"code",{"className":47},[],[49],{"type":21,"value":50},"statusLine",{"type":21,"value":52}," block to ",{"type":16,"tag":45,"props":54,"children":56},{"className":55},[],[57],{"type":21,"value":58},"~/.claude/settings.json",{"type":21,"value":60},". Set ",{"type":16,"tag":45,"props":62,"children":64},{"className":63},[],[65],{"type":21,"value":66},"type",{"type":21,"value":68}," to ",{"type":16,"tag":45,"props":70,"children":72},{"className":71},[],[73],{"type":21,"value":74},"command",{"type":21,"value":76}," and point ",{"type":16,"tag":45,"props":78,"children":80},{"className":79},[],[81],{"type":21,"value":74},{"type":21,"value":83}," at a script:",{"type":16,"tag":85,"props":86,"children":90},"pre",{"code":87,"language":88,"meta":7,"className":89,"style":7},"{\n  \"statusLine\": {\n    \"type\": \"command\",\n    \"command\": \"~/.claude/statusline.sh\",\n    \"padding\": 2\n  }\n}\n","json","language-json shiki shiki-themes github-light github-dark",[91],{"type":16,"tag":45,"props":92,"children":93},{"__ignoreMap":7},[94,106,121,146,168,186,195],{"type":16,"tag":95,"props":96,"children":99},"span",{"class":97,"line":98},"line",1,[100],{"type":16,"tag":95,"props":101,"children":103},{"style":102},"--shiki-default:#24292E;--shiki-dark:#E1E4E8",[104],{"type":21,"value":105},"{\n",{"type":16,"tag":95,"props":107,"children":109},{"class":97,"line":108},2,[110,116],{"type":16,"tag":95,"props":111,"children":113},{"style":112},"--shiki-default:#005CC5;--shiki-dark:#79B8FF",[114],{"type":21,"value":115},"  \"statusLine\"",{"type":16,"tag":95,"props":117,"children":118},{"style":102},[119],{"type":21,"value":120},": {\n",{"type":16,"tag":95,"props":122,"children":124},{"class":97,"line":123},3,[125,130,135,141],{"type":16,"tag":95,"props":126,"children":127},{"style":112},[128],{"type":21,"value":129},"    \"type\"",{"type":16,"tag":95,"props":131,"children":132},{"style":102},[133],{"type":21,"value":134},": ",{"type":16,"tag":95,"props":136,"children":138},{"style":137},"--shiki-default:#032F62;--shiki-dark:#9ECBFF",[139],{"type":21,"value":140},"\"command\"",{"type":16,"tag":95,"props":142,"children":143},{"style":102},[144],{"type":21,"value":145},",\n",{"type":16,"tag":95,"props":147,"children":149},{"class":97,"line":148},4,[150,155,159,164],{"type":16,"tag":95,"props":151,"children":152},{"style":112},[153],{"type":21,"value":154},"    \"command\"",{"type":16,"tag":95,"props":156,"children":157},{"style":102},[158],{"type":21,"value":134},{"type":16,"tag":95,"props":160,"children":161},{"style":137},[162],{"type":21,"value":163},"\"~/.claude/statusline.sh\"",{"type":16,"tag":95,"props":165,"children":166},{"style":102},[167],{"type":21,"value":145},{"type":16,"tag":95,"props":169,"children":171},{"class":97,"line":170},5,[172,177,181],{"type":16,"tag":95,"props":173,"children":174},{"style":112},[175],{"type":21,"value":176},"    \"padding\"",{"type":16,"tag":95,"props":178,"children":179},{"style":102},[180],{"type":21,"value":134},{"type":16,"tag":95,"props":182,"children":183},{"style":112},[184],{"type":21,"value":185},"2\n",{"type":16,"tag":95,"props":187,"children":189},{"class":97,"line":188},6,[190],{"type":16,"tag":95,"props":191,"children":192},{"style":102},[193],{"type":21,"value":194},"  }\n",{"type":16,"tag":95,"props":196,"children":198},{"class":97,"line":197},7,[199],{"type":16,"tag":95,"props":200,"children":201},{"style":102},[202],{"type":21,"value":203},"}\n",{"type":16,"tag":17,"props":205,"children":206},{},[207],{"type":21,"value":208},"The command runs in a shell, so an inline one-liner works too. Three optional fields are easy to miss:",{"type":16,"tag":210,"props":211,"children":212},"table",{},[213,232],{"type":16,"tag":214,"props":215,"children":216},"thead",{},[217],{"type":16,"tag":218,"props":219,"children":220},"tr",{},[221,227],{"type":16,"tag":222,"props":223,"children":224},"th",{},[225],{"type":21,"value":226},"Field",{"type":16,"tag":222,"props":228,"children":229},{},[230],{"type":21,"value":231},"What it does",{"type":16,"tag":233,"props":234,"children":235},"tbody",{},[236,260,285],{"type":16,"tag":218,"props":237,"children":238},{},[239,249],{"type":16,"tag":240,"props":241,"children":242},"td",{},[243],{"type":16,"tag":45,"props":244,"children":246},{"className":245},[],[247],{"type":21,"value":248},"padding",{"type":16,"tag":240,"props":250,"children":251},{},[252,254],{"type":21,"value":253},"Extra horizontal spacing in characters, on top of the interface's own. Defaults to ",{"type":16,"tag":45,"props":255,"children":257},{"className":256},[],[258],{"type":21,"value":259},"0",{"type":16,"tag":218,"props":261,"children":262},{},[263,272],{"type":16,"tag":240,"props":264,"children":265},{},[266],{"type":16,"tag":45,"props":267,"children":269},{"className":268},[],[270],{"type":21,"value":271},"refreshInterval",{"type":16,"tag":240,"props":273,"children":274},{},[275,277,283],{"type":21,"value":276},"Re-runs the command every N seconds on top of event-driven updates. Minimum ",{"type":16,"tag":45,"props":278,"children":280},{"className":279},[],[281],{"type":21,"value":282},"1",{"type":21,"value":284},". Set it when you display a clock or a countdown",{"type":16,"tag":218,"props":286,"children":287},{},[288,297],{"type":16,"tag":240,"props":289,"children":290},{},[291],{"type":16,"tag":45,"props":292,"children":294},{"className":293},[],[295],{"type":21,"value":296},"hideVimModeIndicator",{"type":16,"tag":240,"props":298,"children":299},{},[300,302,308,310,316],{"type":21,"value":301},"Suppresses the built-in ",{"type":16,"tag":45,"props":303,"children":305},{"className":304},[],[306],{"type":21,"value":307},"-- INSERT --",{"type":21,"value":309}," line when your script renders ",{"type":16,"tag":45,"props":311,"children":313},{"className":312},[],[314],{"type":21,"value":315},"vim.mode",{"type":21,"value":317}," itself",{"type":16,"tag":17,"props":319,"children":320},{},[321],{"type":21,"value":322},"Claude Code reloads settings on save, so the statusline appears as soon as you write the file.",{"type":16,"tag":33,"props":324,"children":326},{"id":325},"what-your-script-receives",[327],{"type":21,"value":328},"What your script receives",{"type":16,"tag":17,"props":330,"children":331},{},[332],{"type":21,"value":333},"The payload is one JSON object on stdin. These are the fields worth reading:",{"type":16,"tag":210,"props":335,"children":336},{},[337,352],{"type":16,"tag":214,"props":338,"children":339},{},[340],{"type":16,"tag":218,"props":341,"children":342},{},[343,347],{"type":16,"tag":222,"props":344,"children":345},{},[346],{"type":21,"value":226},{"type":16,"tag":222,"props":348,"children":349},{},[350],{"type":21,"value":351},"What it carries",{"type":16,"tag":233,"props":353,"children":354},{},[355,380,397,443,467,504,521,538,578,595,632,663,687,723,740,781],{"type":16,"tag":218,"props":356,"children":357},{},[358,375],{"type":16,"tag":240,"props":359,"children":360},{},[361,367,369],{"type":16,"tag":45,"props":362,"children":364},{"className":363},[],[365],{"type":21,"value":366},"cwd",{"type":21,"value":368},", ",{"type":16,"tag":45,"props":370,"children":372},{"className":371},[],[373],{"type":21,"value":374},"workspace.current_dir",{"type":16,"tag":240,"props":376,"children":377},{},[378],{"type":21,"value":379},"The current directory",{"type":16,"tag":218,"props":381,"children":382},{},[383,392],{"type":16,"tag":240,"props":384,"children":385},{},[386],{"type":16,"tag":45,"props":387,"children":389},{"className":388},[],[390],{"type":21,"value":391},"workspace.project_dir",{"type":16,"tag":240,"props":393,"children":394},{},[395],{"type":21,"value":396},"The directory the session started in",{"type":16,"tag":218,"props":398,"children":399},{},[400,409],{"type":16,"tag":240,"props":401,"children":402},{},[403],{"type":16,"tag":45,"props":404,"children":406},{"className":405},[],[407],{"type":21,"value":408},"workspace.repo",{"type":16,"tag":240,"props":410,"children":411},{},[412,418,419,425,427,433,435,441],{"type":16,"tag":45,"props":413,"children":415},{"className":414},[],[416],{"type":21,"value":417},"host",{"type":21,"value":368},{"type":16,"tag":45,"props":420,"children":422},{"className":421},[],[423],{"type":21,"value":424},"owner",{"type":21,"value":426}," and ",{"type":16,"tag":45,"props":428,"children":430},{"className":429},[],[431],{"type":21,"value":432},"name",{"type":21,"value":434},", inside a git repo with an ",{"type":16,"tag":45,"props":436,"children":438},{"className":437},[],[439],{"type":21,"value":440},"origin",{"type":21,"value":442}," remote",{"type":16,"tag":218,"props":444,"children":445},{},[446,462],{"type":16,"tag":240,"props":447,"children":448},{},[449,455,456],{"type":16,"tag":45,"props":450,"children":452},{"className":451},[],[453],{"type":21,"value":454},"session_id",{"type":21,"value":368},{"type":16,"tag":45,"props":457,"children":459},{"className":458},[],[460],{"type":21,"value":461},"session_name",{"type":16,"tag":240,"props":463,"children":464},{},[465],{"type":21,"value":466},"The session identifier, and its custom or AI-generated name",{"type":16,"tag":218,"props":468,"children":469},{},[470,486],{"type":16,"tag":240,"props":471,"children":472},{},[473,479,480],{"type":16,"tag":45,"props":474,"children":476},{"className":475},[],[477],{"type":21,"value":478},"model.id",{"type":21,"value":368},{"type":16,"tag":45,"props":481,"children":483},{"className":482},[],[484],{"type":21,"value":485},"model.display_name",{"type":16,"tag":240,"props":487,"children":488},{},[489,491,497,498],{"type":21,"value":490},"For example ",{"type":16,"tag":45,"props":492,"children":494},{"className":493},[],[495],{"type":21,"value":496},"claude-opus-5",{"type":21,"value":426},{"type":16,"tag":45,"props":499,"children":501},{"className":500},[],[502],{"type":21,"value":503},"Opus",{"type":16,"tag":218,"props":505,"children":506},{},[507,516],{"type":16,"tag":240,"props":508,"children":509},{},[510],{"type":16,"tag":45,"props":511,"children":513},{"className":512},[],[514],{"type":21,"value":515},"version",{"type":16,"tag":240,"props":517,"children":518},{},[519],{"type":21,"value":520},"The Claude Code version",{"type":16,"tag":218,"props":522,"children":523},{},[524,533],{"type":16,"tag":240,"props":525,"children":526},{},[527],{"type":16,"tag":45,"props":528,"children":530},{"className":529},[],[531],{"type":21,"value":532},"output_style.name",{"type":16,"tag":240,"props":534,"children":535},{},[536],{"type":21,"value":537},"The active output style",{"type":16,"tag":218,"props":539,"children":540},{},[541,550],{"type":16,"tag":240,"props":542,"children":543},{},[544],{"type":16,"tag":45,"props":545,"children":547},{"className":546},[],[548],{"type":21,"value":549},"context_window.used_percentage",{"type":16,"tag":240,"props":551,"children":552},{},[553,555,561,562,568,570,576],{"type":21,"value":554},"Context used, 0 to 100. Also ",{"type":16,"tag":45,"props":556,"children":558},{"className":557},[],[559],{"type":21,"value":560},"remaining_percentage",{"type":21,"value":368},{"type":16,"tag":45,"props":563,"children":565},{"className":564},[],[566],{"type":21,"value":567},"context_window_size",{"type":21,"value":569}," and a ",{"type":16,"tag":45,"props":571,"children":573},{"className":572},[],[574],{"type":21,"value":575},"current_usage",{"type":21,"value":577}," breakdown",{"type":16,"tag":218,"props":579,"children":580},{},[581,590],{"type":16,"tag":240,"props":582,"children":583},{},[584],{"type":16,"tag":45,"props":585,"children":587},{"className":586},[],[588],{"type":21,"value":589},"exceeds_200k_tokens",{"type":16,"tag":240,"props":591,"children":592},{},[593],{"type":21,"value":594},"Whether the conversation went past 200k",{"type":16,"tag":218,"props":596,"children":597},{},[598,607],{"type":16,"tag":240,"props":599,"children":600},{},[601],{"type":16,"tag":45,"props":602,"children":604},{"className":603},[],[605],{"type":21,"value":606},"cost.total_cost_usd",{"type":16,"tag":240,"props":608,"children":609},{},[610,612,618,619,625,626],{"type":21,"value":611},"Session cost, plus ",{"type":16,"tag":45,"props":613,"children":615},{"className":614},[],[616],{"type":21,"value":617},"total_duration_ms",{"type":21,"value":368},{"type":16,"tag":45,"props":620,"children":622},{"className":621},[],[623],{"type":21,"value":624},"total_lines_added",{"type":21,"value":426},{"type":16,"tag":45,"props":627,"children":629},{"className":628},[],[630],{"type":21,"value":631},"total_lines_removed",{"type":16,"tag":218,"props":633,"children":634},{},[635,644],{"type":16,"tag":240,"props":636,"children":637},{},[638],{"type":16,"tag":45,"props":639,"children":641},{"className":640},[],[642],{"type":21,"value":643},"effort.level",{"type":16,"tag":240,"props":645,"children":646},{},[647,649,655,657],{"type":21,"value":648},"Reasoning effort, such as ",{"type":16,"tag":45,"props":650,"children":652},{"className":651},[],[653],{"type":21,"value":654},"high",{"type":21,"value":656}," or ",{"type":16,"tag":45,"props":658,"children":660},{"className":659},[],[661],{"type":21,"value":662},"max",{"type":16,"tag":218,"props":664,"children":665},{},[666,682],{"type":16,"tag":240,"props":667,"children":668},{},[669,675,676],{"type":16,"tag":45,"props":670,"children":672},{"className":671},[],[673],{"type":21,"value":674},"thinking.enabled",{"type":21,"value":368},{"type":16,"tag":45,"props":677,"children":679},{"className":678},[],[680],{"type":21,"value":681},"fast_mode",{"type":16,"tag":240,"props":683,"children":684},{},[685],{"type":21,"value":686},"Booleans",{"type":16,"tag":218,"props":688,"children":689},{},[690,699],{"type":16,"tag":240,"props":691,"children":692},{},[693],{"type":16,"tag":45,"props":694,"children":696},{"className":695},[],[697],{"type":21,"value":698},"rate_limits.five_hour",{"type":16,"tag":240,"props":700,"children":701},{},[702,708,709,715,717],{"type":16,"tag":45,"props":703,"children":705},{"className":704},[],[706],{"type":21,"value":707},"used_percentage",{"type":21,"value":426},{"type":16,"tag":45,"props":710,"children":712},{"className":711},[],[713],{"type":21,"value":714},"resets_at",{"type":21,"value":716},", a Unix timestamp in seconds. Same shape for ",{"type":16,"tag":45,"props":718,"children":720},{"className":719},[],[721],{"type":21,"value":722},"seven_day",{"type":16,"tag":218,"props":724,"children":725},{},[726,735],{"type":16,"tag":240,"props":727,"children":728},{},[729],{"type":16,"tag":45,"props":730,"children":732},{"className":731},[],[733],{"type":21,"value":734},"prompt_cache.hit_ratio",{"type":16,"tag":240,"props":736,"children":737},{},[738],{"type":21,"value":739},"Prompt cache statistics for the main conversation",{"type":16,"tag":218,"props":741,"children":742},{},[743,751],{"type":16,"tag":240,"props":744,"children":745},{},[746],{"type":16,"tag":45,"props":747,"children":749},{"className":748},[],[750],{"type":21,"value":315},{"type":16,"tag":240,"props":752,"children":753},{},[754,760,761,767,768,774,775],{"type":16,"tag":45,"props":755,"children":757},{"className":756},[],[758],{"type":21,"value":759},"NORMAL",{"type":21,"value":368},{"type":16,"tag":45,"props":762,"children":764},{"className":763},[],[765],{"type":21,"value":766},"INSERT",{"type":21,"value":368},{"type":16,"tag":45,"props":769,"children":771},{"className":770},[],[772],{"type":21,"value":773},"VISUAL",{"type":21,"value":656},{"type":16,"tag":45,"props":776,"children":778},{"className":777},[],[779],{"type":21,"value":780},"VISUAL LINE",{"type":16,"tag":218,"props":782,"children":783},{},[784,807],{"type":16,"tag":240,"props":785,"children":786},{},[787,793,794,800,801],{"type":16,"tag":45,"props":788,"children":790},{"className":789},[],[791],{"type":21,"value":792},"agent.name",{"type":21,"value":368},{"type":16,"tag":45,"props":795,"children":797},{"className":796},[],[798],{"type":21,"value":799},"pr.number",{"type":21,"value":368},{"type":16,"tag":45,"props":802,"children":804},{"className":803},[],[805],{"type":21,"value":806},"worktree.name",{"type":16,"tag":240,"props":808,"children":809},{},[810,812],{"type":21,"value":811},"The active agent, the open pull request, the ",{"type":16,"tag":24,"props":813,"children":815},{"href":814},"/guides/claude-code-git-worktrees",[816],{"type":21,"value":817},"worktree",{"type":16,"tag":33,"props":819,"children":821},{"id":820},"the-fields-that-are-not-always-there",[822],{"type":21,"value":823},"The fields that are not always there",{"type":16,"tag":17,"props":825,"children":826},{},[827],{"type":21,"value":828},"This is where most statusline bugs come from. Several keys are absent, not null, and a script that assumes them prints nothing at all:",{"type":16,"tag":830,"props":831,"children":832},"ul",{},[833,867,878,903,934],{"type":16,"tag":834,"props":835,"children":836},"li",{},[837,842,844,850,851,857,859,865],{"type":16,"tag":45,"props":838,"children":840},{"className":839},[],[841],{"type":21,"value":461},{"type":21,"value":843}," appears only when a custom name is set with ",{"type":16,"tag":45,"props":845,"children":847},{"className":846},[],[848],{"type":21,"value":849},"--name",{"type":21,"value":656},{"type":16,"tag":45,"props":852,"children":854},{"className":853},[],[855],{"type":21,"value":856},"/rename",{"type":21,"value":858},", or once an AI-generated title exists. The default display name like ",{"type":16,"tag":45,"props":860,"children":862},{"className":861},[],[863],{"type":21,"value":864},"my-app-3f",{"type":21,"value":866}," does not populate it.",{"type":16,"tag":834,"props":868,"children":869},{},[870,876],{"type":16,"tag":45,"props":871,"children":873},{"className":872},[],[874],{"type":21,"value":875},"effort",{"type":21,"value":877}," appears only when the model supports a reasoning effort parameter.",{"type":16,"tag":834,"props":879,"children":880},{},[881,886,888,893,895,901],{"type":16,"tag":45,"props":882,"children":884},{"className":883},[],[885],{"type":21,"value":408},{"type":21,"value":887}," needs a git repo with an ",{"type":16,"tag":45,"props":889,"children":891},{"className":890},[],[892],{"type":21,"value":440},{"type":21,"value":894}," remote, and ",{"type":16,"tag":45,"props":896,"children":898},{"className":897},[],[899],{"type":21,"value":900},"workspace.git_worktree",{"type":21,"value":902}," needs a linked worktree.",{"type":16,"tag":834,"props":904,"children":905},{},[906,912,913,919,920,926,927,932],{"type":16,"tag":45,"props":907,"children":909},{"className":908},[],[910],{"type":21,"value":911},"vim",{"type":21,"value":368},{"type":16,"tag":45,"props":914,"children":916},{"className":915},[],[917],{"type":21,"value":918},"agent",{"type":21,"value":368},{"type":16,"tag":45,"props":921,"children":923},{"className":922},[],[924],{"type":21,"value":925},"pr",{"type":21,"value":426},{"type":16,"tag":45,"props":928,"children":930},{"className":929},[],[931],{"type":21,"value":817},{"type":21,"value":933}," appear only in their respective modes.",{"type":16,"tag":834,"props":935,"children":936},{},[937,943,944,950,952,958],{"type":16,"tag":45,"props":938,"children":940},{"className":939},[],[941],{"type":21,"value":942},"rate_limits.spend_limit",{"type":21,"value":426},{"type":16,"tag":45,"props":945,"children":947},{"className":946},[],[948],{"type":21,"value":949},"prompt_cache",{"type":21,"value":951}," require Claude Code 2.1.251 or later, ",{"type":16,"tag":45,"props":953,"children":955},{"className":954},[],[956],{"type":21,"value":957},"prompt_id",{"type":21,"value":959}," 2.1.196 or later.",{"type":16,"tag":17,"props":961,"children":962},{},[963,965,971,973,979,980,986],{"type":21,"value":964},"Guard every read. In ",{"type":16,"tag":45,"props":966,"children":968},{"className":967},[],[969],{"type":21,"value":970},"jq",{"type":21,"value":972},", that means ",{"type":16,"tag":45,"props":974,"children":976},{"className":975},[],[977],{"type":21,"value":978},"// \"\"",{"type":21,"value":656},{"type":16,"tag":45,"props":981,"children":983},{"className":982},[],[984],{"type":21,"value":985},"// 0",{"type":21,"value":987}," on each field.",{"type":16,"tag":33,"props":989,"children":991},{"id":990},"a-minimal-statusline",[992],{"type":21,"value":993},"A minimal statusline",{"type":16,"tag":17,"props":995,"children":996},{},[997],{"type":21,"value":998},"This prints context, the five hour quota, the model and the folder:",{"type":16,"tag":85,"props":1000,"children":1004},{"code":1001,"language":1002,"meta":7,"className":1003,"style":7},"#!/bin/bash\ninput=$(cat)\njq -r '\n  \"Ctx: \\(.context_window.used_percentage // 0 | floor)%\"\n  + \" | 5h: \\(.rate_limits.five_hour.used_percentage // 0 | floor)%\"\n  + \" | \\(.model.display_name // \"?\")\"\n  + \" | \\(.workspace.current_dir | split(\"/\") | last)\"\n' <<< \"$input\"\n","bash","language-bash shiki shiki-themes github-light github-dark",[1005],{"type":16,"tag":45,"props":1006,"children":1007},{"__ignoreMap":7},[1008,1017,1047,1064,1072,1080,1088,1096],{"type":16,"tag":95,"props":1009,"children":1010},{"class":97,"line":98},[1011],{"type":16,"tag":95,"props":1012,"children":1014},{"style":1013},"--shiki-default:#6A737D;--shiki-dark:#6A737D",[1015],{"type":21,"value":1016},"#!/bin/bash\n",{"type":16,"tag":95,"props":1018,"children":1019},{"class":97,"line":108},[1020,1025,1031,1036,1042],{"type":16,"tag":95,"props":1021,"children":1022},{"style":102},[1023],{"type":21,"value":1024},"input",{"type":16,"tag":95,"props":1026,"children":1028},{"style":1027},"--shiki-default:#D73A49;--shiki-dark:#F97583",[1029],{"type":21,"value":1030},"=",{"type":16,"tag":95,"props":1032,"children":1033},{"style":102},[1034],{"type":21,"value":1035},"$(",{"type":16,"tag":95,"props":1037,"children":1039},{"style":1038},"--shiki-default:#6F42C1;--shiki-dark:#B392F0",[1040],{"type":21,"value":1041},"cat",{"type":16,"tag":95,"props":1043,"children":1044},{"style":102},[1045],{"type":21,"value":1046},")\n",{"type":16,"tag":95,"props":1048,"children":1049},{"class":97,"line":123},[1050,1054,1059],{"type":16,"tag":95,"props":1051,"children":1052},{"style":1038},[1053],{"type":21,"value":970},{"type":16,"tag":95,"props":1055,"children":1056},{"style":112},[1057],{"type":21,"value":1058}," -r",{"type":16,"tag":95,"props":1060,"children":1061},{"style":137},[1062],{"type":21,"value":1063}," '\n",{"type":16,"tag":95,"props":1065,"children":1066},{"class":97,"line":148},[1067],{"type":16,"tag":95,"props":1068,"children":1069},{"style":137},[1070],{"type":21,"value":1071},"  \"Ctx: \\(.context_window.used_percentage // 0 | floor)%\"\n",{"type":16,"tag":95,"props":1073,"children":1074},{"class":97,"line":170},[1075],{"type":16,"tag":95,"props":1076,"children":1077},{"style":137},[1078],{"type":21,"value":1079},"  + \" | 5h: \\(.rate_limits.five_hour.used_percentage // 0 | floor)%\"\n",{"type":16,"tag":95,"props":1081,"children":1082},{"class":97,"line":188},[1083],{"type":16,"tag":95,"props":1084,"children":1085},{"style":137},[1086],{"type":21,"value":1087},"  + \" | \\(.model.display_name // \"?\")\"\n",{"type":16,"tag":95,"props":1089,"children":1090},{"class":97,"line":197},[1091],{"type":16,"tag":95,"props":1092,"children":1093},{"style":137},[1094],{"type":21,"value":1095},"  + \" | \\(.workspace.current_dir | split(\"/\") | last)\"\n",{"type":16,"tag":95,"props":1097,"children":1099},{"class":97,"line":1098},8,[1100,1105,1110,1115,1120],{"type":16,"tag":95,"props":1101,"children":1102},{"style":137},[1103],{"type":21,"value":1104},"'",{"type":16,"tag":95,"props":1106,"children":1107},{"style":1027},[1108],{"type":21,"value":1109}," <<<",{"type":16,"tag":95,"props":1111,"children":1112},{"style":137},[1113],{"type":21,"value":1114}," \"",{"type":16,"tag":95,"props":1116,"children":1117},{"style":102},[1118],{"type":21,"value":1119},"$input",{"type":16,"tag":95,"props":1121,"children":1122},{"style":137},[1123],{"type":21,"value":1124},"\"\n",{"type":16,"tag":17,"props":1126,"children":1127},{},[1128],{"type":21,"value":1129},"Fed a full payload, it prints:",{"type":16,"tag":85,"props":1131,"children":1133},{"code":1132},"Ctx: 42% | 5h: 23% | Opus 5 | my-app\n",[1134],{"type":16,"tag":45,"props":1135,"children":1136},{"__ignoreMap":7},[1137],{"type":21,"value":1132},{"type":16,"tag":17,"props":1139,"children":1140},{},[1141,1143,1149],{"type":21,"value":1142},"There is a lesson in the degraded case. Run it against a payload with no ",{"type":16,"tag":45,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":21,"value":1148},"rate_limits",{"type":21,"value":1150}," at all and you get:",{"type":16,"tag":85,"props":1152,"children":1154},{"code":1153},"Ctx: 8% | 5h: 0% | Opus 5 | my-app\n",[1155],{"type":16,"tag":45,"props":1156,"children":1157},{"__ignoreMap":7},[1158],{"type":21,"value":1153},{"type":16,"tag":17,"props":1160,"children":1161},{},[1162,1164,1170],{"type":21,"value":1163},"A quota of ",{"type":16,"tag":45,"props":1165,"children":1167},{"className":1166},[],[1168],{"type":21,"value":1169},"0%",{"type":21,"value":1171}," is a comfortable, wrong answer: the field was missing, not empty. Prefer hiding a block you cannot measure over printing a default that reads as good news.",{"type":16,"tag":33,"props":1173,"children":1175},{"id":1174},"rate-limits-go-stale-and-that-is-the-interesting-part",[1176],{"type":21,"value":1177},"Rate limits go stale, and that is the interesting part",{"type":16,"tag":17,"props":1179,"children":1180},{},[1181,1186],{"type":16,"tag":45,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":21,"value":1148},{"type":21,"value":1187}," is only refreshed on an API exchange. A session you leave open without talking to it keeps serving the same snapshot for as long as it sits there, and the numbers drift further from reality with every hour.",{"type":16,"tag":17,"props":1189,"children":1190},{},[1191],{"type":21,"value":1192},"Measured across ten sessions open at once on a single account, the spread reached 5.8 days of drift, with one session reporting the seven day window at 9 percent while the true figure was 27 percent. The quota is account-wide, so every one of those sessions was describing the same reality and only one of them was right.",{"type":16,"tag":17,"props":1194,"children":1195},{},[1196,1198,1204,1206,1211,1213,1218],{"type":21,"value":1197},"There is a second, quieter detail. When ",{"type":16,"tag":45,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":21,"value":1203},"five_hour.resets_at",{"type":21,"value":1205}," is already in the past, no window is running at all: a five hour window starts on a message, not on a fixed grid. Verified over a run of real payloads, ",{"type":16,"tag":45,"props":1207,"children":1209},{"className":1208},[],[1210],{"type":21,"value":714},{"type":21,"value":1212}," lands on minutes like :00, :20, :30 and :50, which tracks the time of the first message rather than any clock boundary. So an elapsed ",{"type":16,"tag":45,"props":1214,"children":1216},{"className":1215},[],[1217],{"type":21,"value":714},{"type":21,"value":1219}," does not mean \"stale and useless\", it means nothing has been spent since, and the remembered figure still holds.",{"type":16,"tag":17,"props":1221,"children":1222},{},[1223,1225,1231,1232,1237],{"type":21,"value":1224},"The fix is a shared cache. Every session writes its snapshot to one file, and whichever session holds the freshest one publishes it for the others to read. Freshness ranks on ",{"type":16,"tag":45,"props":1226,"children":1228},{"className":1227},[],[1229],{"type":21,"value":1230},"five_hour.resets_at * 1000 + five_hour.used_percentage",{"type":21,"value":134},{"type":16,"tag":45,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":21,"value":714},{"type":21,"value":1238}," increases from one window to the next, and within a window the percentage only rises, so the key is monotonic and the tie-break is free.",{"type":16,"tag":33,"props":1240,"children":1242},{"id":1241},"the-statusline-this-site-runs",[1243],{"type":21,"value":1244},"The statusline this site runs",{"type":16,"tag":17,"props":1246,"children":1247},{},[1248,1250,1255,1256,1261],{"type":21,"value":1249},"The full script is here, MIT, no dependency beyond ",{"type":16,"tag":45,"props":1251,"children":1253},{"className":1252},[],[1254],{"type":21,"value":1002},{"type":21,"value":426},{"type":16,"tag":45,"props":1257,"children":1259},{"className":1258},[],[1260],{"type":21,"value":970},{"type":21,"value":1262},":",{"type":16,"tag":17,"props":1264,"children":1265},{},[1266],{"type":16,"tag":1267,"props":1268,"children":1269},"strong",{},[1270],{"type":16,"tag":24,"props":1271,"children":1273},{"href":1272},"/downloads/statusline.sh",[1274],{"type":21,"value":1275},"Download statusline.sh",{"type":16,"tag":17,"props":1277,"children":1278},{},[1279,1281,1287,1288,1294],{"type":21,"value":1280},"Save it to ",{"type":16,"tag":45,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":21,"value":1286},"~/.claude/statusline.sh",{"type":21,"value":368},{"type":16,"tag":45,"props":1289,"children":1291},{"className":1290},[],[1292],{"type":21,"value":1293},"chmod +x",{"type":21,"value":1295}," it, and point your settings at it. It prints context, both quota windows with their countdowns, the model with its effort level, and the session name. On top of the plain readout it adds:",{"type":16,"tag":830,"props":1297,"children":1298},{},[1299,1309,1319,1329],{"type":16,"tag":834,"props":1300,"children":1301},{},[1302,1307],{"type":16,"tag":1267,"props":1303,"children":1304},{},[1305],{"type":21,"value":1306},"Two orthogonal quota signals.",{"type":21,"value":1308}," Colour is a forecast: it compares quota remaining against time remaining in the window, so it warns when the current burn rate will hit the wall early, not merely when a number is large. A reverse video block is a statement of present fact at 90 percent used or more, which a healthy forecast must never mask.",{"type":16,"tag":834,"props":1310,"children":1311},{},[1312,1317],{"type":16,"tag":1267,"props":1313,"children":1314},{},[1315],{"type":21,"value":1316},"Context tiers",{"type":21,"value":1318}," at 60 percent (yellow), 80 percent (red) and 90 percent (reverse block).",{"type":16,"tag":834,"props":1320,"children":1321},{},[1322,1327],{"type":16,"tag":1267,"props":1323,"children":1324},{},[1325],{"type":21,"value":1326},"A tilde",{"type":21,"value":1328}," in front of a figure that was deduced from an elapsed window rather than measured.",{"type":16,"tag":834,"props":1330,"children":1331},{},[1332,1337],{"type":16,"tag":1267,"props":1333,"children":1334},{},[1335],{"type":21,"value":1336},"The cross-session cache",{"type":21,"value":1338}," described above.",{"type":16,"tag":17,"props":1340,"children":1341},{},[1342],{"type":21,"value":1343},"Verified on 2026-09-13 against bash 5.2.21 and jq 1.7: five runs complete in 62 ms total, roughly 12 ms each, which matters because this script runs on every event.",{"type":16,"tag":33,"props":1345,"children":1347},{"id":1346},"one-line-per-session-is-still-one-session",[1348],{"type":21,"value":1349},"One line per session is still one session",{"type":16,"tag":17,"props":1351,"children":1352},{},[1353,1355,1361],{"type":21,"value":1354},"A statusline is the right tool for the session you are looking at. It is the wrong tool for the other four, because each one is drawn at the bottom of its own terminal, and the one that needs you is the one you are not looking at. That is the gap: the more ",{"type":16,"tag":24,"props":1356,"children":1358},{"href":1357},"/guides/multiple-claude-code-sessions",[1359],{"type":21,"value":1360},"parallel sessions you run",{"type":21,"value":1362},", the less a per-terminal readout helps.",{"type":16,"tag":17,"props":1364,"children":1365},{},[1366,1372],{"type":16,"tag":24,"props":1367,"children":1369},{"href":1368},"/",[1370],{"type":21,"value":1371},"Blooby",{"type":21,"value":1373}," takes the same session state out of the terminal and puts it on your desktop, one animated mascot per session, so the one waiting on a permission raises its head whatever window you are in.",{"type":16,"tag":1375,"props":1376,"children":1377},"style",{},[1378],{"type":21,"value":1379},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":7,"searchDepth":108,"depth":108,"links":1381},[1382,1383,1384,1385,1386,1387,1388],{"id":35,"depth":108,"text":38},{"id":325,"depth":108,"text":328},{"id":820,"depth":108,"text":823},{"id":990,"depth":108,"text":993},{"id":1174,"depth":108,"text":1177},{"id":1241,"depth":108,"text":1244},{"id":1346,"depth":108,"text":1349},"markdown","content:guides:claude-code-statusline.md","content","guides/claude-code-statusline.md","guides/claude-code-statusline","md",1]