<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Static on Giovanni Bassi</title><link>https://giggio.net/en/blog/tags/static/</link><image><url>https://giggio.net/images/base/logo-small.png</url><title>Static on Giovanni Bassi</title><link>https://giggio.net/en/blog/tags/static/</link></image><description>Static no site do Giovanni Bassi</description><generator>Hugo</generator><language>en</language><managingEditor>giggio@giggio.net (Giovanni Bassi)</managingEditor><webMaster>giggio@giggio.net (Giovanni Bassi)</webMaster><copyright>© 2025 Giovanni Bassi</copyright><lastBuildDate>Mon, 24 Mar 2025 15:00:00 -0300</lastBuildDate><atom:link href="https://giggio.net/en/blog/tags/static/index.xml" rel="self" type="application/rss+xml"/><item><title>Under the hood: creating a site with Hugo</title><link>https://giggio.net/en/blog/under-the-hood-creating-a-site-with-hugo/</link><pubDate>Mon, 24 Mar 2025 15:00:00 -0300</pubDate><author>giggio@giggio.net (Giovanni Bassi)</author><guid>https://giggio.net/en/blog/under-the-hood-creating-a-site-with-hugo/</guid><category>web</category><description>&lt;h3 id="evaluating-the-options"&gt;
 &lt;a href="#evaluating-the-options" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Evaluating the Options&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;When I decided to create a new website, the first option that came to mind was WordPress. I’ve been using it for many
years and I like it. Since I’m also well-versed in infrastructure, setting up a service in the cloud and running it is
very simple. It’s tempting.&lt;/p&gt;
&lt;p&gt;But there are performance challenges. While I maintained the Lambda3 site, we faced several problems. Initially, we
solved them with cache plugins, but over time, even that wasn’t enough, and we started using Cloudflare’s cache, which
in fact solved the problem definitively.&lt;/p&gt;
&lt;p&gt;It was a bit much: PHP + MariaDB + Cloudflare, all just to serve a static site. And it still needed plugins to write in
Markdown, which was what I wanted from the start. Wasn’t there a better solution?&lt;/p&gt;
&lt;p&gt;My main argument in favor of WordPress is its ecosystem of plugins, which is unbeatable. But for a static site, that
seemed excessive. I just wanted a site with a blog and a few sections. Did I really need all of that?&lt;/p&gt;
&lt;p&gt;Giving up WordPress meant having to deliver everything it and its plugins do. My minimum requirements included static
pages, a blog, and RSS. Along the way, other needs emerged: posts categorization and tagging, blocking generative AI
robots, image optimization, among others. Not to mention the common frontend needs, like compiling styles written in
Sass.&lt;/p&gt;
&lt;h3 id="choosing-hugo"&gt;
 &lt;a href="#choosing-hugo" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Choosing Hugo&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Decided to use a static site generator, I went to evaluate options. I wanted fast software, under constant development,
mature and free. It needed to meet my needs and offer flexibility for the future. &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; won, but
other good options were &lt;a href="https://astro.build/"&gt;Astro&lt;/a&gt;, &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;, and
&lt;a href="https://www.getzola.org/"&gt;Zola&lt;/a&gt;. I evaluated others, but these were the ones I considered the most. It’s been a while
since I made the decision for Hugo; I started the project months ago, and it was shelved for a while.&lt;/p&gt;
&lt;p&gt;Hugo met everything I needed. With almost &lt;a href="https://github.com/gohugoio/hugo"&gt;80 thousand stars on GitHub&lt;/a&gt;, it is a tool
in constant update, with almost 9 thousand commits. Made in Golang, it has good documentation and an active forum for
questions.&lt;/p&gt;
&lt;p&gt;Moreover, it features &lt;a href="https://themes.gohugo.io/"&gt;hundreds of themes&lt;/a&gt; distributed across the internet. Since I’m not a
designer, that was essential. I chose the &lt;a href="https://github.com/StaticMania/roxo-hugo"&gt;Roxo&lt;/a&gt; theme, which I ended up
completely customizing. The only thing that will still give me trouble is updating Bootstrap 4 to version 5, something
that isn’t so trivial.&lt;/p&gt;
&lt;h3 id="whats-good-about-hugo"&gt;
 &lt;a href="#whats-good-about-hugo" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;What’s Good About Hugo&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;h4 id="development-experience"&gt;
 &lt;a href="#development-experience" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Development Experience&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;The development experience with Hugo is excellent. The built-in server, started with &lt;code&gt;hugo server&lt;/code&gt;, runs the site and
