Como escrever um CLAUDE.md que realmente melhora as respostas do Claude Code

O CLAUDE.md é um arquivo markdown que o Claude Code lê no início de toda sessão, com o contexto persistente que ele não consegue inferir só lendo o código: comandos, convenções fora do padrão, decisões de arquitetura e pegadinhas do ambiente. Não existe formato obrigatório, mas a orientação oficial é mirar em menos de 200 linhas por arquivo, porque texto inchado consome contexto e faz o Claude ignorar as instruções reais. A régua é simples: escreva só o que você teria que reexplicar toda sessão, em instrução verificável, e confira com /context o que entrou de verdade
Fala aí, beleza? O CLAUDE.md é o arquivo que VOCÊ escreve pro Claude Code ler no início de toda sessão, antes de ele encostar em qualquer linha do seu código
E é exatamente por isso que ele decide, na prática, a qualidade das respostas que você recebe 🙂
Ele é um arquivo markdown carregado no início de cada sessão, com o contexto persistente que o Claude não tem como inferir só lendo o repositório: qual comando roda os testes, por que a pasta X existe, aquele detalhe do ambiente que te ferrou uma vez
Só que tem um preço: esse arquivo entra no contexto e consome tokens
Ou seja, toda linha que não muda o comportamento do agente está pagando aluguel na sua janela de contexto, e a documentação oficial do Claude Code é bem direta nisso: arquivo inchado faz o Claude ignorar as instruções que realmente importam
Bora escrever um que funciona?
O que você precisa antes de começar:
Pouca coisa, e nada de PC da Nasa aqui
Você precisa do Claude Code instalado e aberto na raiz do projeto, porque é a partir do diretório de trabalho que ele monta a memória da sessão
Domine o Claude Code do básico ao avançado
Você vai aprender a criar sistemas completos com Claude Code, sem precisar ser programador. Inscreva-se para ter acesso a um desconto de lançamento e bônus especiais!
E três comandos sustentam todo o resto deste tutorial:
/initgera um CLAUDE.md inicial a partir da estrutura atual do projeto, pra depois ser refinado/memorylista e abre os arquivos de memória (incluindo CLAUDE.md e CLAUDE.local.md) nos escopos de usuário e de projeto, e se você selecionar um arquivo que ainda não existe, ele cria/contextmostra em tempo real o que está ocupando a janela de contexto, incluindo quais arquivos CLAUDE.md e de auto memory foram carregados na sessão
Esse último é o mais subestimado dos três
É ele que transforma "acho que o Claude leu meu arquivo" em "o Claude leu, e ocupa tanto assim"
Como escrever um CLAUDE.md passo a passo
- Rode
/inite trate o resultado como rascunho. O comando lê a estrutura atual do projeto e te entrega um esqueleto pra refinar, não um arquivo final. O erro comum deste passo: aceitar a saída como está e sair usando, aí o arquivo vira uma descrição do repositório em vez de instrução de comportamento
- Aplique o critério de conteúdo: escreva o que você teria que reexplicar. A régua oficial é pensar no que um colega novo de time precisaria saber pra produzir: comandos de build, convenções, layout do projeto, regras do tipo "sempre faça X". Se você repetiria isso em toda sessão, é linha de CLAUDE.md. Vale a pena olhar com calma o que colocar e o que cortar antes de encher o arquivo. O erro comum deste passo: escrever pro Claude aquilo que ele descobre sozinho lendo dois arquivos
- Escreva instrução verificável, não instrução simpática. "Formate o código corretamente" não dá pra checar, e por isso não muda nada. "Use indentação de 2 espaços" dá. O erro comum deste passo: linha genérica que soa bonita na leitura e não tem como ser cumprida nem cobrada
- Corte a lista do que não deve entrar. A orientação oficial manda tirar qualquer coisa que o Claude descobre lendo o código, convenções padrão da linguagem, documentação detalhada de API, informação que muda com frequência e explicação longa. O erro comum deste passo: colar doc de API dentro do arquivo achando que está ajudando, quando está só empurrando o resto pra fora do foco
- Segure o arquivo abaixo de 200 linhas. Esse é o alvo recomendado por arquivo CLAUDE.md, e o motivo é bem prático: arquivo maior consome mais contexto e reduz a aderência às instruções. O erro comum deste passo: crescer o arquivo por acumulação, uma linha por frustração, e nunca revisitar
- Confira com
/contexto que entrou de verdade na sessão. Ele mostra quais arquivos de memória foram carregados e o que está ocupando a janela. O erro comum deste passo: supor a carga em vez de olhar. Sem checar, você fica ajustando instrução que talvez nem esteja no contexto
Exemplos de instruções que mudam o comportamento na prática
Os blocos abaixo são ilustrativos de FORMATO
A ideia é você sentir a diferença entre a linha vaga e a linha que muda a resposta, e depois trocar o conteúdo pelo do seu projeto
- Comando que ele não tem como adivinhar
# vago
Rode os testes antes de finalizar
# muda o comportamento
Testes: `npm run test:unit <arquivo>` durante o trabalho
Suite completa só antes de commitar: `npm run test`
- Estilo que foge do padrão
# vago
Mantenha o código bem formatado
# muda o comportamento
Use indentação de 2 espaços
Aspas simples em TypeScript, sem ponto e vírgula no fim da linha
- Etiqueta do repositório
# vago
Siga o padrão de commits do projeto
# muda o comportamento
Nunca commite direto na branch principal: crie branch antes
Mensagem de commit no imperativo, em português
- Decisão de arquitetura
# vago
O projeto tem uma boa separação de camadas
# muda o comportamento
Acesso a banco mora só na camada de dados
Rota nunca monta query: chama função da camada de dados
- Peculiaridade do ambiente
# vago
O ambiente local é um pouco diferente
# muda o comportamento
O Postgres local roda na porta 5434 (5432 está ocupada)
Subir tudo com `npm run dev:all` no começo da sessão
- Pegadinha (a gotcha que já te mordeu)
# vago
Cuidado com os arquivos de configuração
# muda o comportamento
Migration já aplicada nunca é editada: crie uma nova
Esse tipo de linha é ouro, porque é o conhecimento que não está escrito em lugar nenhum do código
É o "já me ferrei uma vez por causa disso" virando regra
- Instrução de compactação escrita no próprio CLAUDE.md
Dá pra customizar o comportamento de compactação por ali também, dizendo o que não pode se perder quando a conversa é compactada:
Ao compactar, preserve a lista completa de arquivos modificados
e os comandos de teste usados até aqui
Sacou o padrão? Toda linha boa responde "o que muda na próxima resposta do agente por causa disso"
Onde cada instrução deve morar: arquivo do projeto, rules ou skill
Agora a parte que quase ninguém organiza direito
O Claude Code lê os CLAUDE.md do diretório de trabalho pra cima até a raiz, e descobre os arquivos de subpastas conforme acessa arquivos daqueles diretórios
Então os pais carregam na abertura da sessão, e as subpastas carregam sob demanda
Na ordem de leitura, o arquivo do diretório mais acima aparece antes no contexto, e dentro de cada diretório o CLAUDE.local.md é acrescentado depois do CLAUDE.md:
foo/CLAUDE.md <- entra antes
foo/CLAUDE.local.md
foo/bar/CLAUDE.md <- entra depois
Isso importa quando duas instruções conversam entre si, beleza?
E o que é seu, não do time?
Instrução de escopo pessoal fica na memória de usuário: ~/.claude/CLAUDE.md e ~/.claude/rules/
Assim sua mania não vira regra do repositório inteiro
Projeto grande pede quebra por tópico
Em vez de um arquivão, dá pra criar arquivos markdown dentro de .claude/rules/ no projeto, com descoberta recursiva dos .md e um tópico por arquivo
E tem o pulo do gato: regra pode ser limitada a arquivos específicos pelo campo paths no frontmatter YAML, e só entra no contexto quando o Claude trabalha com arquivos que casam com o padrão
---
paths:
- "apps/web/**/*.tsx"
---
Componente novo sempre em Server Component por padrão
Regra que não casou com o glob simplesmente não é carregada
É contexto que você não paga 😀
Quando a instrução NÃO é caso de CLAUDE.md
Se a entrada é um procedimento de vários passos, ou só importa pra uma parte do código, a orientação é mover: procedimento longo vira skill, regra localizada vira path-scoped rule
O mesmo raciocínio vale pra tarefa grande, onde o combinado detalhado não mora na memória do projeto e sim em uma spec antes de implementar
O erro comum aqui: achar que import com @caminho economiza contexto
Não economiza
Ele organiza o arquivo, mas os arquivos importados carregam junto na abertura da sessão do mesmo jeito
CLAUDE.md e auto memory: dois mecanismos diferentes
Esse ponto confunde muita gente, então vamos separar
Além do CLAUDE.md que VOCÊ escreve, o Claude Code tem a auto memory, em que o próprio Claude salva notas a partir das suas correções e preferências
Ela vem ligada por padrão, e o toggle grava autoMemoryEnabled em ~/.claude/settings.json (o toggle também aparece no /memory)
| CLAUDE.md | Auto memory | |
|---|---|---|
| Quem escreve | você | o próprio Claude, a partir das suas correções e preferências |
| Onde fica | no projeto e no escopo de usuário (~/.claude/CLAUDE.md) |
~/.claude/projects/<projeto>/memory/ |
| Índice | não tem | MEMORY.md funciona como índice do diretório |
| Estado padrão | você cria | ligada por padrão, com toggle em ~/.claude/settings.json |
Do MEMORY.md, carregam no início de cada conversa as primeiras 200 linhas ou os primeiros 25KB, o que vier primeiro
O que passa disso não entra na abertura da sessão
E qual o caso de uso prático dessa distinção?
Não duplicar
Se uma preferência sua já foi capturada pela auto memory a partir de uma correção que você fez, repetir a mesma coisa no CLAUDE.md só gasta contexto duas vezes
O CLAUDE.md é o contrato do projeto
A auto memory é o caderninho do que você já corrigiu
Como podar o arquivo e manter ele afiado
CLAUDE.md não é documento que se escreve uma vez e esquece, ele é mantido
E manter, aqui, quer dizer cortar 🙂
- Passe o olho procurando linha redundante. Se o Claude já faz aquilo certo sem a instrução, a orientação é apagar a linha, sem dó
- Converta em hook a regra que precisa de garantia. Quando não pode falhar de jeito nenhum, instrução em texto é o lugar errado: vira hook
- Cheque o tamanho de novo. O alvo continua sendo menos de 200 linhas por arquivo CLAUDE.md, e quem cresceu passa por revisão ou vira arquivo por tópico em
.claude/rules/
- Use
/contextcomo termômetro. Ele mostra quanto os arquivos de memória estão custando na janela, então dá pra medir o efeito da poda em vez de confiar no feeling
O erro comum dessa rotina: só adicionar
Cada vez que o agente erra, a tentação é escrever mais uma linha, e em três semanas o arquivo está com o dobro do tamanho e metade da eficácia…
Conclusão
A régua do CLAUDE.md cabe em uma frase: escreva só o que precisaria ser reexplicado toda sessão, em instrução curta e verificável
O resto é peso morto no contexto
Seu próximo passo é bem concreto: roda /init hoje pra ter o esqueleto, poda até caber abaixo de 200 linhas, confere com /context o que entrou de verdade e move procedimento de vários passos pra uma skill
Depois disso, o arquivo deixa de ser um README disfarçado e passa a mudar a resposta do agente na prática
até o próximo post! 😀
Perguntas frequentes
Qual a diferença entre CLAUDE.md e CLAUDE.local.md?
Os dois convivem no mesmo diretório, mas a ordem de leitura importa: dentro de cada pasta, o CLAUDE.local.md é acrescentado depois do CLAUDE.md. E entre pastas, o arquivo do diretório mais acima no projeto aparece antes no contexto do que o de uma subpasta.
Onde ficam as instruções pessoais que não são do projeto, tipo preferência de estilo do próprio usuário?
Esse escopo é separado do CLAUDE.md do repositório: fica em arquivos de usuário, como ~/.claude/CLAUDE.md e ~/.claude/rules/. É onde mora instrução que você quer em qualquer projeto que abrir, não só neste.
Usar @caminho pra importar outro arquivo dentro do CLAUDE.md economiza tokens?
Não. O import com @caminho ajuda a organizar o conteúdo em arquivos separados, mas os arquivos importados carregam junto na abertura da sessão. Ou seja, o consumo de contexto continua o mesmo, só muda a forma como o texto fica dividido.
Qual a diferença entre o CLAUDE.md e a auto memory do Claude Code?
São dois mecanismos distintos. O CLAUDE.md é o arquivo que você escreve à mão, enquanto a auto memory é o próprio Claude salvando notas a partir das suas correções e preferências ao longo do uso, e ela vem ligada por padrão.
Todo CLAUDE.md do projeto é lido de uma vez, mesmo o de pastas mais internas?
Não exatamente. O Claude Code lê os CLAUDE.md do diretório de trabalho pra cima até a raiz no início da sessão, e descobre os arquivos de subpastas conforme acessa arquivos daqueles diretórios. Então o de uma subpasta específica só entra quando ela é tocada.
Quando vale mover uma instrução do CLAUDE.md pra um arquivo em .claude/rules/?
Quando a regra só importa pra uma parte do código. A pasta .claude/rules/ permite um arquivo por tópico, e o campo paths no frontmatter YAML limita a regra a arquivos específicos, então ela só entra no contexto quando o Claude trabalha com algo que casa com aquele padrão.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
As diferenças de var, let e const
Como fazer redirecionamento com PHP
Neste artigo você vai aprender a como fazer redirecionamento com PHP, utilizaremos abordagens fáceis de entender e de aplicar Fala programador(a), beleza? Bora aprender mais […]
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação A popularidade da automação de processos com o n8n está em alta, principalmente […]
