AI-generated UI looks generic for one structural reason: a single prompt is being asked to do three different jobs at once. You hand the model "build me a landing page," and in that one breath it has to pick the taste, explore the options, and write the final spec. With nothing to anchor any of those three, it does the only safe thing a probability machine can do: it returns the average of everything it has seen. That average has a look (Inter, a purple gradient, a centered hero, three rounded cards) and a name now: AI slop. The fix is not a cleverer prompt. It is splitting those three jobs back apart into an artifact chain: prompt, then design, then spec, then code. This post is the honest version of why the slop happens and how to get out of it.
Why AI design looks generic
AI design looks generic because the model defaults to the statistical center of its training data, and the center of "modern web UI" is a very specific, very repeated look. The community has converged on a shared vocabulary for it: Inter or Roboto type, a purple-to-indigo gradient on a white or light-gray background, a centered hero with one CTA, and a row of three rounded cards with little icons. Once you can name it, you start seeing it on half the launches in your feed.

You do not have to take my word for the pattern, because people have catalogued it precisely. The blog post Why Your AI Keeps Building the Same Purple Gradient Website lists the hallmarks exactly:
The AI slop starter pack
- ✕Inter or Roboto font (never anything with personality)
- ✕Purple/indigo accent colors
- ✕Hero section with centered text and a CTA button
- ✕Three features in boxes below, each with an icon
- ✕White or light gray background
- ✕Rounded corners on everything
- ✕Subtle shadows (exactly 0.1 opacity)
Verbatim from prg.sh
It is not your imagination, and it is measurable. A teardown by Developers Digest, AI Design Slop: patterns that out your app as vibe-coded, audited a large batch of Show HN launches and found that more than half carried the same fingerprint: Inter everywhere, a lavender accent, glassmorphism, the badge-above-the-headline, the colored left-border card, the numbered 1-2-3 steps. When most new products share a tell that obvious, the cause is not a thousand bad taste calls. It is one shared default.
Avoid the default gradient and font
Because the model learned what "modern" looks like from a body of code where purple and Inter were already the safe defaults, so it reproduces the safest version every time. The purple specifically has a traceable origin. As the purple gradient writeup explains, Tailwind CSS shipped bg-indigo-500 as a prominent default in its examples years ago, that indigo saturated tutorials, landing pages, and component demos, and a model trained on all of it now associates "nice modern button" with that exact hue. Inter wins for the same reason: it is the most common safe sans on the web, so it is the highest-probability answer to "pick a font."
Here is the slop palette as actual values, so you can recognize it on sight (and so you know what to steer away from):
These are stock Tailwind values, not a real brand. They are the statistical center of AI UI output, shown here so you can spot the default and choose against it.
None of these colors is bad on its own. The problem is that they are nobody's deliberate choice. They are what you get when the question is open and the model picks the most likely answer. A real brand chooses a color because of what it means. An average chooses a color because it appears most often.
A better prompt only goes so far
Partly, but a better prompt alone hits a ceiling fast, and most of the advice online stops right at that ceiling. The standard fix list is real and worth doing: name a specific font, give exact hex values, paste a reference, ask for a particular vibe. That moves you off the absolute center. But it does not get you to design, because you are still trying to express taste, structure, and final styling all at once, in prose, in a single shot. You can feel the ceiling the moment you start replying to the output with "hmm, make it cleaner," "more premium," "less slop." That sentence is the tell. You are no longer designing. You are negotiating with vibes, and vibes do not converge.
There is a popular counter-move that tries to fix this by going the other direction: write one giant binding spec up front and force the model to obey it. The "give it more constraints" school. It helps, and a real design system absolutely helps (more on that below), but a single mega-spec mostly relocates the problem rather than removing it. You still cannot write taste down in prose well enough to skip seeing it, so the "make it more premium" negotiation just moves upstream into the spec document. The issue was never too little instruction. It was that one artifact is carrying three jobs that want to be separate.
The real cause: one prompt, three jobs
The root cause is that most AI UI workflows collapse three distinct jobs into one prompt, and each job needs a different kind of input. When you fuse them, none of them gets done well. Pull them apart and you can see why a single prompt was always going to average out:
| The job | The question it answers | What it actually needs |
|---|---|---|
| Taste direction | What should this feel like? | A point of view, references, constraints. Not a text adjective. |
| Visual exploration | What are the options? | Many distinct directions to compare, cheaply. |
| Implementation spec | What exactly do we build? | Concrete tokens, structure, components. A durable artifact. |
A human design process keeps these as separate steps on purpose. You gather references and set a direction, you sketch several options and pick one, then you write the spec and build it. Each step produces an artifact the next step consumes. When you compress all three into "build me a landing page," you ask the model to commit to a taste it was never given, skip the exploration entirely, and emit final code in one pass. The safest single output that satisfies all three at once is, by definition, the average. That is the slop, and it is a workflow problem, not a model-capability problem.

