<?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.us-east-2.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 Fable 5.2 vs Opus 5.5: which one should you actually use?</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Thu, 12 Nov 2026 10:03:38 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/claude-fable-52-vs-opus-55-which-one-should-you-actually-use-485f</link>
      <guid>https://dev.to/muhammad_moeed/claude-fable-52-vs-opus-55-which-one-should-you-actually-use-485f</guid>
      <description>&lt;p&gt;Anthropic released &lt;strong&gt;Claude Fable 5.2&lt;/strong&gt; on November 9, 2026. The first question everyone asks: should I switch from &lt;strong&gt;Claude Opus 5.5&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;This is the short version. The full guide, with Claude Code setup and a longer FAQ, is on my blog: &lt;a href="https://moeed.app/posts/claude-fable-5-2-vs-opus-5-5/" rel="noopener noreferrer"&gt;Claude Fable 5.2 vs Opus 5.5: Which One Should You Use?&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Opus 5.5 for most work.&lt;/strong&gt; Coding, bug fixes, writing, data analysis. $4 / $20 per million tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fable 5.2 for the hardest work.&lt;/strong&gt; Large multi-file changes, long tasks the agent runs on its own, and bugs Opus keeps getting wrong. $8 / $40, exactly &lt;strong&gt;2x Opus 5.5&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Anthropic's own launch post agrees: start with Opus 5.5 as your "daily driver" and keep Fable for "the most ambitious, open-ended technical work."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Side by side
&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;Fable 5.2&lt;/th&gt;
&lt;th&gt;Opus 5.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model ID&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-fable-5-2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-opus-5-5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price (input / output)&lt;/td&gt;
&lt;td&gt;$8 / $40&lt;/td&gt;
&lt;td&gt;$4 / $20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache reads&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast mode&lt;/td&gt;
&lt;td&gt;$16 / $80&lt;/td&gt;
&lt;td&gt;$8 / $40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context / max output&lt;/td&gt;
&lt;td&gt;1M / 128K&lt;/td&gt;
&lt;td&gt;1M / 128K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default effort in Claude Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same context window, same output limit, same cache read price. Fable is not "bigger". It is better at long, multi-step work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Fable 5.2 wins
&lt;/h2&gt;

&lt;p&gt;From Anthropic's own benchmark table (not independent tests yet):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FrontierSWE v2 (agentic coding): &lt;strong&gt;69.9%&lt;/strong&gt; vs 62.3%&lt;/li&gt;
&lt;li&gt;Remote Labor Index (long knowledge work): &lt;strong&gt;41.3%&lt;/strong&gt; vs 21.3%&lt;/li&gt;
&lt;li&gt;Terminal-Bench-Science 0.1: &lt;strong&gt;74.6%&lt;/strong&gt; vs 58.7%&lt;/li&gt;
&lt;li&gt;OSWorld 2.1 (computer use): 89.3% vs 87.2%, a small gap&lt;/li&gt;
&lt;li&gt;AA-Briefcase Elo: Opus 5.5 is actually ahead, 1800 vs 1785&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern is clear: the bigger and longer the task, the bigger Fable's lead.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 2x means in dollars
&lt;/h2&gt;

&lt;p&gt;One task with 500K input tokens (400K of it cached) and 50K output tokens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Opus 5.5:&lt;/strong&gt; $0.40 + $0.08 + $1.00 = &lt;strong&gt;$1.48&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fable 5.2:&lt;/strong&gt; $0.80 + $0.08 + $2.00 = &lt;strong&gt;$2.88&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run 20 of those every working day for a month (440 tasks) and it is &lt;strong&gt;$651 vs $1,267&lt;/strong&gt;. That gap is fine if Fable gets hard tasks right the first time. It is wasted money on routine work.&lt;/p&gt;

&lt;p&gt;One more detail: Opus 5.5 in fast mode costs the same as Fable 5.2 at normal speed. If you want speed, Opus fast mode is the cheaper path.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple rule
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Start on Opus 5.5 at the default effort.&lt;/li&gt;
&lt;li&gt;If the result is weak, raise effort to &lt;code&gt;high&lt;/code&gt;, then &lt;code&gt;xhigh&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Still not good enough? Switch to Fable 5.2 for that one task.&lt;/li&gt;
&lt;li&gt;Switch back when the hard part is done.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Switching in Claude Code
&lt;/h2&gt;

