Por que todo site gerado por IA parece igual

Você já viu este site. Fundo cinza-ardósia, Inter, um título com gradiente em duas palavras, três cards de funcionalidades com cantos arredondados e um ícone pequeno no canto superior esquerdo. Não é que o modelo tenha mau gosto. É que ninguém deu a ele um gosto próprio, então ele recorreu aos padrões — e esses padrões são compartilhados por todas as ferramentas que geram UI.

Atualizado 2026-07-27

A mesmice é herdada, não inventada

É tentador descrever isso como um problema de gosto — o modelo viu um bilhão de landing pages e regride para a média. Isso faz parte, mas não é o mecanismo, e leva as pessoas à solução errada (prompts melhores). O mecanismo é mais tedioso e muito mais acionável: um agente de código solicitado a construir uma UI recorre a uma biblioteca de componentes, e essa biblioteca entrega padrões. Esses padrões foram projetados para serem inofensivos, que é exatamente o que os torna universais.

Peça a cinco ferramentas diferentes — Claude Code, Cursor, v0, Lovable, Bolt — um dashboard, sem nenhuma outra instrução. Você receberá cinco layouts e uma única identidade visual. Elas não estão copiando umas às outras. Cada uma está, independentemente, fazendo a coisa sensata com o mesmo material de partida.

Os quatro sinais e de onde cada um vem

1. A rampa neutra

O tema padrão do shadcn/ui é construído sobre a escala zinc do Tailwind, com slate e gray como substituições comuns. É um cinza frio, levemente azulado. Uma vez que você nota, não consegue parar de notar: é o fundo da maioria dos produtos feitos por IA lançados nos últimos dois anos. É um neutro genuinamente bom, e esse é o problema — é bom o suficiente para que ninguém o substitua.

A entrega não é o cinza em si, mas sua *uniformidade*. Uma interface projetada geralmente inclina seus neutros levemente para a cor da marca, para que os cinzas pareçam relacionados ao destaque. Uma interface padrão tem uma rampa pura ao lado de um destaque não relacionado, e os dois nunca parecem pertencer um ao outro.

2. Inter, ou algo indistinguível dela

A Inter é uma tipografia de UI excelente, e é por isso que está em todo lugar e por que agora parece um padrão, e não uma decisão. Onde não é literalmente Inter, é a stack de sistema font-sans, que resulta em uma grotesque quase idêntica na maioria das máquinas. De qualquer forma, a página tem uma única família fazendo todo o trabalho: títulos, corpo, labels, números.

O fato de haver apenas uma família é o sinal real, mais do que qual família seja. Um design system quase sempre faz pares — uma fonte de display com personalidade para títulos contra uma fonte de trabalho para o corpo, ou, no mínimo, um contraste deliberado de peso e largura dentro de uma mesma superfamília. Páginas de família única parecem planas, mesmo quando todas as outras decisões são sólidas.

3. `0.5rem` em tudo

O --radius padrão do shadcn é 0.5rem, e ele se propaga para botões, inputs, cards, dialogs e popovers da mesma forma. Raio uniforme em todos os tamanhos de elemento não é como design systems se comportam: um botão de 44px e um card de 400px com o mesmo raio de canto fazem o card parecer suave demais e o botão parecer uma 'bolha', porque o raio é percebido em relação ao elemento em que está.

:root {
  /* The line most AI-built projects never touch */
  --radius: 0.5rem;
}
A única declaração por trás de uma quantidade surpreendente de mesmice.

4. O grid de três cards

Hero, depois três cards iguais, depois uma faixa de depoimentos, depois um CTA. Este é genuinamente fruto da gravidade dos dados de treinamento, e não de um padrão de configuração — é a estrutura de página de marketing mais comum na web, então é a forma que um modelo produz quando o briefing não sugere outra. Não está errado. É simplesmente o layout que não transmite nenhuma informação sobre o seu produto.

Preview unavailable here. Browse complete kits in the kit gallery.

Por que prompts melhores param de funcionar

A resposta comum é escrever um prompt mais longo: *use uma paleta quente, combine uma display serif com um corpo grotesque, varie o raio.* Isso funciona. Funciona para uma tela, e geralmente funciona para a segunda e a terceira.

Então a qualidade cai, e cai de uma forma específica. O agente não está ignorando sua instrução — ele está mantendo uma conversa cada vez mais longa na qual seu parágrafo de estilização está competindo com tudo o que veio depois. Na quinta tela, ele lembra do *quente* e perdeu os valores hex, então ele aproxima. A aproximação é um quente ligeiramente diferente. A sexta tela aproxima a aproximação.

