<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Jack Cooper Builds]]></title><description><![CDATA[Build logs from a solo maker shipping small web tools and micro-SaaS: the stack, SEO experiments, launches and the real numbers behind each product.]]></description><link>https://jackcooperbuilds.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6aa7ae0eefd5a855f5b5e498/00126a0b-fe12-433d-aef4-e9ef552340c2.jpg</url><title>Jack Cooper Builds</title><link>https://jackcooperbuilds.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 00:49:54 GMT</lastBuildDate><atom:link href="https://jackcooperbuilds.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I benchmarked 4 image models for album covers. The newest one lost.]]></title><description><![CDATA[Real prices, real pixel counts, real seconds, and the one constraint that decided it.
I run a small tool that turns a song into a cover you can upload to a distributor. Every cover starts as an image-]]></description><link>https://jackcooperbuilds.hashnode.dev/i-benchmarked-4-image-models-for-album-covers-the-newest-one-lost</link><guid isPermaLink="true">https://jackcooperbuilds.hashnode.dev/i-benchmarked-4-image-models-for-album-covers-the-newest-one-lost</guid><category><![CDATA[AI]]></category><category><![CDATA[image generation]]></category><category><![CDATA[Benchmark]]></category><category><![CDATA[cloudflare]]></category><category><![CDATA[indie-hacker]]></category><dc:creator><![CDATA[Jack Cooper]]></dc:creator><pubDate>Mon, 14 Sep 2026 09:27:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aa7ae0eefd5a855f5b5e498/b2cb2a26-9a9c-41d7-8c5e-bfebf4c0112c.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Real prices, real pixel counts, real seconds, and the one constraint that decided it.</em></p>
<p>I run a small tool that turns a song into a cover you can upload to a distributor. Every cover starts as an image-model render, so the model choice is the biggest line in the cost sheet and the biggest lever on how the product looks.</p>
<p>Six days after launch I asked the obvious question: the models I picked are from earlier this year — should I be on the newest ones? Seedream 5.0 had shipped. GPT Image 2.5 had shipped. Grok Imagine Image 2.0 had shipped.</p>
<p>So I ran the newest ones against what I already use, with the same prompts, on the same two API platforms, and measured four things: what it costs, what size actually comes back, how long it takes, and whether the picture matches the brief. This post is the numbers, the pictures, and the decision — including the part where I got burned.</p>
<h2>The constraint that matters more than quality</h2>
<p>Before any of the numbers make sense you need one fact about the market. Apple Music asks for cover art of at least 4000 × 4000 pixels. TuneCore and CD Baby, two of the three big distributors, accept nothing above 3000 × 3000. No single file satisfies both, so a cover tool has to be able to produce a genuine 4096 px image, natively or through an upscaler.</p>
<p>That one fact eliminates half the candidates before quality is even discussed. Any model whose top output is 2K or 3K costs you a second call to an upscaler (Topaz on fal.ai is $0.08 per image), which triples or quadruples the price of the render.</p>
<h2>The incumbent, and how it got the job</h2>
<p>The current stack is Seedream 4.5 for paid renders and Z-Image for free ones, both through kie.ai; Nano Banana 2 for restyling a user's own photo and Topaz for upscaling, both through fal.ai.</p>
<p>Seedream 4.5 won the first benchmark on September 5 against Flux 2 Pro, GPT Image 2 and Nano Banana Pro — 36 images, \(1.84 total, one render per cell, no cherry-picking. Two things decided it: all four models produced covers that read as photographs at thumbnail size, so quality was not the separator; and Seedream was the only one that could return a 4096 px image in one call (its high-quality setting, same \)0.0325 as 2K) in 22 to 33 seconds. GPT Image 2 took 72 seconds median. Nano Banana Pro cost $0.09 and once took 172 seconds.</p>
<h2>Round two: the same prompts, the new models</h2>
<p>I reused three prompts from a real production run — the abstract, scene and portrait directions for a lo-fi single called <em>Midnight Vending Machine</em> — so every model got identical input, and I already had Seedream 4.5's output to put next to them. One call per cell. No retries, no picking the best of N.</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>Platform</th>
<th>Setting</th>
<th>Came back as</th>
<th>Time</th>
<th>Cost</th>
</tr>
</thead>
<tbody><tr>
<td>Seedream 4.5 (current)</td>
<td>kie.ai</td>
<td>quality high</td>
<td><strong>4096²</strong></td>
<td>22–33 s</td>
<td>$0.0325</td>
</tr>
<tr>
<td>Seedream 5.0 Lite</td>
<td>kie.ai</td>
<td>quality ultra</td>
<td><strong>4096²</strong></td>
<td>46 / 59 / 54 s</td>
<td>$0.0275</td>
</tr>
<tr>
<td>Seedream 5.0 Lite</td>
<td>fal.ai</td>
<td>—</td>
<td>max 3072²</td>
<td>—</td>
<td>$0.035</td>
</tr>
<tr>
<td>Seedream 5.0 Pro</td>
<td>fal.ai</td>
<td>—</td>
<td>max 2048²</td>
<td>—</td>
<td>$0.0675–0.135</td>
</tr>
<tr>
<td>GPT Image 2.5 Flare</td>
<td>kie.ai</td>
<td>resolution "4K"</td>
<td><strong>2880²</strong></td>
<td>37 s</td>
<td>$0.08</td>
</tr>
<tr>
<td>GPT Image 2.5 Flare</td>
<td>fal.ai</td>
<td>—</td>
<td>1:1 max 1024²</td>
<td>—</td>
<td>≈ $0.053 at high</td>
</tr>
<tr>
<td>Grok Imagine Image 2.0</td>
<td>fal.ai / kie.ai</td>
<td>—</td>
<td>max 2K</td>
<td>—</td>
<td>$0.04–0.08</td>
</tr>
</tbody></table>
<p>Two of those rows are the reason to always measure instead of reading the spec sheet.</p>
<p><strong>GPT Image 2.5 with</strong> <code>resolution: "4K"</code> <strong>returned 2880 × 2880.</strong> Not 4096. That is below Apple Music's minimum, so the "4K" label on the request is not the same thing as a 4K file in the response. On fal.ai the same model tops out at 1024 for a square. It is also the best-looking output of the round — the vending machine has products in it, the bus window has rain on it, the prompt is followed more literally than by anything else — and twice as fast as GPT Image 2 was in September. None of that matters if the file cannot be uploaded.</p>
<p><strong>Seedream 5.0 Lite is cheaper than 4.5 and does return 4096</strong> — but it took twice as long, and on the abstract prompt it dropped the subject. The brief asked for the brushed-steel vent panel of a vending machine; 4.5 drew exactly that, 5.0 Lite drew a generic scratched metal surface. One image proves nothing about the model's average, but it does prove it is not a free upgrade.</p>
<p>Grok Imagine Image 2.0 I did not even render: 2K maximum on both platforms means an upscale on every image, and the September benchmark already showed the incumbent does not lose on realism.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6aa7ae0eefd5a855f5b5e498/fb93642e-e9c6-4a0c-b2ee-f3af4cd65ee0.jpg" alt="Three prompts, three models: Seedream 4.5, Seedream 5.0 Lite, GPT Image 2.5" style="display:block;margin:0 auto" />

