<?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: Tariq Hassan</title>
    <description>The latest articles on DEV Community by Tariq Hassan (@tariqhassan).</description>
    <link>https://dev.to/tariqhassan</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%2F4136682%2F5cbc9e95-f288-4e44-8351-7d929ec58a06.png</url>
      <title>DEV Community: Tariq Hassan</title>
      <link>https://dev.to/tariqhassan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tariqhassan"/>
    <language>en</language>
    <item>
      <title>Can Claude Generate Images? What Actually Works in 2026</title>
      <dc:creator>Tariq Hassan</dc:creator>
      <pubDate>Wed, 07 Oct 2026 03:10:28 +0000</pubDate>
      <link>https://dev.to/tariqhassan/can-claude-generate-images-what-actually-works-in-2026-2mlg</link>
      <guid>https://dev.to/tariqhassan/can-claude-generate-images-what-actually-works-in-2026-2mlg</guid>
      <description>&lt;p&gt;I get asked "can Claude generate images?" about once a week, usually by someone who just watched Claude produce a perfect landing page and assumed a hero image would be the easy part. The short answer is no: Claude does not output pixels. The longer answer is more useful, because there are three or four reliable ways to get images out of a Claude workflow, and picking the right one saves a lot of wasted prompts.&lt;/p&gt;

&lt;p&gt;This post is the version of that answer I wish I had a year ago: what the model does and doesn't do, what it can produce instead, and a working setup for getting real raster images from inside Claude Code. For photographic stuff like product shots, I don't route through Claude at all; I use &lt;a href="https://supavisual.com/?utm_source=devto&amp;amp;utm_medium=ugc&amp;amp;utm_campaign=tariqhassan&amp;amp;utm_content=can-claude-generate-images-intro" rel="noopener noreferrer"&gt;Supavisual&lt;/a&gt; for that, and I'll explain where the line sits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can Claude generate images? The official answer
&lt;/h2&gt;

&lt;p&gt;Anthropic is unusually direct about this. The &lt;a href="https://platform.claude.com/docs/en/build-with-claude/vision" rel="noopener noreferrer"&gt;vision docs&lt;/a&gt; have an FAQ entry that reads:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No, Claude is an image understanding model only. It can interpret and analyze images, but it cannot generate, produce, edit, manipulate, or create images.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So images go in, text comes out. Claude accepts JPEG, PNG, GIF and WebP as input (for animated GIFs only the first frame is used), and it is very good at reading them: screenshots, charts, UI mockups, whiteboard photos. But every token it returns is text.&lt;/p&gt;

&lt;p&gt;That's the part people skip over: text covers a lot of formats. SVG is text. HTML with a &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; is text. A Python script that draws a PNG is text. A tool call that asks an image model for a picture is also text. Once you stop expecting Claude to be an image model and treat it as the thing that writes the instructions for one, most of the "Claude can't do images" frustration goes away.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude can actually produce
&lt;/h2&gt;

&lt;p&gt;Here's how I think about the options, roughly ordered from "works in any chat" to "needs setup":&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;th&gt;Weak at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inline SVG&lt;/td&gt;
&lt;td&gt;Vector markup&lt;/td&gt;
&lt;td&gt;Icons, logos, diagrams, simple illustrations&lt;/td&gt;
&lt;td&gt;Anything photographic, gradients get muddy fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML / CSS / canvas&lt;/td&gt;
&lt;td&gt;A page that renders a visual&lt;/td&gt;
&lt;td&gt;Mockups, animated demos, generative patterns&lt;/td&gt;
&lt;td&gt;Exporting a clean file without a browser step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plotting / imaging code (matplotlib, Pillow)&lt;/td&gt;
&lt;td&gt;A script that writes a PNG&lt;/td&gt;
&lt;td&gt;Charts, OG cards, templated graphics, batch jobs&lt;/td&gt;
&lt;td&gt;Organic, painterly or photo content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mermaid / Graphviz&lt;/td&gt;
&lt;td&gt;Diagram source&lt;/td&gt;
&lt;td&gt;Flowcharts, architecture, sequence diagrams&lt;/td&gt;
&lt;td&gt;Visual polish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool call to an image model (CLI, MCP, API)&lt;/td&gt;
&lt;td&gt;A real raster image&lt;/td&gt;
&lt;td&gt;Hero images, illustrations, textures&lt;/td&gt;
&lt;td&gt;Costs money, needs a key, less deterministic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first four are deterministic: the same code gives the same picture, which you can diff, review and commit. The last one is where you get photorealism, but you're now depending on a separate model and paying per image.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route 1: SVG and HTML, straight from the chat
&lt;/h2&gt;

