discourse-to-markdown é um novo plugin que retorna o conteúdo do fórum em Markdown quando o cliente envia Accept: text/markdown ou adiciona .md a qualquer URL de conteúdo.
Estamos executando-o em nosso próprio fórum em https://discourse.roots.io:
curl -H "Accept: text/markdown" https://discourse.roots.io/latest
curl https://discourse.roots.io/t/serve-your-wordpress-posts-as-markdown/30321.md
O HTML é caro para alimentar um LLM, e servir Markdown que contém apenas o conteúdo frequentemente reduz o uso de tokens em 3–5x. Isso significa chamadas de API mais baratas, respostas mais rápidas e mais espaço na janela de contexto para o modelo raciocinar. Veja https://acceptmarkdown.com para o pitch completo e uma verificação de prontidão para qualquer site.
Como os clientes solicitam Markdown
Três pontos de entrada:
- Cabeçalho
Accept: text/markdown(ideal para LLMs) - Sufixo de URL
.md - Descoberta (cada resposta HTML anuncia seu irmão em Markdown via
Link: <...>; rel="alternate"; type="text/markdown"e uma tag<link rel="alternate">no<head>; feeds RSS carregam um<atom:link>apontando para o equivalente em Markdown)
Rotas suportadas
| Rota | HTML | Markdown |
|---|---|---|
| Tópico | /t/:slug/:id |
/t/:slug/:id.md |
| Postagem única | /t/:slug/:id/:post_number |
/t/:slug/:id/:post_number.md |
| Categoria | /c/:slug/:id |
/c/:slug/:id.md |
| Tag | /tag/:tag |
/tag/:tag.md |
| Mais recentes | /latest |
/latest.md |
| Topo | /top |
/top.md |
| Em alta | /hot |
/hot.md |
| Atividade do usuário | /u/:username/activity |
/u/:username/activity.md |
Instalação
Adicione o plugin ao seu app.yml:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/roots/discourse-to-markdown.git
Reconstrua o contêiner:
cd /var/discourse
./launcher rebuild app
Em seguida, ative-o em Admin → Configurações → Plugins → Saída Markdown.
Notas sobre a conversão
O plugin converte o HTML cooked do Discourse — a representação renderizada que os leitores veem, com oneboxes expandidas, menções linkadas e citações atribuídas — e não o raw. Isso preserva o que os leitores realmente veem e mantém a saída portável em qualquer renderizador compatível com GFM. Estruturas específicas do Discourse (citações, oneboxes, detalhes, menções, hashtags, emojis, lightboxes, enquetes) são reescritas de forma sensata antes da conversão.
O Markdown convertido é armazenado em cache no Redis por postagem, usando como chave post.id + post.updated_at, e edições invalidam automaticamente.
Configurações
| Configuração | Padrão | Propósito |
|---|---|---|
discourse_to_markdown_enabled |
false |
Interruptor mestre para o plugin |
discourse_to_markdown_md_urls_enabled |
true |
Aceitar sufixos de URL .md como irmão da rota HTML |
discourse_to_markdown_strict_accept |
false |
Retornar 406 Not Acceptable quando o cabeçalho Accept do cliente excluir tanto text/html quanto text/markdown |
discourse_to_markdown_emit_vary |
true |
Emitir Vary: Accept nas respostas Markdown e 406 para que caches não sirvam representações cruzadas |
discourse_to_markdown_include_post_metadata |
true |
Incluir URL, categoria, tags, autor e carimbos de data/hora na representação Markdown |
Recursos
- Código/fonte e issues: GitHub - roots/discourse-to-markdown: Serve Discourse content as Markdown via Accept: text/markdown or .md URLs — content negotiation for LLMs and agents. · GitHub
- acceptmarkdown.com — servir Markdown para agentes via negociação de conteúdo, além de verificação de prontidão para seu site
- RFC 9110 §12.5.1 — Negociação Proativa — a especificação que este plugin implementa
- RFC 7763 — registro do tipo de mídia
text/markdown - MDN — Negociação de conteúdo — introdução acessível ao conceito
- Veja acceptmarkdown.com/reference para a especificação completa + lista de documentação para desenvolvedores