<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Productivity on Nick Liu - Software Engineer</title>
    <link>https://nick-liu.com/tags/productivity/</link>
    <description>Recent content in Productivity on Nick Liu - Software Engineer</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>nickboy@users.noreply.github.com (Nick Liu)</managingEditor>
    <webMaster>nickboy@users.noreply.github.com (Nick Liu)</webMaster>
    <copyright>2026 Nick Liu</copyright>
    <lastBuildDate>Fri, 10 Jul 2026 20:05:23 -0700</lastBuildDate><atom:link href="https://nick-liu.com/tags/productivity/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Make tmux Show What Each Window Is Doing</title>
      <link>https://nick-liu.com/posts/tmux-window-titles/</link>
      <pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>https://nick-liu.com/posts/tmux-window-titles/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;If you use tmux, you&#39;ve hit this: ten windows open and they&#39;re all named `zsh` or `node`. Which one had your AI agent running? No idea. Let&#39;s make tmux label windows usefully.&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;nav class=&#34;series-progress&#34; aria-label=&#34;Series progress&#34;&gt;&#xA;    &lt;span class=&#34;series-progress-label&#34;&gt;Taming Claude Code Sessions · Part 3 of 4&lt;/span&gt;&#xA;    &lt;ol class=&#34;series-progress-dots&#34;&gt;&lt;li class=&#34;series-progress-dot is-done&#34;&gt;&#xA;          &lt;a href=&#34;https://nick-liu.com/posts/find-claude-code-sessions/&#34; title=&#34;Stop Losing Your Claude Code Conversations&#34;&gt;1&lt;/a&gt;&#xA;        &lt;/li&gt;&lt;li class=&#34;series-progress-dot is-done&#34;&gt;&#xA;          &lt;a href=&#34;https://nick-liu.com/posts/first-claude-code-hook/&#34; title=&#34;Your First Claude Code Hook: Auto-Name Every Session&#34;&gt;2&lt;/a&gt;&#xA;        &lt;/li&gt;&lt;li class=&#34;series-progress-dot is-current&#34;&gt;&#xA;          &lt;a href=&#34;https://nick-liu.com/posts/tmux-window-titles/&#34; title=&#34;Make tmux Show What Each Window Is Doing&#34; aria-current=&#34;step&#34;&gt;3&lt;/a&gt;&#xA;        &lt;/li&gt;&lt;li class=&#34;series-progress-dot&#34;&gt;&#xA;          &lt;a href=&#34;https://nick-liu.com/posts/managing-many-ai-agents/&#34; title=&#34;Running Several AI Coding Agents Without Losing Track&#34;&gt;4&lt;/a&gt;&#xA;        &lt;/li&gt;&lt;/ol&gt;&#xA;  &lt;/nav&gt;&#xA;&lt;div class=&#34;tested-with&#34; role=&#34;note&#34;&gt;&#xA;  &lt;span class=&#34;tested-with-icon&#34; aria-hidden=&#34;true&#34;&gt;🧪&lt;/span&gt;&#xA;  &lt;span&gt;Tested with &lt;strong&gt;Claude Code&lt;/strong&gt; &lt;code&gt;2.1.x&lt;/code&gt; · macOS / Linux&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;&#xA;&#xA;&lt;div&#xA;  &#xA;    class=&#34;flex px-4 py-3 rounded-md shadow bg-primary-100 dark:bg-primary-900&#34;&#xA;  &#xA;  &gt;&#xA;  &lt;span&#xA;    &#xA;      class=&#34;text-primary-400 pe-3 flex items-center&#34;&#xA;    &#xA;    &gt;&#xA;    &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S224 177.7 224 160C224 142.3 238.3 128 256 128zM296 384h-80C202.8 384 192 373.3 192 360s10.75-24 24-24h16v-64H224c-13.25 0-24-10.75-24-24S210.8 224 224 224h32c13.25 0 24 10.75 24 24v88h16c13.25 0 24 10.75 24 24S309.3 384 296 384z&#34;/&gt;&lt;/svg&gt;&#xA;&lt;/span&gt;&#xA;  &lt;/span&gt;&#xA;&#xA;  &lt;span&#xA;    &#xA;      class=&#34;dark:text-neutral-300&#34;&#xA;    &#xA;    &gt;&lt;strong&gt;New to tmux?&lt;/strong&gt; It&amp;rsquo;s a &amp;ldquo;terminal multiplexer&amp;rdquo;: it splits one terminal into many windows and panes that survive disconnects. The only vocabulary you need here: a &lt;strong&gt;window&lt;/strong&gt; is like a browser tab inside tmux; the bar at the bottom lists them. The &lt;strong&gt;prefix&lt;/strong&gt; is the key you press before a tmux command, commonly &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;b&lt;/kbd&gt; (mine is &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;a&lt;/kbd&gt;).&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why everything is named &lt;code&gt;zsh&lt;/code&gt;&#xA;    &lt;div id=&#34;why-everything-is-named-zsh&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#why-everything-is-named-zsh&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;By default tmux has a setting called &lt;strong&gt;&lt;code&gt;automatic-rename&lt;/code&gt;&lt;/strong&gt; turned on. It&#xA;renames each window after whatever program is running in it. A shell? &lt;code&gt;zsh&lt;/code&gt;. A&#xA;Node program (like Claude Code)? &lt;code&gt;node&lt;/code&gt;. Helpful in theory, useless when&#xA;everything collapses to the same word.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Stop Losing Your Claude Code Conversations</title>
      <link>https://nick-liu.com/posts/find-claude-code-sessions/</link>
      <pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>https://nick-liu.com/posts/find-claude-code-sessions/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;You&#39;re deep in a great Claude Code conversation. You close the terminal. The next day you want to pick up where you left off… and you can&#39;t find it. Sound familiar? Let&#39;s fix that.&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;nav class=&#34;series-progress&#34; aria-label=&#34;Series progress&#34;&gt;&#xA;    &lt;span class=&#34;series-progress-label&#34;&gt;Taming Claude Code Sessions · Part 1 of 4&lt;/span&gt;&#xA;    &lt;ol class=&#34;series-progress-dots&#34;&gt;&lt;li class=&#34;series-progress-dot is-current&#34;&gt;&#xA;          &lt;a href=&#34;https://nick-liu.com/posts/find-claude-code-sessions/&#34; title=&#34;Stop Losing Your Claude Code Conversations&#34; aria-current=&#34;step&#34;&gt;1&lt;/a&gt;&#xA;        &lt;/li&gt;&lt;li class=&#34;series-progress-dot&#34;&gt;&#xA;          &lt;a href=&#34;https://nick-liu.com/posts/first-claude-code-hook/&#34; title=&#34;Your First Claude Code Hook: Auto-Name Every Session&#34;&gt;2&lt;/a&gt;&#xA;        &lt;/li&gt;&lt;li class=&#34;series-progress-dot&#34;&gt;&#xA;          &lt;a href=&#34;https://nick-liu.com/posts/tmux-window-titles/&#34; title=&#34;Make tmux Show What Each Window Is Doing&#34;&gt;3&lt;/a&gt;&#xA;        &lt;/li&gt;&lt;li class=&#34;series-progress-dot&#34;&gt;&#xA;          &lt;a href=&#34;https://nick-liu.com/posts/managing-many-ai-agents/&#34; title=&#34;Running Several AI Coding Agents Without Losing Track&#34;&gt;4&lt;/a&gt;&#xA;        &lt;/li&gt;&lt;/ol&gt;&#xA;  &lt;/nav&gt;&#xA;&lt;div class=&#34;tested-with&#34; role=&#34;note&#34;&gt;&#xA;  &lt;span class=&#34;tested-with-icon&#34; aria-hidden=&#34;true&#34;&gt;🧪&lt;/span&gt;&#xA;  &lt;span&gt;Tested with &lt;strong&gt;Claude Code&lt;/strong&gt; &lt;code&gt;2.1.x&lt;/code&gt; · macOS / Linux&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What is a &amp;ldquo;session,&amp;rdquo; and where does it go?&#xA;    &lt;div id=&#34;what-is-a-session-and-where-does-it-go&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#what-is-a-session-and-where-does-it-go&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Every time you run &lt;code&gt;claude&lt;/code&gt;, you start a &lt;strong&gt;session&lt;/strong&gt;, one conversation, with&#xA;its full history. When you quit, that history doesn&amp;rsquo;t vanish. Claude Code saves&#xA;it to disk, organized &lt;strong&gt;per project folder&lt;/strong&gt;, here:&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Claude Code vs Cursor vs Copilot vs Windsurf: An Honest 2026 Comparison</title>
      <link>https://nick-liu.com/posts/vibe-coding-tools-compared/</link>
      <pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>https://nick-liu.com/posts/vibe-coding-tools-compared/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;The AI coding tool landscape in 2026 has finally settled into four serious players: &lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    Claude Code&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;, &lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    Cursor&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;, &lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    GitHub Copilot&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;, and &lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    Windsurf&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;. I&#39;ve used all four on real work. This is the honest comparison.&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Forget feature checklists. What matters is how each tool feels under real engineering work, the kind I do every day as a senior software engineer at Meta. I built &lt;a href=&#34;https://nick-liu.com/posts/vibe-coding-workflow/&#34; &gt;this site&lt;/a&gt; primarily with Claude Code, but I&amp;rsquo;ve put serious hours into the others.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>My Vibe Coding Workflow: How I Built This Site with Claude Code</title>
      <link>https://nick-liu.com/posts/vibe-coding-workflow/</link>
      <pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>https://nick-liu.com/posts/vibe-coding-workflow/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;I rebuilt my portfolio site in a weekend using vibe coding with &lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    Claude Code&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;. This is the real workflow, no hype, with honest tradeoffs.&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Andrej Karpathy coined &amp;ldquo;vibe coding&amp;rdquo; in early 2025. The pitch: describe what you want in natural language, let the AI write the code, spend your time directing instead of typing. Collins Dictionary named it Word of the Year. Most takes on it are either breathless hype or dismissive eye-rolls. Here&amp;rsquo;s what it looks like when a senior engineer uses it for a real project.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Vibe Coding Won&#39;t Replace Senior Engineers. It Amplifies Them.</title>
      <link>https://nick-liu.com/posts/vibe-coding-senior-engineer/</link>
      <pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>https://nick-liu.com/posts/vibe-coding-senior-engineer/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;The hype says anyone can code now. The reality: vibe coding changes *what* senior engineers do, not *whether* we&#39;re needed. And the gap between experienced and inexperienced developers is getting wider, not narrower.&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Collins Dictionary named &amp;ldquo;vibe coding&amp;rdquo; their Word of the Year for 2025. Search interest spiked over 6,000%. The narrative is seductive: describe what you want, AI writes the code, programming becomes as easy as having a conversation.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Building a Knowledge Base That AI Can Actually Use</title>
      <link>https://nick-liu.com/posts/obsidian-claude-code-knowledge-base/</link>
      <pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>https://nick-liu.com/posts/obsidian-claude-code-knowledge-base/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;Obsidian + Claude Code is everywhere right now. But pointing an AI at a folder of markdown files and hoping for the best doesn&#39;t work. What matters is how you structure the knowledge base. Get that right, and Claude becomes genuinely useful. Get it wrong, and you get confident garbage.&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;There&amp;rsquo;s been a wave of posts about this combo lately: &lt;a href=&#34;https://x.com/jameesy/status/2026628809424781787&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;James Bedford&amp;rsquo;s full walkthrough&lt;/a&gt;, &lt;a href=&#34;https://x.com/gregisenberg/status/2026036464287412412&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Greg Isenberg&amp;rsquo;s &amp;ldquo;personal OS&amp;rdquo; approach&lt;/a&gt;, &lt;a href=&#34;https://x.com/kepano/status/2008578873903206895&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;kepano (Obsidian&amp;rsquo;s CEO) sharing Claude Skills&lt;/a&gt;. They&amp;rsquo;re all worth reading.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>What I Learned from How Claude Code&#39;s Creator Uses Claude Code</title>
      <link>https://nick-liu.com/posts/boris-claude-code-tips/</link>
      <pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>https://nick-liu.com/posts/boris-claude-code-tips/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;Boris Cherny created Claude Code. When he shared how he actually uses it day-to-day, the setup was surprisingly simple. I went through every tip, tried most of them, and have opinions about all of them.&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;The original thread is on &lt;a href=&#34;https://x.com/bcherny/status/2007179832300581177&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Boris&amp;rsquo;s X account&lt;/a&gt;. A good companion site is &lt;a href=&#34;https://howborisusesclaudecode.com&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;howborisusesclaudecode.com&lt;/a&gt; which compiles everything in one place.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Catppuccin Mocha: Why I Theme Everything the Same Color</title>
      <link>https://nick-liu.com/posts/catppuccin-mocha-theming/</link>
      <pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>https://nick-liu.com/posts/catppuccin-mocha-theming/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;Your development environment should feel like **one cohesive tool**, not a collection of unrelated windows with clashing colors. I theme everything with the same palette: &lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    Catppuccin Mocha&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;. The result is a workspace where context-switching between tools is effortless.&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why One Palette Everywhere?&#xA;    &lt;div id=&#34;why-one-palette-everywhere&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#why-one-palette-everywhere&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Most developers pick a theme for their editor and call it a day. Their terminal is one color, their editor another, their tmux status bar a third, and their Git diffs something else entirely. Every time they switch contexts, their brain spends a fraction of a second recalibrating.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>My Terminal Setup in 2026: Ghostty, tmux, and Neovim</title>
      <link>https://nick-liu.com/posts/my-terminal-setup-2026/</link>
      <pubDate>Sun, 15 Feb 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>https://nick-liu.com/posts/my-terminal-setup-2026/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;After years of refining my terminal workflow, I&#39;ve landed on a stack I genuinely enjoy using every day: **Ghostty** as the terminal emulator, **tmux** with **sesh** for session management, and **Neovim** with **LazyVim** for editing.&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Everything runs on macOS (Apple Silicon) with a consistent &lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    Catppuccin Mocha&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA; theme across all tools.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Modern CLI Tools That Replaced My Unix Classics</title>
      <link>https://nick-liu.com/posts/modern-cli-tools-replacing-unix-classics/</link>
      <pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>https://nick-liu.com/posts/modern-cli-tools-replacing-unix-classics/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;I&#39;ve been gradually replacing classic Unix tools with modern alternatives, mostly written in &lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    Rust&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;. After a year of daily use, these aren&#39;t experiments anymore. They&#39;re muscle memory.&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Replacements&#xA;    &lt;div id=&#34;the-replacements&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-replacements&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Classic&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Modern&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Why&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;cat&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    bat&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Syntax highlighting, line numbers, git integration&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;ls&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    eza&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Icons, git status, tree view, color-coded&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;grep&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    ripgrep&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;10x faster, respects &lt;code&gt;.gitignore&lt;/code&gt;, smart case&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;find&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    fd&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Simpler syntax, respects &lt;code&gt;.gitignore&lt;/code&gt;, colored output&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;cd&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    zoxide&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Learns your habits, fuzzy matching&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;sed&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    sd&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Intuitive regex syntax, no escaping nightmare&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;du&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    dust&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Visual directory size with a tree view&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;df&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    duf&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Colorful, filterable disk usage&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;top&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    btop&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Beautiful TUI with mouse support, per-core graphs&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;ps&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    procs&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Colorized, searchable, tree view&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;history&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;span class=&#34;flex cursor-pointer&#34;&gt;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;    &lt;span&#xA;      class=&#34;rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400&#34;&gt;&#xA;  &#xA;    atuin&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Encrypted sync, full-text search, workspace filtering&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;Setting Up Aliases&#xA;    &lt;div id=&#34;setting-up-aliases&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#setting-up-aliases&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;In my &lt;code&gt;.zshrc&lt;/code&gt;, I alias the classics to their replacements so the transition is invisible:&lt;/p&gt;</description>
      
    </item>
    
  </channel>
</rss>
