<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ai on Nick Liu - Software Engineer</title>
    <link>https://nick-liu.com/tags/ai/</link>
    <description>Recent content in Ai 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/ai/index.xml" rel="self" type="application/rss+xml" />
    
    <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>The Claude Code hooks docs are wrong. Here&#39;s what&#39;s actually on the wire.</title>
      <link>https://nick-liu.com/posts/claude-code-hooks-reality/</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/claude-code-hooks-reality/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &#xA;I wrote a daemon to listen to Claude Code hooks. My first version read `$CLAUDE_HOOK_PAYLOAD` and logged empty bodies for two days straight. The payload was sitting on stdin the whole time.&#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;Building ClaudeDeck · Part 1 of 10&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/claude-code-hooks-reality/&#34; title=&#34;The Claude Code hooks docs are wrong. Here&amp;#39;s what&amp;#39;s actually on the wire.&#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/streamdeck-sdk-quirks/&#34; title=&#34;Two Stream Deck SDK quirks that cost me a weekend&#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/lru-session-eviction/&#34; title=&#34;Five Stream Deck keys, N Claude sessions: LRU that keeps the order I see&#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/statusline-side-channel/&#34; title=&#34;The Claude Code statusline is a per-turn telemetry side channel&#34;&gt;4&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/plan-usage-statusline-pivot/&#34; title=&#34;I polled an undocumented endpoint for 18 hours. The data was on stdin.&#34;&gt;5&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/permission-round-trip/&#34; title=&#34;Holding HTTP open for 590 seconds so a Stream Deck key can approve a tool call&#34;&gt;6&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/pty-wrap-migration/&#34; title=&#34;I split my daemon in two so a Node subprocess could own the PTY&#34;&gt;7&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/tcc-cdhash-trap/&#34; title=&#34;TCC pins your Accessibility grant to a cdhash. Every rebuild breaks it.&#34;&gt;8&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/tahoe-hotkey-dead-end/&#34; title=&#34;What replaced CGEventPost in my Stream Deck daemon&#34;&gt;9&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/launchd-bootstrap-debugging/&#34; title=&#34;launchctl unload returned 0. The daemon was still running. KeepAlive raced.&#34;&gt;10&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&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;This post is the five gotchas I hit while wiring up &lt;a href=&#34;https://github.com/nickboy/claudedeck&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;ClaudeDeck&lt;/a&gt;, a Stream Deck plugin (a small program that runs inside Elgato&amp;rsquo;s Stream Deck app on the USB grid of programmable LCD keys) that talks to Claude Code over its hooks system. Claude Code is Anthropic&amp;rsquo;s terminal CLI for Claude (&lt;code&gt;claude&lt;/code&gt; in your shell), and its hooks are user-defined scripts it spawns at certain points in a session (before a tool call, on session start, on prompt submit). My daemon is a long-running background process the plugin and the hooks both talk to over a local socket. None of the gotchas are exotic. All of them cost me hours. Each one is a place where the docs were either silent, ambiguous, or contradicted by tribal knowledge I picked up from other people&amp;rsquo;s projects.&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>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>
    
  </channel>
</rss>
