<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Terminal on Andrew Jones</title><link>https://andrew-jones.com/categories/terminal/</link><description>Recent content in Terminal on Andrew Jones</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>&amp;copy; 2008 - 2026 Andrew Jones</copyright><lastBuildDate>Thu, 23 Apr 2026 07:30:50 +0000</lastBuildDate><atom:link href="https://andrew-jones.com/categories/terminal/index.xml" rel="self" type="application/rss+xml"/><item><title>Per-project terminal colours</title><link>https://andrew-jones.com/blog/per-project-terminal-colours/</link><pubDate>Thu, 23 Apr 2026 07:30:50 +0000</pubDate><guid>https://andrew-jones.com/blog/per-project-terminal-colours/</guid><description>&lt;p>Here&amp;rsquo;s a small but nice improvement I&amp;rsquo;ve made to my terminal recently that has been effective for me.&lt;/p>
&lt;p>I generally have many terminal windows open across many git-based projects, which I&amp;rsquo;m regularly switching between.&lt;/p>
&lt;p>Now, my terminal windows have different colours for each project.&lt;/p>
&lt;p>This is what it looks like:&lt;/p>
&lt;figure style="">
&lt;img src="https://andrew-jones.com/images/blog/2026-04-23/per-project-terminal-colour.gif" alt="Animated Gif showing a dark themed terminal window with the user entering and exiting directories and the colour updating as described in this article." />
&lt;/figure>
&lt;div class="clear">&lt;/div>
&lt;p>This is the code I&amp;rsquo;ve added to my &lt;code>zshrc&lt;/code>, written with AI assistance:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># --- Project terminal background ---&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Changes the terminal background colour based on the current git repo.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Colour is deterministic per repo (derived from the repo root path).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">_project_bg&lt;span class="o">()&lt;/span> &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">local&lt;/span> git_root
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">git_root&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>git rev-parse --show-toplevel 2&amp;gt;/dev/null&lt;span class="k">)&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">printf&lt;/span> &lt;span class="s1">&amp;#39;\e]111\e\\&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">local&lt;/span> &lt;span class="nv">hash&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>&lt;span class="nb">printf&lt;/span> &lt;span class="s1">&amp;#39;%s&amp;#39;&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$git_root&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> md5 -q&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">local&lt;/span> &lt;span class="nv">r&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$((&lt;/span> &lt;span class="m">16#&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">hash&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nv">0&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nv">2&lt;/span>&lt;span class="si">}&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="m">71&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="m">30&lt;/span> &lt;span class="k">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">local&lt;/span> &lt;span class="nv">g&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$((&lt;/span> &lt;span class="m">16#&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">hash&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nv">2&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nv">2&lt;/span>&lt;span class="si">}&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="m">71&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="m">30&lt;/span> &lt;span class="k">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">local&lt;/span> &lt;span class="nv">b&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$((&lt;/span> &lt;span class="m">16#&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">hash&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nv">4&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nv">2&lt;/span>&lt;span class="si">}&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="m">71&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="m">30&lt;/span> &lt;span class="k">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">printf&lt;/span> &lt;span class="s1">&amp;#39;\e]11;#%02x%02x%02x\e\\&amp;#39;&lt;/span> &lt;span class="nv">$r&lt;/span> &lt;span class="nv">$g&lt;/span> &lt;span class="nv">$b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">chpwd_functions&lt;/span>&lt;span class="o">+=(&lt;/span>_project_bg&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">_project_bg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If the directory is a git repository it gets the path to the repo and creates an MD5 hash of it (using &lt;code>md5 -q&lt;/code>, which is macOS-specific. Use &lt;code>md5sum&lt;/code> if on Linux). This ensures the same repository (path) always produces the same colour.&lt;/p>
&lt;p>To generate a colour it then extracts 2-character hex pairs from the hash and converts them from hex to decimal. Only values 30-100 are used, so the background is always dark and white text remains readable.&lt;/p>
&lt;p>Finally it sets the colour using &lt;a href="https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands">OSC 11&lt;/a>.&lt;/p>
&lt;p>It hooks into Zsh&amp;rsquo;s &lt;code>chpwd_functions&lt;/code> array, so it automatically runs when the directory changes.&lt;/p>
&lt;p>Now when I&amp;rsquo;m switching between terminal windows I get a clear context signal telling me which project I&amp;rsquo;m currently in.&lt;/p>
&lt;p>I&amp;rsquo;ve only tested this with &lt;a href="https://ghostty.org/">Ghostty&lt;/a>, and the code can also be found in &lt;a href="https://github.com/andrewrjones/dotfiles">my dotfiles repository&lt;/a>.&lt;/p></description></item></channel></rss>