How to stop AI coding agents making generic-looking UI
Generic output fills the gaps a request leaves open: palette, fonts, layout, buttons and proof. Make those choices in a design file the agent loads every session, and name the defaults you do not want.
6 min read
Why does an agent's page look like every other generated page?
A request for “a landing page” leaves the agent to choose the palette, the fonts, the layout, the number of buttons and the proof to show. With nothing to go on, it fills each gap with a common choice. To stop that, make those choices yourself in a file the agent loads every session, and name the defaults you keep seeing.
We tested this on 5 November 2026 by giving Claude Code the same request with and without such a file.
The test: one request, with and without a design file
On 5 November 2026, we ran Claude Code 2.1.309 four times with the request below, using claude -p with no tools, so the reply was the page itself. Two runs started in an empty folder. Two started in a folder holding a CLAUDE.md whose only line imports DESIGN.md, the file shown further down. Both versions used --setting-sources project,local, so no personal instructions from the machine's user settings reached either one. The folder was the only difference.
The request is for Wrenboard, a fictional scheduling tool for small dental clinics. A script then counted patterns in each page's HTML: colours, gradients, buttons, fonts, percentages, prices and quoted testimonials.
Create index.html: a one-page landing page for Wrenboard, a scheduling tool for small dental clinics that sends appointment reminders and fills cancellations from a waiting list. Use a single HTML file with one style element. Reply with only the complete HTML, no explanation.What changed with the design file
Neither version produced the purple gradient and Inter font that people often associate with AI-generated pages. The sameness showed up elsewhere. Both pages made without a design file opened with “Fewer empty chairs.”, both chose Iowan Old Style for headings, and they used 15 and 20 colours. Their buttons asked for different things: one page had seven buttons with five different labels, from Start free trial to Book a 15-minute demo.
One of those pages also invented evidence for a product that has none: “38% fewer no-shows”, “7 in 10” same-day cancellations refilled, about five hours a week of calls saved, a quote from an office manager at a named clinic, and prices of $79 and $149 a month. Nothing in the request supplied those facts.
Both pages made with the design file used exactly the six specified colours, the two specified fonts, one button labelled Book a demo and a numbered list for the setup steps, and contained no statistics, prices or testimonials. Four runs of one request on one model show what can happen, not how often it happens. The counts are pattern matches in the source, not a judgement of design quality.
| Measure | No design file, run 1 | No design file, run 2 | With DESIGN.md, run 1 | With DESIGN.md, run 2 |
|---|---|---|---|---|
| Headline | Fewer empty chairs. Fewer phone calls. | Fewer empty chairs. Less time on the phone. | Keep tomorrow’s chairs full. | Keep tomorrow’s diary full, even when patients cancel. |
| Heading typeface | Iowan Old Style | Iowan Old Style | Source Serif 4 | Source Serif 4 |
| Distinct colour values | 15 | 20 | 6 | 6 |
| Gradients | 0 | 1 | 0 | 0 |
| Buttons (different labels) | 7 (5) | 4 (3) | 1 (1) | 1 (1) |
| Invented statistics, prices or quotes | 38%, 7 in 10, 5 hours a week, $79, $149, one quote | None found | None found | None found |
Copy the design file
Save this as DESIGN.md and add a CLAUDE.md containing the single line @DESIGN.md, so Claude Code loads it in every session. Each section answers a question the agent would otherwise answer for you: which six colours, which two fonts, what the hero shows, how many buttons, and what proof exists.
The line saying the product has no logos, testimonials, ratings or statistics is the one that removed the invented proof. For a real product, replace it with the evidence you can publish, such as a named customer who agreed to be quoted.
# Wrenboard design rules
Wrenboard is a fictional scheduling tool for small dental clinics. It sends appointment reminders and offers cancelled slots to patients on a waiting list. The reader is a practice manager deciding whether to book a demo.
## Colour
Use only these values, as CSS variables:
- --page: #f7f4ee (warm off-white background)
- --ink: #1d2a26 (text)
- --muted: #55635e (secondary text)
- --brand: #0f5b4f (deep green: the primary button and links)
- --brand-ink: #ffffff (text on the primary button)
- --line: #d9d3c7 (borders and dividers)
No gradients. No purple, violet, indigo or pink. No shadows larger than 0 1px 2px.
## Type
- Headings: "Source Serif 4", Georgia, serif. Weight 600.
- Body: system-ui, -apple-system, "Segoe UI", sans-serif. 18px, line height 1.6.
- Do not use Inter.
## Layout
- The hero is left-aligned. Headline and one sentence on the left, a product picture on the right: a list of tomorrow's appointments with one slot marked "Filled from waiting list".
- One primary action on the page, labelled Book a demo. No second button in the hero.
- Below the hero, explain the three steps a practice manager actually takes (connect the diary, set reminder times, approve the waiting list) as a numbered list with one sentence each. Do not use icon cards.
- No customer logos, testimonials, ratings or statistics. The product is fictional and has none.
- No emoji. No glassmorphism, blur or glow.Write bans from your own output
Lists of AI design clichés go out of date as models change. In this test the model avoided the purple gradient on its own and invented a customer quote instead. Run your request once without rules, list what you would not ship, and turn each item into a rule that names the thing: “One primary action, labelled Book a demo” rather than “keep the hero focused”.
If you want a longer starting list, Impeccable packages design anti-patterns as commands for Claude Code and Codex. Check its suggestions against your own pages before adopting them.
Then look at the rendered page
The counts above come from the HTML source. A page can use the right six colours and still crowd its text at phone width. Open it at 390 and 1280 pixels wide, and when something is wrong, ask for one repair that names the section and the width.
iter0, which publishes this guide, builds a website from a written brief and lets you edit it in place. The same rule applies there: the more of the page you decide in the brief, the less the model decides for you.
Put the brief into practice
A launch page should make the buyer, promise, proof, and next action obvious. iter0 uses this same standard when it turns a brief or reference site into a builder-ready page.
Start your launch build