Markdown com front matter YAML em .NET usando Markdig e YamlDotNet
Por Tiago Spana
Praticamente todo gerador de site estático usa o mesmo formato de arquivo: um bloco YAML no topo (o front matter) com metadados, seguido do conteúdo em Markdown.
---
title: "Meu post"
date: 2026-07-05
tags: [dotnet, markdown]
---
O conteúdo começa aqui...
Em .NET, a dupla Markdig + YamlDotNet resolve isso em poucas linhas.
Separando o front matter do corpo
O bloco YAML é delimitado por duas linhas ---. Dá para separar com um parser simples: leia a primeira linha (deve ser ---), acumule linhas até encontrar o próximo ---, e o restante é o corpo.
Desserializando o YAML
Com o bloco isolado, o YamlDotNet transforma o texto em um objeto tipado:
var deserializer = new DeserializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.IgnoreUnmatchedProperties()
.Build();
var meta = deserializer.Deserialize<FrontMatter>(yamlBlock);
O IgnoreUnmatchedProperties é importante: permite adicionar campos novos nos arquivos sem quebrar posts antigos.
Renderizando o corpo
O Markdig converte o restante para HTML. O pipeline com UseAdvancedExtensions() habilita tabelas, listas de tarefas, autolinks e outros recursos do "Markdown de verdade" que usamos no dia a dia:
var pipeline = new MarkdownPipelineBuilder()
.UseAdvancedExtensions()
.Build();
var html = Markdown.ToHtml(body, pipeline);
Por que não um banco de dados?
Para um blog, arquivos Markdown versionados no Git são o banco de dados: revisão de conteúdo vira pull request, histórico vira git log, e backup vira clone. A aplicação só precisa ler a pasta no startup e manter tudo em memória — com dezenas ou centenas de posts, isso custa poucos milissegundos.