Plugin Discourse para Markdown

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:

  1. Cabeçalho Accept: text/markdown (ideal para LLMs)
  2. Sufixo de URL .md
  3. 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