Gráfico de Gantt em Mermaid: sintaxe, armadilhas e ida e volta para um editor de verdade
Blocos gantt do Mermaid são renderizados nativamente no GitHub, no GitLab, no Notion e no Obsidian, o que os torna a forma mais fácil de colocar um cronograma onde o trabalho já acontece — dentro do repositório, revisável num pull request. Também são penosos de editar: mude uma data e você recalcula na mão toda a corrente de after abaixo dela. Aqui estão a sintaxe campo a campo, um exemplo completo para colar num README, as armadilhas que renderizam perfeitamente estando erradas, e o passo que falta — editar visualmente e recuperar o texto.
A sintaxe de uma só passada
Um bloco gantt abre com a palavra gantt e algumas linhas de cabeçalho; depois vêm os títulos de section com as linhas de tarefa embaixo. A indentação é convenção, não gramática — o Mermaid não se importa, mas quem lê o diff se importa muito.
Uma linha de tarefa é um nome, dois-pontos e então campos separados por vírgula:
Nome da tarefa :tag, id, início, duração
- Tags — qualquer uma entre
done,active,critemilestone, em qualquer ordem, e dá para empilhar mais de uma. Opcionais. - id — uma palavra simples, sem espaço nem pontuação, necessária apenas se algo mais precisar se referir a esta tarefa.
- início — uma data, ou
after algumId, ou omitido para continuar a partir da tarefa de cima. - duração —
5d,2w, ou uma segunda data absoluta.
Linhas de cabeçalho que vale conhecer: dateFormat (como as datas do seu arquivo estão escritas), excludes weekends, title e axisFormat (como o eixo é rotulado, em códigos no estilo strftime). Os campos são classificados pelo formato, e não estritamente pela posição — é por isso que :done, aud, 2026-03-02, 5d e :aud, done, 2026-03-02, 5d funcionam igualmente bem.
Um exemplo completo para colar num README
Um bloco válido e inteiro, para trabalho de verdade: a migração de um gateway de cobrança para o Pix Automático. Ele usa seções, datas absolutas, correntes de after, todas as tags, um marco e fins de semana excluídos. Cole num bloco cercado mermaid em qualquer arquivo Markdown do GitHub e ele renderiza.
gantt
title Migração para o Pix Automático
dateFormat YYYY-MM-DD
axisFormat %d/%m
excludes weekends
section Descoberta
Auditoria dos fluxos atuais :done, aud, 2026-03-02, 5d
Especificação OpenAPI :done, esp, after aud, 4d
Revisão da especificação :active, rev, after esp, 2d
section Construção
Serviço de autenticação :crit, auth, after rev, 10d
Endpoints de cobrança :cob, after auth, 12d
Regerar o SDK do cliente :sdk, after cob, 3d
section Virada
Homologação com o PSP :hom, after sdk, 5d
Beta público :milestone, beta, 2026-05-04, 0d
Descontinuar a v1 :desc, after beta, 2w
Lendo linha a linha:
dateFormat YYYY-MM-DDdiz ao Mermaid como ler as datas que você digitou. É formato de entrada, não de saída — mexer nele não muda o eixo.axisFormat %d/%mé o lado da saída, e é o que faz o eixo aparecer como "02/03" em vez de uma data ISO — a convenção de data que o leitor brasileiro espera. Use%Vpara número de semana em qualquer coisa maior que um trimestre.excludes weekendsfaz todas as barras pularem sábado e domingo, no diagrama inteiro — não existe exceção por tarefa. A mesma diretiva aceita datas específicas, comoexcludes 2026-04-03para a Sexta-feira Santa, e nomes de dias da semana. É o único lugar onde feriado brasileiro cabe neste formato.Auditoria dos fluxos atuais :done, aud, 2026-03-02, 5d— tag, id, um início absoluto (uma segunda-feira) e cinco dias. As durações incluem o dia de início, então esta termina na sexta, 06/03.after audquer dizer "comece quandoaudterminar" — com fins de semana excluídos, isso é segunda, 09/03, e não sábado, dia 07.:crit, auth, ...pinta a barra com a cor de caminho crítico. Repare no verbo: pinta. Veja os limites mais abaixo.Endpoints de cobrança :cob, after auth, 12dnão tem tag nenhuma; o primeiro campo é só um id. Sem tag significa trabalho futuro.Beta público :milestone, beta, 2026-05-04, 0dé um marcador de comprimento zero numa data fixa. Marcos ganham id como qualquer outra linha, então oafter betada última linha é perfeitamente legal.2wsão duas semanas. O Mermaid também aceitahem, raramente úteis aqui.
As linhas em branco entre as seções são decorativas — o Mermaid as ignora, e o nosso importador também. Mantenha assim mesmo: um bloco de quarenta tarefas sem elas é ilegível num diff.
Referência da linha de tarefa
Cada campo e modificador, o que ele faz e como aparece na prática.
| Campo ou modificador | Exemplo | O que faz |
|---|---|---|
id | aud | Uma palavra simples que nomeia a tarefa para que after possa se referir a ela. Sem espaços nem pontuação. Opcional, a menos que algo dependa da tarefa. |
after | after aud | Começa quando a tarefa nomeada termina. Só término-início, sem defasagem. Aceita vários ids — after a b espera pelo que terminar mais tarde. |
done | :done, aud, … | Desenha a barra como concluída. Sem percentual: 100% e "praticamente pronto" ficam idênticos. |
active | :active, rev, … | Desenha a barra como em andamento. De novo, sem número por trás. |
crit | :crit, auth, … | Colore a barra como crítica. É uma afirmação que você digita, não algo que o Mermaid deduza — nada confere isso contra a cadeia de precedências. |
milestone | :milestone, beta, … | Desenha um losango no lugar da barra. Use junto com 0d. |
| Unidades de duração | 5d · 2w · 8h | Dias, semanas, horas (também m). Incluem o dia de início: 5d a partir de segunda termina na sexta. |
| Data de término | 2026-03-02, 2026-03-06 | Uma segunda data no lugar da duração, para um término fixado por fora. |
dateFormat | dateFormat YYYY-MM-DD | Como as datas do arquivo são interpretadas. Linha de cabeçalho, uma vez por diagrama. |
axisFormat | axisFormat %d/%m | Como o eixo é rotulado, em códigos strftime. Puramente cosmético. |
excludes | excludes weekends | Dias não trabalhados. Aceita também datas específicas (excludes 2026-04-03) e nomes de dias da semana. Vale para o diagrama inteiro. |
Quatro coisas que vão te pegar
1. As durações incluem o dia de início. 5d a partir de segunda, dia 5, vai até sexta, dia 9, e não até o dia 10. Um erro de um dia aqui desloca todas as tarefas do arquivo e mesmo assim ele renderiza perfeitamente — que é o pior modo de falha possível, porque nada parece quebrado.
2. after junto com excludes weekends é onde moram os bugs de verdade. Se uma antecessora termina numa sexta, a sucessora começa na segunda — não no sábado. Qualquer ferramenta que resolva o after somando um dia de calendário vai colocar tarefas em fins de semana num arquivo que os proíbe explicitamente, e todas as datas seguintes derivam a partir dali. A nossa fazia isso, por pouco tempo. A correção passa a aritmética pelo calendário útil, para que a importação concorde com o que o Mermaid desenha, e o teste que protege isso afirma a propriedade em vez de datas específicas: nenhum início ou término derivado pode cair num dia excluído. Datas que você digitou à mão ficam onde você as pôs, fim de semana ou não — mover em silêncio a data explícita de um autor é o tipo errado de ajuda.
3. Não existe escape. Os dois-pontos iniciam a lista de campos e a vírgula separa campos, então uma tarefa chamada Fase 2: projeto, revisão vira uma tarefa "Fase 2" com campos sem sentido. Mantenha dois-pontos, vírgulas e ponto e vírgula fora dos nomes; na exportação nós trocamos esses caracteres por espaço em vez de emitir uma linha que não vai ser interpretada.
4. Uma duração ilegível vira zero em silêncio. Escreva 3dd e você recebe uma barra de comprimento zero em vez de um erro. Depois de uma edição em massa, procure tarefas invisíveis.
Os limites de um formato de diagrama
O gantt do Mermaid é uma linguagem de desenho, não um motor de cronograma, e a diferença aparece no instante em que você quer que o gráfico responda a uma pergunta em vez de ilustrar uma resposta já conhecida.
- Sem recursos. Não há campo para quem faz o serviço, nem custo, nem esforço, nem unidade. Não dá para superalocar alguém no Mermaid porque o Mermaid não sabe que alguém existe.
- Sem folga e sem caminho crítico calculado.
crité uma cor que você aplica na mão. Nada percorre o grafo de precedências, calcula datas cedo e tarde ou diz qual cadeia comanda a data de entrega. Um diagrama com todas as barras marcadas comocrité tão válido quanto um sem nenhuma. - Sem linha de base. Não há onde registrar o que o plano dizia no mês passado, então não existe desvio para mostrar nem atraso para medir.
- Apenas término-início.
afteré FS com defasagem zero. Início-início, término-término, início-término e qualquer defasagem ou antecipação não têm onde caber. Planos reais estão cheios de "começar o teste três dias depois que o desenvolvimento começar" — no Mermaid isso vira uma data fixa, e a ligação some. - Sem percentual de avanço. Uma tarefa com 40% e outra com 90% são as duas simplesmente "active".
- Seções planas. Sem grupos aninhados, então uma estrutura analítica com mais de um nível achata na entrada.
Nada disso faz dele um formato ruim. Faz dele um formato de publicação: ótimo para mostrar um cronograma, inútil para derivar um. É exatamente por isso que a ida e volta importa.
Editar visualmente e colar o texto de volta
Muitas ferramentas renderizam Mermaid. O que faltava era o caminho inverso — arrastar barras e recuperar a sintaxe.
- Cole o diagrama em ✨ Colar no Gantt, ou use 📂 Abrir para carregar um arquivo
.mmdou um.mdcom bloco cercado. A detecção é pelo conteúdo, não pela extensão. - Confira o aviso de importação: ele diz quantas tarefas entraram e o que foi adivinhado no caminho.
- Arraste, ligue e reprograme como em qualquer outro gráfico. O
excludes weekendsliga o Calendário de trabalho, de modo que as datas geradas concordam com o arquivo de origem. - Ative Reprogramar se quiser que as precedências acomodem tudo sozinhas ao mover uma barra.
- Ligue Caminho crítico para ver a cadeia que o Mermaid nunca calculou.
- Vá em ⬇ Exportar ▸ 🧜 Mermaid gantt (texto) e escolha Copiar para a área de transferência ou Baixar .mmd.
- Cole de volta no seu README e faça o commit do diff.
A ida e volta perde informação de um jeito conhecido e sem surpresas. O avanço mapeia 100% para done e de 1% a 99% para active na saída; active volta como 50% na entrada — um palpite sobre o qual você é avisado, em vez de descobrir num relatório de status. As ligações que não conseguem ser escritas como after — qualquer uma com defasagem, e qualquer SS, FF ou SF — viram datas absolutas, que continuam corretas mesmo deixando de ser fáceis de manter.
Uma assimetria deliberada, e não um defeito: crit é escrito na exportação e nunca lido na importação. Na saída ele é derivado — o editor calculou o caminho crítico a partir do grafo de precedências, então a tag é verdadeira no momento em que é escrita. Na entrada, ele é uma palavra que alguém digitou num arquivo que pode estar semanas desatualizado, e confiar nela permitiria que um diagrama velho pintasse de vermelho uma cadeia que não é crítica. Então ele é escrito e depois ignorado: o caminho crítico que você vê depois de uma importação foi recalculado, não afirmado.
Vale lembrar como esse recálculo funciona aqui: o caminho crítico é "como posicionado". Uma precedência só consegue empurrar uma tarefa para a frente, nunca puxá-la para trás — então uma barra que você arrastou para uma data mais tardia fica onde você a colocou, e a criticidade é calculada em cima do desenho real e não de um plano ideal que ninguém aprovou.
Há também um efeito colateral simpático para quem usa um LLM para rascunhar cronogramas: peça a sintaxe gantt do Mermaid, cole a resposta e você tem um gráfico editável de verdade, com caminho crítico calculado — sem chave de API e sem servidor no meio.
Perguntas frequentes
Como faço um gráfico de Gantt no Mermaid?
Inicie o bloco com gantt, acrescente dateFormat YYYY-MM-DD e então títulos de section com linhas de tarefa embaixo, no formato "Nome :tag, id, início, duração" — por exemplo "Auditoria :done, aud, 2026-03-02, 5d".
O 5d do Mermaid inclui o dia de início?
Sim. Uma tarefa de 5d começando na segunda, dia 2, termina na sexta, dia 6. Essa contagem inclusiva é a fonte mais comum de erros de um dia, e produz um diagrama que renderiza perfeitamente com todas as datas erradas em um dia por tarefa.
Como funcionam as precedências no gantt do Mermaid?
Use "after algumId" no campo de início. É sempre término-início sem defasagem — início-início, término-término e defasagens não podem ser expressos. Dá para nomear várias antecessoras, como em "after a b", e a tarefa espera pela que terminar mais tarde.
O after pula os fins de semana?
Pula quando o diagrama declara "excludes weekends". A sucessora de uma tarefa que termina na sexta começa na segunda, e a duração é contada em dias úteis. Ferramentas que resolvem o after somando um dia de calendário acabam colocando tarefas no sábado num arquivo que proíbe sábado.
O Mermaid calcula o caminho crítico?
Não. A tag crit é uma cor que você aplica na mão; nada no Mermaid percorre o grafo de precedências nem calcula folga. É por isso que o gantts.app exporta crit e o ignora na importação — a criticidade é recalculada a partir das precedências em vez de ser aceita de um arquivo possivelmente desatualizado.
Dá para converter um gantt do Mermaid em gráfico editável?
Dá. Abra o arquivo .mmd ou o Markdown no gantts.app, edite visualmente e use ⬇ Exportar ▸ 🧜 Mermaid gantt (texto) para copiar a sintaxe atualizada de volta.
Modelos que usam isso
Leia também
Este artigo também está disponível em inglês.