&lt;p&gt;Fable 5.2 needs Claude Code 2.1.321 or later:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model fable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go back with &lt;code&gt;/model opus&lt;/code&gt;. One tip: in the &lt;code&gt;/model&lt;/code&gt; picker, &lt;code&gt;Enter&lt;/code&gt; saves your choice as the default for every new session, while &lt;code&gt;s&lt;/code&gt; switches for this session only. Use &lt;code&gt;s&lt;/code&gt; for Fable so you do not stay on the expensive model by accident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two API gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Thinking is always on.&lt;/strong&gt; Sending &lt;code&gt;thinking: {type: "disabled"}&lt;/code&gt; or &lt;code&gt;budget_tokens&lt;/code&gt; returns a 400. Use &lt;code&gt;effort&lt;/code&gt; instead. Opus 5.5 works the same way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forced tool choice is gone.&lt;/strong&gt; &lt;code&gt;tool_choice&lt;/code&gt; set to &lt;code&gt;any&lt;/code&gt; or a named tool returns a 400. Use &lt;code&gt;auto&lt;/code&gt; and say in your prompt which tool to use.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>anthropic</category>
      <category>llm</category>
    </item>
    <item>
      <title>spawn npx ENOENT and 9 Other MCP Errors, Explained in Plain English</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Fri, 18 Sep 2026 14:54:36 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/spawn-npx-enoent-and-9-other-mcp-errors-explained-in-plain-english-g3p</link>
      <guid>https://dev.to/muhammad_moeed/spawn-npx-enoent-and-9-other-mcp-errors-explained-in-plain-english-g3p</guid>
      <description>&lt;p&gt;You added an MCP server to your config, restarted the app, and one of these happened:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nothing showed up at all.&lt;/li&gt;
&lt;li&gt;The server showed up and then died with &lt;code&gt;MCP error -32000: Connection closed&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Every tool call hits &lt;code&gt;Request timed out&lt;/code&gt; after 60 seconds.&lt;/li&gt;
&lt;li&gt;You got &lt;code&gt;spawn npx ENOENT&lt;/code&gt; and no idea what "ENOENT" even means.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hit all four in one week. So I sat down with the Claude Code changelog, ~20 open anthropics/claude-code GitHub issues, the MCP debugging docs, and a bunch of Reddit and Stack Overflow threads, and wrote a plain-English fix guide.&lt;/p&gt;

&lt;p&gt;Here is the short version.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 4 things that fix 80% of MCP failures
&lt;/h2&gt;

&lt;p&gt;Before you Google a specific error, try these:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fully quit the client, then relaunch.&lt;/strong&gt; Cmd+Q on macOS. On Windows right-click the tray icon and click Quit. Closing the window is not enough. Config only reloads on a cold start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run your config file through a JSON linter.&lt;/strong&gt; A single missing comma, an unescaped Windows backslash, or the wrong top-level key silently breaks the whole file. No error dialog, no servers register.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replace bare &lt;code&gt;npx&lt;/code&gt; with an absolute path.&lt;/strong&gt; On Mac/Linux run &lt;code&gt;which npx&lt;/code&gt; and paste the full path (something like &lt;code&gt;/Users/you/.nvm/versions/node/v22.14.0/bin/npx&lt;/code&gt;). On Windows use &lt;code&gt;cmd /c npx&lt;/code&gt; or point directly at &lt;code&gt;node.exe&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the logs.&lt;/strong&gt; Mac: &lt;code&gt;tail -F ~/Library/Logs/Claude/mcp*.log&lt;/code&gt;. Windows: &lt;code&gt;%APPDATA%\Claude\logs\&lt;/code&gt;. Claude Code CLI: &lt;code&gt;claude --debug=mcp&lt;/code&gt; then read &lt;code&gt;~/.claude/debug/&amp;lt;session-id&amp;gt;.txt&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The single most common MCP error
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;spawn npx ENOENT&lt;/code&gt; is the #1 setup failure. It shows up in 30+ MCP repos. Here is why it happens.&lt;/p&gt;

