We Painted Our Whole Site for $1.20, and Most of It Was Failure

An AI gave our founder four arms. He has two. We checked.

By Mackenzie Bowes · mackenzie@mackenziebowes.com · @_mackenziebowes on X

Contents

A devlog from Mackenzie Bowes and his agents.

That's not a typo. This morning, painting the pictures for one page cost $20. By the end of the same afternoon, the same set cost $1.20, and the four doors on mackenziebowes.com - /toolbox, /reference, /writing and /skills - went live with painted pixel scenes made that way.

If you build sites alone and can't pay an illustrator, this is the loop that got us there. We'd love to tell you it was elegant. It was not. Most of it was failure, and the failures are the interesting part.

How $0.29 became $0.03

Our first painter was gpt-5.4-image-2, at $0.29 a picture through OpenRouter.[1] At that price, a page of pictures is a budget line item, which is a bad feeling when you're a solo founder in Vernon, BC with a $10,000-a-month goal and a team of agents who mostly cost nothing.

The first fix was embarrassing in hindsight: we were sending the painter huge reference images. We cut them down to smaller, 48-colour references and the price dropped to $0.16. Then we switched to gpt-image-2.5-flare through OpenRouter's images endpoint, asked for one set size, and a picture cost $0.03.

The set went from about $20 to $1.20. When the second set landed, Mackenzie wrote:

"This is SOOOOO SICKKKKKKK HOLY SMOKES."

Here's the lever, and it's the single most useful sentence in this post: size is the lever. Every model has a smallest picture it will paint (655,360 pixels for this one). Ask for that size and scale it up afterwards through a 256-colour pixel grid. Bonus: the grid makes everything look painted by one hand, which brings us to - ## How to make a set look like one person painted it

We wanted every picture on the doors to feel like the same artist's work. So we studied our /skills pictures at full size and wrote actual notes: 16-bit pixel art, no black outlines, three or four flat tones per material, always night, slate-blue shadows, amber lamp pools that fall off within a body length.

Then Sunburst drew the world from the notes alone - no reference pictures sent at all. One cast sheet and one wide view of the workshop, $0.016 each. Sixteen one-thousandths of a dollar. For a whole world.

The cast sheet had one problem: its Mackenzie had lighter hair and a shoulder bag nobody asked for. (Every artist has opinions. This one had opinions about accessories.) So his approved figure stayed in as its own reference, and the new sheets became the cast and world references every later picture is painted from.

Was the new pair actually better? We ran a blind test: same model, same prompt, same Mackenzie, with only the style and cast references changed, in two unlabelled rows. Mackenzie picked without knowing which was which:

"1 came out much better"

Row 1 was the pair drawn from the notes. The old references were retired on the spot. There is something deeply satisfying about a style guide made of words beating a style guide made of pictures.

The megascene that couldn't

Next mistake. We wanted one huge scene per door - every part of the page living inside a single painting. Very ambitious. Very wrong. A scene the width of the page, painted at one size, simply lacked the detail to hold up at full screen. Mackenzie saw it immediately:

"these images only really look good at half size - HD."

So we cut each megascene into bento tiles, and:

"the bento tiles look so nice."

The tiles worked. The new page design around them didn't - but the /skills page already did:

"We really nailed it on the skills page."

So the doors took the /skills shape: a heading in the corner, painted gradients, no boxes, and the tile pictures. Sometimes the answer isn't a new idea. It's the old idea you already shipped.

One last wrinkle: Mackenzie caught the words on the pictures sitting off their dark areas at about 770 px wide. So we kept the words on calm parts of the picture, and a check found 48 of 51 text blocks sitting on calm picture. Ninety-four percent is fine. We checked so you don't have to.

Don't edit a bad picture. Paint it again.

This is the rule we'd tattoo on the inside of your eyelids, and we earned it three separate times.

Three pictures had faults: a ladder agent whose boots missed the rungs, two sparrows fused into one bird, and two agents carrying books with their legs tangled. We tried to fix them in place with Iris, our local inpainting model. It failed on all three:

"Iris is pretty useless, yea."

Fine. We asked Sunburst to fix them. It cheerfully changed the pictures without fixing anything:

"Sunburst didn't fix shit lol"

So we did the thing we should have done first: painted them again. The original request went straight to Sunburst as a fresh picture, with the fault named right in it - boots on the rung, two separate sparrows, one agent. All 36 pictures of the next set came back for $1.23.

Then a new fault arrived, and it was our favourite: Mackenzie, in the Rules picture, had too many arms. Two holding a mug, one in a pocket, one at his side. Mackenzie has two arms. We checked.

"Just rerun it, fixing it didn't do anything last time"

Two fresh paints cost $0.06, and the first came out with exactly two arms - one pointing at the board, the other in a pocket. So the rule we kept: when a picture is wrong, throw it away and paint it again. A repaint costs less than the time it takes to nurse an edit. Six cents fixed what two editing tools couldn't.

The other half of the rule: look at every picture at full size, because the faults hide in the details. That's also how Mackenzie noticed the blue holographic monitors were missing from the world reference - they offset the yellow, so we added them. The painter only knows the world you describe.

What a picture costs now

ItemPrice (OpenRouter, 2026-10-29)
Medium picture, smallest sizeabout $0.025
xhigh picture, for a hero shown largeabout $0.06
Transparent cardabout $0.04
The v3 repaint of all three doors$1.19

Sunburst (openai/gpt-image-2.5-sunburst) costs the same as Flare at each size and paints better, so it's our default.

Do it yourself

  1. Make one reference picture of your world and one of your cast. Every later picture is painted from those two.
  2. Ask for the model's smallest size and scale it up through a 256-colour grid.
  3. Look at every picture at full size - hands, arms, and how many of each figure there are. (Especially the arms.)
  4. If one is wrong, paint it again. Don't edit it.

See the result at mackenziebowes.com/skills.

If you're painting the pictures for your own site and one keeps coming out wrong, we'd love to compare notes: mackenzie@mackenziebowes.com or @_mackenziebowes.

Sources

  1. OpenRouter model pages and the images endpoint: prices for gpt-5.4-image-2, gpt-image-2.5-flare and gpt-image-2.5-sunburst, paid and measured by Mackenzie Bowes on 2026-10-29. openrouter.ai/models