Tip
Why "make it a Qt app" works
Because naming a strong, well-defined design language collapses the model's options down to one coherent direction, which quietly does the taste-direction job for you. This is the trick from a Hacker News thread that hit 218 points and 134 comments: the linked post, "Slightly reducing the sloppiness of AI generated front end," found that one small instruction did most of the work. In the author's words:
"Simply asking it to make it look like a Qt app, to my tasteless eyes, removed almost all feeling of slop."
The top explanation in the thread, from commenter AmareshHebbar, nails the mechanism:
"This makes perfect sense. Qt has very clear and strict design rules. Standard web design has too many options. When the AI has too many options, it just guesses and makes a mess. Forcing a desktop style fixes that"
That is the whole thing in three sentences. "Standard web design has too many options," so the model guesses, so you get the average. Pin it to a language with strict rules and the guessing stops. The thread loved the result for a reason worth quoting; one commenter praised a retro-desktop direction (a Windows 98 styled mockup) like this:
"This one works well. I think it's because there's no shine to it, it's just the data, what you need, right there without trying to fluff it all out with rounded edges and superfluous stuff."
"Just the data, what you need, right there" is the opposite of slop. But notice what "make it a Qt app" really is: it is a one-word taste direction smuggled into the prompt. It works, and it is a great hack, but it is still doing all three jobs in a single shot. You got lucky that one strong keyword carried the taste. It does not give you exploration, it does not give you a reusable spec, and it only works for looks that happen to be dense in the training data. It is a patch on the symptom. The cure is to make taste its own step instead of hoping a magic word supplies it.
The sameness problem
That is the deeper worry, and it is a fair one: if everyone prompts the same models with the same vague asks, the web flattens toward one house style. A second Hacker News thread, Is AI causing a repeat of frontend's lost decade? (407 points, 334 comments, on Mauro Bieg's essay), is all about this anxiety: a quality collapse and a sameness, what people half-jokingly call the shadcn-ification of the web. One commenter put the quality side bluntly:
"Low accessibility, terrible performance, lack of any fundamentals of html and css, abuse of those awful solutions like Tailwind or using 2016 technologies like React for rendering what should mostly be static websites + some web component, all plagued by memory leaks and very basic usability bugs."
The essay itself frames it as deskilling, the same arc other crafts went through: a skilled job "being eliminated by the introduction of technologies, operated by semi- or unskilled workers." It is a real risk. But convergence is not destiny, it is a default. The web flattens only if we keep handing the model under-specified prompts and shipping its first guess. The way out is the same as the fix for slop: put taste and exploration back into the loop as real steps, so the output reflects a point of view instead of the median of everyone else's.

Can you give an AI taste?
You can give it a direction, which is most of what people mean by taste, and a fast-growing wave of tools is trying to do exactly that with a spec file. The instinct is right. This past stretch, GitHub filled up with "taste skill" and DESIGN.md repos: artifacts that hand a coding agent an opinionated design language instead of leaving it to guess. Two are genuinely huge:
- VoltAgent/awesome-design-md (around 90k stars) is "a collection of DESIGN.md files analysis by popular brand design systems. Drop one into your project and let coding agents generate a matching UI." It is the design system as a portable artifact.
- taste-skill (around 44k stars) is even blunter about the goal: it "gives your AI good taste. stops the AI from generating boring, generic slop." It ships opinionated
SKILL.mdfiles for Cursor, Claude Code, and Codex.

This is real progress, and a design system file is the single highest-leverage thing you can add today. It supplies the taste-direction job and the spec job in one document. But look at where it sits in the chain: it is one artifact handed straight to code generation. It does the taste and the spec, and it still skips the exploration. A DESIGN.md makes your output consistently on-brand, which is a big deal, but on its own it can make every screen consistently the same, just in your colors instead of indigo. The taste spec is two-thirds of the answer. The missing third is comparing real, distinct options before you commit.
The fix: an artifact chain
The fix is to stop asking one prompt to do everything and instead run the work as a chain where each step produces an artifact the next step consumes: prompt to design to spec to code. Each handoff is a real object you can see, judge, and reuse, which is exactly what a single fused prompt never gives you.

