<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: otterdev</title>
    <description>The latest articles on DEV Community by otterdev (@otterdev3).</description>
    <link>https://dev.to/otterdev3</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4235925%2F4a499c24-d63e-4703-98e0-a0f16a802768.png</url>
      <title>DEV Community: otterdev</title>
      <link>https://dev.to/otterdev3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/otterdev3"/>
    <language>en</language>
    <item>
      <title>Why AI-built UIs all look the same, and the 4-step fix we use with Codex and Claude Code</title>
      <dc:creator>otterdev</dc:creator>
      <pubDate>Tue, 10 Nov 2026 11:53:24 +0000</pubDate>
      <link>https://dev.to/otterdev3/why-ai-built-uis-all-look-the-same-and-the-4-step-fix-we-use-with-codex-and-claude-code-4afb</link>
      <guid>https://dev.to/otterdev3/why-ai-built-uis-all-look-the-same-and-the-4-step-fix-we-use-with-codex-and-claude-code-4afb</guid>
      <description>&lt;p&gt;Ask Codex or Claude Code for a landing page and you can usually tell, from across the room, that an agent made it. Violet-to-indigo gradient behind the hero. A headline with gradient text. Frosted-glass cards with a soft purple glow. A row of emoji as feature icons. "Seamless", "supercharge", "unlock". Inter everywhere.&lt;/p&gt;

&lt;p&gt;None of these are wrong on their own. The problem is that every model reaches for the same safe defaults, so the result looks like every other generated page. People have started calling it AI slop.&lt;/p&gt;

&lt;p&gt;We build a design tool for Codex, so we have been fighting this on our own screens. Here is what worked, what did not, and the small open-source skill that came out of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did not work: longer rule lists
&lt;/h2&gt;

&lt;p&gt;The first thing everyone tries is a prompt or skill full of rules: "no purple gradients, no glassmorphism, no emoji icons, use a 4px grid". It helps a little. Then two things happen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The agent swaps one default for another.&lt;/strong&gt; Ban violet and you get beige, a serif headline and a terracotta button. That combination is now so common it has become its own tell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The next screen drifts.&lt;/strong&gt; Even when one page comes out well, nothing records why. Open a new session, ask for the settings screen, and you are back to the defaults.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rules tell the agent what not to do. They never tell it what &lt;em&gt;your&lt;/em&gt; product should look like.&lt;/p&gt;

&lt;h2&gt;
  
  
  What worked: make the choice, then write it down
&lt;/h2&gt;

&lt;p&gt;What fixed it was copying what a designer does on day one. Four steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. See three real directions before restyling anything
&lt;/h3&gt;

&lt;p&gt;Instead of letting the agent pick a style, have it build &lt;strong&gt;the same key screen three times&lt;/strong&gt;, with your real content, in three directions that differ on purpose: say, one light and editorial, one dark and dense, one soft and friendly. Put them side by side and choose. Or mix: "A's type with C's colors".&lt;/p&gt;

&lt;p&gt;This is the step that matters most. Choosing from rendered options is far easier than describing a style in words, and it forces a decision that a rule list never does.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg2qnsg5nf2xe9nr4m225.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg2qnsg5nf2xe9nr4m225.webp" alt="Three directions for the same hero: Paper, Ledger and Pop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Save the choice as DESIGN.md
&lt;/h3&gt;

&lt;p&gt;Write the chosen direction into a &lt;code&gt;DESIGN.md&lt;/code&gt; file at the root of the repo: colors as named tokens with hex values, two font families and a type scale, a spacing unit, radius, shadows, and short rules for buttons, inputs, cards and navigation.&lt;/p&gt;

&lt;p&gt;Every agent can read Markdown. Once the file exists, a new session starts from your design instead of from the model's defaults, and you can point any tool at it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Apply it in passes, not all at once
&lt;/h3&gt;

&lt;p&gt;Asking for "make it look like DESIGN.md" in one go tends to produce a half-restyled page. Passes work better, in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tokens:&lt;/strong&gt; replace hard-coded colors, sizes and radii.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type:&lt;/strong&gt; two families at most, the system's scale, one clearly largest line per screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spacing and layout:&lt;/strong&gt; one spacing unit and its multiples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Color:&lt;/strong&gt; neutrals carry the screen; the primary color shows up where the user acts, about once per view.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Components:&lt;/strong&gt; real icons (Lucide, Phosphor, SF Symbols), never emoji as icons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy:&lt;/strong&gt; plain words from the product. Cut "seamless" and "supercharge".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Details:&lt;/strong&gt; hover, focus, empty, loading and error states; 4.5:1 contrast for text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Motion:&lt;/strong&gt; only where it explains a change.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4. Check for the tells with a script
&lt;/h3&gt;

