Workshop notes

The ugly cat

All I wanted was a comfortable tomcat for a website. What I got explains two things at once: why AI can't draw — and why quality is a budget decision.

The brief was simple. For a small website I build on the side, I wanted a mascot: a well-fed tomcat strolling across the page, occasionally giving the visitor a curious look. No photo, no image generator — drawn in code, right in the browser. The same AI that migrates my databases without a hitch was supposed to handle it on the side.

Early iteration of the code-drawn cat: cross-eyed saucer eyes, a lumpy body and sausage-shaped legs

The first attempt — drawn blind, in economy mode.

This is what came back. You can tell it's meant to be a cat. You can also tell that something went fundamentally wrong — two things, actually.

Cause one: the AI draws blind

A language model that "draws" doesn't paint. It writes drawing code as text — coordinates, curves, colour values — and never sees the result. Imagine dictating a drawing to someone over the phone, stroke by stroke, without ever seeing the paper: "Now a circle at 320, 180, radius 40." That's roughly how this cat came to be.

The model knows perfectly well that cats have two ears, a tail, whiskers. But knowing in text form is not the same as placing coordinates so the ear lands on the head rather than in the belly. For prose and program code, training offers billions of good examples; for the pairing "a beautiful figure and the exact code that produces it", there is far less. Blind, plus little practice — the result is above.

Cause two: running on fumes

The second cause is less comfortable, because it has nothing to do with technology and everything to do with money: the cat was made on a day I had to economise. My weekly allowance was used up, I had topped up extra usage credit — and I was still rationing it. So: not the best model, but a simpler one. No generous thinking budget, but the quick answer.

This is the part casual users rarely get told: intelligence is billed by the token. Bigger models cost more per token than small ones. "Thinking" — the internal work before the answer — burns additional tokens. And every retry costs again. Whoever economises turns three dials down at once: model class, depth of thought, number of attempts. Some chat interfaces even do it silently for you when your allowance runs low. The answers quietly get worse — you just can't see it in a mediocre paragraph. You can see it in a cat.

The fix: giving the AI eyes

The cat only became likeable once both things changed. The big model again — and above all, a closed loop. The AI draws, the result is rendered, a screenshot goes back to the AI, it sees its own work and corrects it. Ear too low, eye too wild, legs too short — round after round. Blind dictation becomes working with eye contact.

Tom today: a well-fed ginger tomcat drawn in code, green-eyed and looking at the viewer

Same approach, different conditions: a big model and a closed loop.

The same loop carries every kind of good AI work, by the way, not just drawing: for code, the feedback is called "run the tests"; for prose, "read it critically". The only difference is that an ugly cat wears its production conditions on its face — a plausible but crooked text does not.

What to take away

When an AI result disappoints you, look at the conditions before you judge: Which model did the work? Was it allowed to think? And did it ever get to see its own output — or did you just say "again, but nicer"? That's repetition, not feedback.

And if you're wondering why this site's logo is a sober pair of brackets and not an animal: now you know. Our mascot gets its entrance once the loop can do it justice. Until then: honestly geometric beats ugly with whiskers.

/compact — the essentials, if context is running low:

The cat turned out ugly because the AI draws blind — and on a budget day: smaller model, hardly any thinking budget, no correction rounds. Intelligence is billed by the token, and limits lower quality silently. The cat only became likeable with a big model and a loop in which the AI sees its own result.

An unhandled error has occurred. Reload 🗙

Rejoining the server…

Rejoin failed… trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.