<?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: Muhammad Moeed</title>
    <description>The latest articles on DEV Community by Muhammad Moeed (@muhammad_moeed).</description>
    <link>https://dev.to/muhammad_moeed</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%2F3912830%2F5374218f-156e-4bbc-be08-c9bea48d2ee0.png</url>
      <title>DEV Community: Muhammad Moeed</title>
      <link>https://dev.to/muhammad_moeed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muhammad_moeed"/>
    <language>en</language>
    <item>
      <title>Claude Code slow or worse? How to diagnose and fix it in 2026</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Sat, 23 May 2026 19:05:07 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/claude-code-slow-or-worse-how-to-diagnose-and-fix-it-in-2026-951</link>
      <guid>https://dev.to/muhammad_moeed/claude-code-slow-or-worse-how-to-diagnose-and-fix-it-in-2026-951</guid>
      <description>&lt;p&gt;If Claude Code has felt slower or less capable this spring, you were not imagining it. Anthropic confirmed in an &lt;a href="https://www.infoq.com/news/2026/05/anthropic-claude-code-postmortem/" rel="noopener noreferrer"&gt;official post mortem on April 23, 2026&lt;/a&gt; that three product changes stacked between March and April caused real, measurable quality drops. All three were reverted by April 20.&lt;/p&gt;