&lt;p&gt;Eyes get used to a screen quickly, so we wrote a small checker that scans HTML, CSS, JSX, TSX, Vue, Svelte and Astro files for the usual tells. On our deliberately generic example page it prints (excerpt):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERROR tally.html:11  [violet-gradient] Purple, violet or indigo gradient. Use a flat color from the design system.
WARN  tally.html:14  [glassmorphism] Backdrop blur. Use solid surfaces unless this is an overlay that really floats.
ERROR tally.html:21  [gradient-text] Gradient text. Use one solid color and let size carry emphasis.
ERROR tally.html:36  [emoji-icon] Emoji used in the UI. Use a real icon set, or no icon.
WARN  tally.html:42  [filler-copy] Filler marketing word. Say what the product does.
WARN  tally.html     [arbitrary-spacing] Spacing values off a 4px grid: 6, 10, 11, 13, 14, 22, 26, 34px.

1 files checked: 12 errors, 12 warnings.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The three directions built from the same content report none. A clean run does not mean a screen is good; it means the obvious tells are gone and you can judge the design itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The skill: pretty-ui
&lt;/h2&gt;

&lt;p&gt;We packaged the four steps as an open-source agent skill called &lt;strong&gt;pretty-ui&lt;/strong&gt;. It runs the whole loop: reads your project, audits what is there, builds three directions with your content, opens a comparison page, saves your pick as &lt;code&gt;DESIGN.md&lt;/code&gt;, applies it pass by pass, and runs the checker before and after. Nothing is restyled until you choose.&lt;/p&gt;

&lt;p&gt;It works with Codex, Claude Code, Hermes Agent, or any agent that reads &lt;code&gt;SKILL.md&lt;/code&gt;, for websites, web apps and mobile apps (React, Next.js, Vue, Svelte, Tailwind, shadcn/ui, React Native, SwiftUI, Flutter and more). It ships with 24 design systems, each with a contrast-checked palette and a font pairing that is not Inter.&lt;/p&gt;

&lt;p&gt;Install for Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex plugin marketplace add ummydev/pretty-ui
codex plugin add pretty-ui@pretty-ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add ummydev/pretty-ui
/plugin install pretty-ui@pretty-ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or any agent: &lt;code&gt;npx skills add ummydev/pretty-ui&lt;/code&gt;. Then ask in plain words: "Make this landing page look less AI-generated."&lt;/p&gt;

&lt;p&gt;The checker also runs on its own, with Node 18+ and no dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node skills/pretty-ui/scripts/check.mjs src/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/ummydev/pretty-ui" rel="noopener noreferrer"&gt;github.com/ummydev/pretty-ui&lt;/a&gt; (MIT).&lt;/p&gt;

&lt;h2&gt;
  
  
  If you do not want another skill
&lt;/h2&gt;

&lt;p&gt;The approach works without it. The short version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before any restyle, ask your agent for three different directions of one screen as separate HTML files, and pick one yourself.&lt;/li&gt;
&lt;li&gt;Save the pick as &lt;code&gt;DESIGN.md&lt;/code&gt; and tell the agent to read it first in every session.&lt;/li&gt;
&lt;li&gt;Restyle in passes: tokens, type, spacing, color, components, copy, states.&lt;/li&gt;
&lt;li&gt;Search your code for &lt;code&gt;backdrop-filter&lt;/code&gt;, &lt;code&gt;background-clip: text&lt;/code&gt;, gradients with violet or indigo, and emoji inside buttons and headings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We keep a longer list of the tells, with a prompt to fix each one, here: &lt;a href="https://codexdesign.io/guides/ai-ui-design-tells" rel="noopener noreferrer"&gt;AI UI design tells and how to avoid them&lt;/a&gt;. The 24 design systems are browsable with live previews at &lt;a href="https://codexdesign.io/design-systems" rel="noopener noreferrer"&gt;codexdesign.io/design-systems&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: we build Codex Design, a canvas for designing UI with Codex, and wrote pretty-ui along the way. The skill is free and does not need our product.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What tells do you see most in AI-generated UI? We are collecting them for the next version of the checker.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>design</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
