Hugin on steroids: tags, links e edição numa só TUI

Neste post
No post sobre o Hugin apresentei a ferramenta que uso para gerar tags e resumos nos meus blogs Hugo. Duas semanas depois, no post sobre o Munin, mostrei o irmão dele: um segundo programa que descobre e insere links internos entre posts usando embeddings e LLM.
Os dois funcionavam bem. Separados, funcionavam bem.
O problema de ter dois programas#
Na teoria, dividir responsabilidades entre ferramentas é uma boa prática. Na prática, o fluxo para processar um post novo era assim: abrir o Hugin, navegar até o post, gerar tags, gerar resumo, fechar o Hugin. Abrir o Munin, esperar o modelo de embeddings carregar, navegar até o mesmo post, verificar links existentes, gerar sugestões de links, aplicar. Se precisasse corrigir um typo no título que só apareceu depois de olhar o post no Hugin, fechar tudo e abrir o Pages CMS ou o vim.
Com 5 posts novos por semana, isso era um ritual de 20 minutos que poderia ser 5. O atrito não estava nas funcionalidades — estava na troca de contexto. Cada vez que eu saía de um programa e entrava no outro, perdia o fio do que estava fazendo. E a necessidade de ir ao Pages para corrigir uma frase ou um título com typo era o insulto final.
A decisão de unificar#
Não tinha jeito: ou eu continuava convivendo com a fricção ou fundia tudo. Escolhi fundir. O Munin deixou de existir como programa separado, e toda a sua funcionalidade foi absorvida pelo Hugin. O resultado é um único comando que faz tudo: tags, resumos, links internos, sugestões de tópicos e edição de posts.
O que antes eram dois programas com interfaces quase idênticas mas funções distintas virou uma única tela com todas as ações disponíveis por tecla. Você navega até um post e tem tudo ali: t para tags, s para resumo, i para links de entrada, o para links de saída, l para listar e remover links, u para sugestões de tópicos novos, e para editar o post. Sem fechar, sem reabrir, sem relocalizar.
O que mudou#
Editor embutido#
A novidade mais significativa é o editor interno. Ao teclar e, abre uma tela cheia com campos editáveis para cada campo do frontmatter — título, data, descrição, slug, draft — e um TextArea com syntax highlighting de Markdown para o corpo do post. Tags aparecem como read-only porque têm o t dedicado para isso.

O save é atômico: escreve num arquivo temporário e renomeia, exatamente como o Munin já fazia para links. Se o processo morrer no meio da escrita, o arquivo original continua intacto. E se você sair sem salvar, uma confirmação impede perdas acidentais.
Isso eliminou a necessidade de ir ao Pages CMS ou abrir o vim só para corrigir um parágrafo. As correções rápidas acontecem ali mesmo, sem sair do fluxo.
Indicador de loading#
Os spinners discretos na lista de posts foram substituídos por um modal com fundo semitransparente que aparece durante operações com o LLM. Não tem como não perceber que o programa está trabalhando. A mensagem muda conforme a operação: “Generating tags…”, “Finding outgoing links…”, “Suggesting new topics…”.
Parâmetros por projeto#
Cada blog agora tem seu próprio arquivo de configuração com parâmetros que afetam o comportamento do LLM. Acessível pela tecla p:
- Palavras do resumo — o número alvo que vai no prompt. Meu blog pessoal usa 28, o técnico usa 20.
- Estilo do resumo — uma instrução de tom que vai direto para o LLM. Em vez de escolher entre presets como “formal” ou “casual”, você escreve exatamente o que quer: “Write it engaging, causing on the reader the wish to read the full post.”
- Palavras por link — controla a densidade de links internos. Um blog com 400 posts pode se dar ao luxo de ser liberal (150 palavras por link). Um com 18 precisa ser mais conservador (400 ou mais).

Os parâmetros do projeto têm prioridade sobre os defaults globais. Se você não configurar nada, os valores do links.toml continuam valendo.
Drafts fora do embedding#
Posts em rascunho não aparecem mais como candidatos para links internos. E se você mudar um post publicado para draft, ele é automaticamente removido do índice de embeddings na próxima execução. Isso evita sugestões de links para posts que não existem no site publicado.
Cache mais confiável#
Dois problemas que me morderam em produção foram corrigidos. Primeiro: posts que tinham sido deletados ficavam como fantasmas no cache de embeddings, gerando sugestões de links para páginas que não existiam mais. Agora o find_similar verifica se o arquivo ainda existe no disco antes de retornar um resultado.
Segundo: URLs ficavam desatualizadas se a configuração de permalinks do Hugo mudasse. O Hugin agora re-resolve as URLs de todas as entradas do cache a cada inicialização, sem precisar limpar e reconstruir tudo.
Persistência entre sessões#
O tema do Textual (aquela paleta de cores que você escolhe com Ctrl+P) agora persiste entre execuções. E o post que estava selecionado quando você saiu do programa é restaurado automaticamente na próxima vez. Pequenos confortos que fazem diferença quando você usa a ferramenta todo dia.
O que ficou igual#
A arquitetura fundamental não mudou. O Hugin continua sendo uma TUI em Python que fala com qualquer endpoint compatível com a API OpenAI. Os motores, API keys e seleção de modelo funcionam exatamente como antes. Os prompts de tags e o normalizador são os mesmos. O sistema de embeddings continua local, sem gastar tokens. A escrita de links continua respeitando zonas protegidas do Markdown.
Se você já usava o Hugin e o Munin separados, a transição é simples: atualize o repositório e reinstale. O comando munin deixou de existir — tudo é hugin agora. O arquivo de configuração munin.toml continua sendo lido como fallback se links.toml não existir, então nada quebra.
Fluxo atual#
Meu fluxo para processar um post novo agora é LOST:
- L (List) — vejo os links que já existem no post
- O (Outgoing) — peço sugestões de novos links
- S (Summary) — gero o resumo
- T (Tags) — gero as tags
Tudo num único programa, sem trocar de janela, sem recarregar, sem perder o contexto. Se preciso corrigir algo no texto, e abre o editor ali mesmo.
Código#
O Hugin é open source:
Repositório: github.com/janiosarmento/hugin
Sysadmin, 53 anos, brasileiro trabalhando de casa para o mundo todo. Cuida de servidores Linux, containers LXC, e de gatos que não saem de cima do teclado.