TLDR: if you're generating a character progression with AI art, independent text prompts can't give you a consistent character AND visibly distinct stages at the same time. Img2img chaining + aggressive negative prompts is the solution.
The Setup
I'm building a gym progression PWA — a dead-simple progressive web app (a phone app that installs from the browser) gym tracker for M/W/F workouts.
The hook is a 12-stage 8-bit dad character who transforms from scrawny to jacked as you rack up workouts.
I wanted real art. Not emoji, not stick figures. So I reached for PixelLab AI (an AI pixel-art image generator) and tried to generate all twelve stages.
That's where I hit a wall.
The Two Problems That Fight Each Other
Here's the tension nobody warns you about when you try to AI-generate a progression:
"Same character" and "visibly distinct stages" pull in opposite directions.
If you generate each stage independently from a text prompt, you get twelve different dudes — same description, but the model interprets the hair a little differently, the shorts are a slightly different shade, the proportions drift. L1 doesn't look like L12's younger self. It looks like a stranger.
So you tighten the prompt. You get more specific. And now?
They all look the same.
Which brings me to the second problem: the model is biased toward the "fit young man." Ask PixelLab to draw a shirtless guy — any guy — and it will give him a six-pack. Every time. L1 and L6 are supposed to look meaningfully different. But if the model adds abs to everyone, your early stages lose all their distinctiveness. There's no "before."
What I Tried That Didn't Work
My first pass: generate each of the twelve stages from a text prompt, same character description, incrementally more muscular language.
The result was a mess. Characters drifted. And the early stages looked just as built as the middle ones because the model wouldn't draw a soft stomach to save its life.
I tried seed-locking. Helped a little with consistency but didn't fix the abs.
I tried longer negative prompts. Helped a little with the muscle creep but the character still didn't read as the same guy across twelve frames.
Neither fix touched the real problem.
The Fix That Actually Worked
Two things, working together.
First: img2img chaining. Instead of generating each stage from a text prompt, I generated an anchor — the starting character — and then used that PNG as the init_image for Stage 2. Then Stage 2's output became the init_image for Stage 3. And so on all the way to Stage 12.
Each stage inherits its proportions and character details from the previous one. Muscle builds cumulatively. The character stays the same guy because he is the same guy — just evolved.
Second: negative-prompt pose lock AND abs suppression. Words like "bodybuilder" and "jacked" apparently trigger the model to put the character in a flexing pose. So I blocked that explicitly: "flexing, posing, raised arms, crossed arms, bent arms, hands on hips, action pose, dynamic pose" in the negative description. And I kept "muscular, abs, six-pack, toned, wide shoulders" suppressed on the early stages.
One more trick for L1 specifically: to get a genuinely skinny shirtless guy, I had to generate him in a t-shirt first (the model tolerates a skinny body if it's clothed) and then img2img that frame shirtless. Transferring the proportions through the shirt was the only way to sneak past the bias.
Why This Matters to Me
I care about this one more than most fixes.
This is a motivation app. The whole point of the transformation strip is that you feel the progress over months and years. If L1 looks basically the same as L5, the early grind feels invisible. If L3 doesn't look like the same character as L10, the story breaks.
The design problem — same character, visibly distinct stages — turns out to be a real craft problem when AI is generating the art. You can't solve it with prompts alone.
You have to build the progression the same way you'd build actual muscle: one step at a time, each stage starting from the last.
P.S. The project is open source — pure vanilla JS PWA, no framework, no build step. As bare-metal as I could make it.