📅 Saturday, Mar 22, 2025
⏰ 10:00:00
🔄 Saturday, Mar 22, 2025 10:00:00
📖 Reading time: 8 min
As a Software Engineer, You can’t write a blog without first building a blog. So here I am, writing a blog about building a blog… I recently launched my personal site, powered by Hugo, Go, and GitHub Actions.
In this post, I’ll walk you through how I set everything up, from installing Hugo to picking a theme that didn’t make my site look like it was designed in 1998.
I chose Hugo for the same reason I choose black coffee and CLI tools.. it’s fast, simple, and gets the job done. This thing is so fast, I could rebuild my entire site in the time it takes WordPress to load a settings page. Hugo fits into my workflow perfectly. No databases, no bloated UI, just markdown, Go, and lightning-fast builds.
To get started:
One of the best things about using Hugo is the amazing selection of open-source themes. Seriously, there’s a theme for everything. Want a minimalist, typography-focused blog? There’s a theme for that. Need something that looks like it belongs in a cyberpunk movie? There’s a theme for that too. Want your site to look like a 1999 Geocities page? Well… you could do that, but let’s not.
Picking a theme should be simple, right? Wrong. This is the ultimate developer dilemma.. Spend actual time writing blog posts, or endlessly tweak the theme until it’s perfect? (Spoiler: It’s never perfect.)
I started off browsing the official Hugo theme gallery.
I found sleek, modern themes with dark mode (a necessity, obviously ☕).
Themes that had just the right amount of typography finesse to make me feel like a professional writer.
And themes so minimalist that they were almost just a blank page. (“Simplicity!” the theme description proudly declared. “Where’s my content?” I asked.)
Customizing: Because We Can’t Leave Well Enough Alone 🛠️ Of course, I could have just picked a theme and been done with it. But where’s the fun in that?
This is how all Hugo users end up with a half-stock, half-custom Frankenstein theme that mostly works until the next theme update breaks something. But hey, that’s the price of perfection.
The Final Choice: Function Over Perfection 🚀 After much overthinking, I finally landed on Terminal Hugo theme. I decided on this theme because it was:
It was as easy as,
git submodule add https://github.com/panr/hugo-theme-terminal.git themes/terminal
Then, I customized the hugo.yaml
to fine-tune the appearance.
And just like that, my blog finally had a look that fit my style.
Well… for now.
Once I had built my blog with Hugo, the next big question was: Where do I host this thing? I mean, I could spin up a Kubernetes cluster, set up a load balancer, configure auto-scaling, and make my personal blog more resilient than most production applications… or I could just use GitHub Pages.
GitHub Pages is like the free lunch of static site hosting—simple, reliable, and doesn’t ask for much in return. No servers to manage, no databases to worry about, just push to a repo and let GitHub Actions do its thing.
Also, let’s be real, nothing feels more DevOps-y than having my blog live in a git repo, with every update triggered by a commit. CI/CD for blog posts? Absolutely.
Now, even though GitHub Pages gives me free hosting, I still wanted my own custom domain because nothing screams “I take myself seriously” like a .net.
Enter Cloudflare—the Swiss Army knife of DNS and web performance.
With Cloudflare, I get:
Setting it up was as simple as:
Pointing my custom domain to Cloudflare.
Adding DNS records to direct traffic to GitHub Pages.
Enabling HTTPS and feeling like a cybersecurity expert.
And just like that—boom! My blog is online, and secured.
Since I wanted my site to be accessible at patricknelson-devops.net
and www.patricknelson-devops.net
,
I had to configure an apex domain (a.k.a. root domain), and A
and CNAME
records.
Here’s how I set it up:
Add an A Record for the apex domain
In Cloudflare’s DNS settings, I added an A record pointing to GitHub Pages’ IP addresses:
185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153
(These are GitHub’s official IPs for Pages hosting.)
Set up CNAME Flattening for the apex domain
Cloudflare supports CNAME Flattening, which lets me point patricknelson-devops.net
to pat-nel87.github.io
without violating DNS rules.
I added a CNAME
record for www
that points to pat-nel87.github.io
, so www
works too!
Enable HTTPS
In Cloudflare, I switched SSL/TLS mode to “Full (Strict)” to ensure secure HTTPS connections.
Tell GitHub Pages to use my custom domain
In my GitHub Pages settings, I entered patricknelson-devops.net
as the custom domain and checked “Enforce HTTPS.”
And just like that—boom!
My blog was live at patricknelson-devops.net
, loading fast, and secured by HTTPS,
Once I had my Hugo-powered blog looking the way I wanted (after way too much theme tweaking), the next step was getting it deployed automatically.
I turned to GitHub Actions, because why deploy manually when you can write YAML and let the robots 🤖 handle it?
Hugo makes it ridiculously easy to deploy to GitHub Pages with GitHub Actions.
I started with their recommended workflow and customized it to fit my repo. Whenever I push changes to main, the GitHub Actions workflow:
Checks out the repo
Installs Go & Hugo
Builds the site
Deploys it to GitHub Pages
The Result: Push, and It’s Live! 🎉 Now, every time I update my blog and push to main:
No manual builds. No copy-pasting files. No stress. Just instant deployment, powered by YAML, GitHub, and Hugo.
Because if I wanted to deploy my site manually, I’d still be using FTP like it’s 1989.
So, let’s take a step back and appreciate the beautiful recursion we’ve just lived through:
I built a blog ✨
To write a blog 📝
About building a blog 🔄
If this isn’t the most developer thing ever, I don’t know what is.
And at the end of it all? I now have a working, fully automated, beautifully over-engineered personal blog that I can… finally use to write about things other than building the blog itself.
If there’s one key takeaway here, it’s this: 🚀 Just start. Hugo makes it easy. GitHub Pages makes it free. And writing about your journey—even if it’s just about setting up the blog is half the fun.
That is, until I inevitably rewrite everything in some hot new framework in six months. But for now? I’m calling this a success.
Welcome to my blog. Next post: something other than a blog about a blog… 😆
I’m always excited to discuss Go, DevOps, or technology in general. Reach out via contacts on my resume page resume page, and let’s connect!
Happy coding! 🎉