&lt;p&gt;Your terminal shells (zsh, bash) source &lt;code&gt;~/.zshrc&lt;/code&gt; or &lt;code&gt;~/.bashrc&lt;/code&gt; on startup. That is where nvm adds its &lt;code&gt;bin&lt;/code&gt; directory to your PATH. So &lt;code&gt;npx&lt;/code&gt; works in your terminal.&lt;/p&gt;

&lt;p&gt;GUI apps like Claude Desktop do NOT source those shell files. They launch with a minimal PATH (&lt;code&gt;/usr/bin:/bin:/usr/sbin:/sbin&lt;/code&gt;) that excludes nvm, mise, fnm, and Homebrew. So &lt;code&gt;npx&lt;/code&gt; is not on the client's PATH. The child_process.spawn call fails with &lt;code&gt;ENOENT&lt;/code&gt; (Error NO ENTity, meaning "file does not exist").&lt;/p&gt;

&lt;p&gt;Two ways to fix it. Either paste the absolute path from &lt;code&gt;which npx&lt;/code&gt; as the &lt;code&gt;command&lt;/code&gt; in your config, or add a per-server &lt;code&gt;env&lt;/code&gt; block that gives the child process a working PATH. Full recipe (with Windows and NVM variants) is in the guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in the full guide
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;10 named errors&lt;/strong&gt; with the exact copy-paste text you see and the fix steps for each:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MCP error -32000: Connection closed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MCP error -32001: Request timed out&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spawn npx ENOENT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;spawn EINVAL&lt;/code&gt; (Windows only)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Server transport closed unexpectedly&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Could not attach to MCP server &amp;lt;NAME&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-32601 Method not found&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-32602 Invalid params&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Failed to connect&lt;/code&gt; in &lt;code&gt;claude mcp list&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;OAuth 401 / &lt;code&gt;authorization with MCP server failed&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Per-platform gotchas&lt;/strong&gt; for Claude Desktop on macOS and Windows (including the MSIX / Microsoft Store virtualized-path trap that opens the WRONG config file), Claude Code CLI, VS Code, Cursor, Node with NVM/mise/fnm, and corporate networks with proxies and OAuth.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;7-step diagnostic checklist&lt;/strong&gt; if your specific error is not in the catalog.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;8 H3 FAQs&lt;/strong&gt; matching the exact questions people paste into Google.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read the full guide here: &lt;a href="https://moeed.app/posts/mcp-server-not-connecting-fix-guide/" rel="noopener noreferrer"&gt;MCP Server Not Connecting? 10 Fixes That Actually Work&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you have hit an MCP error not in the list, drop it in the comments and I will add it in the next update.
&lt;/h2&gt;

</description>
      <category>claude</category>
      <category>mcp</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Claude Fable 5 is currently unavailable , here's what actually happened</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Tue, 16 Jun 2026 11:12:02 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/claude-fable-5-is-currently-unavailable-heres-what-actually-happened-1lch</link>
      <guid>https://dev.to/muhammad_moeed/claude-fable-5-is-currently-unavailable-heres-what-actually-happened-1lch</guid>
      <description>&lt;p&gt;Claude Fable 5 was live for three days.&lt;/p&gt;

&lt;p&gt;It launched on June 9, 2026. By June 12 at 5:21 PM Eastern Time, it was off. And as of June 16, it is still off — for every user, everywhere in the world. Mythos 5 was turned off at the same time for the same reason.&lt;/p&gt;

&lt;p&gt;If you have been getting a "currently unavailable" error, this is why.&lt;/p&gt;

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

&lt;p&gt;The US Commerce Department, signed by Secretary Howard Lutnick, sent Anthropic an export-control order on June 12. The order requires Anthropic to block access to Fable 5 and Mythos 5 for any foreign national, including their own non-US employees.&lt;/p&gt;

&lt;p&gt;Anthropic has no way to check, in real time, which user is from which country. So they did the only thing they could to comply — turn the models off for everyone. In their own words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We must abruptly disable Fable 5 and Mythos 5 for all our customers to ensure compliance."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What the government said was the problem
&lt;/h2&gt;

