Guides

How to Make Claude Code UI Look Good (Fix-It Guide)

Jason Zhou8 min read
how to make claude code ui look goodclaude code ui uglyclaude code design badmake claude code app look betterclaude code ui design

Quick answer

To make Claude Code UI look good, prompt it like an art director, not an engineer: hand it a real visual reference before it writes code, lock your fonts, colors, and spacing into a CLAUDE.md so it stops drifting, name the defaults you forbid (no purple gradient, no centered hero, no three-card row), and run a screenshot loop because Claude cannot see what it built. Almost every 'ugly Claude Code UI' complaint traces to one of four gaps: no eyes, no design memory, no feedback loop, and safe defaults. The fix is the prompt, not the model.

Try it now, freeGenerate UI from a prompt on SuperdesignOpen the tool →

To make your Claude Code UI look good, stop prompting it like an engineer and start prompting it like an art director: give it a real visual reference before it writes a line, lock your fonts, colors, and spacing into a file so it stops re-guessing, and run a screenshot loop because Claude cannot see what it built. Most "Claude Code UI is ugly" complaints trace to one of four fixable gaps, and the fix is almost always the prompt, not the model. This is the tactical, copy-this-prompt version. For the full strategy and the skill setup, read the pillar: how to design good UI with Claude Code.

Give Claude Code something good to copyPull a reference from a free prompt library, explore polished directions on a canvas, and hand real React and Tailwind back to your agent. Free tier, flat $20/mo.Start designing →

Why your Claude Code UI looks ugly

It looks ugly for four specific reasons, and none of them is "Claude is bad at code." Claude writes clean, accessible, responsive CSS. It just designs blind. When you hand it a vague request, it returns the statistical center of its training data, and that center has a face: Inter font, a purple-to-indigo gradient, a centered hero, three rounded cards. That is the same root cause behind every generic AI page, which we unpack in why AI design looks generic.

The four gaps, plainly:

  • No eyes. Claude renders nothing. It writes CSS it has never looked at, so a layout that is technically correct can still look broken.
  • No design memory. Each session starts cold. The nice version it made yesterday is gone, so every screen drifts to a slightly different average.
  • No feedback loop. Without a screenshot going back in, it never sees the gap between "valid code" and "looks right."
  • Safe defaults. Given no direction, it picks the highest-probability everything: the safest font, the safest gradient, the safest grid.

Fix those four and the output changes hard. Here is the sequence, then each fix as an actual prompt.

Make Claude Code UI look good

1

Give it a reference before it codes

Hand Claude a real visual (a screenshot, a live site, a prompt-library pattern) instead of an adjective like "modern." It copies structure it can see.

2

Lock a design system so it stops drifting

Put your fonts, colors, and 8px spacing in a CLAUDE.md so every screen inherits the same rules instead of re-guessing them.

3

Prompt with constraints that beat the defaults

Forbid the slop out loud (no purple gradient, no centered hero, no three-card row) and name the density and states you want.

4

Iterate from a screenshot before you ship

Claude cannot see its own output, so feed it the render and ask for a concrete diff. Repeat until it matches the reference.

Give it a reference before it codes

The single biggest upgrade is handing Claude a concrete visual to build against instead of an adjective. "Make it look modern" is an instruction to return the average again, because modern has no shape. A reference does. Claude's vision is genuinely good at reading a screenshot and reproducing its structure, spacing, and type pairings.

Watch the difference:

prompt
# Before (gets you slop)
Build a pricing page for my SaaS.

# After (gets you a real design)
Build a pricing page. Match the structure and visual tone of this
reference: [paste a screenshot or a prompt-library pattern].
Three tiers, the middle one featured. Keep the type scale and the
generous whitespace from the reference, not a tight default grid.