O desvio não é o agente esquecendo sua instrução. É o agente lembrando dela aproximadamente, seis vezes seguidas.

Quem está no meio desse processo chama isso de *design drift*, e é a razão pela qual um app feito via 'vibe' que parecia nítido na sexta-feira parece ter sido montado por um comitê na segunda. A instrução vivia na conversa, e conversas se degradam.

O teste que separa os dois modos de falha: abra a tela um e a tela oito lado a lado. Se elas divergem no espaçamento e na cor, mas cada uma é internamente consistente, isso é drift. Se ambas são internamente inconsistentes, o sistema nunca foi especificado.

A solução é um arquivo que o agente relê, não um parágrafo que ele lembra

Um design system interrompe o drift pela mesma razão que o interrompe em equipes humanas: os valores vivem em algum lugar durável e são consultados, em vez de serem carregados na cabeça de alguém. Para um agente de código, esse lugar é um DESIGN.md mais um conjunto de tokens no repo. Ambos são relidos no início de cada sessão, então a tela vinte resolve o mesmo --primary que a tela um — e não um similar.

No promptEm tokens + DESIGN.md
Sobrevive a uma nova sessãoNão — o contexto é resetadoSim — é relido do repositório
Precisão após 10 telasAproximado ('meio quente')Hex exato, sempre
Revisável via PRNãoSim — é um arquivo que gera diff
Funciona entre ferramentasReescrever para cada ferramentaMesmo arquivo para Claude Code, Cursor, v0
A mesma instrução, aplicada de duas formas diferentes.

Este é todo o argumento para dar a um agente um sistema real em vez de apenas uma descrição melhor de um. A camada de tokens semânticos importa mais do que a paleta: --primary e --muted-foreground sobrevivem a um redesign, enquanto blue-600 espalhado pelo markup não.

Token specimen · real values

Terrain Vivant

Live render

Terrain Vivant's actual tokens — the same values its exports use.

Color tokensSemantic roles with HEX / HSL / CMYK

Color tokens

Terrain Vivant

light · HEX · HSL · CMYK

Core

#229F39

background

H 131 · C79, 0, 64, 38

#001500

foreground

H 120 · C100, 0, 100, 92

#2B3386

card

H 235 · C68, 62, 0, 47

#17882A

muted

H 130 · C83, 0, 69, 47

#0C7023

border

H 134 · C89, 0, 69, 56

Brand

#2B3386

primary

H 235 · C68, 62, 0, 47

#FFFFFF

primary-fg

H 0 · C0, 0, 0, 0

#1A4A8C

secondary

H 215 · C81, 47, 0, 45

#095DAC

accent

H 209 · C95, 46, 0, 33

#2B3386

ring

H 235 · C68, 62, 0, 47

Semantic

#B91C1C

destructive

H 0 · C0, 85, 85, 27

#FFFFFF

destructive-fg

H 0 · C0, 0, 0, 0

#004D10

success

H 132 · C100, 0, 79, 70

#92400E

warning

H 23 · C0, 56, 90, 43

#000000

muted-fg

H 0 · C0, 0, 0, 100

Charts

#2B3386

chart-1

H 235 · C68, 62, 0, 47

#095DAC

chart-2

H 209 · C95, 46, 0, 33

#0C549C

chart-3

H 210 · C92, 46, 0, 39

#001500

chart-4

H 120 · C100, 0, 100, 92

#3C438A

chart-5

H 235 · C57, 51, 0, 46

Type scaleHeading, body, and mono in the kit's fonts

Typography

Terrain Vivant

Scale: perfect-fourth

Density: balanced

Heading · Space Mono · 3rem

Sample headline

Subheading · Space Mono · 2.25rem

A bold two-color institutional editorial system built on vivid green and cobalt blue full-screen surfaces, with monospace type throughout and zero-radius geometry.

Body · Space Mono · 1rem