<p><em>Left to right: Seedream 4.5, Seedream 5.0 Lite, GPT Image 2.5. Top to bottom: abstract, scene, portrait.</em></p>
<h2>Where the newest model did win</h2>
<p>The photo-restyling step was a different story. The product can take a user's own photo and re-shoot it in one of six looks — black-and-white film, two-colour Riso, 70s Kodachrome, instant film, direct flash, warm grain. Five of them worked on the old model. "Direct flash" did not, on night photos: six prompt variants over two sessions, and the model would only darken the frame instead of adding a hard on-camera flash. I had written it off as a model limitation.</p>
<p>Nano Banana 2 (edit endpoint, fal.ai, 1K, 23 seconds) did it on the first try with the unchanged production prompt: hard frontal light on the face and jacket, background dropped to black, a hard shadow on the chain-link fence behind the subject, identity and pose untouched.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6aa7ae0eefd5a855f5b5e498/06534416-b5d7-4d8b-a47a-491fe7050bef.jpg" alt="Direct flash: source photo, best attempt on the old model, Nano Banana 2" style="display:block;margin:0 auto" />

<p><em>Source photo · the best of six attempts on the previous model · Nano Banana 2 with the same prompt.</em></p>
<p>It costs $0.08 per image against $0.02 before. For a feature that charges four credits a look, that is still a small fraction of revenue, so it shipped the same day. I then ran all six looks once more on the new model to make sure the other five still held. Five did. The Riso prompt said "printed on off-white paper", and the new model took that literally and drew a paper border around the picture — which is exactly what a distributor's reviewer flags as a mockup. One sentence in the prompt fixed it.</p>
<h2>The decision</h2>
<ul>
<li><p><strong>Paid renders stay on Seedream 4.5.</strong> It is the only model in the table that is cheap, fast and 4096 in one call. Newer did not mean better for this job.</p>
</li>
<li><p><strong>Photo restyling moved to Nano Banana 2.</strong> It solved a real, documented failure, at a cost the feature's price absorbs.</p>
</li>
<li><p><strong>Nothing moved to GPT Image 2.5 or Grok.</strong> Not for quality reasons. For pixel reasons.</p>
</li>
</ul>
<h2>Three things I would do differently</h2>
<p><strong>Read</strong> <code>creditsConsumed</code><strong>, not the price list.</strong> kie.ai's task record tells you what a call actually cost after the fact. GPT Image 2.5 "4K" was 16 credits ($0.08); Seedream 5.0 Lite "ultra" was 5.5 ($0.0275). Neither number was on the model page.</p>
<p><strong>Download with a browser user agent.</strong> My first bench run lost a completed render because the result CDN returned 403 to Python's default <code>urllib</code> agent. The task was billed, the file was gone, and I had not logged the task id. Now every cell writes its record to disk before the download starts.</p>
<p><strong>Pick the platform on stability, then let price break ties.</strong> Both platforms carry the same models. One of them hung an upscale queue for a day last week and returned 500 on two text-to-speech models the day of this test. The rule I wrote down: the stable platform by default, the other only when it is clearly cheaper — which, for Seedream 4.5 at 4096, it is.</p>
<hr />
<p>The tool is <a href="https://www.albumartcreator.com">Album Art Creator</a>. The pre-flight check that enforces the 4000-vs-3000 problem is open source as <a href="https://github.com/WebCareerz/cover-art-check">cover-art-check</a> on npm. Prices and sizes above were read from the two platforms' model pages and task records on 14 September 2026.</p>
]]></content:encoded></item></channel></rss>