<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JessYT</title>
    <description>The latest articles on DEV Community by JessYT (@jessyt).</description>
    <link>https://dev.to/jessyt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3929396%2F258b3757-050e-4d7f-9578-f524506551bc.png</url>
      <title>DEV Community: JessYT</title>
      <link>https://dev.to/jessyt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jessyt"/>
    <language>en</language>
    <item>
      <title>Raycast: Why I Use It Instead of Spotlight</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Tue, 02 Jun 2026 21:06:32 +0000</pubDate>
      <link>https://dev.to/jessyt/raycast-why-i-use-it-instead-of-spotlight-58f9</link>
      <guid>https://dev.to/jessyt/raycast-why-i-use-it-instead-of-spotlight-58f9</guid>
      <description>&lt;h1&gt;
  
  
  Raycast: Why I Use It Instead of Spotlight
&lt;/h1&gt;

&lt;p&gt;Raycast is a launcher that replaces Spotlight, macOS's built-in search bar. But it's not just a "prettier Spotlight." The whole point is turning that app-launch shortcut into a work hub that handles clipboard history, window tiling, text autocomplete, and script execution all in one place. This post walks through what Raycast is, how to set it up the first time, which features to try first, and the gotchas worth knowing in advance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spotlight already works — so why switch?
&lt;/h2&gt;

&lt;p&gt;If you use macOS, you've almost certainly hit &lt;code&gt;⌘Space&lt;/code&gt; to bring up Spotlight, searched for an app, and launched it. It's fast and convenient. But that's where it ends. Once the app is open, everything that comes next — pasting back something you just copied, snapping a window to half the screen, typing a phrase you use constantly — lives in a different app, behind a different shortcut.&lt;/p&gt;

&lt;p&gt;Raycast starts from one idea: "let's pull all those scattered tasks into the same search bar." You open a single window with a shortcut, type a few characters, and it doesn't just launch apps — it searches your clipboard, tiles windows, runs calculations, and fires extensions. The biggest change is how much less your hands leave the keyboard to go digging through menus with the mouse.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Spotlight&lt;/th&gt;
&lt;th&gt;Raycast&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Launch apps · search files&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Re-paste something copied earlier&lt;/td&gt;
&lt;td&gt;No (needs a separate app)&lt;/td&gt;
&lt;td&gt;Built in (Clipboard History)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snap windows to half-screen · maximize&lt;/td&gt;
&lt;td&gt;No (needs a separate app)&lt;/td&gt;
&lt;td&gt;Built in (Window Management)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-type frequently used phrases&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Built in (Snippets)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drive external tools like GitHub · Linear&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, via extensions (Store)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to set it up on first launch
&lt;/h2&gt;

&lt;p&gt;After you install and open Raycast, the first thing you decide is the trigger shortcut. The default is &lt;code&gt;⌥Space&lt;/code&gt; (Option + Space), but a lot of people prefer to hand Raycast the &lt;code&gt;⌘Space&lt;/code&gt; slot that Spotlight occupies. You keep the key your hands already know.&lt;/p&gt;

&lt;p&gt;There's one catch, though. macOS assigns &lt;code&gt;⌘Space&lt;/code&gt; to Spotlight by default, so if you leave it as-is, the two collide. The usual order is to &lt;strong&gt;first clear or remap the Spotlight shortcut in System Settings&lt;/strong&gt;, then set Raycast's trigger to &lt;code&gt;⌘Space&lt;/code&gt; in its preferences.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Setup order:&lt;/strong&gt; ① System Settings → Keyboard → Keyboard Shortcuts → Spotlight → disable (or change) the "Show Spotlight search" shortcut → ② Raycast Settings → General → set Raycast Hotkey to the key you want. Follow this order and the shortcuts won't clash.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Also, some features like window tiling have to move other apps' windows, so macOS asks for &lt;strong&gt;Accessibility permission&lt;/strong&gt;. The first time you run a window-tiling command, a permission prompt appears — grant Raycast access once in System Settings and it works smoothly from then on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can use right after installing
&lt;/h2&gt;

&lt;p&gt;Even without installing a single extension, the out-of-the-box feature set is surprisingly broad. It effectively absorbs several small utilities you'd otherwise install separately. Let's go through them one by one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clipboard History — pull back what you copied
&lt;/h3&gt;

&lt;p&gt;Copy something, then copy something else, and the previous item is gone. Clipboard History keeps a record of copied text and images so you can search and re-paste the one you want. Assign it a shortcut and you can pop the history list anywhere to instantly find "that link from earlier."&lt;/p&gt;

&lt;h3&gt;
  
  
  Window Management — tile windows with the keyboard
&lt;/h3&gt;

&lt;p&gt;Move a window to the left half, right half, or full screen with a single command. Instead of grabbing a window corner with the mouse and dragging, you type a command like "left half" into the search bar or bind it to a shortcut. There are also commands to throw a window onto the next display on a dual-monitor setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Snippets — autocomplete phrases you reuse
&lt;/h3&gt;

&lt;p&gt;Register repeated text — an email address, a common greeting, a signature — under a keyword, and the moment you type that keyword it expands into the full phrase. For example, you can make typing &lt;code&gt;;mail&lt;/code&gt; insert your email address. It also supports dynamic snippets that auto-fill the date.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quicklinks · Calculator · Search
&lt;/h3&gt;

&lt;p&gt;Quicklinks for registering frequently opened URLs or site-specific searches as commands, a Calculator for doing math and converting units · currencies right in the window, and search for finding and opening files and folders — all built in. This is where the feeling of "I start pretty much everything from one search bar" takes hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real difference comes from the Store
&lt;/h2&gt;

&lt;p&gt;What gives Raycast its character is the Store. Community extensions let you drive tools like GitHub, Jira, Linear, Homebrew, color pickers, and translators straight from the search bar. Installing is simple: open "Store" from the search bar, find the extension you want, install it, and its commands immediately join your search results.&lt;/p&gt;

&lt;p&gt;For developers, the flow that really lands is something like this: checking your PR list from the search bar without opening a browser to GitHub, or searching and installing a Homebrew package without opening a terminal. Instead of "moving to a tool's window to use the tool," it shifts to "calling the tool from the search bar."&lt;/p&gt;

&lt;h2&gt;
  
  
  One step further — register your own scripts as commands
&lt;/h2&gt;

&lt;p&gt;If you want to automate repetitive work, Script Commands are powerful. Register a shell or Python script as a Raycast command and you can run it just by typing its name into the search bar. All it takes is adding a block of structured comments (metadata) at the top of the script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Raycast metadata&lt;/span&gt;
&lt;span class="c"&gt;# @raycast.schemaVersion 1&lt;/span&gt;
&lt;span class="c"&gt;# @raycast.title Copy today's date&lt;/span&gt;
&lt;span class="c"&gt;# @raycast.mode silent&lt;/span&gt;

&lt;span class="c"&gt;# Actual action&lt;/span&gt;
&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="s2"&gt;"+%Y-%m-%d"&lt;/span&gt; | pbcopy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop a script saved like this into Raycast's Script Commands folder, and the moment you find and run "Copy today's date" from the search bar, today's date lands on your clipboard. Build commands you run often — build scripts, server logins, opening logs — into a single search-bar line this way.&lt;/p&gt;

&lt;h2&gt;
  
  
  How far does free go, and what's paid?
&lt;/h2&gt;

&lt;p&gt;Personal use is free, and the free tier covers most of what's described above. Some features like team-wide sync and Raycast AI belong to the paid Pro plan. That said, plan structure, pricing, and the free/paid line all change over time, so for the exact, current details it's safest to check the pricing page on the official site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas worth knowing in advance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shortcut conflicts:&lt;/strong&gt; as covered above, to use &lt;code&gt;⌘Space&lt;/code&gt; you have to clear the Spotlight shortcut first. Otherwise both windows respond at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission prompts:&lt;/strong&gt; window tiling and some extensions need Accessibility permission. Without it, those specific commands just silently fail to work, so it's worth granting it once at the start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uneven extension quality:&lt;/strong&gt; Store extensions are community-built, so their polish and maintenance vary. Sticking to extensions that are popular and have an update history is more reliable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; it's most mature on macOS right now. Rather than expecting the same experience elsewhere, keep in mind it's the tool that fits macOS users best.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So who is it for?
&lt;/h2&gt;

&lt;p&gt;If you prefer working from the keyboard over the mouse, and you already run a separate clipboard manager or window-tiling app, Raycast becomes a natural choice for merging them into one. Add extensions and scripts on top, and it goes beyond a simple launcher to become "the entrance to your workflow."&lt;/p&gt;

&lt;p&gt;On the other hand, if you only use Spotlight's app launching and need nothing more, there's little reason to switch. Rather than reaching for every feature from day one, I'd suggest binding just two — Clipboard History and Window Management — to shortcuts and living with them for about a week. Even those two alone make it easy to feel your hands leaving the keyboard less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.raycast.com/" rel="noopener noreferrer"&gt;Raycast official site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://manual.raycast.com/" rel="noopener noreferrer"&gt;Raycast Manual (official docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raycast.com/store" rel="noopener noreferrer"&gt;Raycast Store (extensions)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.raycast.com/basics/create-your-first-extension" rel="noopener noreferrer"&gt;Raycast Developer Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This post is an overview based on the official docs and Store rather than a long-term hands-on review. Specific features, shortcuts, and pricing may change with updates, so I recommend checking the settings screen and the official documentation alongside it.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/raycast-why-i-use-it-instead-of-spotlight/" rel="noopener noreferrer"&gt;https://jessinvestment.com/raycast-why-i-use-it-instead-of-spotlight/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>raycast</category>
      <category>productivity</category>
      <category>macos</category>
      <category>launcher</category>
    </item>
    <item>
      <title>How One Word 'Workflow' Spins Up Hundreds of Claude Code Agents</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Tue, 02 Jun 2026 21:04:13 +0000</pubDate>
      <link>https://dev.to/jessyt/how-one-word-workflow-spins-up-hundreds-of-claude-code-agents-2md6</link>
      <guid>https://dev.to/jessyt/how-one-word-workflow-spins-up-hundreds-of-claude-code-agents-2md6</guid>
      <description>&lt;h1&gt;
  
  
  How One Word 'Workflow' Spins Up Hundreds of Claude Code Agents