A resolutely flat two-color surface system. Vivid grass-green (#229f39) and deep cobalt-blue (#2b3386) are sovereign peers: either can fill an entire screen or section, with no neutral intermediary. All text is set in Space Mono at every scale from hero display down to captions, making the monospace grid the primary typographic voice rather than a code aesthetic. All shapes are sharp 90-degree rectangles, and section breaks use stacked parallel horizontal lines as a graphic band.

Mono · Space Mono · 0.75rem

npx shadcn add terrainvivant.json

Aa

Space Mono · Heading

400700

Aa

Space Mono · Body

400700

ABCDEFGHIJKLM NOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789 & @ # % →

Um conjunto completo de tokens: neutros tendenciosos para a cor de destaque e duas famílias desempenhando funções diferentes.

As pessoas que documentam isso realmente conseguem escapar dos padrões?

Na maioria das vezes, não, e essa é a descoberta mais desconfortável. Analisamos 299 arquivos DESIGN.md públicos no GitHub — o arquivo cuja única função é evitar isso — e medimos o que havia neles.

Dos 72 que descrevem um design system visual, 21% especificam uma escala de radius e 26% especificam elevação. Esses são dois dos quatro sinais mencionados acima, deixados nos padrões por três quartos das pessoas que se dedicaram especificamente a escrever um contrato de design. 69% omitem completamente o dark mode, deixando todo o segundo tema para o agente inventar. E 86% nomeiam cores por matiz ou listam hexes puros em vez de usar papéis semânticos, o que significa que o arquivo não pode ser aplicado a nenhum componente que não tenha sido explicitamente descrito.

Os padrões sobrevivem à tentativa de substituí-los

A tipografia é abordada em 83% dos arquivos e a cor em 67%, porque essas são as duas coisas que as pessoas associam a 'design'. Radius, elevação e dark mode são os que permanecem silenciosamente genéricos. Os quatro sinais persistem não porque ninguém tentou, mas porque a maioria das tentativas cobre apenas a metade visível.

Existe uma versão de segunda ordem do mesmo problema: 54% dos arquivos contêm pelo menos um adjetivo vago substituindo um valor, liderados por *clean* (39%) e *modern* (36%). Um adjetivo não substitui um padrão. Ele pede para o agente escolher um.

Uma auditoria de cinco minutos

  1. 1

    Amostre o background

    Pegue o hex do background da sua página. Se for #09090b, #18181b, #0f172a ou #020617, você está usando uma rampa de zinc ou slate intocada.

  2. 2

    Conte as famílias tipográficas

    Abra os estilos computados de um H1 e de um parágrafo de corpo. A mesma font-family em ambos significa que uma única família está fazendo todo o trabalho.

  3. 3

    Compare dois radii

    Meça o radius do canto de um botão e do seu maior card. Valores idênticos significam que ninguém escalou o radius de acordo com o tamanho do elemento.

  4. 4

    Compare sua primeira e última tela

    Coloque a primeira tela que você criou ao lado da mais recente. Liste cada valor que diverge — essa lista é o seu drift.

  5. 5

    Decida onde a resposta reside

    Para cada divergência, pergunte se o valor correto existe em algum lugar durável. Se a resposta honesta for 'no prompt que escrevi em março', isso é o que precisa ser corrigido.

Pule completamente os quatro padrões

Cada kit do Identity Forge vem com um conjunto completo de tokens — neutros ajustados ao destaque, um pairing de fontes real, radius escalado por elemento — além do DESIGN.md que seu agente lê antes de escrever o markup. Kits gratuitos não exigem conta.

Isso é um problema do modelo ou das ferramentas ao redor dele?

Principalmente das ferramentas. O mesmo modelo produz UIs distintas quando recebe um conjunto de tokens e um brief, e UIs genéricas quando não recebe nenhum dos dois. O que varia é o material de partida, não a capacidade.

Mudar a cor de destaque resolve o problema?

Não, e esse é o desperdício de tarde mais comum. Trocar a cor de destaque mantendo os neutros padrão, a família tipográfica única e o raio uniforme produz a mesma página em um tom diferente. A tipografia e a estrutura carregam mais da identidade do que a cor de destaque.

Posso apenas dizer ao agente para evitar Inter e zinc?

Para uma única sessão, sim. A instrução reside no contexto, portanto, ela se degrada conforme a conversa cresce e desaparece completamente quando você abre uma nova. Um arquivo no repositório não tem essa característica.

O shadcn/ui é o problema?

Não. O shadcn entrega padrões sensatos justamente para que você possa começar sem precisar decidir tudo, e sua camada de temas é o que torna a correção simples. O problema é que os padrões são tratados como finalizados, em vez de serem vistos como um ponto de partida.

Quantas telas são necessárias para que o drift se torne visível?

Em nossos próprios testes, isso aparece por volta da quinta ou sexta tela de uma sessão contínua, e muito antes se você trocar de ferramenta no meio do caminho. Não há um número fixo — isso acompanha a extensão da conversa, não a contagem de telas.