<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tech on Gauri G</title><link>https://gaurig.com/tags/tech/</link><description>Recent content in Tech on Gauri G</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 22 Sep 2026 19:44:01 -0400</lastBuildDate><atom:link href="https://gaurig.com/tags/tech/index.xml" rel="self" type="application/rss+xml"/><item><title>Hugo Blog Setup</title><link>https://gaurig.com/post/hugo-blog-setup/</link><pubDate>Tue, 22 Sep 2026 19:44:01 -0400</pubDate><guid>https://gaurig.com/post/hugo-blog-setup/</guid><description>&lt;img src="https://gaurig.com/post/hugo-blog-setup/cover.png" alt="Featured image of post Hugo Blog Setup" /&gt;&lt;p&gt;I am no frontend wizard, yet I was able to set up a fully customizable website for my blog largely thanks to Hugo.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="hugo-a-static-site-generator"&gt;Hugo: A Static Site Generator&#10;&lt;/h2&gt;&lt;p&gt;Hugo enables you to write your content in Markdown files. It then works its Go magic to turn those Markdown files into HTML and renders this HTML through your chosen theme&amp;rsquo;s templates at build time. Combined with the theme&amp;rsquo;s CSS and JavaScript, the output is a folder of static files easy for any web server to host. Full flexibility, full ownership, none of the frontend hassle.&lt;/p&gt;&#10;&lt;p&gt;The following is a walkthrough of my end-to-end setup and blogging flow.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="the-setup"&gt;The Setup&#10;&lt;/h2&gt;&lt;h3 id="toolkit"&gt;Toolkit&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Job&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Tool&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;What it does&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Site generator&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Hugo (Extended)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Turns Markdown into static HTML&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Theme&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Stack&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Layout and styling&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Version control&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Git&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tracks every change to the site&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Code hosting&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GitHub&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Stores the repo&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Build and deploy&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GitHub Actions&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Builds the site on every push&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Hosting&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GitHub Pages&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Serves the built files&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Domain&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Namecheap&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Points gaurig.com at the site&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="installing-hugo"&gt;Installing Hugo&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;The first step&lt;/strong&gt; was to install Hugo and make a new project. I then picked a theme from &lt;a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener"&#10; &gt;Hugo&amp;rsquo;s theme repository&lt;/a&gt; and set it up as a submodule within my project&amp;rsquo;s &lt;code&gt;themes/&lt;/code&gt; folder. It could also be set up as a Go module, but for that I&amp;rsquo;d need to install Go on my machine. I chose the Stack theme because it is one of Hugo&amp;rsquo;s most popular themes and is well maintained, which makes it a good bet for my blog&amp;rsquo;s longevity.&lt;/p&gt;&#10;&lt;blockquote class="alert alert-tip"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;💡&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;What is a Git submodule?&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;A Git submodule embeds one Git repository inside another. Although the theme&amp;rsquo;s files are physically present on your filesystem, committing to the parent repository does not put those individual files into the parent&amp;rsquo;s commit. Instead, Git stores a link to the theme&amp;rsquo;s repository and the exact commit you are using. That keeps the theme separate from your own code, and you choose when to update it.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;blockquote class="alert alert-note"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;📝&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;Note&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;If you are a WSL user like me, you may find that your distro&amp;rsquo;s (in my case, Ubuntu) package repository carries an older version of Hugo, so &lt;code&gt;sudo apt install hugo&lt;/code&gt; will not be sufficient. Instead, download the latest extended release from &lt;a class="link" href="https://github.com/gohugoio/hugo/releases" target="_blank" rel="noopener"&#10; &gt;Hugo&amp;rsquo;s GitHub releases page&lt;/a&gt;, unpack it, move the &lt;code&gt;hugo&lt;/code&gt; binary into &lt;code&gt;~/.local/bin&lt;/code&gt;, and add that folder to your &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;blockquote class="alert alert-warning"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;⚠️&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;Warning&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;Always make sure your Hugo version and your theme version are compatible. Themes declare the minimum Hugo version they need (in Stack&amp;rsquo;s case, in its &lt;code&gt;theme.toml&lt;/code&gt;), and a mismatch can cause build errors or missing features.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="populating-gitignore"&gt;Populating .gitignore&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;The second step&lt;/strong&gt; was to set up a base &lt;code&gt;.gitignore&lt;/code&gt;, which tells Git which files to leave out of version control. Mine is short, and everything in it is either generated by Hugo or specific to my machine:&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Entry&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Why it is ignored&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/public/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;The built site that the &lt;code&gt;hugo&lt;/code&gt; command generates. GitHub Actions builds a fresh copy on every push, so committing it would be redundant.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/.hugo_build.lock&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;An empty lock file Hugo creates while building to stop two builds from running at once. It means nothing on another machine.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/resources/_gen/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Hugo&amp;rsquo;s cache of processed assets, such as compiled SCSS and resized images. Hugo regenerates it whenever it is missing.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/content/.obsidian/workspace.json&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;My &lt;code&gt;content/&lt;/code&gt; folder is also an Obsidian vault, and this file records which notes and panes I have open. It changes constantly and only matters locally. Committing it would only add noise.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="build-and-deployment"&gt;Build and Deployment&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;The final step&lt;/strong&gt; was deployment. Rather than building the site by hand and uploading it, I let a GitHub Actions workflow do it: every push to &lt;code&gt;main&lt;/code&gt; builds the site and publishes it to GitHub Pages. The workflow is a YAML file at &lt;code&gt;.github/workflows/hugo.yaml&lt;/code&gt; and it has two jobs. The &lt;code&gt;build&lt;/code&gt; job runs on a fresh Ubuntu machine:&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Step&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;What it does&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Checkout&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Pulls down the repo, including the theme submodule (&lt;code&gt;submodules: recursive&lt;/code&gt;).&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Setup Hugo&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Installs the extended version of Hugo, which Stack needs to compile its SCSS.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Build&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Runs &lt;code&gt;hugo --gc --minify&lt;/code&gt;, which clears unused cache files and minifies the output into &lt;code&gt;public/&lt;/code&gt;.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Upload artifact&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Packages &lt;code&gt;public/&lt;/code&gt; so the next job can use it.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;blockquote class="alert alert-tip"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;💡&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;Tip&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;My workflow pins Hugo to a specific version (&lt;code&gt;0.166.0&lt;/code&gt;, the same one I use locally) instead of installing the latest release on every run. That way a new Hugo release can&amp;rsquo;t unexpectedly clash with the theme or break the build. When I want to upgrade, I update the version in &lt;code&gt;hugo.yaml&lt;/code&gt; and on my own machine at the same time.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;The &lt;code&gt;deploy&lt;/code&gt; job waits for &lt;code&gt;build&lt;/code&gt; to succeed, then publishes that package to GitHub Pages using a fresh machine. For this to work, the repository&amp;rsquo;s Pages source in GitHub (under Settings, then Pages) has to be set to GitHub Actions.&lt;/p&gt;&#10;&lt;p&gt;To serve the site from my own domain, I entered it in the Pages settings, enabled HTTPS, and added DNS records in Namecheap that point to GitHub&amp;rsquo;s IPs. GitHub Pages now serves my website at gaurig.com.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="the-flow"&gt;The Flow&#10;&lt;/h2&gt;&lt;h3 id="toolkit-1"&gt;Toolkit&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Job&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Tool&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;What it does&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Writing&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Obsidian&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Markdown editor. My &lt;code&gt;content/&lt;/code&gt; folder is an Obsidian vault, so I write posts in the same files Hugo publishes&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Research and drafting&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Claude (desktop app)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Helps me research topics and draft and edit posts, using a Claude project set up for this blog&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Customization&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Claude Code in VS Code&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AI coding assistant that works directly in the repository for code-level changes to the site&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="obsidian"&gt;Obsidian&#10;&lt;/h3&gt;&lt;p&gt;Now comes the fun part: creating content. My editing workspace for posts is Obsidian. It is yet another Markdown-based tool, which is exactly why it pairs so well with Hugo. Besides, VS Code is not the nicest place to edit Markdown. I turned my &lt;code&gt;content/&lt;/code&gt; folder into an Obsidian vault by opening it in Obsidian, which creates a &lt;code&gt;.obsidian/&lt;/code&gt; folder inside it for the app&amp;rsquo;s settings. Now I just edit away in Obsidian&amp;rsquo;s nice live-preview editor interface.&lt;/p&gt;&#10;&lt;blockquote class="alert alert-warning"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;⚠️&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;Warning&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;Obsidian and Hugo do not speak exactly the same Markdown. Both understand standard Markdown, including GitHub-style tables and task lists. But Obsidian adds its own syntax on top, such as &lt;code&gt;[[wikilinks]]&lt;/code&gt;, &lt;code&gt;==highlights==&lt;/code&gt; and &lt;code&gt;%%comments%%&lt;/code&gt;, which Hugo does not recognize and prints as literal text. The reverse is also true: Hugo has shortcodes, such as &lt;code&gt;{{&amp;lt; youtube &amp;gt;}}&lt;/code&gt; for embedding a video, that only Hugo knows how to turn into HTML. Obsidian does not recognize them and shows them as plain text, but they can stay in a post, because Hugo replaces them with the embedded video when it builds the site. I will have a tip to tackle these differences later in the post.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="claude-code-and-vs-code"&gt;Claude Code and VS Code&#10;&lt;/h3&gt;&lt;p&gt;This bit is pretty straightforward. I do all customization work in VS Code with Claude Code as my harness. In claude.md, I specify instructions such that Claude Code knows not to touch my &lt;code&gt;themes/hugo-theme-stack/&lt;/code&gt; folder as it is a submodule, and instead use Hugo&amp;rsquo;s project-level overrides. These work because Hugo checks my project&amp;rsquo;s own folders, such as &lt;code&gt;layouts/&lt;/code&gt;, &lt;code&gt;assets/&lt;/code&gt; and &lt;code&gt;static/&lt;/code&gt;, before it looks in the theme. If I add a file at the same path as one in the theme, Hugo uses mine instead, so I can change how the site looks and behaves without ever editing the theme itself.&lt;/p&gt;&#10;&lt;h3 id="claude-mcp-and-a-project"&gt;Claude, MCP and a project&#10;&lt;/h3&gt;&lt;p&gt;For research, drafting and editing, I use the Claude desktop app with two things set up.&lt;/p&gt;&#10;&lt;p&gt;The first is a connection to my Hugo project through MCP (Model Context Protocol), an open standard that lets Claude reach tools and data outside the chat. I installed the Filesystem extension (MCP under the hood) and gave it access to my Hugo project folder and nothing else. Claude can now read my Hugo project, its posts and edit my content directly instead of me copying text back and forth.&lt;/p&gt;&#10;&lt;p&gt;The second is a Claude project dedicated to this blog. Its instructions tell Claude that my local Hugo project is the source of truth, to inspect the installed Stack theme before suggesting any theme-specific feature, and to leave the theme folder alone. That way it works with the site I actually have instead of guessing from general knowledge.&lt;/p&gt;&#10;&lt;blockquote class="alert alert-tip"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;💡&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;Tip&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;The Obsidian and Hugo Markdown differences above are easy to avoid if my writing assistant knows about them. In my Claude project&amp;rsquo;s instructions, I tell Claude to use only Hugo-compatible Markdown and to avoid Obsidian-only syntax such as wikilinks, so anything it drafts or edits for me publishes correctly.&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="blogging-pipeline"&gt;Blogging Pipeline&#10;&lt;/h3&gt;&lt;p&gt;This is the path a post takes from a blank page to the live site:&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10; A["Write in Obsidian (content/post)"] --&gt; B["Review with Claude"]&#10; B --&gt; C["Customize with Claude Code (when needed)"]&#10; C --&gt; D["Test locally with hugo server"]&#10; D --&gt; E["Commit"]&#10; E --&gt; F["Push to main"]&#10; F --&gt; G["GitHub Actions builds and deploys"]&#10; G --&gt; H["Live at gaurig.com"]&lt;/pre&gt;&lt;p&gt;Customization only comes into play when a post needs a change to the site itself, such as a layout override. Everything after the push happens automatically: GitHub Actions builds the site and GitHub Pages serves it.&lt;/p&gt;&#10;&lt;p&gt;You can see all the details, including the workflow, &lt;code&gt;.gitignore&lt;/code&gt; and setup script, in my &lt;a class="link" href="https://github.com/guptg/guptg.github.io" target="_blank" rel="noopener"&#10; &gt;public repository on GitHub&lt;/a&gt;.&lt;/p&gt;&#10;</description></item></channel></rss>