&lt;p&gt;The order cited "national security authorities" and pointed at a method to "jailbreak" Fable 5. According to administration officials quoted by reporters, another company demonstrated the jailbreak to the government, and that "alarmed the administration about possible national security risks."&lt;/p&gt;

&lt;p&gt;The jailbreak itself, as Anthropic describes it, "essentially consists of asking the model to read a specific codebase and fix any software flaws." In plain English — someone asked Claude to look at software code and find the security bugs in it.&lt;/p&gt;

&lt;p&gt;Anthropic pushed back. They called the technique "narrow and non-universal" and pointed out that OpenAI's GPT-5.5 can do the same thing without needing any trick. Their position is that this should not require shutting down the entire model.&lt;/p&gt;

&lt;h2&gt;
  
  
  When is Fable 5 coming back?
&lt;/h2&gt;

&lt;p&gt;Nobody has said. Anthropic says they "believe this is a misunderstanding" and are "working to restore access as soon as possible." As of June 16, there is no timeline.&lt;/p&gt;

&lt;p&gt;If your code used &lt;code&gt;claude-fable-5&lt;/code&gt;, switch to &lt;code&gt;claude-opus-4-8&lt;/code&gt; as the closest substitute. Sonnet 4.6 and Haiku 4.5 are cheaper alternatives that still work fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full guide
&lt;/h2&gt;

&lt;p&gt;I wrote a longer breakdown with the day-by-day timeline, a 5-step migration playbook, what to do if you built on Fable 5, and the open questions about when (or if) it comes back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://moeed.app/posts/claude-fable-5-unavailable/" rel="noopener noreferrer"&gt;Read the full guide on moeed.app →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>anthropic</category>
      <category>llm</category>
    </item>
    <item>
      <title>MCP Apps vs OpenAI Apps SDK: are they competing standards?</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Thu, 11 Jun 2026 22:30:32 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/mcp-apps-vs-openai-apps-sdk-are-they-competing-standards-3ao4</link>
      <guid>https://dev.to/muhammad_moeed/mcp-apps-vs-openai-apps-sdk-are-they-competing-standards-3ao4</guid>
      <description>&lt;p&gt;If you have started building tools for AI chat hosts, you have probably hit the same fork in the road. There are two ways to add a user interface to a tool right now. The first is MCP Apps, the open standard from the Model Context Protocol. The second is the OpenAI Apps SDK, the framework OpenAI shipped for the ChatGPT app store.&lt;/p&gt;

&lt;p&gt;They both let your tool render a UI inside the chat. They both run inside a sandboxed iframe. They both talk to your server over JSON-RPC. So the question almost every developer is asking is the obvious one: are these competing standards?&lt;/p&gt;

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

&lt;p&gt;No. The OpenAI Apps SDK is &lt;strong&gt;built on top of MCP&lt;/strong&gt;. It uses MCP for the wire format, the tool definitions, the UI rendering, and the security model. It then adds a thin layer with ChatGPT-specific extensions: a payment hook (&lt;code&gt;window.openai.requestCheckout&lt;/code&gt;), a store directory, and a few helpers that only run inside ChatGPT.&lt;/p&gt;

&lt;p&gt;So the choice is not "pick one or the other." The honest framing is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build to MCP Apps first.&lt;/strong&gt; Your tool then works in Claude, Claude Desktop, VS Code, Goose, Postman, MCPJam, and any host that supports the open standard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Light up OpenAI Apps SDK extensions only when you need ChatGPT-specific features.&lt;/strong&gt; Mostly that means payments and the ChatGPT app store.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The four real differences
&lt;/h2&gt;