Where do you get a good reference? Pull a proven pattern from the free Superdesign prompt library, capture a live site you admire (see how to clone a website's design), or generate a polished direction on a design canvas and hand it over. The point is the same: give it taste to copy, do not ask it to invent taste from text.

Superdesign doing exactly this, live on the canvas.Generate UI from a prompt, free →

Lock a design system so it stops drifting

Put your design decisions in a file Claude reads every session, so it stops re-rolling them. This is what kills the "every screen looks slightly different" problem. The pillar has a full copyable CLAUDE.md block; the short version is to make the rules operational, not aspirational.

prompt
# Before
Use a nice font and good colors.

# After (drop this in CLAUDE.md)
Typography: never Inter, Roboto, or system fonts. Display: Fraunces.
Body: a clean grotesque. Use weight extremes (200 vs 800).
Color: one dominant color plus one sharp accent, all in CSS variables.
Forbidden: purple-to-blue gradients, three-rounded-card heroes.
Spacing: 8px rhythm. Hierarchy from type and space, not borders.

"Nice font and good colors" means nothing to a model. "Fraunces display, 8px rhythm, one accent, no purple" is something it executes the same way every time. The full block, plus wiring shadcn/ui in through MCP so Claude uses current component signatures, is in the pillar guide.

Prompt patterns that beat the generic look

Most ugly output comes from prompts that describe the feature but never the design. Engineers prompt for behavior ("a settings page with tabs") and leave every visual decision to the default. Name the decisions and the average never gets a chance.

Three rewrites that do most of the work:

  • Trade adjectives for constraints. "Clean and modern" returns the average. "Two fonts max, one accent color, generous line height, no card shadows" returns a decision.
  • Forbid the defaults out loud. Add "no purple gradient, no centered hero, no three-icon-card row" to the prompt. Naming the slop is the fastest way to dodge it.
  • Ask for the boring states. "Include the loading, empty, and error states, and show the mobile layout" is where real product UI lives, and it is exactly what a "be distinctive" instinct skips.

A full before/after on a dashboard request:

prompt
# Before
Make a dashboard for my analytics app.

# After
Build the analytics dashboard. Reference tone: [paste reference].
Constraints: one accent color, 8px spacing, dense data tables (32px
rows), numbers in a mono font. No hero, no gradient, no decorative
cards. Include empty, loading, and error states. Show me the mobile
reflow. Then screenshot the result so we can compare it to the
reference before we call it done.

That last line matters more than it looks.

Iterate visually before you ship

Render it, screenshot it, paste the image back, and give specific feedback. Repeat. This is the loop that closes the "no eyes" gap, and it is the highest-leverage habit on this whole list because it costs nothing. Claude writes correct CSS but cannot judge its own output, and the same agent that wrote the code is the worst reviewer of it.

The trick is replacing description with the actual render. "Make it better" gets you the average again. "Here is the screenshot: the card padding is inconsistent and the heading is too small next to the body" is something Claude fixes precisely. Usually three rounds, under ten minutes, and round two pulls back round one's overcorrection. The first render almost always looks fine; the cracks (janky mobile breakpoints, overflowing text, a missing empty state) only show under a real screenshot. The pillar covers the full screenshot loop in depth.

Let a design agent carry the taste

If you want the reference, the persistent system, and the feedback loop handled in one step instead of by hand, that is the gap Superdesign fills. It runs as a skill inside Claude Code (or Cursor), so the design step lives where you already work:

npm install -g @superdesign/cli@latest
superdesign login
npx skills add superdesigndev/superdesign-skill

Trigger it with /superdesign and a plain-English request. It reads your project first and writes a design-system file plus replicas of your real pages, opens a canvas to explore several polished directions at once, and hands the chosen one back as real React and Tailwind. That covers the four gaps directly: a reference and taste come from a curated prompt library and parallel exploration, the design-system file gives Claude the memory it lacks, and the canvas lets you compare before you commit. Free tier, flat $20/month, no metered credits.

The takeaway: Claude Code is your engineer, not your art director. Give it a reference, a locked system, forbidden defaults, and a screenshot loop, and the ugly generic look goes away. For the broader setup and the skill-vs-system-vs-tool breakdown, the Claude Code UI design pillar is the next read.

Key takeaways

  • Ugly Claude Code UI traces to four gaps: no eyes (it renders nothing), no design memory (every session starts cold), no feedback loop, and safe defaults (the highest-probability font, gradient, and grid).
  • The biggest single upgrade is handing Claude a real visual reference before it codes, from a prompt library, a captured site, or a design agent, instead of asking it to invent taste from an adjective like 'modern'.
  • Lock decisions in a CLAUDE.md and keep them operational: 'Fraunces display, 8px rhythm, one accent, no purple' executes the same way every time; 'nice font and good colors' means nothing to a model.
  • Name the slop to dodge it (no purple gradient, no centered hero, no three-card row) and always run a screenshot loop, since the same agent that wrote the code is the worst judge of how it looks.

Frequently asked questions

Why does Claude Code UI look ugly or generic?

Because with a vague prompt Claude returns the statistical center of its training data: Inter font, a purple-to-indigo gradient, a centered hero, three rounded cards. It writes clean code but designs blind, so it picks the safest font, gradient, and grid by default. Give it a deliberate direction and a reference and the look changes hard.

How do I make my Claude Code app look better?

Fix four gaps. Give it a real visual reference to build against instead of an adjective, lock your fonts, colors, and 8px spacing into a CLAUDE.md so every screen matches, forbid the defaults out loud (no purple gradient, no centered hero), and run a screenshot-compare-refine loop because Claude cannot judge its own rendered output.

What is a good prompt to make Claude Code UI look good?

Trade adjectives for constraints. Instead of 'build a clean modern dashboard', say: 'Match the tone of this reference [paste it], one accent color, 8px spacing, 32px dense table rows, numbers in mono, no hero, no gradient, include empty/loading/error states, show the mobile reflow, then screenshot it so we can compare before calling it done.'

Why does Claude Code UI still look generic after I install the frontend-design skill?

Because a skill is aesthetic guidance, not a visual source of truth. It bans the worst fonts and forces a direction, but it does not know what this product should look like, so Claude fills the gaps with familiar archetypes. The missing piece is a concrete reference plus a persistent design system, covered in the Claude Code UI design pillar.

Explore 5,000+ design prompts

The most-used styles from the Superdesign design prompt library.

Browse all →

Keep reading