<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-08-23T01:11:51+00:00</updated><id>/feed.xml</id><title type="html">Brian Roberts</title><subtitle>I lead platform engineering teams building secure, developer-friendly cloud infrastructure.</subtitle><entry><title type="html">Statusline</title><link href="/ai/claude/2026/07/10/statusline.html" rel="alternate" type="text/html" title="Statusline" /><published>2026-07-10T12:00:00+00:00</published><updated>2026-07-10T12:00:00+00:00</updated><id>/ai/claude/2026/07/10/statusline</id><content type="html" xml:base="/ai/claude/2026/07/10/statusline.html"><![CDATA[<p><img src="/assets/images/statusline/screenshot.png" alt="Custom status line showing model, directory, git branch, context usage, cost, and effort level" /></p>

<p>I get a lot of enjoyment out of fine-tuning the tools I use every day. Whether it’s my editor, terminal, or shell, I’m always looking for small improvements that make my workflow faster and more enjoyable. The status line is one of those details that often goes unnoticed, but when it’s thoughtfully designed, it provides exactly the information you need at the right time. In this post, I’ll share how I customized mine and the code behind it.</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nv">input</span><span class="o">=</span><span class="si">$(</span><span class="nb">cat</span><span class="si">)</span>

<span class="nv">MODEL</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$input</span><span class="s2">"</span> | jq <span class="nt">-r</span> <span class="s1">'.model.display_name'</span><span class="si">)</span>
<span class="nv">DIR</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$input</span><span class="s2">"</span> | jq <span class="nt">-r</span> <span class="s1">'.workspace.current_dir'</span><span class="si">)</span>
<span class="nv">SESSION_ID</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$input</span><span class="s2">"</span> | jq <span class="nt">-r</span> <span class="s1">'.session_id'</span><span class="si">)</span>
<span class="nv">PCT</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$input</span><span class="s2">"</span> | jq <span class="nt">-r</span> <span class="s1">'.context_window.used_percentage // 0'</span> | <span class="nb">cut</span> <span class="nt">-d</span><span class="nb">.</span> <span class="nt">-f1</span><span class="si">)</span>
<span class="nv">COST</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$input</span><span class="s2">"</span> | jq <span class="nt">-r</span> <span class="s1">'.cost.total_cost_usd // 0'</span><span class="si">)</span>
<span class="nv">DURATION_MS</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$input</span><span class="s2">"</span> | jq <span class="nt">-r</span> <span class="s1">'.cost.total_duration_ms // 0'</span><span class="si">)</span>
<span class="nv">EFFORT</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$input</span><span class="s2">"</span> | jq <span class="nt">-r</span> <span class="s1">'.effort.level // empty'</span><span class="si">)</span>
<span class="nv">CACHE_FILE</span><span class="o">=</span><span class="s2">"/tmp/statusline-git-cache-</span><span class="nv">$SESSION_ID</span><span class="s2">"</span>
<span class="nv">CACHE_MAX_AGE</span><span class="o">=</span>5  <span class="c"># seconds</span>

<span class="nv">CYAN</span><span class="o">=</span><span class="s1">'\033[36m'</span><span class="p">;</span> <span class="nv">GREEN</span><span class="o">=</span><span class="s1">'\033[32m'</span><span class="p">;</span> <span class="nv">YELLOW</span><span class="o">=</span><span class="s1">'\033[33m'</span><span class="p">;</span> <span class="nv">RED</span><span class="o">=</span><span class="s1">'\033[31m'</span><span class="p">;</span> <span class="nv">RESET</span><span class="o">=</span><span class="s1">'\033[0m'</span>
<span class="nv">DIM</span><span class="o">=</span><span class="s1">'\033[2m'</span>

<span class="c"># Pick bar color based on context usage</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$PCT</span><span class="s2">"</span> <span class="nt">-ge</span> 90 <span class="o">]</span><span class="p">;</span> <span class="k">then </span><span class="nv">BAR_COLOR</span><span class="o">=</span><span class="s2">"</span><span class="nv">$RED</span><span class="s2">"</span>
<span class="k">elif</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$PCT</span><span class="s2">"</span> <span class="nt">-ge</span> 70 <span class="o">]</span><span class="p">;</span> <span class="k">then </span><span class="nv">BAR_COLOR</span><span class="o">=</span><span class="s2">"</span><span class="nv">$YELLOW</span><span class="s2">"</span>
<span class="k">else </span><span class="nv">BAR_COLOR</span><span class="o">=</span><span class="s2">"</span><span class="nv">$GREEN</span><span class="s2">"</span><span class="p">;</span> <span class="k">fi

</span><span class="nv">FILLED</span><span class="o">=</span><span class="k">$((</span>PCT <span class="o">/</span> <span class="m">10</span><span class="k">))</span><span class="p">;</span> <span class="nv">EMPTY</span><span class="o">=</span><span class="k">$((</span><span class="m">10</span> <span class="o">-</span> FILLED<span class="k">))</span>
<span class="nb">printf</span> <span class="nt">-v</span> FILL <span class="s2">"%</span><span class="k">${</span><span class="nv">FILLED</span><span class="k">}</span><span class="s2">s"</span><span class="p">;</span> <span class="nb">printf</span> <span class="nt">-v</span> PAD <span class="s2">"%</span><span class="k">${</span><span class="nv">EMPTY</span><span class="k">}</span><span class="s2">s"</span>
<span class="nv">BAR</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">FILL</span><span class="p">// /█</span><span class="k">}${</span><span class="nv">PAD</span><span class="p">// /░</span><span class="k">}</span><span class="s2">"</span>

<span class="nv">MINS</span><span class="o">=</span><span class="k">$((</span>DURATION_MS <span class="o">/</span> <span class="m">60000</span><span class="k">))</span><span class="p">;</span> <span class="nv">SECS</span><span class="o">=</span><span class="k">$((</span><span class="o">(</span>DURATION_MS <span class="o">%</span> <span class="m">60000</span><span class="o">)</span> <span class="o">/</span> <span class="m">1000</span><span class="k">))</span>

<span class="c"># Color-code effort level, build optional segment</span>
<span class="nv">EFFORT_SEG</span><span class="o">=</span><span class="s2">""</span>
<span class="k">if</span> <span class="o">[</span> <span class="nt">-n</span> <span class="s2">"</span><span class="nv">$EFFORT</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
    case</span> <span class="s2">"</span><span class="nv">$EFFORT</span><span class="s2">"</span> <span class="k">in
        </span>low<span class="p">)</span>        <span class="nv">EFFORT_FMT</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">DIM</span><span class="k">}${</span><span class="nv">EFFORT</span><span class="k">}${</span><span class="nv">RESET</span><span class="k">}</span><span class="s2">"</span> <span class="p">;;</span>
        medium<span class="p">)</span>     <span class="nv">EFFORT_FMT</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">CYAN</span><span class="k">}${</span><span class="nv">EFFORT</span><span class="k">}${</span><span class="nv">RESET</span><span class="k">}</span><span class="s2">"</span> <span class="p">;;</span>
        high|xhigh<span class="p">)</span> <span class="nv">EFFORT_FMT</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">YELLOW</span><span class="k">}${</span><span class="nv">EFFORT</span><span class="k">}${</span><span class="nv">RESET</span><span class="k">}</span><span class="s2">"</span> <span class="p">;;</span>
        max<span class="p">)</span>        <span class="nv">EFFORT_FMT</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">RED</span><span class="k">}${</span><span class="nv">EFFORT</span><span class="k">}${</span><span class="nv">RESET</span><span class="k">}</span><span class="s2">"</span> <span class="p">;;</span>
        <span class="k">*</span><span class="p">)</span>          <span class="nv">EFFORT_FMT</span><span class="o">=</span><span class="s2">"</span><span class="nv">$EFFORT</span><span class="s2">"</span> <span class="p">;;</span>
    <span class="k">esac</span>
    <span class="nv">EFFORT_SEG</span><span class="o">=</span><span class="s2">" | ⚡ </span><span class="k">${</span><span class="nv">EFFORT_FMT</span><span class="k">}</span><span class="s2">"</span>