&lt;p&gt;If you ask Claude for "a logo for a CLI tool called &lt;code&gt;pgsnap&lt;/code&gt;, flat, two colors, as SVG", you get valid SVG markup back. In the claude.ai app that usually renders in an artifact, so you see the result immediately. In Claude Code it just writes the &lt;code&gt;.svg&lt;/code&gt; file into your repo.&lt;/p&gt;

&lt;p&gt;A few things that make this work better:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ask for a &lt;code&gt;viewBox&lt;/code&gt; and no fixed width/height.&lt;/strong&gt; It scales cleanly in CSS that way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constrain the palette.&lt;/strong&gt; "Use only &lt;code&gt;#0f172a&lt;/code&gt; and &lt;code&gt;#f97316&lt;/code&gt;" gives far more usable output than "make it modern".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate on the code, not the vibe.&lt;/strong&gt; "Move the circle 10 units left and thicken the stroke to 3" works. "Make it pop more" doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paste a screenshot back in.&lt;/strong&gt; Since Claude can read images, you can render the SVG, screenshot it, and ask what's off. This loop is where the vision side actually helps the generation side.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where SVG falls apart is anything with texture, lighting or faces. Claude will gamely try to draw a person in SVG, and the result looks like it was drawn by someone describing a person over the phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route 2: let Claude write the code that draws the image
&lt;/h2&gt;

&lt;p&gt;This is my most-used route, especially for repetitive assets. Open Graph cards are the classic example: every blog post needs a 1200x630 image with the title on it, and you do not want a diffusion model for that. You want a script.&lt;/p&gt;

&lt;p&gt;Here's one I had Claude Code write and then trimmed down. It runs on Pillow 10.1 or newer (that's when &lt;code&gt;load_default(size=...)&lt;/code&gt; gained the size argument), with no font files to ship:&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="c1"&gt;# og_card.py - render a 1200x630 Open Graph card from a title string
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;textwrap&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageDraw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageFont&lt;/span&gt;

&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;630&lt;/span&gt;
&lt;span class="n"&gt;BG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ACCENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0f172a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#f8fafc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#f97316&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;og.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;BG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageDraw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rectangle&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ACCENT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# left accent bar
&lt;/span&gt;    &lt;span class="n"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageFont&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="c1"&gt;# Pillow &amp;gt;= 10.1
&lt;/span&gt;    &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;textwrap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;)[:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optimize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&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;wrote &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Untitled post&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"pillow&amp;gt;=10.1"&lt;/span&gt;
python og_card.py Can Claude generate images? Here is what actually works
&lt;span class="c"&gt;# wrote og.png (1200x630)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran exactly this to make the card for this post: dark background, orange bar on the left, title in white, wrapped onto two lines.&lt;/p&gt;

&lt;p&gt;Once the script exists, Claude Code can loop over your &lt;code&gt;posts/&lt;/code&gt; directory and regenerate every card whenever you change the design. Boring and repeatable is what you want for build assets. The same pattern works with matplotlib for charts in docs: describe the chart, let Claude write the plotting code, commit the code next to the PNG so the next person can regenerate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route 3: Claude Code calling a real image model
&lt;/h2&gt;

&lt;p&gt;When you actually need a raster image from a model, the trick is to give Claude Code a tool it can call. You have two main options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A CLI plus a skill.&lt;/strong&gt; Vercel's &lt;code&gt;ai-cli&lt;/code&gt; (repo: &lt;code&gt;vercel-labs/ai-cli&lt;/code&gt;) wraps their AI Gateway and has an &lt;code&gt;image&lt;/code&gt; command. Its README lists Node.js 22+ as a requirement, plus either an AI Gateway key or a provider key like &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; ai-cli
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AI_GATEWAY_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key_here

ai models &lt;span class="nt"&gt;--type&lt;/span&gt; image                       &lt;span class="c"&gt;# what's available, with rates&lt;/span&gt;
ai image &lt;span class="s2"&gt;"flat illustration of a server rack, navy and orange"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; public/hero.png
ai image &lt;span class="nt"&gt;-m&lt;/span&gt; flux-2-pro &lt;span class="s2"&gt;"a sunset"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; renders/    &lt;span class="c"&gt;# short ids resolve to creator/model&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repo also ships a &lt;code&gt;skills/ai-cli&lt;/code&gt; folder, so Claude Code can learn to reach for the CLI on its own when you ask for "a hero image for the pricing page" in plain English. Even without the skill, Claude Code can run the command through its Bash tool if you tell it the CLI exists.&lt;/p&gt;

&lt;p&gt;One pricing detail the earlier write-ups gloss over: Vercel's AI Gateway pricing page says the free tier includes $5/month of credit, but only for a subset of "Free Tier eligible" models, and free requests are rate limited per model (you'll see &lt;code&gt;429&lt;/code&gt;s if you push it). Buying any credits moves you to the paid tier, and the monthly free credit stops applying. Fine for a handful of hero images; plan for it if you're batch-generating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An MCP server.&lt;/strong&gt; If an image provider ships an MCP server, Claude Code can register it and call it like any other tool. The command shape for a local stdio server, from Claude Code's MCP docs, is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-key &lt;span class="nt"&gt;--transport&lt;/span&gt; stdio my-image-server &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; &amp;lt;the-server-package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remote servers use &lt;code&gt;--transport http &amp;lt;name&amp;gt; &amp;lt;url&amp;gt;&lt;/code&gt; instead. I'm deliberately not naming a specific image MCP package here, because the ecosystem churns fast; check the provider's own docs for the exact package and env var names.&lt;/p&gt;

