<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dotfiles | Derek Armstrong — Staff Engineer &amp; Solutions Architect</title><link>https://derekarmstrong.dev/tags/dotfiles/</link><atom:link href="https://derekarmstrong.dev/tags/dotfiles/index.xml" rel="self" type="application/rss+xml"/><description>Dotfiles</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Thu, 28 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://derekarmstrong.dev/media/sharing.png</url><title>Dotfiles</title><link>https://derekarmstrong.dev/tags/dotfiles/</link></image><item><title>clean-term: A Minimal Oh My Zsh Theme That Actually Works Everywhere</title><link>https://derekarmstrong.dev/blog/clean-term-oh-my-zsh-theme/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://derekarmstrong.dev/blog/clean-term-oh-my-zsh-theme/</guid><description>&lt;p&gt;I spent more time trying to find a terminal theme I actually liked than I am willing to admit. Every theme I tried either relied on unicode box-drawing characters that broke across different fonts, had more colors and glyphs than I could parse at a glance, or painted the screen with status information I never looked at. The one I ended up keeping was a 14-line script in my dotfiles. So I packaged it and made it public.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Terminal themes are not hard to break. Put a &lt;code&gt;│&lt;/code&gt; in your prompt and it looks fine in your current font. SSH into a server running a different font, or open iTerm2 on a friend&amp;rsquo;s Mac, and suddenly your prompt is unreadable garbage. The same thing happens with arrows, triangles, and diamonds that look &amp;ldquo;clean&amp;rdquo; until they render as &lt;code&gt;?&lt;/code&gt; or &lt;code&gt;�&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Oh My Zsh has hundreds of themes. Most of them use special characters. Almost none of them thought about what happens when someone&amp;rsquo;s terminal does not speak UTF-8.&lt;/p&gt;
&lt;p&gt;I had a working solution already: a tiny prompt in my dotfiles that drew a line of dashes, showed my current directory, the git branch if I was in a repo, and nothing else. It worked everywhere because it was ASCII. Dash. Space. Alphanumeric. That was it.&lt;/p&gt;
&lt;h2 id="what-i-built"&gt;What I Built&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;clean-term&lt;/code&gt; is a standalone Oh My Zsh theme. 14 lines. No dependencies beyond git and zsh:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;──────────────────────────────────────────────────────────────────────────────
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ~/code/my-project main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is the whole prompt. A full-width dashed separator, the current working directory (bold white), the git branch if one exists (green), and a &lt;code&gt;&amp;gt;&lt;/code&gt; (or &lt;code&gt;#&lt;/code&gt; if you are root). No icons, no battery percentage, no exit code colors, no weather widget.&lt;/p&gt;
&lt;p&gt;The separator uses &lt;code&gt;printf&lt;/code&gt; and &lt;code&gt;$COLUMNS&lt;/code&gt; so it resizes with your terminal. The git branch is a simple &lt;code&gt;git branch --show-current 2&amp;gt;/dev/null&lt;/code&gt;. That is the entire implementation.&lt;/p&gt;
&lt;h2 id="why-ascii-only-matters"&gt;Why ASCII-Only Matters&lt;/h2&gt;
&lt;p&gt;This is not a style preference. This is a compatibility requirement. When your prompt contains non-ASCII bytes, you start getting rendering issues across fonts, across terminals, across SSH sessions. ASCII-safe means it works in every context without configuration.&lt;/p&gt;
&lt;p&gt;I tested this in Docker: a fresh Ubuntu container, default fonts, default locale, minimal install. Theme loaded, prompt rendered correctly, zero errors. The source file contains zero non-ASCII bytes. &lt;code&gt;grep -P '[^\x00-\x7F]' themes/clean-term.zsh-theme&lt;/code&gt; returns nothing.&lt;/p&gt;
&lt;h2 id="the-trade-off"&gt;The Trade-Off&lt;/h2&gt;
&lt;p&gt;You will not get a rainbow prompt. Branches are not colored by status. Your exit code does not turn your prompt red. This is intentional. Your terminal prompt should tell you where you are and what branch you are on, then get out of the way. Everything else is visual noise that competes with the actual output of the commands you are running.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;One curl command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sh -c &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -fsSL https://raw.githubusercontent.com/dereklarmstrong/clean-term-omz/main/install.sh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The installer handles both macOS and Linux &lt;code&gt;sed&lt;/code&gt; syntax. It clones the repo into &lt;code&gt;~/.oh-my-zsh/custom/themes/clean-term-omz&lt;/code&gt;, sets &lt;code&gt;ZSH_THEME&lt;/code&gt; and &lt;code&gt;ZSH_CUSTOM&lt;/code&gt; in your &lt;code&gt;.zshrc&lt;/code&gt;, and tells you to source it.&lt;/p&gt;
&lt;p&gt;Manual install is also documented in the README.&lt;/p&gt;
&lt;h2 id="why-publish-something-so-small"&gt;Why Publish Something So Small&lt;/h2&gt;
&lt;p&gt;Oh My Zsh does not accept community themes into the main repo. The standard pattern is to host a theme as a standalone repository. I already had people asking about my prompt in previous posts, so I made it easy for them to get it.&lt;/p&gt;
&lt;p&gt;Small is fine. The value is in solving a specific problem for a specific audience and making it frictionless to adopt.&lt;/p&gt;
&lt;h2 id="where-it-lives"&gt;Where It Lives&lt;/h2&gt;
&lt;p&gt;Source code:
&lt;/p&gt;
&lt;p&gt;MIT license. Fork it, modify it, or just grab the theme file and source it standalone.&lt;/p&gt;
&lt;h2 id="next"&gt;Next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
— A year of using AI-powered CLI tools and what I learned.&lt;/li&gt;
&lt;li&gt;
— Why I moved my Git hosting to Gitea and never looked back.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>