hot reloads whenever a file is changed. Changes in CSS don’t even reload the page; they are applied dynamically. On my
machine, a Markdown post takes 22ms to process, and the entire site half a second. On GitHub Actions, the build takes
2.5s, so YMMV. Template development is equally fast; you save and immediately see the result, without delay. The
experience is the same as developing a dynamic site with server-side rendering, and with immediate feedback, somewhat
better than working on an Angular or React SPA.&lt;/p&gt;
&lt;h4 id="flexibility"&gt;
 &lt;a href="#flexibility" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Flexibility&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;With Hugo, you have full control over HTML, CSS, and JavaScript. You don’t depend on whoever wrote a plugin to adapt it
to get to the result you want. There are plugins for Hugo (called modules), but the most common is to
find code snippets to customize as needed. Since it is very extensible, that’s enough. I really liked this approach,
which allows for enormous freedom.&lt;/p&gt;
&lt;h4 id="template-system"&gt;
 &lt;a href="#template-system" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Template System&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;Hugo uses HTML templates to structure the site and Markdown for content. This is useful because metadata remains in the
&lt;a href="https://gohugo.io/content-management/front-matter/"&gt;front matter&lt;/a&gt;, facilitating translations, RSS, and other features.&lt;/p&gt;
&lt;p&gt;Its template system is powerful. The templates are divided into &lt;a href="https://gohugo.io/templates/types/"&gt;types&lt;/a&gt;, such as
sections (lists of pages) and individual pages. There is support for partials, allowing for the componentization of
reusable elements like header and footer.&lt;/p&gt;
&lt;p&gt;The templates can generate any format, such as JSON, XML, or others. This is essential for features like
&lt;a href="https://giggio.net/pt-br/sitemap.xml"&gt;sitemap.xml&lt;/a&gt; and RSS.&lt;/p&gt;
&lt;h4 id="data-features"&gt;
 &lt;a href="#data-features" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Data Features&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;At the footer there is a section of podcasts I listen to and blogs I read. Both were built using a Hugo feature to
reference &lt;a href="https://gohugo.io/content-management/data-sources/"&gt;data sources&lt;/a&gt;. You can create CSV, JSON, TOML, YAML, and
XML files (I used YAML) and use them as a source.&lt;/p&gt;
&lt;p&gt;For example, creating a YAML data file for podcasts, like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Medo e delírio em Brasília&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://medoedelirioembrasilia.com.br/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Hipsters.tech&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://www.hipsters.tech/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then using it, like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go-html-template" data-lang="go-html-template"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;hugo&lt;/span&gt;&lt;span class="na"&gt;.Data.podcasts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="shortcodes-and-code-fences"&gt;
 &lt;a href="#shortcodes-and-code-fences" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Shortcodes and Code Fences&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;There are also &lt;a href="https://gohugo.io/content-management/shortcodes/"&gt;shortcodes&lt;/a&gt;, which are ways to easily create HTML,
