Diagramas de Gantt en Mermaid: sintaxis, trampas y vuelta a un editor real
Los bloques gantt de Mermaid se renderizan de forma nativa en GitHub, GitLab, Notion y Obsidian, lo que los convierte en la manera más fácil de poner un calendario donde ya vive el trabajo: en el repositorio, revisable dentro de una pull request. También son penosos de editar: mueves una fecha y tienes que rehacer a mano toda la cadena de after que va detrás. Aquí van la sintaxis campo por campo, un ejemplo completo que puedes pegar en un README, las trampas que se renderizan perfectamente siendo falsas, y el paso que falta: editarlo visualmente y recuperar el texto.
La sintaxis de una pasada
Un bloque gantt se abre con la palabra clave gantt y unas pocas líneas de cabecera, y después vienen encabezados section con líneas de tarea debajo. La sangría es convención, no gramática: Mermaid no se queja si la pierdes, pero el diff sí.
Una línea de tarea es un nombre, dos puntos y después campos separados por comas:
Nombre de tarea :etiqueta, id, inicio, duración
- Etiquetas — cualquiera de
done,active,crit,milestone, en cualquier orden, y puedes apilar varias en la misma tarea. Son opcionales. - id — una palabra suelta, sin espacios ni puntuación, necesaria solo si algo más se refiere a esta tarea.
- inicio — una fecha, o
after algúnId, o se omite por completo para continuar justo detrás de la tarea anterior. - duración —
5d,2w, o una segunda fecha absoluta que fija el final.
Cabeceras que conviene conocer: dateFormat (cómo están escritas las fechas en tu archivo), excludes weekends, title y axisFormat (cómo se etiqueta el eje, con códigos al estilo strftime). Los campos se clasifican por su forma más que por su posición estricta, y por eso :done, aud, 2026-03-02, 5d y :aud, done, 2026-03-02, 5d funcionan los dos igual de bien.
Una advertencia que ahorra media hora de desconcierto: dateFormat y axisFormat no son el mismo parámetro escrito de dos maneras. El primero es entrada y el segundo es salida. Cambiar dateFormat no reetiqueta el eje; lo que hace es cambiar cómo se leen las fechas que ya has tecleado, con lo que un archivo perfectamente correcto puede pasar a interpretarse al revés.
Un ejemplo completo que puedes pegar en un README
Un bloque válido y completo para trabajo real: el lanzamiento de la app de reservas de Grupo Alcorta, una agencia de Valladolid, con el equipo de producto de Marta Iglesias. Usa secciones, fechas absolutas, cadenas de after, todas las etiquetas, un hito y fines de semana excluidos. Pégalo en un bloque delimitado mermaid dentro de cualquier Markdown de GitHub y se renderiza.
gantt
title Lanzamiento app de reservas — Grupo Alcorta
dateFormat YYYY-MM-DD
axisFormat %d %b
excludes weekends
section Descubrimiento
Auditoria del backend actual :done, aud, 2026-03-02, 5d
Especificacion funcional :done, esp, after aud, 4d
Revision con cliente :active, rev, after esp, 2d
section Construccion
Servicio de identidad :crit, ident, after rev, 10d
Pantallas de reserva :pant, after ident, 12d
Pasarela de pago :pago, after pant, 6d
section Salida
Pruebas en preproduccion :pre, after pago, 5d
Beta publica :milestone, beta, 2026-05-04, 0d
Retirada de la version antigua :ret, after beta, 2w
Leído línea a línea:
dateFormat YYYY-MM-DDle dice a Mermaid cómo leer las fechas que has tecleado. Es formato de entrada, no de salida. Aquí no valedd/mm/aaaasalvo que lo declares explícitamente, y aun así conviene no hacerlo: el ISO es lo que espera cualquiera que abra el archivo después de ti.axisFormat %d %bes el lado de salida: el eje se lee «02 mar» en vez de una fecha ISO completa. Para cualquier cosa más larga que un trimestre, usa%Vy trabaja con números de semana.excludes weekendshace que todas las barras salten sábados y domingos, para el diagrama entero. No hay excepción por tarea: es todo o nada.Auditoria del backend actual :done, aud, 2026-03-02, 5d— etiqueta, id, un inicio absoluto (un lunes) y cinco días. Las duraciones incluyen el día de inicio, así que esto termina el viernes 6 de marzo.after audsignifica «empieza cuando termineaud»: con los fines de semana excluidos, el lunes 9 de marzo, no el sábado 7.:crit, ident, ...pinta la barra con el color de ruta crítica. Fíjate en el verbo: pinta. Más abajo están los límites de eso.Pantallas de reserva :pant, after ident, 12dno lleva etiqueta ninguna; el primer campo es simplemente un id. Sin etiqueta significa trabajo pendiente.Beta publica :milestone, beta, 2026-05-04, 0des un marcador de longitud cero en una fecha fija. Los hitos tienen id como cualquier otra cosa, así que elafter betade la última línea es perfectamente legal.2wson dos semanas. Mermaid también aceptahym, que aquí casi nunca sirven de nada.
Un detalle que a un equipo español le importa más que a otros: excludes weekends resuelve los sábados y domingos, pero no sabe nada de los festivos. Este calendario atraviesa la Semana Santa, y el 1 de mayo cae dentro de la ventana de la beta. Si quieres que las barras lo reflejen, hay que declararlos a mano, uno por uno, con excludes 2026-04-03 y excludes 2026-05-01. Y eso solo cubre los nacionales: los autonómicos y locales —San Pedro Regalado en Valladolid, la feria en Sevilla, el puente que tu convenio colectivo te regala en septiembre— no están en ninguna lista que Mermaid conozca. En un plan que cruce agosto, la diferencia entre el diagrama y la realidad de la oficina se cuenta en semanas.
Las líneas en blanco entre secciones son decorativas: Mermaid las ignora, y nuestro importador también. Déjalas igualmente. Un bloque de cuarenta tareas sin ellas es ilegible en un diff, y ese diff lo va a revisar alguien un viernes a las siete.
Referencia de la línea de tarea
Cada campo y modificador, qué hace y cómo se ve en la práctica.
| Campo o modificador | Ejemplo | Qué hace |
|---|---|---|
id | aud | Una palabra suelta que nombra la tarea para que after pueda referirse a ella. Sin espacios ni puntuación. Opcional salvo que algo dependa de la tarea. |
after | after aud | Empieza cuando termina la tarea nombrada. Solo fin-inicio y sin desfase. Admite varios ids: after a b espera al más tardío de los dos. |
done | :done, aud, … | Dibuja la barra como terminada. Sin porcentaje: el 100 % y el «vamos, que está» se ven exactamente igual. |
active | :active, rev, … | Dibuja la barra como en curso. Otra vez sin ningún número detrás. |
crit | :crit, ident, … | Colorea la barra como crítica. Es una afirmación que tecleas tú, no algo que Mermaid deduzca: nada la contrasta con la cadena de dependencias. |
milestone | :milestone, beta, … | Dibuja un rombo en lugar de una barra. Acompáñalo siempre de 0d. |
| Unidades de duración | 5d · 2w · 8h | Días, semanas, horas (también m). Inclusivas respecto al día de inicio: 5d desde el lunes acaba el viernes. |
| Fecha de fin | 2026-03-02, 2026-03-06 | Una segunda fecha en lugar de una duración, para un final fijado desde fuera. |
dateFormat | dateFormat YYYY-MM-DD | Cómo se interpretan las fechas del archivo. Línea de cabecera, una vez por diagrama. |
axisFormat | axisFormat %d %b | Cómo se etiqueta el eje, con códigos strftime. Puramente cosmético. |
excludes | excludes weekends | Días no laborables. Acepta también fechas concretas (excludes 2026-05-01) y nombres de día. Afecta al diagrama entero. |
Cuatro cosas que te van a morder
1. Las duraciones incluyen el día de inicio. 5d desde el lunes día 5 llega hasta el viernes día 9, no hasta el 10. Un error de uno aquí desplaza todas las tareas del archivo y aun así se renderiza perfectamente, que es el peor modo de fallo posible: nada parece roto. La entrega sigue apareciendo en su sitio hasta el día en que alguien intenta cumplirla.
2. after junto con excludes weekends es donde viven los errores de verdad. Si una predecesora termina un viernes, su sucesora empieza el lunes, no el sábado. Cualquier herramienta que resuelva after sumando un día natural colocará tareas en fin de semana dentro de un archivo que lo prohíbe explícitamente, y a partir de ahí todas las fechas de aguas abajo van a la deriva. La nuestra lo hizo, brevemente. El arreglo pasa la aritmética por el calendario laboral para que la importación coincida con lo que Mermaid dibuja, y la prueba que lo vigila comprueba la propiedad y no fechas concretas: ningún inicio ni fin derivado puede caer en un día excluido. Las fechas que escribiste tú a mano se quedan donde las pusiste, sea fin de semana o no. Mover en silencio la fecha explícita de un autor es el tipo equivocado de amabilidad.
3. No hay forma de escapar caracteres. Los dos puntos abren la lista de campos y la coma separa campos, así que Fase 2: diseño, revisión se convierte en una tarea llamada «Fase 2» con campos basura. Mantén los dos puntos, las comas y los puntos y comas fuera de los nombres de tarea. Es la razón de que en el ejemplo de arriba los nombres estén escritos sin ellos. Al exportar sustituimos esos caracteres por espacios antes que emitir una línea que no se va a poder interpretar.
4. Una duración ilegible pasa a cero en silencio. Escribe 3dd y obtendrás una barra de longitud cero en lugar de un error. Repasa el diagrama en busca de tareas invisibles después de cualquier edición masiva: no aparecen en ningún sitio, ni siquiera como una línea vacía.
Los límites de un formato de diagrama
Mermaid gantt es un lenguaje de representación, no un motor de planificación, y la diferencia salta a la vista en cuanto quieres que el gráfico responda a una pregunta en lugar de ilustrar una respuesta que ya tenías.
- Sin recursos. No hay campo para quién hace el trabajo, ni coste, ni esfuerzo, ni unidades. No puedes sobreasignar a nadie en Mermaid porque Mermaid no sabe que exista nadie.
- Sin holgura y sin ruta crítica calculada.
crites un color que aplicas a mano. Nada recorre el grafo de dependencias, ni calcula fechas tempranas y tardías, ni te dice qué cadena manda sobre la fecha de fin. Un diagrama con todas las barras marcadascrites tan válido como uno sin ninguna. - Sin línea base. No hay dónde guardar lo que decía el plan el mes pasado, así que no hay desviación que enseñar ni retraso que medir.
- Solo fin-inicio.
afteres FS con desfase cero. Inicio-inicio, fin-fin, inicio-fin y cualquier desfase o adelanto no tienen dónde ir. Los planes reales están llenos de «empezar a probar tres días después de que arranque el desarrollo»: en Mermaid eso se convierte en una fecha fija y el enlace desaparece. - Sin porcentaje de avance. Una tarea al 40 % y otra al 90 % son las dos simplemente
active. - Secciones planas. No hay grupos anidados, así que una EDT de más de un nivel se aplana al entrar.
Nada de esto lo convierte en un mal formato. Lo convierte en un formato de publicación: excelente para enseñar un calendario, inútil para deducirlo. Y por eso importa la ida y vuelta.
Editar visualmente y pegar el texto de vuelta
Herramientas que renderizan Mermaid hay muchas. Lo que faltaba es la dirección contraria: arrastrar barras y recuperar la sintaxis.
- Pega o abre tu diagrama en gantts.app — un archivo
.mmd, o un.mdcon un bloque delimitado; los dos funcionan. Detecta el bloque gantt por su contenido, no por la extensión. - Comprueba el Calendario laboral.
excludes weekendsenciende el calendario, y ahí es donde añades los festivos que Mermaid no conoce: los nacionales, los de tu comunidad y el puente del convenio. - Arrastra, enlaza y cambia fechas como en cualquier otro gráfico. Con
Ajustarmueves un extremo de la barra y conMoverla desplazas entera sin tocar la duración. - Activa Ruta crítica. Lo que se raya no es lo que decía
criten el archivo, sino lo que sale de recorrer las dependencias que acabas de importar. - Si el plan te ha quedado con huecos porque las fechas venían clavadas del archivo, pulsa Reprogramar para compactar cada tarea a su fecha legal más temprana.
- Abre ⬇ Exportar ▸ 🧜 Mermaid gantt (texto). Ahí tienes Copiar al portapapeles si vas directo al README, o Descargar .mmd si el diagrama vive en su propio archivo dentro del repositorio.
- Pega, revisa el diff y haz commit. El bloque sale con la misma forma con la que entró, así que el diff enseña lo que ha cambiado de verdad y no un reformateo completo.
La ida y vuelta pierde información de una forma conocida y aburrida. El avance convierte el 100 % en done y cualquier valor entre 1 y 99 en active al salir; active vuelve a entrar como 50 %, una suposición que se te comunica en un aviso en lugar de dejar que la descubras en un informe de seguimiento tres semanas después. Los enlaces que no se pueden escribir como after —cualquiera con desfase, o cualquier relación SS, FF o SF— caen a fechas absolutas, que siguen siendo correctas aunque dejen de ser mantenibles.
Hay una asimetría deliberada, y no es un fallo: crit se exporta pero nunca se importa. Al salir es un valor derivado —el editor calculó la ruta crítica a partir del grafo de dependencias, así que la etiqueta es cierta en el momento en que se escribe—. Al entrar es una palabra que alguien tecleó en un archivo que puede llevar semanas sin tocarse, y fiarse de ella permitiría que un diagrama viejo pintara de rojo una cadena que ya no es crítica. Así que se escribe y luego se ignora: la ruta crítica que ves después de importar está recalculada, no afirmada.
Un efecto secundario útil si redactas calendarios con un LLM: pídele sintaxis gantt de Mermaid, pega la respuesta y ya tienes un gráfico editable con ruta crítica calculada. Sin clave de API y sin servidor de por medio.
excludes weekends resuelve sábados y domingos, pero el 1 de mayo, la Semana Santa y los festivos autonómicos hay que declararlos uno a uno con excludes 2026-05-01. Al importar, revisa el Calendario laboral antes de fiarte de las fechas.Preguntas frecuentes
¿Cómo se escribe un diagrama de Gantt en Mermaid?
Abre el bloque con gantt, añade dateFormat YYYY-MM-DD y después encabezados section con líneas de tarea debajo con la forma «Nombre :etiqueta, id, inicio, duración» — por ejemplo «Auditoria :done, aud, 2026-03-02, 5d».
¿5d en Mermaid incluye el día de inicio?
Sí. Una tarea de 5d que empieza el lunes día 5 termina el viernes día 9. Este cómputo inclusivo es la causa más habitual de errores de un día, y produce un diagrama que se renderiza perfectamente aunque todas las fechas estén corridas un día por tarea.
¿Cómo funcionan las dependencias en Mermaid gantt?
Se usa «after algúnId» como campo de inicio. Siempre es fin-inicio y sin desfase: inicio-inicio, fin-fin y los desfases no se pueden expresar. Puedes nombrar varias predecesoras, como en «after a b», y la tarea espera a la más tardía.
¿Salta after los fines de semana?
Sí, cuando el diagrama declara «excludes weekends». La sucesora de una tarea que acaba en viernes empieza el lunes, y su duración se cuenta en días laborables. Las herramientas que resuelven after sumando un día natural acaban colocando tareas en sábado dentro de un archivo que lo prohíbe.
¿Puede Mermaid calcular la ruta crítica?
No. La etiqueta crit es un color que aplicas a mano; nada en Mermaid recorre el grafo de dependencias ni calcula holguras. Por eso gantts.app exporta crit pero lo ignora al importar: la criticidad se recalcula a partir de las dependencias en lugar de fiarse de un archivo posiblemente obsoleto.
¿Puedo convertir un diagrama de Mermaid en un gráfico editable?
Sí. Abre el archivo .mmd o el Markdown en gantts.app, edítalo visualmente y usa ⬇ Exportar ▸ 🧜 Mermaid gantt (texto) para copiar de vuelta la sintaxis actualizada.
Plantillas que usan esto
Seguir leyendo
- Los cuatro tipos de dependencia
- Cómo se calcula la ruta crítica
- ¿Qué es un diagrama de Gantt?
- Ver todas las guías
Las guías que aún no se han traducido se abren en inglés.