<span class="k">fi

</span>cache_is_stale<span class="o">()</span> <span class="o">{</span>
    <span class="o">[</span> <span class="o">!</span> <span class="nt">-f</span> <span class="s2">"</span><span class="nv">$CACHE_FILE</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="se">\</span>
    <span class="c"># stat -f %m is macOS, stat -c %Y is Linux</span>
    <span class="o">[</span> <span class="k">$((</span><span class="si">$(</span><span class="nb">date</span> +%s<span class="si">)</span> <span class="o">-</span> <span class="si">$(</span><span class="nb">stat</span> <span class="nt">-f</span> %m <span class="s2">"</span><span class="nv">$CACHE_FILE</span><span class="s2">"</span> 2&gt;/dev/null <span class="o">||</span> <span class="nb">stat</span> <span class="nt">-c</span> %Y <span class="s2">"</span><span class="nv">$CACHE_FILE</span><span class="s2">"</span> 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo </span>0<span class="si">)</span><span class="k">))</span> <span class="nt">-gt</span> <span class="nv">$CACHE_MAX_AGE</span> <span class="o">]</span>
<span class="o">}</span>

<span class="k">if </span>cache_is_stale<span class="p">;</span> <span class="k">then
    if </span>git rev-parse <span class="nt">--git-dir</span> <span class="o">&gt;</span> /dev/null 2&gt;&amp;1<span class="p">;</span> <span class="k">then
        </span><span class="nv">BRANCH</span><span class="o">=</span><span class="si">$(</span>git branch <span class="nt">--show-current</span> 2&gt;/dev/null<span class="si">)</span>
        <span class="nv">STAGED</span><span class="o">=</span><span class="si">$(</span>git diff <span class="nt">--cached</span> <span class="nt">--numstat</span> 2&gt;/dev/null | <span class="nb">wc</span> <span class="nt">-l</span> | <span class="nb">tr</span> <span class="nt">-d</span> <span class="s1">' '</span><span class="si">)</span>
        <span class="nv">MODIFIED</span><span class="o">=</span><span class="si">$(</span>git diff <span class="nt">--numstat</span> 2&gt;/dev/null | <span class="nb">wc</span> <span class="nt">-l</span> | <span class="nb">tr</span> <span class="nt">-d</span> <span class="s1">' '</span><span class="si">)</span>
        <span class="nb">echo</span> <span class="s2">"</span><span class="nv">$BRANCH</span><span class="s2">|</span><span class="nv">$STAGED</span><span class="s2">|</span><span class="nv">$MODIFIED</span><span class="s2">"</span> <span class="o">&gt;</span> <span class="s2">"</span><span class="nv">$CACHE_FILE</span><span class="s2">"</span>
    <span class="k">else
        </span><span class="nb">echo</span> <span class="s2">"||"</span> <span class="o">&gt;</span> <span class="s2">"</span><span class="nv">$CACHE_FILE</span><span class="s2">"</span>
    <span class="k">fi
fi

</span><span class="nv">IFS</span><span class="o">=</span><span class="s1">'|'</span> <span class="nb">read</span> <span class="nt">-r</span> BRANCH STAGED MODIFIED &lt; <span class="s2">"</span><span class="nv">$CACHE_FILE</span><span class="s2">"</span>

<span class="nv">COST_FMT</span><span class="o">=</span><span class="si">$(</span><span class="nb">printf</span> <span class="s1">'$%.2f'</span> <span class="s2">"</span><span class="nv">$COST</span><span class="s2">"</span><span class="si">)</span>

<span class="k">if</span> <span class="o">[</span> <span class="nt">-n</span> <span class="s2">"</span><span class="nv">$BRANCH</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
    </span><span class="nb">echo</span> <span class="s2">"[</span><span class="nv">$MODEL</span><span class="s2">] 📁 </span><span class="k">${</span><span class="nv">DIR</span><span class="p">##*/</span><span class="k">}</span><span class="s2"> | 🌿 </span><span class="nv">$BRANCH</span><span class="s2"> +</span><span class="nv">$STAGED</span><span class="s2"> ~</span><span class="nv">$MODIFIED</span><span class="s2">"</span>
<span class="k">else
    </span><span class="nb">echo</span> <span class="s2">"[</span><span class="nv">$MODEL</span><span class="s2">] 📁 </span><span class="k">${</span><span class="nv">DIR</span><span class="p">##*/</span><span class="k">}</span><span class="s2">"</span>
<span class="k">fi
</span><span class="nb">echo</span> <span class="nt">-e</span> <span class="s2">"</span><span class="k">${</span><span class="nv">BAR_COLOR</span><span class="k">}${</span><span class="nv">BAR</span><span class="k">}${</span><span class="nv">RESET</span><span class="k">}</span><span class="s2"> </span><span class="k">${</span><span class="nv">PCT</span><span class="k">}</span><span class="s2">% | </span><span class="k">${</span><span class="nv">YELLOW</span><span class="k">}${</span><span class="nv">COST_FMT</span><span class="k">}${</span><span class="nv">RESET</span><span class="k">}</span><span class="s2"> | ⏱️ </span><span class="k">${</span><span class="nv">MINS</span><span class="k">}</span><span class="s2">m </span><span class="k">${</span><span class="nv">SECS</span><span class="k">}</span><span class="s2">s</span><span class="k">${</span><span class="nv">EFFORT_SEG</span><span class="k">}</span><span class="s2">"</span>
</code></pre></div></div>

<blockquote>
  <p><strong>Looking for a deeper dive?</strong> 
This post focuses on my implementation. For a complete explanation of every status line component, see the official <a href="https://code.claude.com/docs/en/statusline">Claude Code Status Line</a> documentation.</p>
</blockquote>]]></content><author><name></name></author><category term="ai" /><category term="claude" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Hello World!</title><link href="/tech/2026/07/05/hello-world.html" rel="alternate" type="text/html" title="Hello World!" /><published>2026-07-05T19:42:15+00:00</published><updated>2026-07-05T19:42:15+00:00</updated><id>/tech/2026/07/05/hello-world</id><content type="html" xml:base="/tech/2026/07/05/hello-world.html"><![CDATA[<p>My first post!!</p>]]></content><author><name></name></author><category term="tech" /><summary type="html"><![CDATA[My first post!!]]></summary></entry></feed>