like embedding a YouTube video, or creating code with &lt;em&gt;syntax highlighting&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; youtube EFAe8W3n2ks &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The codes above were generated solely with &lt;a href="https://gohugo.io/content-management/syntax-highlighting/"&gt;&lt;em&gt;code fences&lt;/em&gt;&lt;/a&gt; —
those codes with three or four backticks in the markdown — and they use a shortcode under the hood. This is an example
of code fences with &lt;code&gt;yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```yaml
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="taxonomy"&gt;
 &lt;a href="#taxonomy" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Taxonomy&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;Hugo has a taxonomy system, which is a way to categorize your pages. The most common, and what I’m using, are categories
and tags for blog posts, but you could use it to organize anything. I also used it to build pages for types of
contributions (for example, &lt;a href="http://giggio.net/participations/kinds/videos/"&gt;videos&lt;/a&gt; – check its code on
&lt;a href="https://github.com/giggio/giggionet/tree/main/content/participationkinds"&gt;Github&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The example they use in the &lt;a href="https://gohugo.io/content-management/taxonomies/"&gt;documentation&lt;/a&gt; is with movies and actors.
Thus, a movie page can list its actors. Actor is the &lt;code&gt;taxonomy&lt;/code&gt;, the actor’s name becomes the &lt;code&gt;term&lt;/code&gt;. The cool thing is
that you can create pages for these classifications, both for the taxonomy and for the term. That’s how I have here the
&lt;a href="https://giggio.net/blog/categories/"&gt;categories&lt;/a&gt; page, &lt;a href="https://giggio.net/blog/tags/"&gt;tags&lt;/a&gt;, and each of their terms,
such as the tag &lt;a href="https://giggio.net/blog/tags/blog/"&gt;blog&lt;/a&gt;. The pages, the taxonomies, and the terms are data that you
can manipulate.&lt;/p&gt;
&lt;h4 id="build"&gt;
 &lt;a href="#build" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Build&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;During the build, all pages are generated, the entire site. With the dev server running you can choose whether to
rebuild everything or just the page that changed. It builds the lists of pages, the taxonomies, everything. It also
caches everything it did, such as image manipulations and files it may have downloaded.&lt;/p&gt;
&lt;p&gt;Hugo supports environments. In dev, it doesn’t optimize anything (and this is configurable). The prod build, on the
other hand, can do a series of things. Just look at what happens on my site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sass compilation, concatenation of all CSS, tree shaking (with PostCSS), minification, and fingerprinting.&lt;/li&gt;
&lt;li&gt;Optimization of all images, which are converted to webp and in some cases resized.&lt;/li&gt;
&lt;li&gt;HTML minification&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also perform critical CSS analysis with the &lt;a href="https://github.com/addyosmani/critical"&gt;critical&lt;/a&gt; tool, which is run for
each individual page. I also generate search with &lt;a href="http://pagefind.app/"&gt;pagefind&lt;/a&gt; (you can try it
&lt;a href="https://giggio.net/en/search/"&gt;at /search&lt;/a&gt; – and I admit I spent little time on it, but it’s working).&lt;/p&gt;
&lt;p&gt;This happens locally, if I want to test, and also using the
&lt;a href="https://github.com/giggio/giggionet/blob/main/.github/workflows/build-hugo.yaml"&gt;workflow&lt;/a&gt; from GitHub Actions, which
also performs linting and spell checking (with &lt;a href="https://cspell.org/"&gt;cspell&lt;/a&gt;).&lt;/p&gt;
&lt;h4 id="other-features"&gt;
 &lt;a href="#other-features" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Other Features&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hugo supports multiple languages, and I’m using that on this site (click the little flag at the top in the header).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The index, at the beginning of this post, was also built using a page metadata, the
&lt;a href="https://gohugo.io/methods/page/tableofcontents/"&gt;.TableOfContents&lt;/a&gt; (check out
&lt;a href="https://github.com/giggio/giggionet/blob/b7be46d67eeb539459c4d51d5a16f15468f086d9/layouts/blog/single.html#L37"&gt;the source code&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can use external resources that can be downloaded, such as an image, or a CSS file, or JSON, and then process them
and generate content from them. That’s how I’m generating my &lt;a href="http://giggio.net/robots.txt"&gt;robots.txt&lt;/a&gt; file (see the
source &lt;a href="https://github.com/giggio/giggionet/blob/b7be46d67eeb539459c4d51d5a16f15468f086d9/layouts/robots.txt"&gt;on Github&lt;/a&gt;),
like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go-html-template" data-lang="go-html-template"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resources&lt;/span&gt;&lt;span class="na"&gt;.GetRemote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://link/para/robots.json&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(notice the &lt;code&gt;try&lt;/code&gt;?)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The integration with Node.js resources is excellent, thanks to the ability to mount directories and files. You can
specify that any directory should be available for the site, and when accessing the resource, it copies the necessary
files. That’s how I’m doing it with the files from &lt;a href="https://fontawesome.com/search"&gt;Font Awesome&lt;/a&gt;, check out how
the
&lt;a href="https://github.com/giggio/giggionet/blob/b7be46d67eeb539459c4d51d5a16f15468f086d9/config/_default/hugo.yaml#L147C3-L155"&gt;configuration file&lt;/a&gt;
looks:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;node_modules/@fortawesome/fontawesome-free&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;assets/css/fontawesome&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="what-could-improve"&gt;
 &lt;a href="#what-could-improve" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;What Could Improve&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Hugo’s main problem is the lack of debugging. When you’re deep into template developing and something doesn’t work
as you’d like, ideally you would be able to debug the problem while the site is being generated, but the tool does not
offer that.&lt;/p&gt;
&lt;p&gt;We’re stuck with good and old writing to HTML approach, using the &lt;code&gt;debug.Dump&lt;/code&gt; instruction, when the result appears
directly in the HTML, or the &lt;code&gt;warnidf&lt;/code&gt; function, which generates a log in the terminal. It helps, but it’s an experience
that could be improved. I struggled a bit until I discovered that these existed, so here’s a tip for those who are
starting.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;
 &lt;a href="#conclusion" class="site-blog-post-header"&gt;
 &lt;span class="site-blog-post-header-text"&gt;Conclusion&lt;/span&gt;
 &lt;i class="fa-solid fa-link site-blog-post-header-paragraph"&gt;&lt;/i&gt;
 &lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;I still have more to say about Hugo, but this post is already long. The main point is that Hugo is an excellent tool for
static sites. It perfectly solved my problem, it’s a pleasure to use, and from what I see, it will continue to serve me
for a long time.&lt;/p&gt;
&lt;p&gt;I still have more to talk about regarding the entire structure around it, such as how I used GitHub Pages, the use of
Nix to structure the tools, and much more, and that will also be saved for future posts.&lt;/p&gt;
&lt;p&gt;What do you think of Hugo? Comment below!&lt;/p&gt;</description></item></channel></rss>