Why AI tools generate ugly color palettes

March 2026 · 5 min read

Every AI coding tool has the same problem. Ask it to build a landing page and you get Tailwind blue buttons on a white background with gray text. Ask for a dashboard and you get slate-700 sidebars with indigo accents. Ask for a card and you get a shadow on white with text-gray-900.

It all looks the same. Because it is all the same.

AI tools don't generate ugly colors because they're bad at design. They generate ugly colors because they have no idea what your design looks like.

Training data bias

Large language models learn from millions of code repositories. Most of those repos use default framework colors. Tailwind's default palette shows up constantly. Bootstrap's blue primary is everywhere. Material Design's indigo is in thousands of projects.

When you ask an AI to "make a button," it reaches for the most statistically common button color in its training data. That color is blue. Not your blue. Generic, default, seen-it-a-thousand-times blue.

The AI isn't making a design decision. It's making a statistical prediction. And the most probable prediction is always the most generic one.

No project context

When a human designer builds a component, they look at the existing design system. They check the brand guidelines. They reference the Figma tokens. They know the palette.

AI tools don't do any of that. They start from zero every conversation. No knowledge of your brand. No access to your design tokens. No understanding of what colors you've already chosen.

You're asking a tool to make color decisions without giving it any color information. Of course the result looks generic.

No understanding of roles

Even when you give an AI hex codes, it doesn't know what they're for. You paste #FC6911 into a prompt and the AI uses it. But where? As a background? As text? As a border? It has to guess.

Colors have roles. A background color is not an accent color. An ink color is not a hover state. The relationship between colors matters as much as the colors themselves. Without role information, the AI treats every hex code as interchangeable. It's not.

This is why you end up with your accent color as body text (unreadable) or your background color on a button (invisible). The AI doesn't understand intent. It only knows values.

The difference is structure

The fix isn't better prompting. You can write the most detailed prompt in the world — "use warm earth tones with high contrast and an energetic accent" — and the AI will still interpret that however it wants. Vague instructions produce vague results.

The fix is structured data. Give the AI exactly what a human designer would have:

  • Named roles: background, ink, accent, support, neutral
  • Exact values: hex codes and RGB for each role
  • Contrast ratios: which pairs meet WCAG AA, which meet AAA
  • Usage rules: what combinations to use, what to avoid
  • Ready-to-use tokens: CSS variables and Tailwind config

This isn't a suggestion. It's a specification. The AI stops guessing and starts following instructions.

"Make it blue" vs. a design system

Compare two approaches to the same task: "Build me a pricing card."

Without color context: The AI generates a card with bg-white, text-gray-900, a bg-blue-600 button, and text-gray-500 for secondary text. Looks like every SaaS template on the internet. Functional. Forgettable.

With a structured palette: The AI generates a card using var(--color-bg) for the surface, var(--color-text) for headings, var(--color-accent) for the button, and var(--color-support) for secondary text. It checks contrast ratios before placing text on colored backgrounds. It follows your rule about never using accent as body text.

Same prompt. Same AI. Completely different output. The variable is context.

How to fix it

The solution is a COLORS.md file in your project root. A plain markdown file that describes your palette with roles, values, contrast data, and rules. Every major AI coding tool — Claude Code, Cursor, Windsurf, Copilot — reads project files for context. Drop the file in your repo and the AI picks it up automatically.

You could write this by hand. But computing contrast ratios, formatting CSS variables, and writing Tailwind tokens is exactly the kind of tedious work you shouldn't be doing manually. Paletter generates a complete COLORS.md from any palette in one click.

The ugly color problem is a context problem. Give your AI the right context and the problem disappears.

Fix your AI's color problem

Generate a structured palette with roles, contrast ratios, and ready-to-use tokens. One file. Every AI tool.

Fix your AI's color problem