&lt;p&gt;This is the short version. The full guide is on my blog: &lt;a href="https://moeed.app/posts/claude-code-slow-fix/" rel="noopener noreferrer"&gt;Claude Code Slow or Worse? How to Diagnose and Fix It (2026)&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;th&gt;Landed&lt;/th&gt;
&lt;th&gt;Reverted&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reasoning effort dropped from high to medium&lt;/td&gt;
&lt;td&gt;March 4&lt;/td&gt;
&lt;td&gt;April 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache eviction bug fired every turn&lt;/td&gt;
&lt;td&gt;March 26&lt;/td&gt;
&lt;td&gt;April 10 (fixed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System prompt "25 words between tool calls"&lt;/td&gt;
&lt;td&gt;April 16&lt;/td&gt;
&lt;td&gt;April 20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All resolved in &lt;code&gt;v2.1.116&lt;/code&gt;. Anthropic reset usage limits as an apology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three quick checks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Are you on the fixed build?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update if you are below &lt;code&gt;v2.1.116&lt;/code&gt;. Fast mode now defaults to Opus 4.7 as of &lt;code&gt;v2.1.142&lt;/code&gt; (May 14).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Run &lt;code&gt;/doctor&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;It catches about 80 percent of "Claude is broken" cases. Stale install, wrong API key, broken MCP server, outdated &lt;code&gt;CLAUDE.md&lt;/code&gt;, silently failing hook. Fix anything yellow or red before blaming the model.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Check status
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;status.claude.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If it is red, stop and come back later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six fixes for the rest
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start fresh sooner.&lt;/strong&gt; Long sessions lose attention to context bloat. Run &lt;code&gt;/compact&lt;/code&gt; every 30 to 45 minutes or restart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write a real &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/strong&gt; Project context that belongs in every session. Keep it under two pages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;/fast&lt;/code&gt; only when speed matters.&lt;/strong&gt; Same intelligence as standard Opus 4.7, six times the cost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Put quality constraints at the end of your prompt.&lt;/strong&gt; Attention weight is higher there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shrink your MCP surface.&lt;/strong&gt; Every connected server eats tokens before you type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Full restart.&lt;/strong&gt; Kill Claude Code, wait 10 to 15 minutes, start again.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The diagnostic tree
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version &amp;gt;= 2.1.116?      no → update
/doctor clean?           no → fix it
status.claude.com clean? no → wait
session &amp;gt; 45 minutes?    yes → /compact or restart
&amp;gt; 3 MCP servers?         yes → disconnect what you do not use
still bad?               → restart, then file a GitHub issue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most people stop at one of the middle steps.&lt;/p&gt;




&lt;p&gt;The full guide covers what each platform change did, the cost trade off of fast mode, when to file a GitHub issue, and a longer FAQ: &lt;a href="https://moeed.app/posts/claude-code-slow-fix/" rel="noopener noreferrer"&gt;Claude Code Slow or Worse? How to Diagnose and Fix It (2026)&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Claude Agent SDK vs Vercel AI SDK 6 — which to pick in 2026</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Sat, 23 May 2026 19:02:11 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/claude-agent-sdk-vs-vercel-ai-sdk-6-which-to-pick-in-2026-2jj</link>
      <guid>https://dev.to/muhammad_moeed/claude-agent-sdk-vs-vercel-ai-sdk-6-which-to-pick-in-2026-2jj</guid>
      <description>&lt;p&gt;Two libraries land on most shortlists when you start an agent project in 2026: Anthropic's &lt;code&gt;Claude Agent SDK&lt;/code&gt; and &lt;code&gt;Vercel AI SDK 6&lt;/code&gt;. Both build agents that use tools, stream, and speak MCP. They were built by teams with different beliefs.&lt;/p&gt;

&lt;p&gt;This is the short version. The full guide is on my blog: &lt;a href="https://moeed.app/posts/claude-agent-sdk-vs-vercel-ai-sdk/" rel="noopener noreferrer"&gt;Claude Agent SDK vs Vercel AI SDK 6: Which to Pick (2026)&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Pick the &lt;strong&gt;Claude Agent SDK&lt;/strong&gt; when your model is Claude and you want the same runtime that powers Claude Code, with caching, compaction, and built in tools on day one. Python and TypeScript.&lt;/p&gt;

&lt;p&gt;Pick the &lt;strong&gt;Vercel AI SDK 6&lt;/strong&gt; when you need multi provider support, your stack is TypeScript and React or Next.js, or you want chat, tools, images, reranking, and speech in one library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side by side at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Claude Agent SDK&lt;/th&gt;
&lt;th&gt;Vercel AI SDK 6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Languages&lt;/td&gt;
&lt;td&gt;Python, TypeScript&lt;/td&gt;
&lt;td&gt;TypeScript only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Models&lt;/td&gt;
&lt;td&gt;Claude only&lt;/td&gt;
&lt;td&gt;Any provider through AI Gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent API&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;query()&lt;/code&gt; with &lt;code&gt;ClaudeAgentOptions&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ToolLoopAgent&lt;/code&gt; class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built in tools&lt;/td&gt;
&lt;td&gt;Read, Write, Edit, Bash, Glob, Grep, WebSearch&lt;/td&gt;
&lt;td&gt;None by default, you define them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subagents&lt;/td&gt;
&lt;td&gt;First class, own context window&lt;/td&gt;
&lt;td&gt;Not built in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP support&lt;/td&gt;
&lt;td&gt;First class&lt;/td&gt;
&lt;td&gt;First class as of v6, OAuth supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt caching&lt;/td&gt;
&lt;td&gt;On by default&lt;/td&gt;
&lt;td&gt;Provider dependent, opt in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context compaction&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevTools UI&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Local UI at &lt;code&gt;localhost:4983&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frameworks&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Next.js, React, Svelte, Vue, Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Anthropic SDK is opinionated and Claude shaped. The Vercel SDK is flexible and provider neutral.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same agent in both
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Claude Agent SDK
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@anthropic-ai/claude-agent-sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What changed in HTTP/3 in 2025?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;allowedTools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WebSearch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WebFetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a research assistant. Always cite sources.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&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="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;result&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;WebSearch&lt;/code&gt; and &lt;code&gt;WebFetch&lt;/code&gt; are built in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vercel AI SDK 6
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ToolLoopAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;anthropic&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@ai-sdk/anthropic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;webSearch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Search the web. Returns the top three results.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ToolLoopAgent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a research assistant. Always cite sources.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;webSearch&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What changed in HTTP/3 in 2025?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You bring your own search function. Swap &lt;code&gt;anthropic(...)&lt;/code&gt; for &lt;code&gt;openai(...)&lt;/code&gt; and the rest of the file is unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each wins
&lt;/h2&gt;

&lt;p&gt;The Claude Agent SDK wins on built in tools, subagents with their own context window, hooks that mirror Claude Code, and defaults that match production. Prompt caching is on, compaction is automatic, retries are sensible.&lt;/p&gt;

&lt;p&gt;The Vercel AI SDK 6 wins on provider flexibility, the DevTools UI at &lt;code&gt;localhost:4983&lt;/code&gt;, one line human in the loop with &lt;code&gt;needsApproval&lt;/code&gt;, and having image, audio, and reranking in the same library.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple way to choose
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Are you locked to Claude models?
  Yes → Claude Agent SDK
  No  → TypeScript and React stack?
          Yes → Vercel AI SDK 6
          No  → Claude Agent SDK Python build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For LangChain comparisons, the &lt;a href="https://moeed.app/posts/claude-agent-sdk-vs-langchain/" rel="noopener noreferrer"&gt;Claude Agent SDK vs LangChain&lt;/a&gt; post has the answer.&lt;/p&gt;




&lt;p&gt;The full guide covers MCP wiring on both sides, defaults and cost, the June 15 2026 Agent SDK billing change, and a longer FAQ: &lt;a href="https://moeed.app/posts/claude-agent-sdk-vs-vercel-ai-sdk/" rel="noopener noreferrer"&gt;Claude Agent SDK vs Vercel AI SDK 6: Which to Pick (2026)&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>anthropic</category>
      <category>vercel</category>
      <category>agents</category>
    </item>
    <item>
      <title>AWS Copilot CLI is reaching end of support — your migration options</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Wed, 20 May 2026 13:32:59 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/aws-copilot-cli-is-reaching-end-of-support-your-migration-options-4bl7</link>
      <guid>https://dev.to/muhammad_moeed/aws-copilot-cli-is-reaching-end-of-support-your-migration-options-4bl7</guid>
      <description>&lt;p&gt;If you have been using AWS Copilot CLI to deploy containers on ECS, the tool has a date on it. &lt;strong&gt;AWS Copilot CLI reaches end of support on June 12, 2026.&lt;/strong&gt; After that, the open-source project stays on GitHub, but AWS will not ship features, fixes, or security patches for it.&lt;/p&gt;

&lt;p&gt;This is the short version. The full walkthrough is on my blog: &lt;a href="https://moeed.app/posts/aws-copilot-cli-end-of-support/" rel="noopener noreferrer"&gt;AWS Copilot CLI End of Support: Migration Guide for 2026&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes on June 12, 2026
&lt;/h2&gt;

&lt;p&gt;Your running apps do not. The ECS services, load balancers, and CloudFormation stacks Copilot created stay in your account.&lt;/p&gt;

&lt;p&gt;What changes is the tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No new features.&lt;/li&gt;
&lt;li&gt;No security updates from AWS.&lt;/li&gt;
&lt;li&gt;No technical support.&lt;/li&gt;
&lt;li&gt;The GitHub repo stays open, but it is no longer AWS-maintained.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What AWS recommends instead
&lt;/h2&gt;

&lt;p&gt;Two paths, for two kinds of teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon ECS Express Mode.&lt;/strong&gt; The fastest path from a container image to production. You hand it an image and two IAM roles, and it builds the load balancer, listener, target groups, security groups, scaling, and monitoring. Fargate-only. Closest in spirit to Copilot. Pick this if your service is a standard load-balanced or request-driven web app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS CDK Layer 3 constructs.&lt;/strong&gt; The &lt;code&gt;aws-ecs-patterns&lt;/code&gt; library has constructs like &lt;code&gt;ApplicationLoadBalancedFargateService&lt;/code&gt;, &lt;code&gt;QueueProcessingFargateService&lt;/code&gt;, and &lt;code&gt;ScheduledFargateTask&lt;/code&gt; that cover most patterns Copilot supported. Pick this if you need fine-grained control, blue/green, a service mesh, or non-Fargate launch types.&lt;/p&gt;

&lt;p&gt;You can also take over the CloudFormation Copilot generated and manage it directly. Low effort short-term, but those templates are not built to be human-edited. Treat it as a bridge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Service-by-service map
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Copilot service type&lt;/th&gt;
&lt;th&gt;Replacement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Load Balanced Web Service&lt;/td&gt;
&lt;td&gt;ECS Express Mode, or CDK &lt;code&gt;ApplicationLoadBalancedFargateService&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request-Driven Web Service&lt;/td&gt;
&lt;td&gt;ECS Express Mode with request-based scaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend Service&lt;/td&gt;
&lt;td&gt;CDK internal ALB, or ECS Service Connect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worker Service&lt;/td&gt;
&lt;td&gt;CDK &lt;code&gt;QueueProcessingFargateService&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduled Job&lt;/td&gt;
&lt;td&gt;EventBridge Scheduler + ECS &lt;code&gt;RunTask&lt;/code&gt;, or CDK &lt;code&gt;ScheduledFargateTask&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static Site&lt;/td&gt;
&lt;td&gt;CDK CloudFront constructs, or AWS Amplify Hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most teams find that web services land on Express Mode and workers/scheduled jobs land on CDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to plan the move
&lt;/h2&gt;

&lt;p&gt;One service at a time, not one big switch:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inventory every service. &lt;code&gt;copilot svc ls&lt;/code&gt; gives the list; the &lt;code&gt;copilot/&lt;/code&gt; manifests give the type.&lt;/li&gt;
&lt;li&gt;Match each to its replacement.&lt;/li&gt;
&lt;li&gt;Pick a low-traffic service for the first migration. The point is to learn the workflow, not to ship the hardest case.&lt;/li&gt;
&lt;li&gt;Run both versions in parallel for a few days, watch metrics, cut over.&lt;/li&gt;
&lt;li&gt;Delete the Copilot service to remove its stack cleanly.&lt;/li&gt;
&lt;li&gt;Repeat. Hardest cases last.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you only do one thing before June 12, do step one.&lt;/p&gt;




&lt;p&gt;The full guide covers the IAM-role split for Express Mode, when CDK is actually worth it, the third path of taking over the CloudFormation directly, and what happens if you cannot migrate in time: &lt;a href="https://moeed.app/posts/aws-copilot-cli-end-of-support/" rel="noopener noreferrer"&gt;AWS Copilot CLI End of Support: Migration Guide for 2026&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ecs</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Claude Code /goal and Agent View, explained</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Tue, 19 May 2026 11:39:31 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/claude-code-goal-and-agent-view-explained-30ih</link>
      <guid>https://dev.to/muhammad_moeed/claude-code-goal-and-agent-view-explained-30ih</guid>
      <description>&lt;p&gt;The May 2026 Claude Code update added two features for running it without watching every step: the &lt;code&gt;/goal&lt;/code&gt; command and Agent View. They are separate, but built for the same workflow, so here they are together. Everything below is from the official docs. The full version is on my blog: &lt;a href="https://moeed.app/posts/claude-code-goal-and-agent-view/" rel="noopener noreferrer"&gt;Claude Code /goal and Agent View: A Practical Guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What /goal does
&lt;/h2&gt;

&lt;p&gt;You write one completion condition. After each turn, instead of stopping, Claude Code asks a separate model whether the condition is true. No, it takes another turn, using the reason as guidance. Yes, the goal clears and you get your terminal back. Requires v2.1.139 or later.&lt;/p&gt;

&lt;p&gt;You set one by running &lt;code&gt;/goal&lt;/code&gt; followed by the condition, for example: &lt;code&gt;/goal all tests in test/auth pass and the lint step is clean&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;/goal&lt;/code&gt; with no argument shows status. &lt;code&gt;/goal clear&lt;/code&gt; stops it early. It also runs non-interactively with &lt;code&gt;claude -p "/goal CHANGELOG.md has an entry for every PR merged this week"&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The detail most posts skip
&lt;/h2&gt;

&lt;p&gt;The evaluator is a small fast model (Haiku by default). It does &lt;strong&gt;not&lt;/strong&gt; run commands or open files. It only judges the text already in the session. So the condition has to be something Claude can prove by what it prints. "All tests in test/auth pass" works because the test output lands in the transcript. "The code is good" never will.&lt;/p&gt;

&lt;p&gt;A condition that holds up has one measurable end state, a stated check (how Claude proves it), and the constraints that must not change. It can be up to 4,000 characters. Add a clause like "or stop after 20 turns" so it does not run forever. That one clause is the difference between a task that ends and a task that quietly keeps spending tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it compares
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/goal&lt;/code&gt;: next turn after the previous finishes; stops when a model confirms the condition.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/loop&lt;/code&gt;: next turn on a time interval.&lt;/li&gt;
&lt;li&gt;Stop hook: your own script decides. (&lt;code&gt;/goal&lt;/code&gt; is actually a thin wrapper over a session-scoped Stop hook.)&lt;/li&gt;
&lt;li&gt;Auto mode: removes per-tool approvals inside a turn. Complementary: auto mode plus &lt;code&gt;/goal&lt;/code&gt; means turns run unattended and keep coming until done.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agent View
&lt;/h2&gt;

&lt;p&gt;Once a session runs on its own, you want several. Agent View is one CLI screen listing your sessions: status, last response, when you last touched it. Open it with the left arrow from any session, or by running &lt;code&gt;claude agents&lt;/code&gt;. Statuses are Running, Blocked (needs you), and Done. Peek at a session, answer inline if it is blocked, press Enter to attach fully.&lt;/p&gt;

&lt;p&gt;Background sessions connect the two: &lt;code&gt;/bg&lt;/code&gt; sends the current session to the background, and &lt;code&gt;claude --bg [task]&lt;/code&gt; starts one already detached. Start a few goals with turn limits, background them, watch the fleet in Agent View, and step in only on Blocked or Done.&lt;/p&gt;

&lt;p&gt;Agent View is a research preview on Pro, Max, Team, Enterprise, and Claude API plans.&lt;/p&gt;




&lt;p&gt;The full guide covers writing conditions in depth, the requirements and limits, when not to use it, and how it differs from Outcomes and plan mode: &lt;a href="https://moeed.app/posts/claude-code-goal-and-agent-view/" rel="noopener noreferrer"&gt;Claude Code /goal and Agent View: A Practical Guide&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What is AWS ECS Express Mode (and when to use it)</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Tue, 19 May 2026 11:33:31 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/what-is-aws-ecs-express-mode-and-when-to-use-it-1amb</link>
      <guid>https://dev.to/muhammad_moeed/what-is-aws-ecs-express-mode-and-when-to-use-it-1amb</guid>
      <description>&lt;p&gt;If you have ever deployed a normal web service on ECS, the slow part was never the container. It was everything around it: a load balancer, listener rules, target groups, two security groups, a task definition, the service, auto scaling, alarms, and the networking that ties it together. ECS Express Mode is Amazon's answer to that. You give it a container image, and it builds the rest.&lt;/p&gt;

&lt;p&gt;This is the short version. The full walkthrough is on my blog: &lt;a href="https://moeed.app/posts/what-is-aws-ecs-express-mode/" rel="noopener noreferrer"&gt;What is AWS ECS Express Mode&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you give it
&lt;/h2&gt;

&lt;p&gt;Three inputs, that is the whole list:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A container image&lt;/strong&gt; — your actual app, the kind of image you would push to ECR.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A task execution IAM role&lt;/strong&gt; — the role ECS uses to start the container, pull the image, and write logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An infrastructure IAM role&lt;/strong&gt; — the new one. The permission Express Mode uses to create the load balancer and the rest on your behalf.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The two roles are kept separate on purpose. One runs your app, the other provisions infrastructure. You do not want your running container holding permission to create load balancers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it builds
&lt;/h2&gt;

&lt;p&gt;From those three inputs it provisions an Application Load Balancer, an HTTPS endpoint on an AWS-provided domain, auto scaling, health checks, security groups, and monitoring set up with AWS's recommended defaults. Every resource stays fully visible and editable in your own account.&lt;/p&gt;

&lt;p&gt;It runs on Fargate only, not the EC2 launch type. It also places up to 25 Express Mode services behind a single shared load balancer when their networking is compatible, so you are not paying for a load balancer per tiny service.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;The feature has no extra charge and is in all regions. You pay only for the AWS resources it creates to run the app. You save the setup time, not the running cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to use it
&lt;/h2&gt;

&lt;p&gt;Express Mode trades configurability for speed. Skip it when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blue/green deployments&lt;/strong&gt; — not supported.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A service mesh or detailed networking control&lt;/strong&gt; — not available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The EC2 launch type&lt;/strong&gt; — Fargate only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A dedicated load balancer&lt;/strong&gt; with custom listener logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because every resource stays in your account, you are not locked in. Start on Express Mode, and when a service grows into one of those cases, migrate it to a standard ECS service rather than rebuilding from scratch.&lt;/p&gt;




&lt;p&gt;The full version explains the IAM roles, the shared load balancer model, the comparison table against a standard ECS service, and a full FAQ: &lt;a href="https://moeed.app/posts/what-is-aws-ecs-express-mode/" rel="noopener noreferrer"&gt;What is AWS ECS Express Mode (and when to use it)&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ecs</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How Anthropic's own teams use Claude Code</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Tue, 19 May 2026 11:11:04 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/how-anthropics-own-teams-use-claude-code-23no</link>
      <guid>https://dev.to/muhammad_moeed/how-anthropics-own-teams-use-claude-code-23no</guid>
      <description>&lt;p&gt;Anthropic published a report on how its own staff use Claude Code. It comes from interviews with internal power users across ten teams, including non-technical ones like legal and marketing. A lot of people have been looking for the PDF, so here is the short version plus the parts that matter even if you are one person and not a company with a large monorepo.&lt;/p&gt;

&lt;p&gt;The source is &lt;a href="https://www-cdn.anthropic.com/58284b19e702b49db9302d5b6f135ad8871e7658.pdf" rel="noopener noreferrer"&gt;How Anthropic teams use Claude Code&lt;/a&gt; (PDF). This is my reading of it, not a copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The report in one paragraph
&lt;/h2&gt;

&lt;p&gt;Ten teams, some technical and some not. The recurring lessons are simple and consistent: write a detailed CLAUDE.md, commit checkpoints often so you can revert, treat Claude Code as a partner you iterate with rather than a one-shot machine, paste screenshots instead of describing things, and learn which tasks can run on their own versus which need you watching. The biggest jumps came from people who do not write code for a living.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few of the stories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Infrastructure&lt;/strong&gt; debugged a Kubernetes outage by pasting dashboard screenshots in and letting Claude Code walk them through the console until they found pod IP exhaustion. They also taught the finance team to run plain-text workflow files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Claude Code team&lt;/strong&gt; builds Claude Code with it. Edge features run in auto-accept loops to about an eighty-percent solution; core logic is watched closely. Vim mode was roughly seventy percent autonomous.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Engineering&lt;/strong&gt; pastes Terraform plans in and asks, in plain words, what it will do and whether they will regret it. They own about half the custom slash commands in the whole monorepo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Science&lt;/strong&gt; builds React and TypeScript dashboards without reading the code, and treats messy refactors "like a slot machine": commit, let it run thirty minutes, then accept or restart fresh.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth Marketing&lt;/strong&gt;, a non-technical team of one, built ad-generation workflows with subagents and a Figma plugin, cutting two-hour copy tasks to fifteen minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legal&lt;/strong&gt; built a predictive-text speaking app for a family member in about an hour.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The patterns worth keeping
&lt;/h2&gt;

&lt;p&gt;These came up independently across teams doing very different work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CLAUDE.md is the highest-leverage file you have.&lt;/strong&gt; Three unrelated teams reached this on their own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit checkpoints and be willing to throw work away.&lt;/strong&gt; Restarting clean usually beats fixing a bad attempt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is a partner you iterate with, not a one-shot oracle.&lt;/strong&gt; Give it the minimum, watch, steer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screenshots are an input, not a fallback.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Judge the task before you pick the mode.&lt;/strong&gt; Edge work can run alone; core logic needs you in the room.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation is a first-class use, not a side effect.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use MCP and subagents to keep things controlled and focused.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The honest parts
&lt;/h2&gt;

&lt;p&gt;Most write-ups drop these. The RL team says a first attempt fully works only about a third of the time, and that it sometimes puts comments in odd places. Data Science says it tends toward complex solutions and has to be told to keep it simple. That is not a reason to avoid it. It is the reason the checkpoint-and-revert habit exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a solo developer can copy today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Write a real CLAUDE.md, even a short one.&lt;/li&gt;
&lt;li&gt;Start risky runs from a clean git state and commit as you go.&lt;/li&gt;
&lt;li&gt;Automate the repetitive thing that sits behind an API first.&lt;/li&gt;
&lt;li&gt;Plan in a normal chat, then move the structured prompt into Claude Code.&lt;/li&gt;
&lt;li&gt;If a run goes sideways, revert and restart instead of wrestling it.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The full version on my blog goes team by team through all ten, with the specific numbers and tips for each: &lt;a href="https://moeed.app/posts/how-anthropic-teams-use-claude-code/" rel="noopener noreferrer"&gt;How Anthropic's own teams use Claude Code&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Claude Code vs Cursor — 90 days with both in 2026</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Fri, 15 May 2026 00:43:39 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/claude-code-vs-cursor-90-days-with-both-in-2026-2dha</link>
      <guid>https://dev.to/muhammad_moeed/claude-code-vs-cursor-90-days-with-both-in-2026-2dha</guid>
      <description>&lt;p&gt;If you have already tried one of them, you are probably wondering whether the other is worth a switch. The short version is that &lt;strong&gt;Claude Code and Cursor are not competing for the same job, even though they look like they are.&lt;/strong&gt; One lives in your terminal and behaves like a junior engineer with shell access. The other lives inside an editor and behaves like a very fast pair programmer sitting next to you.&lt;/p&gt;

&lt;p&gt;I ran both on real work for ninety days. Some of it was a Next.js client project, some of it was a Python data pipeline, and a fair amount was housekeeping in my own blog. The picture that came out of that is more nuanced than the comparison posts I had read going in.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Claude Code is better when the task is large and the work happens across many files. Cursor is better when the task is small and you need to stay in the file you are looking at. Most working developers end up using both.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What they actually are
&lt;/h2&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;Claude Code&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Form&lt;/td&gt;
&lt;td&gt;Terminal CLI (plus IDE extension)&lt;/td&gt;
&lt;td&gt;Forked VS Code editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default working mode&lt;/td&gt;
&lt;td&gt;Agentic — reads, plans, edits, runs cmds&lt;/td&gt;
&lt;td&gt;Inline completion + chat + agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;Pro $20 / Max $200 per month&lt;/td&gt;
&lt;td&gt;Pro $20 / Ultra $200, free tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Multi-file refactors, repo-wide work, CI&lt;/td&gt;
&lt;td&gt;Single-file edits, fast iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cursor is an editor. Claude Code is an agent. That one sentence explains most of the differences below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Cursor wins
&lt;/h2&gt;

&lt;p&gt;I want to be honest here because the internet has decided Claude Code is the winner and Cursor is yesterday's news. That is not what I saw.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inline tab completion is still the best in the category.&lt;/strong&gt; For small edits where you already know what you want, this beats any agent loop on raw speed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diff review inside a real editor.&lt;/strong&gt; Hunk-by-hunk accept/reject with keyboard shortcuts is genuinely nicer than reading the same diff in a terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exploring an unfamiliar codebase.&lt;/strong&gt; Right-click → "explain this function" while looking at the function is the fastest way to learn a new repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-request model switching.&lt;/strong&gt; Mix Opus 4.7, GPT-5, and cheaper models depending on the task.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where Claude Code wins
&lt;/h2&gt;

&lt;p&gt;These are the cases where I would not even open Cursor. The gap is large enough that there is no contest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Large refactors across many files
&lt;/h3&gt;

&lt;p&gt;The first time Claude Code paid for itself was a migration job. Rename a config option across thirty-eight files, update the types, fix every test, add a deprecation notice. In Cursor I would have done this with search-and-replace and a lot of cleanup. In Claude Code I described the task in two sentences and walked away for ten minutes. When I came back, it was done and the tests were passing.&lt;/p&gt;

&lt;p&gt;For anything that touches more than four or five files, the agent loop is the right shape. You stop being a typist and start being a reviewer. That shift is the real product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Long-running, autonomous work
&lt;/h3&gt;

&lt;p&gt;Claude Code can run for thirty or forty minutes on a single task without losing the thread. It plans, executes, hits errors, debugs, and finishes. Ultraplan, the newer cloud-planning feature, pushes this even further by separating planning from execution.&lt;/p&gt;

&lt;p&gt;Cursor's agent mode can do similar work, but I have never gotten a clean half-hour run out of it. It stops to ask questions or loses context. Claude Code is more comfortable with autonomy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running in CI and headless environments
&lt;/h3&gt;

&lt;p&gt;Because Claude Code is a CLI, it runs anywhere a shell runs. Drop it into a GitHub Action and have it review PRs. Pipe data into it. Cursor is an editor, so it lives where editors live: on a developer's laptop. For team automation, this is a real gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real cost over three months
&lt;/h2&gt;

&lt;p&gt;People hand-wave about cost. Here are numbers I actually saw.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Months&lt;/th&gt;
&lt;th&gt;Real spend&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;Pro $20/mo&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;$60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Max $200/mo&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;$600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$660&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That Claude Code spend looks high until you compare it to what those tasks would have cost in human hours. The refactor I mentioned above would have taken me a full day. Claude Code did it for about eight dollars of compute.&lt;/p&gt;

&lt;p&gt;If you are on a tight budget, &lt;strong&gt;Cursor Pro at $20 is the better starting point.&lt;/strong&gt; If you bill client work and your time is worth more than $50 an hour, &lt;strong&gt;Claude Code pays for itself inside the first project.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one to pick for which work
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Solo developer, writing a lot of new code&lt;/td&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bug fixes in a codebase you know well&lt;/td&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-file refactor or migration&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writing tests for an existing module&lt;/td&gt;
&lt;td&gt;Either&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviewing a PR (especially in CI)&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning a new codebase&lt;/td&gt;
&lt;td&gt;Cursor for poking, Claude Code for summaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heavy automation, scripting, glue work&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Very limited budget&lt;/td&gt;
&lt;td&gt;Cursor Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client work where your hourly rate is high&lt;/td&gt;
&lt;td&gt;Claude Code Max&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The honest answer for most working developers is to use both. They are inexpensive enough together that the question is not which to pick, but how to set up your workflow so each one does what it is good at.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup I actually shipped
&lt;/h2&gt;

&lt;p&gt;After ninety days, this is what stayed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; for active coding sessions. Fast tab complete, quick diffs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for everything else. Refactors, test runs, PR reviews, repo-wide search, anything I want running while I am doing something else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both pointed at the same shared &lt;code&gt;.claude/&lt;/code&gt; folder&lt;/strong&gt; so my hooks, skills, and MCP config travel with the repo. A server I write once works in both places.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A few small subagents&lt;/strong&gt; for jobs I do often — diff review before commit, weekly change log.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total: $220 a month for the two of them. Saved a lot of time, I have not measured it carefully enough to put a defensible number on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few common questions I get asked about this
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is Cursor going to be replaced by Claude Code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Cursor is an editor with AI. Claude Code is an agent in your terminal. Either can copy a feature, but the form factor of each one limits how much it can become the other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use Claude Code inside Cursor?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes — run the CLI in Cursor's integrated terminal. You lose the editor integration with the agent but keep Cursor's other features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Cursor support MCP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Same &lt;code&gt;.cursor/mcp.json&lt;/code&gt; format. An MCP server you write once works in both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better for non-developers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cursor. CLIs have a learning curve not everyone wants to climb.&lt;/p&gt;




&lt;h2&gt;
  
  
  The full version
&lt;/h2&gt;

&lt;p&gt;This is the dev.to cut. The &lt;a href="https://moeed.app/posts/claude-code-vs-cursor/" rel="noopener noreferrer"&gt;full version on my blog&lt;/a&gt; goes deeper on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Speed, reliability, and memory benchmarks I tracked&lt;/li&gt;
&lt;li&gt;Editor lock-in concerns with Cursor&lt;/li&gt;
&lt;li&gt;A longer "common questions" section&lt;/li&gt;
&lt;li&gt;Decision rules I now follow when picking which tool to open&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have the opposite experience from what I described above, I genuinely want to hear it. The most useful comparisons come from people whose work shape is different from mine.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>cursor</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>7 Claude Code Routines That Actually Save Me Hours Each Week</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Wed, 13 May 2026 00:51:53 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/7-claude-code-routines-that-actually-save-me-hours-each-week-562l</link>
      <guid>https://dev.to/muhammad_moeed/7-claude-code-routines-that-actually-save-me-hours-each-week-562l</guid>
      <description>&lt;p&gt;For a long time, Claude Code felt like a power tool you had to pick up and put down. You opened the terminal, did the work, and closed it. If you wanted Claude to do something while your laptop was asleep, like review a pull request, scan new issues, or summarise the week, you needed a separate setup. A cron job, a GitHub Action, some glue code, and a way to keep your credentials safe.&lt;/p&gt;

&lt;p&gt;Routines remove all of that.&lt;/p&gt;

&lt;p&gt;A routine is a saved Claude Code configuration. A prompt, one or more repositories, and a set of connectors, packaged once and run automatically on Anthropic cloud. You set it up once. You forget it. It keeps working when your laptop is closed.&lt;/p&gt;

&lt;p&gt;This post walks through what a routine actually is, how the three trigger types work, and seven workflows I either run myself or set up for clients. Most of them save more time in a week than they took to write.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a routine is
&lt;/h2&gt;

&lt;p&gt;The shortest possible definition: a routine is a packaged Claude Code job that runs in the cloud.&lt;/p&gt;

&lt;p&gt;Concretely, each routine includes four things.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A prompt describing the work.&lt;/li&gt;
&lt;li&gt;One or more repositories the routine should have access to.&lt;/li&gt;
&lt;li&gt;The connectors the job needs (Slack, Linear, your MCP servers, anything you have wired up).&lt;/li&gt;
&lt;li&gt;A trigger that decides when the routine runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a routine fires, Anthropic spins up a fresh Claude Code session in the cloud, clones the repositories, attaches the connectors, runs the prompt, and shuts down. There is no permission prompt during the run. The session has the same capabilities as your local Claude Code, including shell commands, file edits, skills, and MCP, but it executes autonomously.&lt;/p&gt;

&lt;p&gt;You can create routines from three places, and all three write to the same cloud account.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The web app at &lt;code&gt;claude.ai/code/routines&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The Claude Code desktop app.&lt;/li&gt;
&lt;li&gt;The CLI, with &lt;code&gt;claude routines create&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A routine created in the web shows up in the desktop app and the CLI immediately. Pick whichever surface you find easiest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three trigger types
&lt;/h2&gt;

&lt;p&gt;Triggers are where Routines get interesting. Each routine can have one or more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scheduled
&lt;/h3&gt;

&lt;p&gt;The routine runs on a recurring cadence. Hourly, nightly, weekly, or at a specific future time once. This is the closest thing to a cron job, except you describe the cadence in plain English and the cloud handles time zones and retries for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  API
&lt;/h3&gt;

&lt;p&gt;Each routine gets a private HTTP endpoint and a bearer token. Send a POST and the routine runs. This is the trigger you use when something outside the Claude ecosystem needs to kick off work, like a deploy script, a monitoring tool, or a webhook from another service.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub
&lt;/h3&gt;

&lt;p&gt;A routine attached to a repository can fire on GitHub events. Pull request opened. Pull request synchronised. Release published. Issue created. The event payload is passed into the routine context, so the prompt can refer to "the PR that just opened" and Claude knows what that means.&lt;/p&gt;

&lt;p&gt;You can mix them. A nightly schedule plus an on-demand API trigger is a common pattern. The routine runs every night for housekeeping, and you can also poke it manually from a script when you need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who can use them, and how many
&lt;/h2&gt;

&lt;p&gt;Routines are part of the Claude Code on the web offering. The limits map onto your plan.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Routines per day&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you regularly bump against these limits, the answer is usually to combine smaller routines into bigger ones rather than upgrade plans. A single routine can do quite a lot of work in one session.&lt;/p&gt;

&lt;h2&gt;
  
  
  A first routine, end to end
&lt;/h2&gt;

&lt;p&gt;Before the workflow examples, here is a complete walkthrough so you can see the moving parts.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Create the routine
&lt;/h3&gt;

&lt;p&gt;From the web at &lt;code&gt;claude.ai/code/routines&lt;/code&gt;, click New routine. Give it a name like &lt;code&gt;weekly-todo-cleanup&lt;/code&gt;. Pick the repository it should work in. Add any connectors it needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Write the prompt
&lt;/h3&gt;

&lt;p&gt;The prompt is the heart of the routine. Treat it like a clear request to a teammate.&lt;/p&gt;

&lt;p&gt;Read the TODOs in this repository that match the pattern&lt;br&gt;
"// TODO" or "# TODO". For each one:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decide whether the surrounding code still makes sense.&lt;/li&gt;
&lt;li&gt;If the TODO is stale (the referenced bug is fixed, the
referenced function no longer exists, or the comment is
older than 90 days with no recent commits to the file)
remove it and add a short note to the commit.&lt;/li&gt;
&lt;li&gt;Group the survivors by directory and post a summary to
#engineering on Slack, grouped by priority.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open a pull request titled "chore: weekly TODO cleanup"&lt;br&gt;
against main. Tag &lt;a class="mentioned-user" href="https://dev.to/moeed"&gt;@moeed&lt;/a&gt; for review.&lt;/p&gt;

&lt;p&gt;A few things to notice. The prompt is specific. It names the patterns to look for. It defines what "stale" means. It says what to do with the survivors. Vague prompts produce vague routines.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Add a trigger
&lt;/h3&gt;

&lt;p&gt;Schedule it for every Monday at 9am. Save.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Run it once by hand
&lt;/h3&gt;

&lt;p&gt;The first run should always be a manual one. You click Run now from the routine page. Watch the session in the web viewer. If the prompt or the connector setup is wrong, you catch it before the scheduled run fires for real.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Iterate
&lt;/h3&gt;

&lt;p&gt;The first version of most routines is not quite right. The Slack summary is too long, or the PR title is off, or the TODO heuristic is too aggressive. You read the output, tighten the prompt, and run it again. After two or three rounds, the routine becomes reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven workflows worth setting up
&lt;/h2&gt;

&lt;p&gt;These are routines I run or have set up for clients. Each one solves a specific problem. The prompt for each is short. The magic is the trigger and the repo it sees, not the cleverness of the writing.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Nightly issue triage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Trigger:&lt;/strong&gt; Schedule, daily at 7am.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Reads new GitHub issues from the last 24 hours. Adds labels based on content. Estimates priority based on the components touched. Posts a short summary to your team Slack channel grouped by priority.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it pays off:&lt;/strong&gt; You walk into the office with a categorised list, not an unread inbox. The labels make the existing GitHub workflow faster too. Search and filter actually work because the labels are consistent.&lt;/p&gt;

&lt;p&gt;A trimmed version of the prompt:&lt;/p&gt;

&lt;p&gt;For every issue opened in this repo in the last 24 hours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read the title and body.&lt;/li&gt;
&lt;li&gt;Add labels from this set: [bug, feature, docs, infra, perf].&lt;/li&gt;
&lt;li&gt;Set a priority label from: [p0, p1, p2, p3] based on:

&lt;ul&gt;
&lt;li&gt;p0: production outage or data loss&lt;/li&gt;
&lt;li&gt;p1: regression in a core feature&lt;/li&gt;
&lt;li&gt;p2: notable bug or feature request&lt;/li&gt;
&lt;li&gt;p3: everything else&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;If priority is p0 or p1, leave a comment tagging @oncall.&lt;/li&gt;

&lt;li&gt;Post a Slack summary to #engineering grouped by priority,
with links to each issue.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. PR review pre-pass
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Trigger:&lt;/strong&gt; GitHub, on pull request opened or synchronised.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Runs your team review checklist before a human looks at the PR. Posts inline comments on mechanical issues, missing tests, unhandled errors, style violations, security smells. Adds a top-level summary so the human reviewer can focus on design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it pays off:&lt;/strong&gt; Humans review faster because the noise has already been filtered. PR authors get faster feedback. Reviewer fatigue drops.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Friday changelog
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Trigger:&lt;/strong&gt; Schedule, every Friday at 4pm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Reads all merged PRs from the past week. Groups them into Features, Fixes, Infrastructure, and Docs. Writes a short, plain-English changelog and opens a PR adding it to &lt;code&gt;CHANGELOG.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it pays off:&lt;/strong&gt; Your changelog actually gets written. The PR is small, you review it in two minutes, you merge it. Over a year, that compounds into a real document.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Stale branch sweeper
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Trigger:&lt;/strong&gt; Schedule, weekly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Lists branches that have not had a commit in 30 days, are not the default branch, and are not referenced by an open PR. Posts the list to Slack with one-click links to delete them. Does not delete by itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it pays off:&lt;/strong&gt; The repo stays clean. Branches do not pile up. Most teams I have set this up for delete twenty or thirty branches the first week and four or five every week after.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Dependency report
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Trigger:&lt;/strong&gt; Schedule, weekly. Or API, on demand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Runs &lt;code&gt;npm outdated&lt;/code&gt;, &lt;code&gt;pip list --outdated&lt;/code&gt;, or whatever the project uses. For each outdated dependency, reads the changelog of the new version and decides whether the upgrade is patch (safe), minor (probably safe), or major (needs a careful look). Posts a summary with recommendations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it pays off:&lt;/strong&gt; You see the upgrade landscape at a glance instead of running commands and reading changelogs yourself. It does not perform the upgrade. It just tells you what is worth doing.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Customer support synthesis
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Trigger:&lt;/strong&gt; Schedule, daily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Reads new support tickets and chat transcripts. Clusters them by topic. Writes a short brief for the engineering team listing the top five issues by volume, with example messages and any links between them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it pays off:&lt;/strong&gt; Engineering hears what users are actually saying. The brief is short enough to read in two minutes and specific enough to drive real changes.&lt;/p&gt;

&lt;p&gt;This is one of the highest-leverage routines I have set up. It is also the easiest to over-engineer. Keep the brief short. Two paragraphs and five bullets, no more.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Documentation drift watch
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Trigger:&lt;/strong&gt; GitHub, on pull request merged to main.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Compares the changes in the PR against the docs. If a function signature changed, an environment variable was renamed, or a configuration option was added, flags any docs that reference the old version and proposes the update as a follow-up PR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it pays off:&lt;/strong&gt; Docs stop rotting. The most common reason docs go stale is that nobody notices the gap between a code change and the doc that describes it. This routine notices.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a routine is the wrong tool
&lt;/h2&gt;

&lt;p&gt;Routines are powerful, and the temptation is to turn everything into one. Two cases where you should not.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anything that needs a human decision in the middle. A routine runs end to end without prompts. If the work has a "should I do this?" step, the answer is a skill or a hook inside an interactive session, not a routine.&lt;/li&gt;
&lt;li&gt;Anything safety-critical. A routine runs autonomously with whatever connectors you give it. If a wrong run could send the wrong message to a customer, charge a credit card, or push to production, treat it like a deploy. Gate it behind a human-triggered API call rather than a schedule.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful rule of thumb. If the work is bounded, reversible, and the cost of a bad run is small, a routine is great. If any of those three is not true, slow down and add a human in the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices that have held up
&lt;/h2&gt;

&lt;p&gt;A few things I keep coming back to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with one routine, not a portfolio.&lt;/strong&gt; The first routine is the one you will tune the most. Do that work on one job, not five. Once it is reliable, copying the pattern to the next one takes minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat the prompt like a small spec.&lt;/strong&gt; Vague prompts produce flaky routines. Tight prompts produce reliable ones. Spend ten minutes on the prompt for a routine you will run weekly for a year. The cost-benefit is obvious.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log everything to a place you will actually read.&lt;/strong&gt; A routine that posts to a Slack channel you mute is a routine you do not benefit from. Send output to a channel or an inbox you check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review the run log once a week.&lt;/strong&gt; Routines drift. APIs change, repos restructure, the world moves. A two-minute weekly review of recent runs catches most issues before they pile up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use API triggers as the safety hatch.&lt;/strong&gt; For any routine with non-trivial side effects, prefer API triggers over schedules. A schedule that runs while you are on holiday and goes wrong is a story you will tell for years. An API endpoint you only call when you mean to is a tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Connectors set up at the wrong scope. Routine-level connectors live with the routine. Personal connectors do not transfer to scheduled runs. The most common "why isn't this working" is a personal connector that the cloud session cannot see.&lt;/li&gt;
&lt;li&gt;No dry run. First runs should be manual. Always. The cost of a bad scheduled run on a Monday morning is much higher than the cost of clicking Run now once.&lt;/li&gt;
&lt;li&gt;Mega-routines. One routine doing five different jobs is harder to debug than five routines doing one job each. Split them.&lt;/li&gt;
&lt;li&gt;Forgetting time zones. The cloud is on UTC. "Every weekday at 8am" can mean different things to different routines. Be explicit.&lt;/li&gt;
&lt;li&gt;Treating routines like cron. A cron job runs a deterministic command. A routine runs a Claude session, which is probabilistic. Two runs of the same routine can produce slightly different outputs. Design for that. The wrapping logic (PRs, comments, summaries) should be the deterministic part.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is a Claude Code routine?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A saved Claude Code configuration (prompt, repositories, connectors) that runs on Anthropic cloud on a schedule, an API call, or a GitHub event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is it different from Claude Code on the desktop?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Desktop runs interactively, with you in the loop. Routines run autonomously in the cloud. The capabilities are largely the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are routines free?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They count against the daily routine limit on your plan. 5 a day on Pro, 15 on Max, 25 on Team and Enterprise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I trigger a routine from a webhook?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Every routine has a private API endpoint and bearer token. A webhook can POST to that endpoint to fire the routine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can routines call my MCP servers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Add the connector at the routine level and the cloud session attaches it like a local one. Make sure the MCP server is reachable from the internet, since the cloud session will not see anything on &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can routines modify the repository?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, including opening pull requests, leaving comments, and pushing branches. The routine acts with the permissions you grant it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I see what a routine did?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each run has a session log you can open from the routines dashboard. The log shows the prompts, tool calls, and outputs, just like a local session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I share a routine with my team?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, if your plan supports shared routines. Otherwise, exporting the prompt and connector setup and re-creating it in a teammate account works too.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short closing thought
&lt;/h2&gt;

&lt;p&gt;The thing routines change is not the work Claude Code can do. It is whether that work happens when you are not there.&lt;/p&gt;

&lt;p&gt;A weekly changelog you intend to write rarely gets written. A weekly changelog that writes itself and opens a PR for your review does. Multiply that across triage, review, dependency reports, and docs drift, and the change is not a productivity boost. It is a different relationship with your repo. You stop being the only person who notices.&lt;/p&gt;

&lt;p&gt;If you have not set one up yet, the issue triage routine is the best place to start. Pick a repo. Write the prompt. Run it manually once. Schedule it for 7am tomorrow. You will know within two days whether it earns its place. Most do.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>claude</category>
      <category>devops</category>
    </item>
    <item>
      <title>Claude Code Dreaming - What /dream Actually Does for Your Memory</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Wed, 13 May 2026 00:07:00 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/claude-code-dreaming-what-dream-actually-does-for-your-memory-4dhg</link>
      <guid>https://dev.to/muhammad_moeed/claude-code-dreaming-what-dream-actually-does-for-your-memory-4dhg</guid>
      <description>&lt;p&gt;If you have used Claude Code on the same project for more than a week, you have probably watched your memory files slowly turn into a mess. A few notes here. A list of conventions there. Some half-written instructions that were urgent on Tuesday and are stale by Friday. By the time you notice, your &lt;code&gt;MEMORY.md&lt;/code&gt; is a few hundred lines long and Claude is using maybe a tenth of it.&lt;/p&gt;

&lt;p&gt;Dreaming is the feature Anthropic shipped to fix this.&lt;/p&gt;

&lt;p&gt;A dream is a background pass where Claude reads its own memory, decides what is still useful, merges duplicates, drops anything stale, and writes a cleaner version back. It runs while you are not actively working. You wake up, the memory file is shorter, sharper, and Claude actually uses it again.&lt;/p&gt;

&lt;p&gt;This is a friendly walkthrough of what Dreaming is in practice. What AutoDream does in the background. What the &lt;code&gt;/dream&lt;/code&gt; slash command does on demand. When to trust it, when to look at the output, and the small mistakes to avoid the first few times you try it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Dreaming actually is
&lt;/h2&gt;

&lt;p&gt;Dreaming is best understood as memory consolidation. Claude already writes notes to memory files during a session: what you asked it to do, decisions it made, conventions you taught it. Over time those notes accumulate. Dreaming is the cleanup pass that turns scattered notes into organised knowledge.&lt;/p&gt;

&lt;p&gt;There are two ways it runs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AutoDream&lt;/strong&gt; runs on its own when Claude Code is idle. By default, it triggers after roughly 24 hours and 5 sessions of activity. You do not start it. You do not see it. You just notice that your memory files are tidier the next morning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The /dream command&lt;/strong&gt; is the manual trigger. You run it after a big change, like a framework migration or a renamed module, and Claude consolidates immediately instead of waiting for the next idle window.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both do the same work. The only difference is who decides when to start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Dreaming is a background memory consolidation pass that reads your existing memory files, drops anything stale, merges duplicates, and rewrites them into a tighter version. AutoDream runs while you sleep. The &lt;code&gt;/dream&lt;/code&gt; command runs on demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more than it sounds
&lt;/h2&gt;

&lt;p&gt;You can get a long way with Claude Code without ever touching memory. The first time you start using it well, though, you write things to memory often. Project conventions. Names of internal services. The reason a certain test is skipped. The format your team uses for commit messages.&lt;/p&gt;

&lt;p&gt;Three months in, two things happen at the same time. The memory file grows past a thousand lines, and the entries inside it start to drift. A convention you wrote in February has been replaced by a different one in April, but both are in the file. A reference to a deleted service is still there. A note about a bug is sitting next to the fix that closed it. The file is no longer a clean summary of how your project works. It is a log.&lt;/p&gt;

&lt;p&gt;Long memory files are also less useful than people expect. When Claude pulls memory into context, more is not better. Past a certain length, the model spends attention parsing your notes instead of using them. A shorter, well-edited memory file outperforms a long, sprawling one almost every time.&lt;/p&gt;

&lt;p&gt;Dreaming is the answer to both problems. It keeps the file short. It keeps the entries current. You stop having to babysit &lt;code&gt;MEMORY.md&lt;/code&gt; by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  How AutoDream works under the hood
&lt;/h2&gt;

&lt;p&gt;AutoDream runs in four phases. You can think of it as a small subagent that wakes up, reads your memory, makes a plan, and rewrites the file. Each phase has one job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: read everything
&lt;/h3&gt;

&lt;p&gt;Claude reads every memory file in the project plus your personal &lt;code&gt;MEMORY.md&lt;/code&gt;. It does not modify anything yet. It just builds a picture of what is currently there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: classify
&lt;/h3&gt;

&lt;p&gt;Each entry gets sorted into one of three buckets.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Still useful.&lt;/strong&gt; A real convention, a real preference, a real bit of context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale.&lt;/strong&gt; References to code that no longer exists, decisions that were reversed later, or notes that were specific to one task and never meant to last.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate or near-duplicate.&lt;/strong&gt; Two entries saying the same thing from different angles. The same convention written twice, six weeks apart, with slightly different words.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: rewrite
&lt;/h3&gt;

&lt;p&gt;Claude produces a new draft of each memory file. Stale entries are dropped. Duplicates are merged into a single canonical entry. The remaining entries get tightened up so the file is shorter without losing anything that matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 4: write back
&lt;/h3&gt;

&lt;p&gt;The new draft replaces the old file. The previous version is kept as a backup so you can diff or revert if something looks off.&lt;/p&gt;

&lt;p&gt;The whole pass usually takes a few minutes for a typical project. It happens in the background. Your next session opens against the cleaner file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using AutoDream - the default workflow
&lt;/h2&gt;

&lt;p&gt;For most projects, the right thing to do is leave AutoDream on and let it run. The defaults are sensible. You will rarely need to intervene.&lt;/p&gt;

&lt;p&gt;A reasonable rhythm looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Work normally for a few days. Claude writes to memory as you go.&lt;/li&gt;
&lt;li&gt;AutoDream fires overnight after the trigger condition is met.&lt;/li&gt;
&lt;li&gt;The next morning, your memory files are tidier. You can skim the diff if you want.&lt;/li&gt;
&lt;li&gt;Repeat.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The only thing worth doing on your side is to occasionally read what AutoDream produced. Not every time. Maybe once a week. You are looking for two things: that nothing important got dropped, and that the entries that remain are written in a way you agree with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using /dream - the manual workflow
&lt;/h2&gt;

&lt;p&gt;Sometimes you do not want to wait. The most common case is a structural change to the project. You renamed half the directories. You migrated from one framework to another. You replaced your test runner. The memory file is now full of references to things that no longer exist, and Claude will keep using those references until the next dream.&lt;/p&gt;

&lt;p&gt;That is when you type &lt;code&gt;/dream&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;▎ /dream&lt;br&gt;&lt;br&gt;
▎ Reading memory files...&lt;br&gt;&lt;br&gt;
▎ Found 47 entries across MEMORY.md and 3 topic files.&lt;br&gt;&lt;br&gt;
▎ Classifying entries (still-useful / stale / duplicate)...&lt;br&gt;&lt;br&gt;
▎ 12 stale, 6 duplicates, 29 still useful.&lt;br&gt;&lt;br&gt;
▎ Rewriting MEMORY.md...&lt;br&gt;&lt;br&gt;
▎ Saved backup to MEMORY.md.bak&lt;br&gt;&lt;br&gt;
▎ Done. Memory consolidated.&lt;/p&gt;

&lt;p&gt;That output is illustrative. The exact wording will differ across versions, but the shape is right. You get a count of what was kept, what was dropped, and a backup of the previous state. The whole thing takes a minute or two on a normal project.&lt;/p&gt;

&lt;p&gt;A small note. The &lt;code&gt;/dream&lt;/code&gt; command is being rolled out gradually, so on some accounts it may not be available yet. If it does not work for you, you can ask Claude in plain English: "consolidate my memory files" or "run a dream cycle." Claude does the same thing under the hood.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to trigger a dream by hand
&lt;/h2&gt;

&lt;p&gt;A few moments are worth the small interruption of running &lt;code&gt;/dream&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;After a big refactor.&lt;/strong&gt; Renamed modules, restructured folders, changed your build tool. Old references in memory turn into noise after a change like this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After a framework migration.&lt;/strong&gt; You moved from Vue to Svelte, from Express to Fastify, from one ORM to another. The same logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before sharing the project with a new collaborator.&lt;/strong&gt; A clean memory file is much easier for someone else to read than a six-month log.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When Claude starts behaving oddly.&lt;/strong&gt; If Claude is making suggestions that feel out of date, the memory is probably stale. A dream usually fixes it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For everything else, leave AutoDream alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  AutoDream vs /dream vs editing by hand
&lt;/h2&gt;

&lt;p&gt;This is the question I get most often. Here is how I think about the three options in practice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AutoDream&lt;/td&gt;
&lt;td&gt;Default. Day-to-day projects you do not want to think about.&lt;/td&gt;
&lt;td&gt;Zero. Runs while you sleep.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/dream&lt;/td&gt;
&lt;td&gt;After a big change, before a handoff, or when memory feels stale.&lt;/td&gt;
&lt;td&gt;A minute or two on demand.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edit by hand&lt;/td&gt;
&lt;td&gt;When you disagree with something Claude wrote.&lt;/td&gt;
&lt;td&gt;Real time, but full control.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A useful rule of thumb. If the issue is "the file is messy," that is a job for AutoDream or &lt;code&gt;/dream&lt;/code&gt;. If the issue is "the file is wrong," that is a job for you. Memory consolidation cleans up the file. It does not fix bad source material.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small example: before and after
&lt;/h2&gt;

&lt;p&gt;Suppose you started a project in March and your &lt;code&gt;MEMORY.md&lt;/code&gt; now looks something like this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The auth service lives in /src/auth.&lt;/li&gt;
&lt;li&gt;We use bcrypt for password hashing.&lt;/li&gt;
&lt;li&gt;Auth has been moved to /server/auth in April.&lt;/li&gt;
&lt;li&gt;Use bcrypt rounds = 12.&lt;/li&gt;
&lt;li&gt;Session tokens expire after 1 hour.&lt;/li&gt;
&lt;li&gt;We switched from bcrypt to argon2 in May.&lt;/li&gt;
&lt;li&gt;Session tokens are now 30 minutes by default.&lt;/li&gt;
&lt;li&gt;Use argon2id with parallelism = 4.&lt;/li&gt;
&lt;li&gt;Do not put session tokens in localStorage.&lt;/li&gt;
&lt;li&gt;We use argon2 (id mode).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After a dream cycle, that becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The auth service lives in /server/auth.&lt;/li&gt;
&lt;li&gt;Use argon2id for password hashing with parallelism = 4.&lt;/li&gt;
&lt;li&gt;Session tokens expire after 30 minutes.&lt;/li&gt;
&lt;li&gt;Do not store session tokens in localStorage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four lines instead of ten. No contradictions. No stale references. Same project knowledge, much easier for Claude to use in the next session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes the first few times
&lt;/h2&gt;

&lt;p&gt;A few patterns I have seen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disabling AutoDream because of one bad pass.&lt;/strong&gt; AutoDream occasionally drops something you wished it had kept. The right response is usually to add the dropped fact back by hand, not to turn the feature off. The average across a hundred passes is strongly net positive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treating /dream as a fix for bad memory.&lt;/strong&gt; If your memory file has wrong information, dreaming will keep the wrong information, just in a tidier form. Fix the source first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Running /dream in the middle of a task.&lt;/strong&gt; Memory consolidation rewrites files that Claude is using. Save it for between tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignoring the backup file.&lt;/strong&gt; Every dream writes a &lt;code&gt;.bak&lt;/code&gt; of the previous memory. If you do not like the result, you can revert.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expecting it to merge across projects.&lt;/strong&gt; Dreaming runs per project. It does not pool memory across all your repos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best practices that actually matter
&lt;/h2&gt;

&lt;p&gt;Three rules I follow after a few months with this feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the diff once a week.&lt;/strong&gt; Not every dream. Just one a week. You are checking that nothing important is being quietly dropped and that the writing style matches what you want. A two-minute skim catches drift early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep CLAUDE.md and memory separate.&lt;/strong&gt; CLAUDE.md stays small and always-on. Memory grows and is consolidated. Mixing them weakens both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pair Dreaming with Skills.&lt;/strong&gt; If a piece of guidance is a stable workflow, promote it from memory into a skill. Skills are explicit, versioned, and shared with your team. Dreaming makes the ephemeral side sustainable. Skills make the stable side reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is Claude Code Dreaming?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A background pass that consolidates your memory files. It reads what Claude has written to &lt;code&gt;MEMORY.md&lt;/code&gt; and any topic files, drops stale entries, merges duplicates, and rewrites a cleaner version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does AutoDream mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AutoDream is the automatic mode. It runs when Claude Code is idle and certain conditions are met, usually a day of activity and at least five sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does /dream do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It triggers a dream cycle on demand. Same work as AutoDream, but it runs immediately instead of waiting for the next idle window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will Dreaming delete my memory?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. It rewrites the file to be shorter and cleaner. A backup of the previous version is saved next to the file so you can diff or revert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Dreaming safe to use on a shared project?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Project memory files are committed to git in most setups. After a dream, you see the diff like any other change and decide whether to merge it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Dreaming work with subagents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dreaming only affects your main session memory. Subagents run in separate, fresh contexts and do not share that file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I turn AutoDream off?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, in Claude Code settings. Most people are better off leaving it on and reviewing the diff occasionally.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short closing thought
&lt;/h2&gt;

&lt;p&gt;The thing that surprised me about Dreaming is how quietly useful it is. You do not notice the feature on day one. You notice it three weeks later when you realise your memory file is still readable, still relevant, and still under a few hundred lines, without you ever having tidied it.&lt;/p&gt;

&lt;p&gt;If you have a project where Claude already writes to memory, just leave AutoDream on for a couple of weeks and see what it does. The first time you run &lt;code&gt;/dream&lt;/code&gt; after a big refactor and the noise goes away, you will understand why this is the feature people are quietly excited about.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>claude</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Claude Code Skills: A Practical Guide for 2026</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Mon, 04 May 2026 21:53:00 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/claude-code-skills-a-practical-guide-for-2026-3f6p</link>
      <guid>https://dev.to/muhammad_moeed/claude-code-skills-a-practical-guide-for-2026-3f6p</guid>
      <description>&lt;p&gt;If you have spent any real time with Claude Code, you have probably noticed the same problem I did. You write the same instructions in the prompt every other day. "Use four-space indentation here." "Always run the linter after edits." "Format commit messages this way." After the third or fourth repeat, it stops feeling like a prompt and starts feeling like missing config.&lt;/p&gt;

&lt;p&gt;Skills are how Claude Code fixes that. A skill is a small folder, with one markdown file inside, that Claude pulls into the conversation only when your request actually needs it. No setup screen. No plugin manager. Just a file in a folder and a one-line description telling Claude what it is for.&lt;/p&gt;

&lt;p&gt;This post is a clean walkthrough for 2026. What a skill actually is, how to write your first one, where to put it, and how it compares to the two things people often confuse it with: slash commands and subagents.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Claude Code Skill actually is
&lt;/h2&gt;

&lt;p&gt;At the most basic level, a skill is a directory with a single file called &lt;strong&gt;SKILL.md&lt;/strong&gt; inside it. The file has two parts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A short YAML frontmatter at the top, with a &lt;code&gt;name&lt;/code&gt; and a &lt;code&gt;description&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A markdown body underneath, with the instructions Claude follows when the skill is triggered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the whole spec. Everything else, examples, supporting scripts, templates, helper files, is optional and lives in the same directory.&lt;/p&gt;

&lt;p&gt;Here is the smallest valid skill you can write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.claude/skills/run-tests/
└── SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;run-tests&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Run&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;project's&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;suite&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;using&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Makefile&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;target.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Use&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;this&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;whenever&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;asks&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;run&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tests,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;check&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tests,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;verify&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;suite&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;passing."&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Run &lt;span class="sb"&gt;`make test`&lt;/span&gt; from the repo root. If the command fails, read the failing test
output, point out the specific assertion that broke, and ask before changing
anything in the source files.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a working skill. Drop it in &lt;code&gt;.claude/skills/run-tests/&lt;/code&gt;, restart Claude Code, and the next time you say "run the tests" Claude will use this instead of guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Claude actually picks up a skill
&lt;/h2&gt;

&lt;p&gt;This is the part that confuses people most. Skills are not always-on. They are &lt;strong&gt;auto-discovered&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is what happens when you send a message:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude reads the descriptions of every skill it can see.&lt;/li&gt;
&lt;li&gt;It compares your message to those descriptions.&lt;/li&gt;
&lt;li&gt;If one matches, it pulls that skill's full content into the conversation.&lt;/li&gt;
&lt;li&gt;If nothing matches, no skill is loaded and you get the default behavior.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why the &lt;strong&gt;description does most of the heavy lifting&lt;/strong&gt; in any skill. It is the only thing Claude has to decide whether the skill applies. A vague description ("Helps with tests") will rarely fire. A specific one ("Runs the project's pytest suite when the user asks to run, check, or verify tests") will fire reliably.&lt;/p&gt;

&lt;p&gt;A simple test: read your description out loud. If it does not start with a clear verb and end with a clear trigger, rewrite it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where skills live
&lt;/h2&gt;

&lt;p&gt;Skills sit in one of three places. The location decides who sees them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/&lt;/code&gt; inside a repo&lt;/td&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;td&gt;Workflows specific to one codebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;~/.claude/skills/&amp;lt;name&amp;gt;/&lt;/code&gt; in your home directory&lt;/td&gt;
&lt;td&gt;Personal&lt;/td&gt;
&lt;td&gt;Workflows you want everywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugins or shared packages&lt;/td&gt;
&lt;td&gt;Team&lt;/td&gt;
&lt;td&gt;Skills you want to ship to others&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Project skills win when there is a conflict. So if your repo has a &lt;code&gt;run-tests&lt;/code&gt; skill and your personal folder has one too, the project one is used while you are inside that repo. That is almost always what you want.&lt;/p&gt;

&lt;p&gt;A small but important detail: skills that live inside the repo are checked into git by default. That is fine. They are usually short, they help every collaborator, and they are easier to review than long CLAUDE.md files.&lt;/p&gt;

&lt;h2&gt;
  
  
  A walkthrough: build a skill from scratch
&lt;/h2&gt;

&lt;p&gt;Let us write something slightly more useful than &lt;code&gt;run-tests&lt;/code&gt;. Say you have a personal habit of starting every commit message with a Conventional Commit type (&lt;code&gt;feat:&lt;/code&gt;, &lt;code&gt;fix:&lt;/code&gt;, &lt;code&gt;chore:&lt;/code&gt;). You want Claude to do the same when it commits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: make the directory
&lt;/h3&gt;

&lt;p&gt;From the root of your project:&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="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude/skills/conventional-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: write SKILL.md
&lt;/h3&gt;

&lt;p&gt;Open &lt;code&gt;.claude/skills/conventional-commit/SKILL.md&lt;/code&gt; and put this inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;conventional-commit&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use this skill any time the user asks for a git commit, to commit changes, or to write a commit message. It writes the message in Conventional Commit format.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

When you create a git commit, follow these rules.
&lt;span class="p"&gt;
1.&lt;/span&gt; Start the subject line with one of: feat, fix, chore, docs, refactor, test, perf.
&lt;span class="p"&gt;2.&lt;/span&gt; Add a colon and a space, then a short imperative summary, no period.
&lt;span class="p"&gt;3.&lt;/span&gt; Keep the subject under 70 characters.
&lt;span class="p"&gt;4.&lt;/span&gt; If the change touches more than two files, add a one-line body that says why.

Example:

  feat: add IndexNow ping to publish workflow

  Auto-pings Bing on every push to main so new posts get indexed faster.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: try it
&lt;/h3&gt;

&lt;p&gt;Restart Claude Code (or just open a new conversation). Say "commit these changes". Claude should pull in the skill, follow the format, and you should see a commit subject that matches the rules.&lt;/p&gt;

&lt;p&gt;If it does not fire, the description is the first thing to fix. Make the trigger words match what you actually say to Claude.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills vs slash commands vs subagents
&lt;/h2&gt;

&lt;p&gt;This is the question I get most often, and the line is genuinely fuzzy because the three features have grown closer over time. Here is how I think about them in practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Auto-discovered. Claude decides when to use them based on your message.&lt;/li&gt;
&lt;li&gt;Live inside the main conversation, so the work stays visible and you can intervene.&lt;/li&gt;
&lt;li&gt;Best for: repeated workflows you do not want to type out, like commit formatting, test running, or PR conventions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Slash commands
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You invoke them by hand, with &lt;code&gt;/command-name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Same file format as skills now, in fact a single skill file gives you both an auto-trigger and a &lt;code&gt;/run-tests&lt;/code&gt; slash command for free.&lt;/li&gt;
&lt;li&gt;Best for: explicit triggers when you want full control over when something runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Subagents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spawned by Claude into a &lt;strong&gt;separate, fresh context&lt;/strong&gt; with their own tools and memory.&lt;/li&gt;
&lt;li&gt;They do not see your conversation. They get a brief from Claude and report back.&lt;/li&gt;
&lt;li&gt;Best for: heavy or noisy work you want to keep out of your main context, like searching the whole repo, running long evals, or summarising a large diff.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful rule of thumb. If the work is small and should stay in front of you, that is a skill. If the work is big and should run in a side process, that is a subagent. If you specifically want a typed entry point, slash command.&lt;/p&gt;

&lt;p&gt;For more on the subagent side, the &lt;a href="https://dev.to/posts/claude-code-hooks-complete-guide"&gt;hooks guide on this site&lt;/a&gt; covers the shell-level lifecycle that pairs well with skill-based workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three small skills that pay for themselves
&lt;/h2&gt;

&lt;p&gt;These are skills I have on most of my repos. None of them are clever. All of them save real time.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;lint-after-edit&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;lint-after-edit&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run the project's linter after any code edit. Use any time the user asks Claude to edit, refactor, fix, or modify a source file.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

After completing any edit to a .ts, .tsx, .js, or .py file, run &lt;span class="sb"&gt;`npm run lint`&lt;/span&gt;
(or &lt;span class="sb"&gt;`ruff check .`&lt;/span&gt; for Python). If the lint fails, fix the warnings before
reporting that the edit is done.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reason this works is that "edit a source file" is a very common trigger. The skill fires almost every coding session and you stop seeing lint failures land in commits.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;pr-description&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pr-description&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Write a pull request description from the current branch's commits. Use any time the user asks for a PR description, PR body, or pull request summary.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Read &lt;span class="sb"&gt;`git log main..HEAD`&lt;/span&gt; and write a PR description in this format.

&lt;span class="gu"&gt;## Summary&lt;/span&gt;
One short paragraph, no marketing language.

&lt;span class="gu"&gt;## Changes&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; One bullet per logical change, not per commit.

&lt;span class="gu"&gt;## Test plan&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; A checklist a reviewer can run.

Do not include emojis, do not start lines with "This PR".
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "do not" lines matter. Negative instructions are how you stop Claude from drifting back to its defaults.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;clean-imports&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;clean-imports&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Remove unused imports and sort the rest. Use any time the user asks to clean imports, sort imports, or tidy imports in a file.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

For each file the user asks to clean:
&lt;span class="p"&gt;
1.&lt;/span&gt; Remove imports that are not referenced anywhere in the file.
&lt;span class="p"&gt;2.&lt;/span&gt; Sort what remains by: standard library, then third-party, then local.
&lt;span class="p"&gt;3.&lt;/span&gt; Group each section with a blank line between them.

Do not touch import side effects (imports with no name).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skill, slash command, and auto-trigger all in one file. Same content. Three ways to invoke it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices that actually matter
&lt;/h2&gt;

&lt;p&gt;After writing dozens of skills for myself and clients, three rules stand out.&lt;/p&gt;

&lt;h3&gt;
  
  
  One skill, one job
&lt;/h3&gt;

&lt;p&gt;The most common mistake is the mega-skill. A single SKILL.md trying to handle commits, PRs, branch naming, and changelog updates all at once. Mega-skills load late, fire less reliably, and confuse Claude when two parts conflict. Split them. A skill should fit on one screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write the description like a trigger, not a label
&lt;/h3&gt;

&lt;p&gt;Bad:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A skill for working with tests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Run the project's pytest suite when the user asks to run tests, check tests, or verify the test suite is passing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The good version names the verbs Claude needs to spot. "Run", "check", "verify" — those are the words a user actually types.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep instructions imperative
&lt;/h3&gt;

&lt;p&gt;Skills that read like documentation ("This skill is responsible for...") fire less reliably than skills that read like instructions ("Run X. Then Y. If Z, do W.") Direct verbs map cleanly to actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resist the urge to over-script
&lt;/h3&gt;

&lt;p&gt;You can ship Python or shell scripts inside a skill folder, and sometimes that is right. But for most workflows, plain markdown instructions are enough and easier to maintain. Use scripts when the work is genuinely deterministic, not just because you can.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;p&gt;A few patterns I see again and again.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Description is too generic.&lt;/strong&gt; If yours starts with "A skill that helps with...", it will rarely fire. Rewrite it to start with a verb.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill is in the wrong folder.&lt;/strong&gt; &lt;code&gt;~/.claude/skills/&lt;/code&gt; is for personal skills across all projects. &lt;code&gt;.claude/skills/&lt;/code&gt; is for the current project only. Mixing them up is the most common reason a skill "is not picked up."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trying to replace CLAUDE.md.&lt;/strong&gt; Skills are for repeated, triggered workflows. CLAUDE.md is for always-on context like project conventions. They complement each other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting to restart Claude Code.&lt;/strong&gt; Skills are loaded on session start. If you add one mid-conversation, end the session and start a new one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Putting secrets inside SKILL.md.&lt;/strong&gt; Skills are committed to git in most setups. Treat them like source code, not config.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Where exactly do project skills go?&lt;/strong&gt;&lt;br&gt;
Inside your repo at &lt;code&gt;.claude/skills/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/code&gt;. The folder is committed to git unless you ignore it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is this different from a slash command?&lt;/strong&gt;&lt;br&gt;
A skill file is a slash command. The same file gives you both auto-discovery and a &lt;code&gt;/skill-name&lt;/code&gt; invocation. Slash commands are the manual entry point. Skills are the auto-discovered side of the same thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is it different from a subagent?&lt;/strong&gt;&lt;br&gt;
Subagents run in a fresh, isolated context. Skills run inside your current conversation. Use a skill when you want the work in front of you. Use a subagent when you want it offloaded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to restart Claude Code after adding a skill?&lt;/strong&gt;&lt;br&gt;
Yes. New skills are picked up when a session starts. End the conversation and open a new one to load them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a skill use external scripts?&lt;/strong&gt;&lt;br&gt;
Yes. You can include shell or Python scripts in the skill folder and reference them from SKILL.md. For most workflows, plain markdown instructions are enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this work in Claude Chat or only in Claude Code?&lt;/strong&gt;&lt;br&gt;
The same SKILL.md format works across Claude Code, Claude Chat, and Claude Cowork. Each product looks for skills in its own location, but the file format is identical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I put skills in CLAUDE.md instead?&lt;/strong&gt;&lt;br&gt;
No. CLAUDE.md is for always-on project context. Skills are for triggered workflows. Loading every workflow into CLAUDE.md bloats the main context and slows the model down.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short closing thought
&lt;/h2&gt;

&lt;p&gt;The reason skills matter is not that they are clever. It is that they remove the small, repeated friction of telling Claude the same thing every day. A good skill is short, targeted, and almost invisible: you stop noticing it because the work just gets done the way you wanted.&lt;/p&gt;

&lt;p&gt;Start with one. The smallest one you can think of. A commit format, a lint rule, a PR template. Once one is working, write the next one. Within a week or two you will have a folder of small files that quietly shape how Claude works on your project, and you will wonder how you ever managed without them.&lt;/p&gt;

&lt;p&gt;If you are extending Claude Code with &lt;a href="https://dev.to/posts/claude-code-hooks-complete-guide"&gt;hooks for shell-level enforcement&lt;/a&gt; or &lt;a href="https://dev.to/posts/build-your-first-mcp-server"&gt;building MCP servers for richer integrations&lt;/a&gt;, skills sit comfortably between the two: lighter than a server, more flexible than a hook, and easier to share across a team than either.&lt;br&gt;
&lt;a href="https://dev.tourl"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>claudecode</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