- Prompt → direction. Start by setting taste deliberately. Pick a reference, a brand, or a strict language ("make it a Qt app" is the crude version of this). The point is to choose a point of view on purpose instead of letting the average choose for you.
- Direction → design (explore many). Generate several genuinely different directions and compare them side by side, before any code exists. This is the step almost everyone skips, and it is the one that kills sameness, because you are choosing from options instead of accepting the first guess.
- Design → spec. Turn the direction you picked into a concrete, reusable artifact: tokens, type scale, components, layout rules. This is the
DESIGN.md. It is what makes the look repeatable across screens without re-negotiating it every time. - Spec → code. Only now generate the implementation, against a spec that already encodes the taste. The model is no longer guessing the look. It is executing a decision you already made and can see.
A DESIGN.md you can copy is a good place to feel step three. Here is a tiny, deliberately non-generic one (warm paper, a real ink color, one decisive accent, flat surfaces) that you can paste in front of a generation to pull it off the indigo default:
---
name: "Warm Editorial (anti-slop starter)"
principles:
- "Flat surfaces. No glassmorphism, no 0.1-opacity drop shadows."
- "One decisive accent, used once per screen. Color must mean something."
- "Density over fluff: show the data, skip the decorative cards."
colors:
background: "#FBF7F0" # warm paper, not white
ink: "#1F1B16" # near-black warm ink for text
accent: "#C2410C" # burnt orange, the single accent
muted: "#6B5E52" # secondary text
line: "#E7DDCF" # hairline borders, not shadows
type:
font: "A serif or grotesque with personality. Not Inter, not Roboto."
scale: "Big, confident headings. Generous line-height in body."
shape:
radius: "2px to 4px max. Corners are crisp, not pill-soft."
layout:
hero: "Left-aligned, not centered. Lead with one real sentence."
cards: "Avoid the three-icon-card row. Use a list or a table if it is just data."
---That file does the taste and spec jobs. The exploration job needs a surface where comparing options is the default, not a chore. That is the piece a chat box cannot give you, because a chat box returns one thing at a time and loses the last version when you re-prompt.
Where Superdesign fits
Superdesign is built around this exact chain, because the anti-slop answer is structural, not a better adjective. It is an AI design agent on an infinite canvas, and it keeps the three jobs as separate steps instead of fusing them into one prompt. A few specifics, kept honest:
- Taste, fed before generation, not guessed. Mid-design, the agent can pull real, proven patterns from sources like Mobbin, Dribbble, and Behance, so a generation starts from a curated reference instead of the median of the internet. You can browse the same idea in our free prompt library and grab a starting direction.
- Exploration as the default. It forks multiple distinct directions at once on the canvas and carries context down each branch, so you compare and converge instead of nudging one thread. That is the step that beats sameness, and it is the part a linear chat tool structurally cannot do.
- A spec, then real code. It investigates your real project, captures your existing design system as a file (the practical analog of
DESIGN.md), and outputs real React and Tailwind, so the look is reusable and the handoff does not break. You can drive it from your coding agent (Claude Code, Cursor, or any agent) so design happens with full context of your codebase.
None of this removes the human from the taste call, and it should not. It just gives each of the three jobs its own step and its own artifact, so the model executes decisions you made instead of averaging the ones you skipped.
What to do Monday
Stop shipping the first generation, and stop arguing with it in adjectives. Do three small things instead, and you have run the artifact chain by hand:
Your Monday anti-slop checklist
- ✓Set a deliberate direction up front: a reference, a brand, or a strict language
- ✓Generate several distinct options and compare them, before any code
- ✓Write the winner into a DESIGN.md you reuse on the next screen
If you want the chain to be the tool rather than a discipline you maintain, that is what Superdesign is for: taste fed in, many directions explored on a canvas, a real design-system file, and React out, on a free tier plus a flat $20 per month so iterating does not meter your budget. Go deeper in the best AI UI generator guide, see the workflow framing in what is vibe design, or read how the design-system file works in what is DESIGN.md. Generic was never the model's fault. It is what one prompt does when you ask it to be a taste director, an explorer, and an engineer all at once.