&lt;p&gt;Strip away the marketing and there are only four things the OpenAI Apps SDK gives you that MCP Apps do not:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A store and a directory&lt;/strong&gt; — the ChatGPT app store will list your app and surface it to ChatGPT users. The open MCP spec has no centralised discovery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-chat payments&lt;/strong&gt; — &lt;code&gt;window.openai.requestCheckout()&lt;/code&gt; runs a payment flow without leaving the chat. MCP Apps has no checkout primitive today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversation-aware helpers&lt;/strong&gt; — tighter access to surrounding conversation state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distribution to ChatGPT users specifically&lt;/strong&gt; — ChatGPT has hundreds of millions of users; the Apps SDK is the only way to reach them through OpenAI's surface.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything else — the sandboxing, the iframe rendering, the JSON-RPC audit trail, the tool declarations — is the same on both sides because the Apps SDK uses MCP for them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one to pick
&lt;/h2&gt;

&lt;p&gt;If your audience is ChatGPT users specifically and you need in-chat payments, build with the OpenAI Apps SDK. For everyone else, build to MCP Apps and your tool runs across every host that supports the open standard.&lt;/p&gt;

&lt;p&gt;I wrote the full comparison — code examples for both sides, the smart progressive-enhancement pattern, a decision tree, and the two pitfalls most teams hit — on my blog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://moeed.app/posts/mcp-apps-vs-openai-apps-sdk/" rel="noopener noreferrer"&gt;Read the full guide on moeed.app →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>mcp</category>
      <category>ai</category>
      <category>anthropic</category>
    </item>
    <item>
      <title>Claude Agent SDK Cost Tracking — what to do before June 15, 2026</title>
      <dc:creator>Muhammad Moeed</dc:creator>
      <pubDate>Fri, 05 Jun 2026 11:40:55 +0000</pubDate>
      <link>https://dev.to/muhammad_moeed/claude-agent-sdk-cost-tracking-what-to-do-before-june-15-2026-2dl9</link>
      <guid>https://dev.to/muhammad_moeed/claude-agent-sdk-cost-tracking-what-to-do-before-june-15-2026-2dl9</guid>
      <description>&lt;p&gt;On June 15, 2026 Anthropic moves Claude Agent SDK calls, &lt;code&gt;claude -p&lt;/code&gt;, GitHub Actions, and third-party agents off the subscription pool and onto a separate dollar-denominated credit ($20 Pro, $100 Max 5x, $200 Max 20x), billed at&lt;br&gt;
  standard API list prices. Interactive Claude Code in the terminal stays where it is. Everything programmatic moves.&lt;/p&gt;

&lt;p&gt;So the question your manager is going to ask the next day stops being "are we within the subscription limit?" and starts being "what did this cost?"&lt;/p&gt;

&lt;p&gt;The full guide is on my blog: &lt;a href="https://moeed.app/posts/claude-agent-sdk-cost-tracking/" rel="noopener noreferrer"&gt;Claude Agent SDK Cost Tracking: A Practical Guide (2026)&lt;/a&gt;. Here is the short version.&lt;/p&gt;

&lt;p&gt;## What the SDK gives you&lt;/p&gt;

&lt;p&gt;Every &lt;code&gt;query()&lt;/code&gt; call ends with a &lt;code&gt;result&lt;/code&gt; message carrying &lt;code&gt;total_cost_usd&lt;/code&gt; and a &lt;code&gt;usage&lt;/code&gt; object with token counts. There is also a per-model breakdown so you can see how much went to Opus versus Haiku in the same call. Same data in&lt;br&gt;
  TypeScript and Python, slightly different field names.&lt;/p&gt;

&lt;p&gt;## The one warning&lt;/p&gt;

&lt;p&gt;Anthropic is very direct in the &lt;a href="https://code.claude.com/docs/en/agent-sdk/cost-tracking" rel="noopener noreferrer"&gt;official docs&lt;/a&gt;: &lt;code&gt;total_cost_usd&lt;/code&gt; is a client-side estimate from a price table bundled at build time. It can drift from the real bill when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pricing changes&lt;/li&gt;
&lt;li&gt;the installed SDK does not recognise a model&lt;/li&gt;
&lt;li&gt;billing rules apply that the client cannot model (the June 15 credit pool, enterprise discounts, surge pricing)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use the SDK number for budgeting. Use the &lt;a href="https://platform.claude.com/docs/en/build-with-claude/usage-cost-api" rel="noopener noreferrer"&gt;Usage and Cost API&lt;/a&gt; or the Console for invoicing.&lt;/p&gt;