&lt;/h1&gt;

&lt;p&gt;I run a few dozen automation jobs. They've always been independent jobs, each spinning up on its own. Then Claude Code shipped Dynamic Workflows, where a single session orchestrates hundreds of agents in the background by itself. It looked close enough to what I've been doing that I spent a few days digging into it firsthand.&lt;/p&gt;

&lt;h2&gt;
  
  
  One word, "workflow," and Claude writes the script itself
&lt;/h2&gt;

&lt;p&gt;Dynamic Workflows dropped as a research preview on May 28. It kicks in when I drop the word "workflow" into a prompt, or type &lt;code&gt;/effort ultracode&lt;/code&gt;. It shows up on Claude Code v2.1.154 and above.&lt;/p&gt;

&lt;p&gt;The behavior was a little unusual. Claude takes my task and, right there on the spot, writes a JavaScript orchestration script itself. That script fans out dozens to hundreds of subagents in the background at once, and checks the results itself once before handing them back to me.&lt;/p&gt;

&lt;p&gt;Up to 1,000 agents per run, with concurrency capped at 16 at a time. &lt;strong&gt;The key part was that I didn't have to spawn each job by hand.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The real story was how it differs from my automation
&lt;/h2&gt;

&lt;p&gt;At first I thought, "Isn't this just what I've been doing for a year?" But after a few days, the grain was completely different.&lt;/p&gt;

&lt;p&gt;My few dozen automation jobs are all independent jobs scheduled by launchd. Publishing jobs separately, market monitoring separately, English study separately. They don't share the same reasoning context — each one wakes up at a set time, does its own work, and goes back to sleep.&lt;/p&gt;

&lt;p&gt;Dynamic Workflows was the opposite. It splits one task into hundreds of branches inside a single session. &lt;strong&gt;It's not a schedule — it's a fan-out that unfolds all at once.&lt;/strong&gt; For one big task like "audit this whole repo, file by file, in parallel," this fit way better than my cron approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  I ran one small workflow myself
&lt;/h2&gt;

&lt;p&gt;I didn't get greedy — I started with something small. A task that scanned the files in one directory in parallel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;claude
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; review and summarize each .py file &lt;span class="k"&gt;in &lt;/span&gt;this directory &lt;span class="k"&gt;in &lt;/span&gt;parallel as a workflow

&lt;span class="c"&gt;# Claude writes a JS script on the spot&lt;/span&gt;
&lt;span class="c"&gt;# one subagent per file, fanned out in the background (up to 16 concurrent)&lt;/span&gt;
&lt;span class="c"&gt;# checks each result itself, then replies all at once&lt;/span&gt;
&lt;span class="c"&gt;# meanwhile my session stays responsive (watch progress with /workflows)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What struck me was that the session doesn't block. While it ran in the background, I could keep asking other things in the same session. Type &lt;code&gt;/workflows&lt;/code&gt; and you get a one-liner showing how many are running and how many are done. &lt;strong&gt;It feels like firing it off, doing something else, and just collecting the results.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Still, I didn't tear down my cron jobs
&lt;/h2&gt;

&lt;p&gt;Honestly, I didn't replace my automation jobs with this. It's still a research preview, but on paid plans it's open from Pro on up. (On Pro you have to flip it on once in the settings.)&lt;/p&gt;

&lt;p&gt;And the whole point of my jobs is that they "wake up on their own at a fixed time," so they were never the same use case as Dynamic Workflows, which fans out inside a single session. So I decided to split the labor like this: recurring work on a fixed schedule stays a launchd scheduled job, and one-off work I want to slice up big at once goes to a workflow. &lt;strong&gt;They're not competing — they're tools in different seats.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If something like a full-repo migration or a large-scale audit comes up — something I need to spread wide in one shot — I'll call workflow without hesitation. For now I'm going to keep the labor split like this and run with it some more.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://code.claude.com/docs/en/workflows" rel="noopener noreferrer"&gt;Claude Code Docs — Orchestrate subagents at scale with dynamic workflows&lt;/a&gt; · &lt;a href="https://claude.com/blog/introducing-dynamic-workflows-in-claude-code" rel="noopener noreferrer"&gt;Anthropic — Introducing dynamic workflows in Claude Code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a first-person write-up from a few days of hands-on use. It's a research-preview feature, so plans and behavior may change. I received no sponsorship of any kind from Anthropic.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/how-one-word-workflow-spins-up-hundreds-of-claude-code-agents/" rel="noopener noreferrer"&gt;https://jessinvestment.com/how-one-word-workflow-spins-up-hundreds-of-claude-code-agents/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>dynamicworkflows</category>
      <category>aiagents</category>
      <category>automation</category>
    </item>
    <item>
      <title>Claude Code's /reload-skills Ended My Constant Session Restarts</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Tue, 02 Jun 2026 21:02:39 +0000</pubDate>
      <link>https://dev.to/jessyt/claude-codes-reload-skills-ended-my-constant-session-restarts-1p60</link>
      <guid>https://dev.to/jessyt/claude-codes-reload-skills-ended-my-constant-session-restarts-1p60</guid>
      <description>&lt;h1&gt;
  
  
  Claude Code can finally reload skills without a session restart
&lt;/h1&gt;

&lt;p&gt;Almost everything I run daily is a Claude Code skill. Publishing, English study, market monitoring — all of it. So I end up editing skill files several times a day, and until now, changing a single line meant tearing down the whole session and starting it back up just to make the new content take effect. That whole dance is now one line: &lt;code&gt;/reload-skills&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  I was restarting whole sessions to fix one line in a skill
&lt;/h2&gt;

&lt;p&gt;I don't write a skill perfectly in one shot. I run it, cut one awkward sentence, add one more condition… I shape it bit by bit like that.&lt;/p&gt;

&lt;p&gt;But before this, even after I fixed that one line, the running session was still holding onto the old skill. To test the new version I had to close the session and open it again — and every time, the context I'd built up went with it. That got annoying fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  /reload-skills rescans in one line
&lt;/h2&gt;

&lt;p&gt;The new &lt;code&gt;/reload-skills&lt;/code&gt; re-reads the skills directory without killing the session. I edit a file, type this command, and I can keep testing the updated skill right there in the same session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;claude
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;edit one line &lt;span class="k"&gt;in &lt;/span&gt;a skill file and save&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /reload-skills

&lt;span class="c"&gt;# rescans the skills directory without restarting&lt;/span&gt;
&lt;span class="c"&gt;# context intact, straight back to testing the updated skill&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This might sound minor, but the biggest thing for me is fixing things without throwing away context. If your day involves touching skills several times, every single one of those restarts adds up.&lt;/p&gt;

&lt;p&gt;The one that hit me most often was my publishing skill. Every time I ran it once and thought "I need to drop one condition here," the old way meant closing out everything I had in progress just to fix that one line. Now I delete that line in the skill file, type &lt;code&gt;/reload-skills&lt;/code&gt;, and run it again from the exact same spot. The loop of test, fix, test again got a lot shorter.&lt;/p&gt;

&lt;h2&gt;
  
  
  I wired it into my SessionStart hook too
&lt;/h2&gt;

&lt;p&gt;I like to auto-load a bunch of things with a hook when a session starts. So whenever a hook installed a new skill, it wouldn't show up in that session — only from the next one — and that always bugged me.&lt;/p&gt;

