<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hugo on /var/log/janio</title><link>https://devops.sarmento.org/en/tags/hugo/</link><description>Recent content in Hugo on /var/log/janio</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 18 Apr 2026 13:19:00 +0000</lastBuildDate><atom:link href="https://devops.sarmento.org/en/tags/hugo/index.xml" rel="self" type="application/rss+xml"/><item><title>Hugin on steroids: tags, links and editing in one TUI</title><link>https://devops.sarmento.org/en/posts/hugin-on-steroids-tags-links-and-editing-in-one-tui/</link><pubDate>Sat, 18 Apr 2026 13:13:00 +0000</pubDate><guid>https://devops.sarmento.org/en/posts/hugin-on-steroids-tags-links-and-editing-in-one-tui/</guid><description>&lt;p&gt;In the &lt;a href="https://devops.sarmento.org/en/posts/hugin-tags-and-summaries-for-hugo-with-ai/"&gt;post about Hugin&lt;/a&gt; I introduced the tool I use to generate tags and summaries for my Hugo blogs. Two weeks later, in the &lt;a href="https://devops.sarmento.org/en/posts/munin-internal-links-for-hugo-with-ai/"&gt;post about Munin&lt;/a&gt;, I showed its sibling: a second program that discovers and inserts internal links between posts using embeddings and an LLM.&lt;/p&gt;
&lt;p&gt;Both worked well. Separately, they worked well.&lt;/p&gt;
&lt;h2 id="the-problem-with-having-two-programs"&gt;The problem with having two programs&lt;/h2&gt;
&lt;p&gt;In theory, splitting responsibilities between tools is good practice. In practice, the workflow for processing a new post looked like this: open Hugin, navigate to the post, generate tags, generate summary, close Hugin. Open Munin, wait for the embedding model to load, navigate to the same post, check existing links, generate link suggestions, apply. If you needed to fix a typo in the title that only showed up after reviewing the post in Hugin, close everything and open Pages CMS or vim.&lt;/p&gt;</description></item><item><title>Hugin: tags and summaries for Hugo with AI</title><link>https://devops.sarmento.org/en/posts/hugin-tags-and-summaries-for-hugo-with-ai/</link><pubDate>Fri, 17 Apr 2026 11:06:00 +0000</pubDate><guid>https://devops.sarmento.org/en/posts/hugin-tags-and-summaries-for-hugo-with-ai/</guid><description>&lt;p&gt;Anyone who maintains a &lt;a href="https://devops.sarmento.org/posts/why-leave-wordpress-and-what-to-build-instead-with-hugo-pages-cms-and-cloudflare/"&gt;static blog with Hugo&lt;/a&gt; knows there are two tasks nobody enjoys: classifying posts with tags and writing meta descriptions. These are the things you skip when publishing because the post is already done, the deploy is set up, and choosing between &amp;ldquo;selfhosted&amp;rdquo; and &amp;ldquo;self-hosted&amp;rdquo; isn&amp;rsquo;t exactly the best use of your time. The result is predictable: posts without tags, empty descriptions or ones copied from the first paragraph, and a taxonomy that hurts more than it helps.&lt;/p&gt;</description></item><item><title>Munin: internal links for Hugo with AI</title><link>https://devops.sarmento.org/en/posts/munin-internal-links-for-hugo-with-ai/</link><pubDate>Fri, 17 Apr 2026 10:49:00 +0000</pubDate><guid>https://devops.sarmento.org/en/posts/munin-internal-links-for-hugo-with-ai/</guid><description>&lt;p&gt;In the &lt;a href="https://devops.sarmento.org/en/posts/hugin-tags-and-summaries-for-hugo-with-ai/"&gt;post about Hugin&lt;/a&gt; I explained how I solved the tag and summary problem on my Hugo blog. But there was another problem, less obvious and more annoying: internal links. Those links that connect one post to another, help readers navigate related content, and that Google loves to see on a well-structured site.&lt;/p&gt;
&lt;p&gt;The truth is nobody links anything. You write a post about systemd timers, another about cron, another about launchd — and none of the three mentions the others. They&amp;rsquo;re content islands that could be connected. The obvious solution is to reread every post, remember which others exist, and manually insert links. With 30 posts, it&amp;rsquo;s doable. With 400, it&amp;rsquo;s insane.&lt;/p&gt;</description></item><item><title>From WordPress to Hugo: Theming Is Not What You Think</title><link>https://devops.sarmento.org/en/posts/from-wordpress-to-hugo-theming-is-not-what-you-think/</link><pubDate>Sat, 04 Apr 2026 15:20:00 +0000</pubDate><guid>https://devops.sarmento.org/en/posts/from-wordpress-to-hugo-theming-is-not-what-you-think/</guid><description>&lt;p&gt;Anyone who has worked with WordPress long enough develops a strong intuition for what a theme is and what it does. That intuition serves you well within the ecosystem: it guides decisions about file structure, where to put logic, and how to extend functionality. The trouble starts when you move to Hugo and try to apply the same mental model. The vocabulary overlaps — templates, layouts, partials — but what those words mean in practice is radically different.&lt;/p&gt;</description></item><item><title>The Dark Side of Free Website: Limits and Alternatives for Hugo + GitHub + Cloudflare Pages + Pages CMS</title><link>https://devops.sarmento.org/en/posts/o-lado-b-do-site-gratis-limites-e-alternativas-para-hugo-github-cloudflare-pages-pages-cms/</link><pubDate>Tue, 24 Mar 2026 10:45:00 +0000</pubDate><guid>https://devops.sarmento.org/en/posts/o-lado-b-do-site-gratis-limites-e-alternativas-para-hugo-github-cloudflare-pages-pages-cms/</guid><description>&lt;p&gt;In a &lt;a href="https://devops.sarmento.org/en/posts/why-leave-wordpress-and-what-to-build-instead-with-hugo-pages-cms-and-cloudflare/"&gt;previous post&lt;/a&gt;, we put together a complete blog with Hugo, GitHub, Cloudflare Pages, and Pages CMS without spending a cent. The stack works, it is fast, and for most personal blogs it will keep working for a long time without asking anything in return. But &amp;ldquo;free&amp;rdquo; does not mean &amp;ldquo;without limits,&amp;rdquo; and understanding where the walls are before you hit them is the kind of thing that saves headaches down the road.&lt;/p&gt;</description></item><item><title>Comments on static sites with Isso — lightweight, self-hosted, and tracking-free</title><link>https://devops.sarmento.org/en/posts/comments-on-static-sites-with-isso-lightweight-self-hosted-and-tracking-free/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://devops.sarmento.org/en/posts/comments-on-static-sites-with-isso-lightweight-self-hosted-and-tracking-free/</guid><description>&lt;p&gt;A static site has no backend. No database, no application server processing requests — and that&amp;rsquo;s exactly what makes it fast, cheap, and resilient. But that simplicity comes at a cost when you need anything that depends on persistent state, and comments are the most obvious case. In WordPress or Ghost, the commenting system is part of the application. In a site generated by Hugo, Jekyll, or Eleventy, that layer simply doesn&amp;rsquo;t exist.&lt;/p&gt;</description></item><item><title>Why leave WordPress — and what to build instead with Hugo, Pages CMS, and Cloudflare</title><link>https://devops.sarmento.org/en/posts/why-leave-wordpress-and-what-to-build-instead-with-hugo-pages-cms-and-cloudflare/</link><pubDate>Fri, 20 Mar 2026 00:10:00 +0000</pubDate><guid>https://devops.sarmento.org/en/posts/why-leave-wordpress-and-what-to-build-instead-with-hugo-pages-cms-and-cloudflare/</guid><description>&lt;h2 id="why-leave-wordpress"&gt;Why leave WordPress&lt;/h2&gt;
&lt;h3 id="the-weight-of-running-a-dynamic-cms"&gt;The weight of running a dynamic CMS&lt;/h3&gt;
&lt;p&gt;WordPress is an extraordinary piece of software that powers nearly half the internet. That said, keeping a WordPress installation healthy is a job that never ends. Every visit to your site triggers a chain of events: the server receives the request, PHP wakes up, queries MySQL, assembles the page on the fly, and sends the HTML back to the browser. Multiply that by a hundred simultaneous visitors and you have a server sweating to deliver pages that, on most blogs, are exactly the same for everyone.&lt;/p&gt;</description></item></channel></rss>