DESIGN.md vs .cursorrules — Portable Design System or Rules Locked to One Tool?
Comparison between DESIGN.md and .cursorrules. Scope, portability across AI tools, and why design tokens do not belong in an IDE config file.
Quick Verdict
.cursorrules is the configuration file for one specific tool: Cursor. DESIGN.md is a universal format that any AI coding agent reads. Putting your design system inside .cursorrules is like getting your home address tattooed on your arm because it works. Until you move. If you only use Cursor and will never switch, fine. If you want portability (and you will want it because the AI editor market shifts every month), DESIGN.md is the right answer.
Comparison Table
| Dimension | DESIGN.md | .cursorrules |
|---|---|---|
| Scope | Design system: tokens + rationale | Everything: code style, preferences, design, workflow |
| Portability | Universal. Works in any AI tool | Cursor only (and forks that copy the format) |
| Format | YAML tokens + structured Markdown | Free-form Markdown (plain text, no schema) |
| Focus | Specialized for visual design | Generalist. Covers any instruction |
| Parsability | High. YAML is machine-readable | Medium. Free text, LLM interprets loosely |
| Community | 24K stars, 461 cataloged design systems | Thousands of examples but no standardization |
| Maintenance | Updates when design changes | Updates when any preference changes |
| Typical size | 200-500 lines (focused) | 50-2000 lines (everything mixed together) |
The Problem with .cursorrules as a Design System
The suitcase file
.cursorrules became the place where developers dump everything they want Cursor to know. The typical result:
# .cursorrules
## Stack
- Next.js 14 com App Router
- TypeScript strict
- Tailwind CSS v4
- Drizzle ORM com PostgreSQL
## Convenções de Código
- Use named exports
- Prefira composição sobre herança
- Componentes em PascalCase
- Utilities em camelCase
## Design System
- Cores: primary #1a1a2e, accent #e94560
- Fonte: Inter para body, Cal Sans para display
- Spacing: múltiplos de 4px
- Cards: rounded-xl, shadow-sm, border border-border
- Botões: rounded-lg, font-medium
## Estilo de Resposta
- Seja conciso
- Não explique o que é óbvio
- Use português nos comentários
## Regras de Git
- Commits convencionais: feat, fix, docs
- Branch naming: feature/xxx, fix/xxx
Looks organized. But it has structural problems:
-
Everything jammed together. Design tokens, code conventions, git rules, language preferences, stack description. When only the design changes, you edit a file that contains everything else too.
-
No schema. “Colors: primary #1a1a2e” is plain text that the LLM interprets. It is not a structured value. A different agent might parse it differently.
-
Locked to Cursor. Switched to Claude Code? To Windsurf? To Kiro? You bring
.cursorrulesalong and… it does not work. You need to adapt it into.claude/settings,.windsurfrules, or whatever else the new tool expects. -
No rationale. Why multiples of 4px? When to use accent vs primary? What is the minimum contrast? Silence.
DESIGN.md in Detail
Specialized and structured
DESIGN.md has one clear job: communicate the design system in a format that machines parse perfectly and humans read naturally.
---
name: "MeuProjeto Design System"
version: "2.1"
last-updated: "2026-06-15"
---
colors:
brand:
primary:
value: "#1a1a2e"
usage: "CTAs, links primários, textos de destaque"
contrast-pair: "white ou primary-foreground"
accent:
value: "#e94560"
usage: "Badges, notificações, elementos que pedem atenção imediata"
constraint: "Nunca como background de áreas grandes — só pontos focais"
neutral:
50: { value: "#fafafa", usage: "Background de page" }
100: { value: "#f4f4f5", usage: "Background de cards" }
900: { value: "#18181b", usage: "Texto principal" }
typography:
system:
display:
family: "Cal Sans"
weights: [600, 700]
usage: "Headers h1-h3, hero text"
constraint: "Nunca em body text, nunca abaixo de 20px"
body:
family: "Inter"
weights: [400, 500, 600]
usage: "Parágrafos, labels, captions, UI text"
scale:
hero: { size: "3.5rem", line-height: 1.1, weight: 700 }
h1: { size: "2.5rem", line-height: 1.2, weight: 700 }
h2: { size: "2rem", line-height: 1.3, weight: 600 }
body: { size: "1rem", line-height: 1.6, weight: 400 }
small: { size: "0.875rem", line-height: 1.5, weight: 400 }
spacing:
base-unit: "4px"
component-internal: "8px–16px (2–4 units)"
component-gap: "16px–24px (4–6 units)"
section-gap: "64px–96px (16–24 units)"
philosophy: "Espaço generoso. Na dúvida, mais espaço."
components:
card:
border-radius: "12px (rounded-xl)"
shadow: "0 1px 3px rgba(0,0,0,0.05)"
border: "1px solid var(--border)"
padding: "24px"
button:
border-radius: "8px (rounded-lg)"
padding: "12px 24px"
font-weight: 500
variants: [primary, secondary, ghost, destructive]
What this format delivers that .cursorrules cannot
- Implicit schema. YAML is programmatically parseable. Tools can validate, extract, and transform it.
- Explicit constraints. “Never as background for large areas” prevents mistakes before they happen.
- Documented relationships. contrast-pair tells you what to combine with.
- Versioned. You know when it changed and why.
- Portable. Any LLM reads YAML. Any AI coding tool ingests it.
.cursorrules in Detail
What it does well
It is quick to create. No ceremony. Open the file, write instructions in free text, save. Cursor reads it automatically. Zero setup, no schema to follow.
For small projects with one developer using Cursor exclusively, it works fine. Minimal investment, immediate return.
When it is enough
- Personal project, single dev, Cursor only
- Simple instructions: “use TypeScript strict, named exports”
- Design system is framework default (no heavy customization)
- No portability needed
Problems at scale
Scenario: Team of 4 devs, each with a different tool
Dev 1 uses Cursor: .cursorrules
Dev 2 uses Claude Code: CLAUDE.md
Dev 3 uses Windsurf: .windsurfrules
Dev 4 uses Copilot: .github/copilot-instructions.md
If the design system lives in .cursorrules, 3 out of 4 developers do not get the information. The result: visual inconsistency.
With DESIGN.md: all 4 agents read the same file (every tool reads Markdown from the repo as context). Unified design system regardless of tool choice.
Scenario: Tool switch
January: entire team on Cursor. .cursorrules has 800 lines including the complete design system.
March: half the team migrates to Claude Code because of the agentic mode.
Result: you need to rewrite the design instructions in another format, or accept inconsistency.
With DESIGN.md: tool switch does not affect the design system. It lives in the repo, not in the IDE config.
The Right Separation of Concerns
Projeto/
├── DESIGN.md ← Design system (portável, universal)
├── AGENTS.md ← Comportamento geral do agente (portável)
│
├── .cursorrules ← Preferências ESPECÍFICAS do Cursor
│ └── "Prefira respostas curtas. Use DESIGN.md para visual."
│
├── .claude/settings.json ← Config ESPECÍFICA do Claude Code
├── .github/copilot-instructions.md ← Config ESPECÍFICA do Copilot
│
└── src/
The pattern: DESIGN.md and AGENTS.md are universal. .cursorrules contains only what is specific to Cursor as a tool: response style, output format, shortcuts.
When to Use Which
Use .cursorrules alone when:
- Personal project, you are the only developer
- You use Cursor exclusively with no plans to change
- Trivial design system (5 colors, default typography)
- No need for other developers or tools to understand the design
Use DESIGN.md (with or without .cursorrules) when:
- Team with multiple AI tools. Each developer can use whatever they prefer.
- Portability matters. You do not want vendor lock-in to any IDE.
- Complex design system. Many tokens, rules, constraints.
- Open-source project. Contributors use diverse tools.
- Project with longevity. Tools will change. The design system persists.
Use both when:
- Most of the team uses Cursor but you want portability
.cursorrulesreferences DESIGN.md: “For tokens and design, see DESIGN.md”.cursorrulesholds only tool-specific preferences: response format, verbosity level
Migration: From .cursorrules to DESIGN.md
If you already have design tokens inside .cursorrules, migration is straightforward:
Step 1: Extract tokens
Pull everything visual from .cursorrules: colors, fonts, spacing, components, design constraints.
Step 2: Structure in YAML
Convert from free text to structured YAML. Add usage and constraint for each token. That is the real value that .cursorrules never had.
Step 3: Add rationale
Why these colors? Why this spacing? The context that explains decisions is what transforms config into a design system.
Step 4: Point .cursorrules to DESIGN.md
# .cursorrules
## Design System
Consulte `DESIGN.md` para todos os tokens visuais, cores, tipografia e componentes.
## Preferências de Resposta
- Respostas concisas
- Código sem comentários óbvios
- TypeScript strict sempre
The result: .cursorrules stays light and focused. DESIGN.md holds the design. Portability guaranteed.
FAQ
If I only use Cursor, what is the advantage of a separate DESIGN.md?
Three things: (1) Organization. Design tokens in a focused file instead of mixed with everything else. (2) Parsability. YAML is more precise than free text for the agent to extract values. (3) Future-proofing. When (not if) you switch tools, the design system comes with you without rework.
Is .cursorrules read by other AI agents?
Not natively. Claude Code reads CLAUDE.md. Windsurf reads .windsurfrules. Copilot reads .github/copilot-instructions.md. Each tool has its own format. DESIGN.md, being generic Markdown in the repo, gets ingested by all of them as project context.
Can .cursorrules include or reference DESIGN.md?
Yes, and it is the recommended pattern. .cursorrules contains a line: “For visual design, follow DESIGN.md.” Cursor includes DESIGN.md in context automatically when referenced (or via @file mention).
Is DESIGN.md natively recognized by Cursor?
Cursor reads any Markdown file from the project as context when referenced. It does not get special native treatment like .cursorrules, but it works the same when included in context (via @ mention or rules that point to it). The advantage is that it also works in every other tool.
Is there a tool to convert .cursorrules into DESIGN.md?
designmd.app generates DESIGN.md from existing projects, including extraction of tokens from configs and rules files. But the main value is adding semantics (usage, constraints, rationale) that no automatic conversion captures on its own.
Conclusion
.cursorrules is a carry-on bag. Practical, quick to pack, good for short trips. But if you switch planes (tools) mid-journey, you need to repack.
DESIGN.md is a standardized shipping container. Works on any transport. Any tool knows how to open and read it. The contents arrive intact regardless of the vehicle.
The smart choice is not “one or the other.” It is separation of concerns. The design system belongs in a portable, universal format. Tool preferences belong in the tool’s config. When you separate those layers, switching editors or adding a new tool does not require rewriting the design system.
In 2026, with new AI tools appearing every month and no clear market dominance, betting all your design documentation on a single tool is unnecessary technical debt. DESIGN.md is the insurance policy, and it costs nothing to maintain.
The 461 design systems on designmd.app work in Cursor, Claude Code, Copilot, Windsurf, Kiro, and any future tool. Because the format is universal, not proprietary.