<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Nick Liu - Software Engineer</title>
    <link>/posts/</link>
    <description>Recent content in Posts 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>Sat, 21 Mar 2026 17:30:33 -0700</lastBuildDate><atom:link href="/posts/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Building a Knowledge Base That AI Can Actually Use</title>
      <link>/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>/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;  Obsidian + Claude Code is everywhere right now. But pointing an AI at a folder of markdown files and hoping for the best doesn&amp;rsquo;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;&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>/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>/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;  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;&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>Case Study: Building AWS Billing&#39;s Unbilled Usage Auditor</title>
      <link>/posts/case-study-aws-billing-auditor/</link>
      <pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>/posts/case-study-aws-billing-auditor/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  I spent five years on the AWS Billing team. The hardest problem I tackled was detecting when customers used AWS services but weren&amp;rsquo;t charged correctly. This post walks through how I designed a system that reduced charge discrepancies by &lt;strong&gt;300x&lt;/strong&gt; and eliminated &lt;strong&gt;230 million&lt;/strong&gt; monthly false positives.&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Problem&#xA;    &lt;div id=&#34;the-problem&#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-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;AWS billing is trickier than it looks. When a customer launches an EC2 instance, writes to S3, or queries DynamoDB, each action generates a usage record. These records flow through a pipeline that calculates charges based on the customer&amp;rsquo;s pricing plan, region, and service tier.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Case Study: Fleet-Scale Kernel Automation at Twitter</title>
      <link>/posts/case-study-twitter-fleet-automation/</link>
      <pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>/posts/case-study-twitter-fleet-automation/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  At Twitter, I was responsible for kernel updates across &lt;strong&gt;5,000+ production servers&lt;/strong&gt;. Updating a kernel is risky on one machine. Doing it across a fleet, without downtime, without data loss, and without breaking the services that millions of people depend on, is a different problem entirely.&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Problem&#xA;    &lt;div id=&#34;the-problem&#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-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Twitter&amp;rsquo;s production infrastructure ran on thousands of bare-metal servers across multiple data centers. Each server ran a Linux kernel that needed regular updates for security patches, performance improvements, and hardware compatibility.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Catppuccin Mocha: Why I Theme Everything the Same Color</title>
      <link>/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>/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;  &lt;p&gt;Your development environment should feel like &lt;strong&gt;one cohesive tool&lt;/strong&gt;, 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;&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;Catppuccin Mocha&#xA;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Finding the Bottom of a Valley Blindfolded: Understanding Gradient Descent</title>
      <link>/posts/ml-gradient-descent/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>/posts/ml-gradient-descent/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  Imagine you&amp;rsquo;re &lt;strong&gt;blindfolded on a mountain&lt;/strong&gt; and you need to find the lowest valley. You can&amp;rsquo;t see anything, but you &lt;em&gt;can&lt;/em&gt; feel the ground under your feet. What would you do? You&amp;rsquo;d feel which direction slopes downward, take a small step that way, and repeat. Congratulations — you just invented &lt;strong&gt;gradient descent&lt;/strong&gt;, the algorithm behind nearly every modern AI system.&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Why Should You Care?&#xA;    &lt;div id=&#34;why-should-you-care&#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-should-you-care&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Optimization is everywhere. When your GPS finds the fastest route, when Netflix recommends a movie, when your phone recognizes your face — behind all of these is an algorithm trying to find the &lt;strong&gt;best possible answer&lt;/strong&gt; from a sea of possibilities. Gradient descent is &lt;em&gt;the&lt;/em&gt; workhorse algorithm that makes this happen.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>How Machines Ask Smart Questions: Entropy &amp; Information Gain</title>
      <link>/posts/ml-entropy-and-information-gain/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>/posts/ml-entropy-and-information-gain/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  Imagine you&amp;rsquo;re playing &lt;strong&gt;20 Questions&lt;/strong&gt;. You&amp;rsquo;re trying to guess what animal your friend is thinking of. Would you start with &amp;ldquo;Is it a golden retriever?&amp;rdquo; or &amp;ldquo;Does it live in water?&amp;rdquo; The second question is obviously smarter — it eliminates roughly half the possibilities in one shot. Decision trees in machine learning work exactly the same way, and they use &lt;strong&gt;entropy&lt;/strong&gt; and &lt;strong&gt;information gain&lt;/strong&gt; to figure out what the smartest question is.&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What&amp;rsquo;s the Big Idea?&#xA;    &lt;div id=&#34;whats-the-big-idea&#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;#whats-the-big-idea&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When a machine learning algorithm builds a &lt;span class=&#34;flex cursor-pointer&#34;&gt;&#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;    Decision Tree&#xA;  &lt;/span&gt;&#xA;&lt;/span&gt;&#xA;&#xA;, it needs to decide which question to ask first. Should it split the data by color? By size? By temperature? The answer comes from a beautifully simple concept: &lt;strong&gt;ask the question that reduces uncertainty the most&lt;/strong&gt;.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>How Neural Networks Learn from Mistakes: Backpropagation Explained</title>
      <link>/posts/ml-backpropagation/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>/posts/ml-backpropagation/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  When a factory produces a defective product, how do you trace the problem back through the assembly line to find which worker made the mistake? Neural networks face the exact same challenge. They have layers of &amp;ldquo;workers&amp;rdquo; (neurons), and when the final output is wrong, they need to figure out &lt;strong&gt;who&amp;rsquo;s responsible&lt;/strong&gt; — and by how much. The algorithm that solves this is called &lt;strong&gt;backpropagation&lt;/strong&gt;, and it&amp;rsquo;s the reason deep learning works at all.&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Neural Networks Are Everywhere&#xA;    &lt;div id=&#34;neural-networks-are-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;#neural-networks-are-everywhere&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Before we dive into how neural networks &lt;em&gt;learn&lt;/em&gt;, let&amp;rsquo;s appreciate what they do. The phone in your pocket uses neural networks for face recognition, voice transcription, photo enhancement, and text prediction. Self-driving cars, medical image analysis, language translation — all neural networks.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>My Terminal Setup in 2026: Ghostty, tmux, and Neovim</title>
      <link>/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>/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;  After years of refining my terminal workflow, I&amp;rsquo;ve landed on a stack I genuinely enjoy using every day: &lt;strong&gt;Ghostty&lt;/strong&gt; as the terminal emulator, &lt;strong&gt;tmux&lt;/strong&gt; with &lt;strong&gt;sesh&lt;/strong&gt; for session management, and &lt;strong&gt;Neovim&lt;/strong&gt; with &lt;strong&gt;LazyVim&lt;/strong&gt; for editing.&#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;  &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;    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>/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>/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;  &lt;p&gt;I&amp;rsquo;ve been gradually replacing classic Unix tools with modern alternatives, mostly written in &lt;span class=&#34;flex cursor-pointer&#34;&gt;&#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;Rust&#xA;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;. After a year of daily use, these aren&amp;rsquo;t experiments anymore — they&amp;rsquo;re muscle memory.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Managing Dotfiles Like a Pro with Yadm</title>
      <link>/posts/managing-dotfiles-with-yadm/</link>
      <pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate>
      <author>nickboy@users.noreply.github.com (Nick Liu)</author>
      <guid>/posts/managing-dotfiles-with-yadm/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  Every developer eventually reaches the point where their configs become too valuable to lose. Here&amp;rsquo;s how I use &lt;strong&gt;yadm&lt;/strong&gt; to manage my macOS dotfiles with automated testing, daily maintenance, and a pre-commit workflow that keeps everything in check.&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;For me, the turning point was spending a weekend setting up a new MacBook and realizing I couldn&amp;rsquo;t reproduce my environment reliably. That&amp;rsquo;s when I started managing my dotfiles properly.&lt;/p&gt;</description>
      
    </item>
    
  </channel>
</rss>