&lt;p&gt;Either way, the mental model is the same: Claude writes the prompt, picks the parameters, calls the tool and saves the file. The pixels come from a different model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which route for which job
&lt;/h2&gt;

&lt;p&gt;After a lot of trial and error, this is roughly my decision tree:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Icon, logo draft, diagram:&lt;/strong&gt; SVG or Mermaid straight from Claude. Free, instant, editable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chart or templated graphic (OG cards, social banners with text):&lt;/strong&gt; have Claude write Pillow/matplotlib code and commit it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-off illustration or hero image in a repo:&lt;/strong&gt; Claude Code plus an image CLI or MCP server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product photos, lifestyle shots, background removal, upscaling at volume:&lt;/strong&gt; a dedicated image tool. This is where an LLM-in-the-middle adds friction rather than removing it.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Can Claude generate images in the free plan?&lt;/strong&gt;&lt;br&gt;
No plan changes this. Claude on any tier returns text only. You can still get SVG, HTML and code that renders images on the free plan, since those are text outputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Claude edit an image I upload?&lt;/strong&gt;&lt;br&gt;
No. It can analyze it (describe it, read text in it, spot UI bugs), but Anthropic's docs say it cannot edit or manipulate images. To edit, have Claude write Pillow code for simple operations, or use an image tool for anything generative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Claude Code generate images?&lt;/strong&gt;&lt;br&gt;
Not by itself, but it can run tools that do. Install an image CLI or add an image-generation MCP server, and Claude Code will call it and save the output into your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Claude's SVG output good enough for production?&lt;/strong&gt;&lt;br&gt;
For icons and diagrams, often yes after a couple of rounds of feedback. For illustrations with depth, lighting or people, no; use an image model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;So: can Claude generate images? Not natively, and the docs are clear about that. But "Claude can't make images" is the wrong takeaway. It writes SVG, it writes the code that draws your charts and cards, and in Claude Code it can drive a real image model for you. For the photographic side, especially e-commerce product shots, background swaps and batch edits across a whole catalog, I use &lt;a href="https://supavisual.com/?utm_source=devto&amp;amp;utm_medium=ugc&amp;amp;utm_campaign=tariqhassan&amp;amp;utm_content=can-claude-generate-images-outro" rel="noopener noreferrer"&gt;Supavisual&lt;/a&gt;, which has templates for studio, apparel and jewelry shots plus remove-background, upscale and batch editing built in.&lt;/p&gt;

&lt;p&gt;Use Claude for the parts that are really code, and a proper image tool for the parts that are really photos. That split has saved me more time than any single prompt trick.&lt;/p&gt;

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