&lt;p&gt;## A minimum viable cost log&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;  &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;claude_agent_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ResultMessage&lt;/span&gt;
  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
      &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarise this project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ResultMessage&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
              &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Estimated cost: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_cost_usd&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Five lines is enough to start. Add a tag for user, model, and feature when you push it into production metrics.&lt;/p&gt;

&lt;p&gt;## The duplicate-ID gotcha with parallel tools&lt;/p&gt;

&lt;p&gt;When Claude uses multiple tools in parallel within one turn, the SDK emits several assistant messages that share the same &lt;code&gt;id&lt;/code&gt; with identical usage. If you sum tokens across every assistant message, you triple- or quadruple-count.&lt;/p&gt;

&lt;p&gt;Deduplicate by ID before you add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;seenIds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;totalInputTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&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;...&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="k"&gt;if &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="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;msgId&lt;/span&gt; &lt;span class="o"&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;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;seenIds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msgId&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;seenIds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msgId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;totalInputTokens&lt;/span&gt; &lt;span class="o"&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;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input_tokens&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or just read &lt;code&gt;total_cost_usd&lt;/code&gt; from the final &lt;code&gt;result&lt;/code&gt; message and let the SDK handle deduplication for you.&lt;/p&gt;

&lt;p&gt;## Where the 90 percent saving really comes from&lt;/p&gt;

&lt;p&gt;Every agent loop reads the same system prompt and the same files on every turn. The SDK turns prompt caching on automatically. Two fields to watch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cache_creation_input_tokens&lt;/code&gt; — billed at a higher rate, once per cache window&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cache_read_input_tokens&lt;/code&gt; — billed at roughly 10 percent of standard input&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the first turn, the cache read field dominates and the bill flattens out. On a Sonnet 4.6 agent with a 15K-token system prompt and 20 turns, that drops per-turn input cost from roughly $0.045 to roughly $0.005.&lt;/p&gt;

&lt;p&gt;## A simple sizing decision&lt;/p&gt;

&lt;p&gt;With one week of measured &lt;code&gt;total_cost_usd&lt;/code&gt;, you can size the plan in three lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Estimated monthly = weekly_total_cost_usd * 4.33

    &amp;lt; $20      → Pro
    $20-$100   → Max 5x + usage credits on
    $100-$200  → Max 20x + usage credits on
    &amp;gt; $200     → Direct API key (or Bedrock / Vertex)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two caveats:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Credits do not roll over. Under-spending is real waste, the same way over-spending is.&lt;/li&gt;
&lt;li&gt;Bursty workloads (one monthly audit doing 80 percent of the spend in two days) often work out cheaper on direct API billing even if the totals look similar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;## What to do this week&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log &lt;code&gt;total_cost_usd&lt;/code&gt; on every &lt;code&gt;query()&lt;/code&gt; call, tagged with user, model, and feature.&lt;/li&gt;
&lt;li&gt;Deduplicate assistant messages by ID before trusting per-step totals.&lt;/li&gt;
&lt;li&gt;Plot &lt;code&gt;cache_read&lt;/code&gt; vs &lt;code&gt;cache_create&lt;/code&gt;. If reads are not dominant after turn one, your system prompt or files are changing too often.&lt;/li&gt;
&lt;li&gt;Pull one week of Console data and compare to the SDK estimate.&lt;/li&gt;
&lt;li&gt;Pick a plan tier. Claim your credit when Anthropic emails you. Enable usage credits for overflow.&lt;/li&gt;
&lt;li&gt;Pin the SDK version in CI. Bumps silently change the bundled price table.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The full guide on my blog has the per-model breakdown code, cache TTL trade-offs, what changes after June 15 for &lt;code&gt;total_cost_usd&lt;/code&gt; interpretation, and an FAQ: &lt;a href="https://moeed.app/posts/claude-agent-sdk-cost-tracking/" rel="noopener noreferrer"&gt;Claude Agent SDK Cost Tracking: A Practical Guide &lt;br&gt;
  (2026)&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>anthropic</category>
      <category>tutorial</category>
    </item>
    <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>
  </channel>
</rss>