&lt;p&gt;Turns out if a SessionStart hook returns &lt;code&gt;reloadSkills: true&lt;/code&gt;, it rescans right there. That let me use a hook-installed skill in the same session. (I didn't know this and spent a while going "why isn't it showing up this session" 😭)&lt;/p&gt;

&lt;h2&gt;
  
  
  There are still times you have to restart
&lt;/h2&gt;

&lt;p&gt;It doesn't cover everything. &lt;code&gt;/reload-skills&lt;/code&gt; was enough when I was editing the contents inside a skill, but when I touched settings themselves or a hook definition, reopening the session was the cleaner move.&lt;/p&gt;

&lt;p&gt;Still, for someone like me who edits skill bodies all the time, just cutting down the number of restarts was enough to feel the difference. At this point, fixing a skill and typing &lt;code&gt;/reload-skills&lt;/code&gt; is basically muscle memory.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://code.claude.com/docs/en/changelog" rel="noopener noreferrer"&gt;Claude Code — Changelog (v2.1.152)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a first-person write-up after using it myself for a few days. I received no sponsorship of any kind from Anthropic.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/claude-codes-reload-skills-ended-my-constant-session-restarts/" rel="noopener noreferrer"&gt;https://jessinvestment.com/claude-codes-reload-skills-ended-my-constant-session-restarts/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>slashcommands</category>
      <category>aitooling</category>
      <category>aicoding</category>
    </item>
    <item>
      <title>Opus 4.8's Default 1M Context Window Is the Upgrade I Notice Most</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Tue, 02 Jun 2026 21:01:20 +0000</pubDate>
      <link>https://dev.to/jessyt/opus-48s-default-1m-context-window-is-the-upgrade-i-notice-most-300h</link>
      <guid>https://dev.to/jessyt/opus-48s-default-1m-context-window-is-the-upgrade-i-notice-most-300h</guid>
      <description>&lt;p&gt;This is a straightforward text transformation task — no skills apply. Here's the converted markdown:&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FPwQjb%2FdJMcahdxSMK%2FAAAAAAAAAAAAAAAAAAAAAAnb0qSGXY---bEItg_VmNmF1HNXDiVc9R5Aj4T6TBvJ%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1780239599%26allow_ip%3D%26allow_referer%3D%26signature%3DHps03diT9%252BIsDZSWcMoEFmbVUFk%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FPwQjb%2FdJMcahdxSMK%2FAAAAAAAAAAAAAAAAAAAAAAnb0qSGXY---bEItg_VmNmF1HNXDiVc9R5Aj4T6TBvJ%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1780239599%26allow_ip%3D%26allow_referer%3D%26signature%3DHps03diT9%252BIsDZSWcMoEFmbVUFk%253D" alt="Opus 4.8: the default 1M context window is what I notice most in long sessions" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Opus 4.8: the default 1M context window is what I notice most in long sessions
&lt;/h1&gt;

&lt;p&gt;Claude Code moved to Opus 4.8 a few days ago, and the default context window is now 1M. I run several long-lived automation jobs, and the old pain was predictable: once a session ran long enough, the context would fill up and I'd have to hit /compact or spin up a fresh session. With 1M as the default, that happens far less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opus 4.8 shipped on May 28
&lt;/h2&gt;

&lt;p&gt;Anthropic released Opus 4.8 on May 28, 2026. The thing that jumped out at me was the default 1M context window. It's 1M on the Claude API, Amazon Bedrock, and Vertex AI, while Microsoft Foundry is 200k. Max output is 128k.&lt;/p&gt;

&lt;p&gt;Pricing stays the same as 4.7. Bumping the model without raising the per-token price was a welcome detail for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  For someone running long sessions, this was the big one
&lt;/h2&gt;

&lt;p&gt;The default 1M landed harder for me than the benchmark numbers did. Before, long sessions filling up their context and breaking my flow was the most annoying part. Working with long automation-job logs attached, I hit it even more often.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ claude
&amp;gt; /model
# Check that it's running as Opus 4.8 (1M context)
# Before, long sessions would fill up the context and I'd hit /compact or open a new session
# With 1M as the default, that happens noticeably less
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's only been about two days, but I'm carrying long sessions straight through more often. If you keep an entire large repo loaded while you work, you'll probably feel it even more.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benchmarks and honesty gains are from the announcement
&lt;/h2&gt;

&lt;p&gt;Per the release notes, agentic coding went from 64.3% to 69.2% and reasoning from 54.7% to 57.9%. I didn't measure these myself — these are the numbers from the announcement, so I'm just passing them along.&lt;/p&gt;

&lt;p&gt;The honesty improvement was more interesting to me. Anthropic said Opus 4.8 lets flaws in its own code slide roughly 4x less often than 4.7. That's not something I can confirm in a few days, though, so I've left it as something to watch for a while.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fast mode got faster and cheaper
&lt;/h2&gt;

&lt;p&gt;Fast mode got some work too. On Opus 4.8 it's about 2.5x faster and costs less than before. You still turn it on with /fast, and it doesn't drop you to a smaller model — it's the same Opus running faster.&lt;/p&gt;

&lt;p&gt;I don't usually run fast mode, so I can't say much here yet. For light tasks that need quick responses, I'm planning to leave it on and run it for a few more days.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm watching over the next few days
&lt;/h2&gt;

&lt;p&gt;In the end, the core of Opus 4.8 for me was the default 1M context. More than how many percentage points a benchmark moved, long sessions not breaking is the difference that adds up day after day.&lt;/p&gt;

&lt;p&gt;Whether the honesty improvement actually shows up is something I'll only know after running the same kinds of tasks for a while. For now, just having the context fill up less is plenty to be happy about.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://www.anthropic.com/news" rel="noopener noreferrer"&gt;Anthropic — News&lt;/a&gt; · &lt;a href="https://code.claude.com/docs/en/whats-new" rel="noopener noreferrer"&gt;Claude Code — What's New&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a first-person take after a few days of hands-on use. The benchmark and honesty figures are copied straight from Anthropic's announcement, and this post is not sponsored in any form.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/opus-4-8s-default-1m-context-window-is-the-upgrade-i-notice-most/" rel="noopener noreferrer"&gt;https://jessinvestment.com/opus-4-8s-default-1m-context-window-is-the-upgrade-i-notice-most/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>opus48</category>
      <category>contextwindow</category>
      <category>anthropic</category>
    </item>
    <item>
      <title>Opus 4.8 Launched, but Fast Mode Was the Real Win for Me</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Fri, 29 May 2026 21:04:06 +0000</pubDate>
      <link>https://dev.to/jessyt/opus-48-launched-but-fast-mode-was-the-real-win-for-me-322l</link>
      <guid>https://dev.to/jessyt/opus-48-launched-but-fast-mode-was-the-real-win-for-me-322l</guid>
      <description>&lt;h1&gt;
  
  
  Opus 4.8 Launched, but Fast Mode Was the Real Win for Me
&lt;/h1&gt;

&lt;p&gt;Yesterday (May 28), Anthropic rolled Opus 4.8 out globally. The announcement was about coding scores climbing again, but since I run Claude Code all day long, something else caught my eye before the benchmark table did: the line saying fast mode got 2.5x faster and 3x cheaper.&lt;/p&gt;

&lt;h2&gt;
  
  
  01. Same price, just a better model
&lt;/h2&gt;

&lt;p&gt;Opus 4.8 went out to everyone the moment it was announced yesterday. According to Anthropic, the core of it is doing agentic work — like coding — better.&lt;/p&gt;

&lt;p&gt;The good news is the price. Anthropic says the per-token rate stays the same between Opus 4.7 and 4.8. It's one of those cases where the model quietly levels up but the bill doesn't change, so for an existing user there was no added burden to worry about.&lt;/p&gt;

&lt;h2&gt;
  
  
  02. How the benchmark table changed
&lt;/h2&gt;

&lt;p&gt;These are the 4.7-vs-4.8 numbers Anthropic published. Let me note up front that I didn't measure these — they're straight from the announcement notes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;4.7&lt;/th&gt;
&lt;th&gt;4.8&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agentic coding&lt;/td&gt;
&lt;td&gt;64.3%&lt;/td&gt;
&lt;td&gt;69.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool-use reasoning&lt;/td&gt;
&lt;td&gt;54.7%&lt;/td&gt;
&lt;td&gt;57.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knowledge-work score&lt;/td&gt;
&lt;td&gt;1753&lt;/td&gt;
&lt;td&gt;1890&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Computer use&lt;/td&gt;
&lt;td&gt;82.8%&lt;/td&gt;
&lt;td&gt;83.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;They also say high effort is now the default for coding tasks. The explanation is that you spend roughly the same tokens as 4.7 but get better results.&lt;/p&gt;

&lt;h2&gt;
  
  
  03. For me, fast mode was the real story
&lt;/h2&gt;

&lt;p&gt;What actually touched my day-to-day, more than the scores, was the fast mode side. Per the announcement, the fast mode variant now runs 2.5x faster than before while costing 3x less.&lt;/p&gt;

&lt;p&gt;I run several Claude Code jobs at once — AI ecosystem monitoring, stock market monitoring, writing posts. In a setup like that, faster responses and cheaper tokens hit you immediately. Here's how I usually launch it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;claude &lt;span class="nt"&gt;--model&lt;/span&gt; opus      &lt;span class="c"&gt;# this is how I usually launch it&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /fast                     &lt;span class="c"&gt;# toggle fast mode (Opus 4.8/4.7/4.6 supported)&lt;/span&gt;

&lt;span class="c"&gt;# I run a bunch of jobs in parallel, so&lt;/span&gt;
&lt;span class="c"&gt;# faster, cheaper responses pile straight up into cost · time savings&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On top of that, Claude Code's rate limits went up too. With the extra · max settings you can funnel more tokens through. Heavy work that kept hitting the ceiling should breathe a little easier now.&lt;/p&gt;

&lt;h2&gt;
  
  
  04. I can't speak to the coding feel yet
&lt;/h2&gt;

&lt;p&gt;Honestly, I can't promise "coding got 5pp better" just from the benchmark table. The model dropped only yesterday, so it'll take a few more days of use before I know what's actually different from 4.7 in my own work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What I haven't verified yet&lt;/strong&gt; — The only thing I measured myself is the fast mode speed; I haven't done a hands-on comparison of coding accuracy. The benchmark table is copied straight from the announcement notes, so I'll write up the real-world feel separately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Still, getting frozen pricing + faster fast mode + higher limits all in one drop was a pretty big bundle for someone running automation. On that part alone, I was glad from day one of the announcement.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Eddie's take&lt;/strong&gt; — Honestly, I tend to stay pretty unmoved every time a model's benchmark table goes up. You only learn the real difference after a few days of use anyway. But this time, making fast mode faster and cheaper without raising the price was a far more concrete change — for someone running it every day — than a few percentage points on a score.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news" rel="noopener noreferrer"&gt;Anthropic — News (Opus 4.8 announcement, 2026.05.28)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://9to5mac.com/2026/05/28/anthropic-upgrades-claude-with-new-opus-4-8-model-heres-whats-new/" rel="noopener noreferrer"&gt;9to5Mac — Anthropic upgrades Claude with new Opus 4.8 model&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This post summarizes an external announcement. The score and price figures are based on Anthropic's announcement notes, and aside from fast mode speed, I did not personally measure the coding experience. No sponsorship of any kind was received.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Canonical: &lt;a href="https://jessinvestment.com/opus-4-8-launched-but-fast-mode-was-the-real-win-for-me/" rel="noopener noreferrer"&gt;https://jessinvestment.com/opus-4-8-launched-but-fast-mode-was-the-real-win-for-me/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/opus-4-8-launched-but-fast-mode-was-the-real-win-for-me/" rel="noopener noreferrer"&gt;https://jessinvestment.com/opus-4-8-launched-but-fast-mode-was-the-real-win-for-me/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>opus48</category>
      <category>fastmode</category>
      <category>aicoding</category>
    </item>
    <item>
      <title>Claude Code Checkpoints: Double-Esc to Undo a Botched Edit</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Fri, 29 May 2026 21:02:01 +0000</pubDate>
      <link>https://dev.to/jessyt/claude-code-checkpoints-double-esc-to-undo-a-botched-edit-1i6b</link>
      <guid>https://dev.to/jessyt/claude-code-checkpoints-double-esc-to-undo-a-botched-edit-1i6b</guid>
      <description>&lt;h1&gt;
  
  
  Claude Code Checkpoints: Double-Esc to Undo a Botched Edit
&lt;/h1&gt;

&lt;p&gt;There's one moment working with Claude Code that sends a chill down my spine. Claude rolls along great, then suddenly does something I never expected. When that happens I stop it fast and ask for a rollback — but sometimes the rollback itself goes sideways from what I meant. Now the new checkpointing feature ends all of that with two presses of Esc. I wrote this as someone running the May Week 20 update (checkpoint + &lt;code&gt;/rewind&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  01. Yesterday I pressed Esc twice for the first time
&lt;/h2&gt;

&lt;p&gt;Yesterday I had Claude refactor a function, and when I looked at the result it had changed way more than I intended. Before, I'd panic first and dig through git diff to see what got wrecked while I rolled it back. But this time I tapped Esc twice and every changed file snapped back to its original state!!&lt;/p&gt;

&lt;p&gt;Claude Code automatically saves a snapshot of your code state right before each change. You pick whichever snapshot you want to return to, and it reverts. What I liked most: no need to git commit, and no special command to memorize!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;claude
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;refactor this whole &lt;span class="k"&gt;function&lt;/span&gt;
&lt;span class="go"&gt;(Claude edits several files at once)

&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;result doesn&lt;span class="s1"&gt;'t match what I meant — Esc twice
&lt;/span&gt;&lt;span class="go"&gt;[checkpoint] reverted to 2 minutes ago
(files restored to just before the change, all at once)
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;no git stash, no git reset needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  02. /rewind for a more explicit revert
&lt;/h2&gt;

&lt;p&gt;Here's what I found from using it. For me, typing &lt;code&gt;/rewind&lt;/code&gt; brings up a list of recent checkpoints, and I pick a point and jump back to it.&lt;/p&gt;

&lt;p&gt;When two or three suspicious changes had piled up, this was great for cleaning it all up in one shot.&lt;/p&gt;

&lt;h2&gt;
  
  
  03. The difference from git reset, as I see it
&lt;/h2&gt;

&lt;p&gt;I'm comfortable with git, so at first I thought "how is this any different from &lt;code&gt;git reset&lt;/code&gt;?" After a few days of use I saw two decisive differences.&lt;/p&gt;

&lt;p&gt;First, the big one: &lt;strong&gt;checkpoints get captured even without a commit&lt;/strong&gt;. I tend to work without committing in the middle, so &lt;code&gt;git reset&lt;/code&gt; had no way to recover those in-between changes for me. What I liked most is that checkpointing snaps automatically right before Claude touches anything — completely independent of commits.&lt;/p&gt;

&lt;p&gt;Second, I liked that &lt;strong&gt;it reverts multiple files as one bundle&lt;/strong&gt;. When a task touches several files at once, it was hard for me to track what I'd changed where. Checkpointing reverts a whole "unit of work" in one shot, so there's no tracking burden.&lt;/p&gt;

&lt;h2&gt;
  
  
  04. /goal delegation finally feels safe
&lt;/h2&gt;

&lt;p&gt;In an earlier post I covered using the &lt;code&gt;/goal&lt;/code&gt; command so Claude stops asking me every turn. Back then the one thing nagging at me was: what if Claude goes rogue mid autonomous run?&lt;/p&gt;

&lt;p&gt;I think checkpointing shaved off most of that worry. Even if the result drifts off-course during delegation, two presses of Esc bring me back to the last safe state. So I've been using &lt;code&gt;/goal&lt;/code&gt; more aggressively.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The pattern I bundle them in:&lt;/strong&gt; I run &lt;code&gt;/goal&lt;/code&gt; for an autonomous pass → let the result play out to the end → if I don't like it, Esc twice. For me, bundling these two features dropped the psychological cost of delegating way down.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  05. A case where it doesn't work so well, in my view
&lt;/h2&gt;

&lt;p&gt;From my few days of use: when each change unit is tiny, they pile up like grains of sand. In that case it was sometimes hard to judge which point to revert to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/whats-new" rel="noopener noreferrer"&gt;Claude Code — What's New (Week 20, May 11–15, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news/enabling-claude-code-to-work-more-autonomously" rel="noopener noreferrer"&gt;Anthropic — Enabling Claude Code to work more autonomously&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This is a first-person review after a few days of hands-on use. I received no sponsorship of any kind from Anthropic.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/claude-code-checkpoints-double-esc-to-undo-a-botched-edit/" rel="noopener noreferrer"&gt;https://jessinvestment.com/claude-code-checkpoints-double-esc-to-undo-a-botched-edit/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>checkpoint</category>
      <category>rewind</category>
      <category>aicoding</category>
    </item>
    <item>
      <title>Claude Code's New /goal Command Killed My Per-Turn Confirmation Loop</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Thu, 28 May 2026 14:44:30 +0000</pubDate>
      <link>https://dev.to/jessyt/claude-codes-new-goal-command-killed-my-per-turn-confirmation-loop-4jbc</link>
      <guid>https://dev.to/jessyt/claude-codes-new-goal-command-killed-my-per-turn-confirmation-loop-4jbc</guid>
      <description>&lt;h1&gt;
  
  
  Claude Code &lt;code&gt;/goal&lt;/code&gt; and &lt;code&gt;claude agents&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Yesterday I had multiple Claude Code sessions running at the same time. But each session kept asking me "next?" every single turn, so I was bouncing between tabs hitting Enter and losing my mind.&lt;/p&gt;

&lt;p&gt;All that inefficiency disappeared with one line: the new &lt;code&gt;/goal&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;Written from the perspective of someone using the Week 20 update (May 11–15) — &lt;code&gt;agent view&lt;/code&gt; + &lt;code&gt;/goal&lt;/code&gt; — every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  01. All my sessions, one screen (&lt;code&gt;claude agents&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;I used to flip between five terminal tabs and constantly lose track of which session was doing what.&lt;/p&gt;

&lt;p&gt;Yesterday I ran &lt;code&gt;claude agents&lt;/code&gt; for the first time. Every session lined up in one view, each showing &lt;strong&gt;running / blocked on you / done&lt;/strong&gt; at a glance. I could immediately see where I needed to respond.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What I noticed:&lt;/strong&gt; That single &lt;strong&gt;blocked on you&lt;/strong&gt; label made a surprisingly big difference for me. Before, I had to peek into every tab to figure out where things were stuck. Now it's right there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  02. My biggest frustration, gone with &lt;code&gt;/goal&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The thing that bothered me most about Claude Code was &lt;strong&gt;the per-turn stop-and-ask&lt;/strong&gt;. One "should I proceed?" would be fine, but the repetition wore me down. With multiple sessions running, that fatigue multiplies.&lt;/p&gt;

&lt;p&gt;I tried &lt;code&gt;/goal&lt;/code&gt; for the first time yesterday. My approach was simple.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ claude
&amp;gt; /goal Keep going until this PR review is done and all tests pass.

# Claude grabs the completion condition (tests passing)
# and from then on, doesn't ask every turn — it just runs
# Only stops on blocked on user (= when a real decision is needed)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The impact was huge. Once I specified the completion condition, I didn't have to babysit it anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  03. The time savings I felt
&lt;/h2&gt;

&lt;p&gt;I timed how long my per-turn answers were taking. Each response averaged 10–15 seconds. Drag one task through about 10 turns and that's 1–2 minutes per session. With five sessions, multiply by five.&lt;/p&gt;

&lt;p&gt;After delegating with &lt;code&gt;/goal&lt;/code&gt;, my time spent dropped to essentially zero. I clawed back about 10 minutes of attention.&lt;/p&gt;

&lt;p&gt;And not hitting unnecessary Enters dropped my fatigue sharply.&lt;/p&gt;

&lt;h2&gt;
  
  
  04. Cases where &lt;code&gt;/goal&lt;/code&gt; doesn't work well
&lt;/h2&gt;

&lt;p&gt;After a few days of use, &lt;code&gt;/goal&lt;/code&gt; worked best &lt;strong&gt;when the completion condition was clearly verifiable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tests passing, build succeeding, a specific file under N lines — cases like that.&lt;/p&gt;

&lt;p&gt;On the flip side, it didn't suit me for the exploration or ideation phase.&lt;/p&gt;

&lt;p&gt;In a "how should I even approach this" flow, answering every turn and thinking together actually produced better results.&lt;/p&gt;

&lt;p&gt;My take: &lt;code&gt;/goal&lt;/code&gt; is a tool for "execute to the finish once the direction is set," not for "finding the direction."&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Sources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/whats-new" rel="noopener noreferrer"&gt;Claude Code — What's New (Week 20, May 11–15, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news/enabling-claude-code-to-work-more-autonomously" rel="noopener noreferrer"&gt;Anthropic — Enabling Claude Code to work more autonomously&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This is a first-person review after a few days of hands-on use. I received no sponsorship of any kind from Anthropic.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted at &lt;a href="https://jessinvestment.com/claude-codes-new-goal-command-killed-my-per-turn-confirmation-loop/" rel="noopener noreferrer"&gt;jessinvestment.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/claude-codes-new-goal-command-killed-my-per-turn-confirmation-loop/" rel="noopener noreferrer"&gt;https://jessinvestment.com/claude-codes-new-goal-command-killed-my-per-turn-confirmation-loop/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>slashcommands</category>
      <category>aicoding</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Anthropic Opens a Korea Office as Claude Usage Surges 12x</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Wed, 27 May 2026 22:25:45 +0000</pubDate>
      <link>https://dev.to/jessyt/anthropic-opens-a-korea-office-as-claude-usage-surges-12x-13pf</link>
      <guid>https://dev.to/jessyt/anthropic-opens-a-korea-office-as-claude-usage-surges-12x-13pf</guid>
      <description>&lt;h1&gt;
  
  
  Korea Uses Claude 3.5x Its Expected Share — Anthropic Comes to Seoul
&lt;/h1&gt;

&lt;p&gt;Anthropic is moving into Korea directly. On May 27, ahead of opening its Seoul office, it appointed its first Korea Representative Director. It's not a model launch, but for Korean developers it's more directly relevant news.&lt;/p&gt;

&lt;h2&gt;
  
  
  01 · The News: Anthropic Named a Korea Country Head
&lt;/h2&gt;

&lt;p&gt;On May 27, 2026, Anthropic announced it had appointed KiYoung Choi, former Korea head of Snowflake, as Representative Director of Anthropic Korea. The Korean entity was already registered back in July 2025, and within weeks senior leadership from headquarters will visit Seoul to officially open the office. It's the entity going fully operational 10 months after registration.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Usage vs. population: 3.5×&lt;/strong&gt; (Economic Index)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User growth in one year: 12×&lt;/strong&gt; (year over year)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude MAU (April): 2.41M&lt;/strong&gt; (ChatGPT 23.45M)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Korea entity registered: Jul 2025&lt;/strong&gt; (10 months ago)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  02 · Why Korea: Few Users, but the Fastest-Growing Market
&lt;/h2&gt;

&lt;p&gt;Anthropic's rationale is usage. By the March Economic Index, Korea's Claude usage runs more than 3.5× what you'd expect from its population. And it's concentrated in high-difficulty technical R&amp;amp;D and creative work. "One of the most sophisticated AI markets in the world" is how the company puts it.&lt;/p&gt;

&lt;p&gt;On raw user count, ChatGPT dominates. As of April, monthly active users stood at 23.45M for ChatGPT and 2.41M for Claude. But Claude grew roughly 12× (+1,148%) in a year, spreading especially on coding and writing demand from men in their 20s.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ChatGPT&lt;/th&gt;
&lt;th&gt;Claude&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;April MAU&lt;/td&gt;
&lt;td&gt;23.45M&lt;/td&gt;
&lt;td&gt;2.41M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Position&lt;/td&gt;
&lt;td&gt;#1 by user base in Korea&lt;/td&gt;
&lt;td&gt;+1,148% YoY (~12× surge)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Note&lt;/td&gt;
&lt;td&gt;Most monthly active users&lt;/td&gt;
&lt;td&gt;20s · coding focus&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  03 · Who Leads: Korea's Lead Is a Cloud Sales Veteran
&lt;/h2&gt;

&lt;p&gt;KiYoung Choi has led tech companies across Korea and Asia-Pacific for over 30 years. Most recently he was Korea head of Snowflake. The fact that he's an enterprise market builder, not a product engineer, tells you the direction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KiYoung Choi — 30 Years of Tech Leadership&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Korea head, Snowflake&lt;/strong&gt; — most recent role, data cloud&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;COO, Microsoft Korea&lt;/strong&gt; — enterprise operations lead&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud Korea leadership&lt;/strong&gt; — drove cloud adoption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adobe · Autodesk Korea leadership&lt;/strong&gt; — global SaaS localization experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  04 · Position: What Changes for Developers
&lt;/h2&gt;

&lt;p&gt;The Korea team's priorities are nailed down to three: enterprise and startup partnerships, government and research collaboration, and local developer community support. Law&amp;amp;Company already runs a Claude-based legal assistant, and SK Telecom has wired Claude into customer support. Once there's a local base, Korean-language billing, enterprise contracts, and local events all get closer.&lt;/p&gt;

&lt;p&gt;Your code won't change overnight. But a local base means Korean-language support, tax invoices, enterprise contracts, and community events all move closer to reality.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What to watch:&lt;/strong&gt; Office opening timing, and whether Korean-language payment · tax invoices arrive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caution:&lt;/strong&gt; ChatGPT has ~10× the users — Claude is still behind on scale&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  05 · Eddie's Take
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Once there's a local base, next come Korean-language invoices and local events. The key is that developer community support made the priority list."&lt;/p&gt;

&lt;p&gt;— Eddie · 2026.05.27&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's not a new model launch, but for Korean developers it may be a more tangible change. &lt;strong&gt;Just watch the office opening timing and Korean-language payment support.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources · References
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Original announcement&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news/kiyoung-choi-representative-director-anthropic-korea" rel="noopener noreferrer"&gt;Anthropic — KiYoung Choi, Representative Director, Anthropic Korea&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Press&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.koreaherald.com/article/10757086" rel="noopener noreferrer"&gt;The Korea Herald — Anthropic names first Korea chief ahead of Seoul office launch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.sedaily.com/technology/2026/05/27/anthropic-names-choi-ki-young-as-korea-country-manager" rel="noopener noreferrer"&gt;Seoul Economic Daily — Anthropic Names Choi Ki-young as Korea Country Manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;User statistics&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zdnet.co.kr/view/?no=20260520145340" rel="noopener noreferrer"&gt;ZDNet Korea — ChatGPT still #1, but here's why Claude users surged 12x in a year&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Disclaimer: An objective summary of an external announcement. No ads or affiliate links. Figures are as cited in press coverage (Anthropic Economic Index · April 2026 MAU).&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/anthropic-opens-a-korea-office-as-claude-usage-surges-12x/" rel="noopener noreferrer"&gt;https://jessinvestment.com/anthropic-opens-a-korea-office-as-claude-usage-surges-12x/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>anthropickorea</category>
      <category>claude</category>
      <category>aimarketshare</category>
      <category>enterpriseai</category>
    </item>
    <item>
      <title>Claude Code Now Ships a Real Code Review Command — Down to PR Comments</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Mon, 25 May 2026 22:21:19 +0000</pubDate>
      <link>https://dev.to/jessyt/claude-code-now-ships-a-real-code-review-command-down-to-pr-comments-4i2b</link>
      <guid>https://dev.to/jessyt/claude-code-now-ships-a-real-code-review-command-down-to-pr-comments-4i2b</guid>
      <description>&lt;h1&gt;
  
  
  Claude Code now has a real code review command
&lt;/h1&gt;

&lt;p&gt;The old &lt;code&gt;/simplify&lt;/code&gt; is now &lt;code&gt;/code-review&lt;/code&gt;. It's not just a rename. The command now goes far enough to post its findings as comments directly on a GitHub PR.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code 2.1.147&lt;/strong&gt; · &lt;code&gt;/code-review&lt;/code&gt; · &lt;code&gt;--comment&lt;/code&gt; · May 21–22&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  01 · Not a rename — a change of job
&lt;/h2&gt;

&lt;p&gt;The first line of the Claude Code 2.1.147 changelog, shipped on May 21, says the &lt;code&gt;/simplify&lt;/code&gt; command became &lt;code&gt;/code-review&lt;/code&gt;. It looks like a simple rename, but what it actually does has changed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Before (&lt;code&gt;/simplify&lt;/code&gt;, gone)&lt;/th&gt;
&lt;th&gt;Now (&lt;code&gt;/code-review&lt;/code&gt;, first-class command)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;Code-simplification helper&lt;/td&gt;
&lt;td&gt;Correctness bug review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target&lt;/td&gt;
&lt;td&gt;current code&lt;/td&gt;
&lt;td&gt;current diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;in the terminal&lt;/td&gt;
&lt;td&gt;down to PR comments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Focus&lt;/td&gt;
&lt;td&gt;refactor suggestions&lt;/td&gt;
&lt;td&gt;correctness bugs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key is that the focus moved. Instead of "make it cleaner," it now looks at "does this change have a bug?" Anthropic has said it runs code review on nearly every PR internally.&lt;/p&gt;

&lt;h2&gt;
  
  
  02 · What landed in this week's batch
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Review effort: tunable&lt;/strong&gt; — low→max selectable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR posting: &lt;code&gt;--comment&lt;/code&gt;&lt;/strong&gt; — GitHub inline comments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/usage&lt;/code&gt;: by category&lt;/strong&gt; — skill · subagent · MCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/diff&lt;/code&gt;: keyboard&lt;/strong&gt; — j · k · PgUp scroll&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can pick the review effort, from low to max. Low and medium surface only a few high-confidence flags, while high and max cast a wider net and catch the uncertain stuff too. In the same week, 2.1.149 made &lt;code&gt;/usage&lt;/code&gt; break usage down by skills, subagents, plugins, and MCP servers, and let you scroll &lt;code&gt;/diff&lt;/code&gt; from the keyboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  03 · Where it slots into your workflow
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/code-review&lt;/code&gt; use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run it locally once before opening a PR&lt;/strong&gt; — It only looks at the current diff, so it stays focused on what changed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use low effort for busy PRs to get just the essentials&lt;/strong&gt; — Less noise, high-confidence flags only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;--comment&lt;/code&gt; to put the review on the PR for important changes&lt;/strong&gt; — Reviewers see it right inside GitHub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a replacement for human review yet&lt;/strong&gt; — Safer to treat it as a first-pass filter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  04 · The point is that it isn't a separate tool
&lt;/h2&gt;

&lt;p&gt;The most striking part of this change is that code review didn't arrive as a separate tool — it came in as a single CLI command.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why it matters:&lt;/strong&gt; It stays inside your terminal workflow — no separate review bot to wire up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What to watch:&lt;/strong&gt; How much accuracy actually differs across effort levels is something you'll only learn by using it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  05 · Eddie's take
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"The thing is, the review command doesn't just end on your screen — it goes out to the PR. If it were me, I'd wire it into the team pipeline as a first-pass filter first."&lt;/p&gt;

&lt;p&gt;— Eddie&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're already on Claude Code, update and run &lt;strong&gt;&lt;code&gt;/code-review&lt;/code&gt;&lt;/strong&gt; first. And if you've got the &lt;code&gt;/simplify&lt;/code&gt; shortcut in muscle memory, just remember the name changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claude Code official&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/changelog" rel="noopener noreferrer"&gt;Claude Code Changelog (2.1.147 / 2.1.149)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/claude-code/releases" rel="noopener noreferrer"&gt;anthropics/claude-code Releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news" rel="noopener noreferrer"&gt;Anthropic News (Code with Claude)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: Based on the official changelog. Features may change by version. No ads or affiliate links.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/claude-code-now-ships-a-real-code-review-command-down-to-pr-comments/" rel="noopener noreferrer"&gt;https://jessinvestment.com/claude-code-now-ships-a-real-code-review-command-down-to-pr-comments/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>codereview</category>
      <category>aicoding</category>
      <category>slashcommands</category>
    </item>
    <item>
      <title>One bug cascaded into three failures across my LLM agent fleet. Here are the four guardrails I added.</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Mon, 25 May 2026 14:04:16 +0000</pubDate>
      <link>https://dev.to/jessyt/one-bug-cascaded-into-three-failures-across-my-llm-agent-fleet-here-are-the-four-guardrails-i-1dl</link>
      <guid>https://dev.to/jessyt/one-bug-cascaded-into-three-failures-across-my-llm-agent-fleet-here-are-the-four-guardrails-i-1dl</guid>
      <description>&lt;p&gt;I run a small fleet of LLM agents on a Mac mini at home — about 44 scheduled jobs that draft, review, and publish blog content without me in the loop. Most of them call the Claude CLI, drive a headless browser with Playwright, and post to a blog.&lt;/p&gt;

&lt;p&gt;For months it just worked. Then one night a single bug took down three different parts of the system at once, and I learned that "it just works" is the most dangerous state an autonomous system can be in.&lt;/p&gt;

&lt;p&gt;This is what broke, and the four guardrails I added so it can't break the same way again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cascade
&lt;/h2&gt;

&lt;p&gt;On May 9 one of my publish jobs failed. Then it failed again. By the time I looked, it had failed four times and my login provider had temporarily blocked the account.&lt;/p&gt;

&lt;p&gt;The root cause was embarrassingly small. The publish script matched a blog category by running a snippet in the page context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# three arguments
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Playwright's &lt;code&gt;evaluate()&lt;/code&gt; takes a function and &lt;strong&gt;at most one&lt;/strong&gt; argument. Passing more throws at runtime. That alone was a one-line fix. But it triggered a chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Playwright misuse&lt;/strong&gt; made the publish step throw every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The retry logic&lt;/strong&gt; dutifully tried again. Four rapid login attempts in a few minutes looked like an attack, so the login provider rate-limited the account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Telegram bot&lt;/strong&gt; that relays my messages to the agent saved its &lt;code&gt;last_update_id&lt;/code&gt; &lt;em&gt;after&lt;/em&gt; processing each message. When the agent crashed mid-message, the offset was never committed — so on restart it re-read the same message and crashed again. An infinite loop.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One bug. Three independent failure modes. None of them had a guardrail.&lt;/p&gt;

&lt;p&gt;The fix wasn't "be more careful." It was four layers, each catching a different class of failure before it can cascade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 1 — A static guard for the exact bug class
&lt;/h2&gt;

&lt;p&gt;The Playwright bug was detectable without running anything. So I wrote an AST check that scans the publish infrastructure for &lt;code&gt;evaluate()&lt;/code&gt; calls with too many arguments, and run it on every change to those files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_evaluate_arity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Call&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Attribute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attr&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;evaluate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="c1"&gt;# fn + at most one arg
&lt;/span&gt;                    &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lineno&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; — &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.evaluate() got &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; args (max 2). &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wrap multiple args in a dict.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same script also flags destructive shell strings (&lt;code&gt;pkill -9&lt;/code&gt;, &lt;code&gt;rm -rf&lt;/code&gt;) embedded in Python, because those should live in a wrapper script where a separate guard can see them — not hidden inside a &lt;code&gt;subprocess.run&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The lesson: when a bug class is statically detectable, don't rely on catching it at runtime. A linter that knows your one specific failure is worth more than a generic test suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 2 — A rate-limit circuit breaker
&lt;/h2&gt;

&lt;p&gt;The account block happened because nothing tracked &lt;em&gt;how often&lt;/em&gt; I was hitting the login. So I added a circuit breaker: at most two login attempts per 15 minutes, then a 30-minute cooldown.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;attempts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;WINDOW&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# 15 min
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attempts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;MAX_ATTEMPTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                                   &lt;span class="c1"&gt;# 2
&lt;/span&gt;    &lt;span class="n"&gt;cooldown_remaining&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;COOLDOWN&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attempts&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;           &lt;span class="c1"&gt;# 30 min
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cooldown_remaining&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;notify_alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;login rate limit: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attempts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/15min — &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                     &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cooldown_remaining&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;min cooldown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;   &lt;span class="c1"&gt;# refuse, don't attempt
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key design choice is that the breaker &lt;strong&gt;refuses the action&lt;/strong&gt; rather than just logging a warning. A warning nobody reads is not a guardrail. And it fails &lt;em&gt;open&lt;/em&gt; on its own errors — if the breaker itself throws, it allows the attempt, because a broken safety check shouldn't take down the whole system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 3 — Idempotency and a restart guard
&lt;/h2&gt;

&lt;p&gt;The infinite loop had two causes, so it needed two fixes.&lt;/p&gt;

&lt;p&gt;First, commit the offset &lt;strong&gt;before&lt;/strong&gt; doing the work, not after:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;updates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_updates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;last_update_id&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;updates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;last_update_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;update_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;updates&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;save_state&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;          &lt;span class="c1"&gt;# commit BEFORE processing
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;updates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;# if this crashes, the message is not re-read
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is just idempotency: a message that has been &lt;em&gt;seen&lt;/em&gt; should never be processed twice, even if processing it crashes. Moving one line above the work loop turned an infinite loop into a single dropped message — a far better failure.&lt;/p&gt;

&lt;p&gt;Second, a restart guard. If the process restarts four times in one minute, something is wrong and restarting faster won't help. So it backs off:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;notify_alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rapid-restart detected — 1h cool-off&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# stop flailing, let a human look
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crash-loops are how a small failure becomes a 2-day outage. The guard turns "restart forever" into "restart, notice, wait."&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 4 — Fail fast, never retry
&lt;/h2&gt;

&lt;p&gt;The most counterintuitive lesson: for this system, &lt;strong&gt;retrying is the dangerous path.&lt;/strong&gt; The retries are what got the account blocked. So the publish step now aborts on the first failure, preserves its work, and tells me.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;notify_publish_failure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;One failure = abort. No retry — repeated attempts cause the block.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="nf"&gt;send_alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;publish failed — aborting after 1 attempt (no retry)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blog: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;file: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html_path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;reason: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTML preserved. Publish manually after review, or wait for the next run.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Automatic retry assumes failures are independent and transient. In a system that talks to a rate-limited third party, failures are &lt;em&gt;correlated&lt;/em&gt; — the second attempt is more likely to fail &lt;em&gt;and&lt;/em&gt; more likely to do harm. The draft is preserved, a human decides, and a daily job will come around again anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus — Letting the system find its own patterns
&lt;/h2&gt;

&lt;p&gt;Once a week, a job feeds the last seven days of error logs and a running incident table to an LLM and asks one question: which failures recurred at least twice? Single transient blips and "expected" failures are filtered out. Only repeating patterns get written to a draft file for me to review.&lt;/p&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; edit the incident log directly — it only proposes. I keep the review gate, because an automated system rewriting its own postmortems is exactly the kind of clever idea that produces the next incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardrails are never done
&lt;/h2&gt;

&lt;p&gt;A week after I shipped all this, the fleet broke again — for a completely different reason. A Homebrew Python upgrade changed the interpreter's signature, macOS revoked its file-access permission, and a dozen jobs started failing with a misleading &lt;code&gt;ModuleNotFoundError&lt;/code&gt;. And while I was fixing &lt;em&gt;that&lt;/em&gt;, I managed to start three copies of the same bot, which then fought each other for the same message queue.&lt;/p&gt;

&lt;p&gt;None of the four layers caught it, because it was a new class of failure. That is the actual lesson. You don't write guardrails to reach "done." You write them so that each incident can only happen once — and then you go collect the next one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I run these agents to publish content while I work a full-time backend job. The full incident archive and guardrail code live in my notes; this is the part I think generalizes. Happy to compare notes if you operate something similar.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/one-bug-cascaded-into-three-failures-across-my-llm-agent-fleet-here-are-the-four-guardrails-i-added/" rel="noopener noreferrer"&gt;https://jessinvestment.com/one-bug-cascaded-into-three-failures-across-my-llm-agent-fleet-here-are-the-four-guardrails-i-added/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>python</category>
      <category>devops</category>
    </item>
    <item>
      <title>I Use All 5 Claude Code Plugins Every Day — An Honest Breakdown</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Sun, 24 May 2026 22:48:02 +0000</pubDate>
      <link>https://dev.to/jessyt/i-use-all-5-claude-code-plugins-every-day-an-honest-breakdown-4i7e</link>
      <guid>https://dev.to/jessyt/i-use-all-5-claude-code-plugins-every-day-an-honest-breakdown-4i7e</guid>
      <description>&lt;h1&gt;
  
  
  I Use All 5 Claude Code Plugins Every Day — An Honest Breakdown
&lt;/h1&gt;

&lt;p&gt;Hi, I'm Edi. A month ago I'd run Claude Code for a full year with zero plugins. Today I have five installed and &lt;strong&gt;I use all of them every day.&lt;/strong&gt; I'll lay it all out honestly: what's installed, when each one fires, and the difference between not having it vs having it. No ads, no sponsorship — just my own measured experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  01 · My 5 Plugins — I use all five daily, in the order I installed them
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bottom line.&lt;/strong&gt; My first year ran on zero plugins. A month ago (2026-04-26) I started with one — frontend-design — and on May 12 I added four more in a single day. All five have now settled into a daily or near-daily cadence.&lt;/p&gt;

&lt;p&gt;Here are the five, ordered by how often I use them, with a one-line note on what situation triggers each.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;frontend-design&lt;/code&gt; — DAILY · installed 2026-04-26
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When it fires.&lt;/strong&gt; Every time I write a post in my v2 infographic style. It auto-applies the magazine card system, light-tone readability, and my dark-box avoidance rules.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I trigger it inside all five of my post-generation jobs (run-daily · run-devtools-daily · run-weekly · run-ai-intro, etc.).&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;hookify&lt;/code&gt; — DAILY · installed 2026-05-12
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When it fires.&lt;/strong&gt; Right after an automation job has an incident, or when I need a new guard rule. I'm running 2 PreToolUse hooks + 1 PostToolUse hook.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;My flow: check the current state with &lt;code&gt;/hookify:list&lt;/code&gt; → write a new rule with &lt;code&gt;/hookify:hookify&lt;/code&gt; → it lands in settings.json automatically.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;skill-creator&lt;/code&gt; — DAILY · installed 2026-05-12
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When it fires.&lt;/strong&gt; Whenever I build a new skill or tweak an existing one. I carry 8 project skills (&lt;code&gt;add-launch-job&lt;/code&gt; · &lt;code&gt;blog-style-guide&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It handles the SKILL.md frontmatter format · description tuning · even the eval in one pass, so the cost of adding a skill is basically zero compared to hand-rolling it a year ago.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;telegram&lt;/code&gt; — DAILY · installed 2026-05-12 (external)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When it fires.&lt;/strong&gt; Two-way messaging between a Claude Code session ↔ my phone. I use it for interviews and instant job-debugging replies.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To avoid a token clash with my existing &lt;code&gt;yongBlogBot&lt;/code&gt;, I spun up a separate bot via BotFather and paired it exclusively to the plugin.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;playwright&lt;/code&gt; — DAILY · installed 2026-05-12 (external)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When it fires.&lt;/strong&gt; Debugging publish jobs · inspecting pages. I keep the actual publish code in lib/ Python untouched and use the MCP browser tools only for debugging.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I don't rip out the publish job code all at once — I observe for a week → confirm it's stable → migrate gradually.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  02 · Before vs After — The gap is bigger than I expected
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bottom line.&lt;/strong&gt; For a year I held the "take it or leave it" view. After a month with them, I realized that the time freed up from hand-editing got filled with actual writing time.&lt;/p&gt;

&lt;p&gt;Here's how I did each task without the plugin, and how it changed with it — all in one table.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Without it (my year)&lt;/th&gt;
&lt;th&gt;With it (one month in)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;frontend-design&lt;/td&gt;
&lt;td&gt;AI output came out as &lt;strong&gt;generic boxes.&lt;/strong&gt; I hand-edited the v2 infographic design stitch by stitch.&lt;/td&gt;
&lt;td&gt;Magazine cards · light-tone rules applied automatically. &lt;strong&gt;Almost zero design hand-editing.&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hookify&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Hand-edited settings.json directly.&lt;/strong&gt; Looked up matcher syntax every time. Guessed at what would fire.&lt;/td&gt;
&lt;td&gt;One line with &lt;code&gt;/hookify:list&lt;/code&gt; shows the state. Rule writing is standardized. &lt;strong&gt;Less debugging time.&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skill-creator&lt;/td&gt;
&lt;td&gt;Started from a blank SKILL.md. Re-checked the frontmatter every time. Never wrote evals.&lt;/td&gt;
&lt;td&gt;Auto format · description tuning · eval package. &lt;strong&gt;Zero cost to add a skill.&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;telegram&lt;/td&gt;
&lt;td&gt;Wrote my own &lt;strong&gt;polling by hand&lt;/strong&gt; with my own bot. Paired it manually. 700+ lines of two-way code.&lt;/td&gt;
&lt;td&gt;Pair once. Session ↔ phone, two-way, instantly. &lt;strong&gt;Less weight on interview jobs.&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;playwright&lt;/td&gt;
&lt;td&gt;Did all publish jobs directly in lib/ Python. To debug, edit code then re-run.&lt;/td&gt;
&lt;td&gt;Inspect pages instantly with MCP browser tools. &lt;strong&gt;The publish jobs stay intact — it just assists.&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Looking at the table taught me one thing. A plugin isn't a "new feature" — it's "automating the manual work I was already doing." All five took over something I'd been doing by hand for a year.&lt;/p&gt;

&lt;h2&gt;
  
  
  03 · How to Find — I locked in 4 criteria for finding a good plugin
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bottom line.&lt;/strong&gt; I learned that if you open the marketplace and install everything that looks cool, your menu turns into a mess within days. So I run a 4-step check before installing anything.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Map your own workflow first.&lt;/strong&gt; Standardizing what you already do often is the highest ROI. For me, that was hookify · skill-creator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Official first, external only after vetting.&lt;/strong&gt; Anthropic's official ones are verified. For external ones, you must check for token · credential clashes. When I installed telegram (external), I built a separate bot to avoid a bot-token clash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-week trial → measure ROI.&lt;/strong&gt; If you're not using it, remove it immediately. Leaving things installed clutters the menu and causes command clashes. All five of mine survived past the one-month mark.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't rip out operational code like publish jobs.&lt;/strong&gt; Even after adopting playwright, I left my lib/ Python publish code as-is. Observe for a week to confirm no stability impact, then migrate gradually — that's the safe path.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Open the marketplace&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;/plugin

&lt;span class="c"&gt;# 2. Browse the official category first&lt;/span&gt;
   ↓ prioritize verified plugins
   ↓ vet external ones &lt;span class="k"&gt;for &lt;/span&gt;clashes

&lt;span class="c"&gt;# 3. Install one at a time (not several at once)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;/plugin &lt;span class="nb"&gt;install &lt;/span&gt;hookify@claude-plugins-official

&lt;span class="c"&gt;# 4. Use for a week → remove if unused&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;/plugin uninstall &amp;lt;the one you don&lt;span class="s1"&gt;'t use&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  04 · My Recommend — If you're just starting, I'd recommend three, in this order
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bottom line.&lt;/strong&gt; All five are good, but if you're just starting, don't be greedy — look at three first. I'd recommend the order skill-creator → telegram → hookify.&lt;/p&gt;

&lt;p&gt;The first three touch almost every workflow. The other two are optional.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;#1 · skill-creator&lt;/strong&gt; — The first step to turning your workflow into an asset. It's the fastest path to baking your repetitive work into a skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;#2 · telegram&lt;/strong&gt; — Session ↔ phone, two-way. Getting answers on your phone from inside a Claude Code session touches daily life more often than you'd think.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;#3 · hookify&lt;/strong&gt; — Safety net + guard rules. If you have even one automation job, you'll need a hook at some point. &lt;code&gt;/hookify:hookify&lt;/code&gt; standardizes the rule writing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;optional · frontend-design&lt;/strong&gt; — Only for people who touch blog · magazine design often. If you're backend-focused, you can skip it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;optional · playwright&lt;/strong&gt; — Consider it if you do publish automation · web scraping often. Migrate operational code gradually, after a week of observation.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Coda — In the end, the answer is: I use all five every day
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A month ago I ran a full year on zero. Now I use all five daily, and I can't go back. The way I see it, a good plugin isn't a new feature — it takes over the manual work.&lt;/p&gt;

&lt;p&gt;— Edi · after one month of use&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Edi's note:&lt;/strong&gt; Don't install them all at once. Use one at a time for a week and drop it the moment the ROI isn't there — that's how you keep the menu clean.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A plugin isn't a new feature — it's the automation of manual work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claude Code official&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.claude.com/en/docs/claude-code/plugins" rel="noopener noreferrer"&gt;Plugins — install · manage · marketplace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.claude.com/en/docs/claude-code/hooks" rel="noopener noreferrer"&gt;Hooks — PreToolUse · PostToolUse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.claude.com/en/docs/claude-code/sub-agents" rel="noopener noreferrer"&gt;Sub-agents · Skills&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Primary data&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EDIBLOG · one month running five plugins, my own asset (first-hand)&lt;/li&gt;
&lt;li&gt;My own setup · 39 automation jobs · 8 custom skills · 56 lib scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: this is my personal operating retro. Results may vary by environment. No ads · no affiliates.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/i-use-all-5-claude-code-plugins-every-day-an-honest-breakdown/" rel="noopener noreferrer"&gt;https://jessinvestment.com/i-use-all-5-claude-code-plugins-every-day-an-honest-breakdown/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>claudecodeplugins</category>
      <category>aitooling</category>
      <category>automation</category>
    </item>
    <item>
      <title>Warp vs Ghostty vs iTerm2 — The 2026 Mac Terminal Landscape After Open Source</title>
      <dc:creator>JessYT</dc:creator>
      <pubDate>Sun, 24 May 2026 06:14:22 +0000</pubDate>
      <link>https://dev.to/jessyt/warp-vs-ghostty-vs-iterm2-the-2026-mac-terminal-landscape-after-open-source-4hi3</link>
      <guid>https://dev.to/jessyt/warp-vs-ghostty-vs-iterm2-the-2026-mac-terminal-landscape-after-open-source-4hi3</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2rqgoavpgh2kqf8xfiqm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2rqgoavpgh2kqf8xfiqm.png" alt="Warp vs Ghostty vs iTerm2 — the 2026 Mac terminal landscape after open source" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The Mac terminal big three — as of May 2026
&lt;/h1&gt;

&lt;p&gt;Warp open-sourced under AGPLv3 on April 29, and the comparison got reshuffled one more time. Here's who should be running which terminal, in one place.&lt;/p&gt;

&lt;p&gt;"Which terminal should I use on a Mac?" is a question whose answer changes about every six months. A year ago it was "iTerm2 is the standard, Warp is a newcomer worth a look." It's not that simple anymore.&lt;/p&gt;

&lt;p&gt;On April 29, 2026, Warp released its entire client under AGPLv3. Around the same time Ghostty 1.3 shipped, and iTerm2's AI integration beta moved close to GA. I reinstalled all three this week and ran them side by side, and my conclusion is there's no single winner — you have to split them by use case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The three-line verdict.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If AI workflows are part of your daily life, go &lt;strong&gt;Warp&lt;/strong&gt;. The open-sourcing removed the closed-source baggage.&lt;/li&gt;
&lt;li&gt;If lightweight and fast is your top priority, go &lt;strong&gt;Ghostty&lt;/strong&gt;. This is where real GPU acceleration is clearest.&lt;/li&gt;
&lt;li&gt;If stability, plugins, and "it always just works" come first, go &lt;strong&gt;iTerm2&lt;/strong&gt;. Nothing matches 12 years of accumulated detail.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  One-line comparison table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Warp&lt;/th&gt;
&lt;th&gt;Ghostty&lt;/th&gt;
&lt;th&gt;iTerm2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;License&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AGPLv3 + MIT (UI)&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;GPLv2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built in (multi-model)&lt;/td&gt;
&lt;td&gt;None (use external tools)&lt;/td&gt;
&lt;td&gt;AI Plugin (beta)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPU rendering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Metal&lt;/td&gt;
&lt;td&gt;Metal (native by design)&lt;/td&gt;
&lt;td&gt;Metal (optional)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GUI-centric&lt;/td&gt;
&lt;td&gt;Text file&lt;/td&gt;
&lt;td&gt;GUI + plist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platforms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;macOS, Linux, Windows&lt;/td&gt;
&lt;td&gt;macOS, Linux&lt;/td&gt;
&lt;td&gt;macOS only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free for individuals, paid for team/AI&lt;/td&gt;
&lt;td&gt;Fully free&lt;/td&gt;
&lt;td&gt;Fully free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Warp — for people whose daily work is AI workflows
&lt;/h2&gt;

&lt;p&gt;Warp's strength starts with treating commands as "blocks." Input and output are captured as a single unit, and you can copy, share, or re-run that whole unit. AI integration sits naturally on top of that — ask about a command you don't know in plain language and it synthesizes it right away.&lt;/p&gt;

&lt;p&gt;The April 29, 2026 change was significant. The client was released under AGPLv3, and OpenAI joined as a Founding Sponsor, which broadened the model choices. For anyone who refused Warp because it was closed-source, this is the biggest new variable.&lt;/p&gt;

&lt;p&gt;The downsides are still there. &lt;strong&gt;It's the heaviest install of the three&lt;/strong&gt;, and because it's GUI-centric, syncing config is fiddly if you're used to dotfiles. And fully exercising the AI features needs a paid plan to be smooth.&lt;/p&gt;

&lt;p&gt;Recommended for: &lt;strong&gt;anyone who asks AI about commands every day, or frequently shares long command output with teammates&lt;/strong&gt;. A great fit for infra/DevOps roles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ghostty — when you just want "fast and light"
&lt;/h2&gt;

&lt;p&gt;Ghostty is a terminal that Mitchell Hashimoto (HashiCorp's founder) rebuilt from scratch as GPU-native. With 1.3.0 landing in April 2026, scrollback search arrived, and it made it into Ubuntu 26.04's official repository.&lt;/p&gt;

&lt;p&gt;Its design philosophy is clear. "A terminal is just a terminal" — no AI integration, no block-level abstraction; instead it focuses on the essentials like rendering speed, standard terminal compatibility, and key-input latency. Config is a single text file, so you can drop it straight into your dotfiles, which makes it an obvious workflow for vim users.&lt;/p&gt;

&lt;p&gt;The downside fits in one line: &lt;strong&gt;"it has fewer features."&lt;/strong&gt; Split panes, hotkeys, and themes all work, but modern integrations like "ask AI about a command" you have to wire up yourself with external tools. For people who've built their workflow out of tmux + fzf + their own shell scripts, that's actually a plus — but if that's a burden, it's not for you.&lt;/p&gt;

&lt;p&gt;Recommended for: &lt;strong&gt;anyone for whom speed matters most and who manages config through GitHub dotfiles&lt;/strong&gt;. The neovim/tmux crowd.&lt;/p&gt;




&lt;h2&gt;
  
  
  iTerm2 — when "hasn't stopped in 12 years" is what matters
&lt;/h2&gt;

&lt;p&gt;iTerm2 has been maintained for over 14 years, since 2009. Its stability, breadth of features, and plugin ecosystem are the deepest of the three. Split panes, a hotkey window, a password manager, shell integration, tmux integration — everything is in its place.&lt;/p&gt;

&lt;p&gt;In 2026, what stands out is that the AI Plugin is working well at the beta stage. It's not as seamless as Warp, but integrations like command autocompletion or sending an error to an external LLM for analysis are plenty practical. You set it up by plugging in your own OpenAI/Claude key.&lt;/p&gt;

&lt;p&gt;The downside is the GUI design. Charitably, it's classic; honestly, it looks a bit dated. And being macOS-only, it has limits if you move between Linux/Windows environments.&lt;/p&gt;

&lt;p&gt;Recommended for: &lt;strong&gt;the "do I really need to switch when I'm already using it fine?" camp who stays put&lt;/strong&gt;. And it's still the safest default for a beginner picking their first terminal.&lt;/p&gt;




&lt;h2&gt;
  
  
  So how should you actually choose?
&lt;/h2&gt;

&lt;p&gt;Here's a line for each situation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ask AI about commands daily, share command output with teammates often&lt;/strong&gt; → Warp&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage config via dotfiles, bothered by key-input latency, neovim user&lt;/strong&gt; → Ghostty&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Already using it fine, can't be bothered to set it all up again, stability first&lt;/strong&gt; → iTerm2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stability on the work Mac + experiments on the personal Mac&lt;/strong&gt; → iTerm2 (work) + Warp/Ghostty (personal) is a natural combo too&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing worth flagging. Before Warp open-sourced, "it's closed-source, so we can't use it at work" was the most common reason for rejecting Warp. Now the opposite is possible too — a scenario where a company runs its own self-built Warp. As of the first week of May, it's worth a fresh evaluation.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My two cents.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've honestly run all three as my main terminal for a stretch each. That's exactly why I can't land on a single answer. Right now I split it: &lt;strong&gt;iTerm2 on the work Mac (stability), Warp on the personal work Mac (AI workflows)&lt;/strong&gt;, and on a small side-project Mac mini I keep Ghostty installed for lightweight SSH work.&lt;/p&gt;

&lt;p&gt;The reason I can't unify on one is that all three are well made, but their strengths point in different directions. Over the next month I plan to track the self-built cases that emerge after Warp's open-sourcing — I'm curious where the first instance of a company self-hosting Warp will show up.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q. If Warp is open source now, is it safe to use at work without worrying?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A. The license (AGPLv3) itself is fine for in-house use, but the moment you use the AI features, your input context goes out to an external model — that hasn't changed. First check whether your company's security policy even allows sending command input externally, and if needed there's an option to use it with the AI features turned off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. What's the difference between Ghostty and Alacritty/Kitty?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A. All three are GPU-accelerated terminals, so the broad category is the same, but Ghostty has the smoothest native macOS SwiftUI integration and tends to care more about standard terminal compatibility. Alacritty/Kitty's strength is cross-platform consistency, and if you're already comfortable with one of them, there's little reason to switch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. Can I use the iTerm2 AI Plugin with just a ChatGPT key?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A. You can use it by entering your OpenAI API key directly, and a Claude key can be set up the same way. The catch is that token usage is billed directly to your own account, so if you leave automatic command analysis on, it's wise to set a limit in advance.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.warp.dev/blog/warp-is-now-open-source" rel="noopener noreferrer"&gt;Warp is now open-source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/warpdotdev/warp" rel="noopener noreferrer"&gt;warpdotdev/warp on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ghostty.org" rel="noopener noreferrer"&gt;Ghostty official site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iterm2.com" rel="noopener noreferrer"&gt;iTerm2 official site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thenewstack.io/warp-open-source-client/" rel="noopener noreferrer"&gt;Analysis of Warp's open-sourcing — The New Stack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This post combines public sources with the author's own usage experience. Validate any concrete adoption against your own environment (security policy, dotfiles setup, AI usage frequency).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Canonically published at &lt;a href="https://jessinvestment.com/warp-vs-ghostty-vs-iterm2-the-2026-mac-terminal-landscape-after-open-source/" rel="noopener noreferrer"&gt;jessinvestment.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original with full infographics and visual structure: &lt;a href="https://jessinvestment.com/warp-vs-ghostty-vs-iterm2-the-2026-mac-terminal-landscape-after-open-source/" rel="noopener noreferrer"&gt;https://jessinvestment.com/warp-vs-ghostty-vs-iterm2-the-2026-mac-terminal-landscape-after-open-source/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>warp</category>
      <category>ghostty</category>
      <category>iterm2</category>
    </item>
  </channel>
</rss>
