Building This Blog: Hugo + Azure Static Web Apps
Table of Contents
Every homelab journey needs a place to live. Mine starts here.
I recently picked up three Intel NUCs — each running an AMD Ryzen 7430U with 32GB of RAM and a 512GB SSD — with the goal of building a proper Kubernetes cluster at home. I want to learn, self-host things I actually use, and document the whole thing so others can follow along (or at least avoid my mistakes).
Before I start flashing Talos Linux and configuring PXE boots, I figured I needed somewhere to write things down. So: this blog.

Why Hugo + Azure Static Web Apps? #
I wanted something:
- Fast — no server, no database, just static files on a CDN
- Automated — push to git, site updates. No manual deploys
- Secure — no backend attack surface, HTTPS out of the box
Hugo fits that perfectly. It’s a static site generator written in Go — single binary, no Node.js dependency hell, builds in milliseconds. Azure Static Web Apps has a free tier that integrates directly with GitHub: every push to main triggers a build and deploy automatically via GitHub Actions.
The Setup #
The stack is simple:
- Hugo — static site generator with the Congo theme
- GitHub — source of truth, version control
- Azure Static Web Apps — free hosting, global CDN, automatic HTTPS, CI/CD via GitHub Actions
The deploy token lives in GitHub Secrets — never in the repository. The public/ build output is never committed either; Azure builds it fresh on every deploy.
Custom Domain + DNS #
With the site running on Azure I wanted it on a proper domain, not the default azurestaticapps.net URL. I registered ricardojacobs.nl through TransIP — the go-to registrar for .nl domains in the Netherlands.
The DNS problem #
The first instinct was to manage DNS at TransIP directly. Azure Static Web Apps needs two things for a custom domain:
- An
ALIASrecord at the apex (@) pointing to the Azure hostname - A
CNAMEforwww
TransIP supports ALIAS records, but it rejected Azure’s hostname format with a validation error. After some digging, the cleaner solution was to move DNS management to Azure DNS — keeping everything in one place and using Azure’s native ALIAS support for Static Web Apps.
Setting up Azure DNS #
- Create a DNS Zone resource in Azure for your domain
- Azure provides 4 nameservers — update these at your registrar under Nameservers
- For
.nldomains this goes through the SIDN registry, so allow up to an hour for propagation
Once the nameservers propagate, add the following records in the Azure DNS Zone:
| Type | Name | Value |
|---|---|---|
A (Alias) | @ | → Azure Static Web App resource |
CNAME | www | your-app.azurestaticapps.net |
The A record with alias mode points directly to the Static Web App resource — Azure resolves the IP internally and handles changes automatically. No hardcoded IP addresses.
Adding the custom domain in Azure #
With DNS in Azure, go to Static Web App → Custom domains → + Add, choose Custom domain on Azure DNS, and Azure handles the ownership validation automatically. It then provisions a free SSL certificate via DigiCert — no manual certificate management needed, auto-renewed.
The whole domain + HTTPS setup took about an hour, most of which was waiting for the .nl nameserver delegation to propagate.
What’s Next #
This blog is step one of a longer journey. Here’s what I’m planning to document:
- Talos Linux — immutable, API-driven OS for Kubernetes, installed via PXE boot
- Kubernetes cluster — setting up a three-node cluster on bare metal NUCs
- OpenBao — secret management (open-source fork of HashiCorp Vault)
- Keycloak — SSO for all self-hosted services
- Immich — self-hosted Google Photos alternative
- Observability — metrics, logs, traces — the whole stack
If any of that sounds interesting, stick around. This is going to get hands-on quickly.