I’ve always operated this site on a shoestring budget, taking advantage of every free offering I can find and paying for the cheapest nameserver possible.
Recently, I decided to update the site by migrating to Hugo so I could add this blog section. The setup I’ve landed on is pretty elegant, and I thought it might be worth sharing.
The Stack
Hugo for Content
Hugo is a fast, modern static site generator that’s perfect for blogs. Creating new posts is just writing markdown — no database, no CMS, just simple files that get transformed into HTML. It fits perfectly with the static site approach and gives me full control over the content.
Azure Static Web Apps for Hosting
I’m using Azure Static Web Apps for hosting, which offers:
- Custom domain binding with zero configuration
- Free SSL certificates (automatically provisioned and renewed)
- Global CDN for fast content delivery
- Generous free tier that’s perfect for a personal blog
The setup is incredibly simple — just connect your GitHub repository and Azure handles the rest.
GitHub Actions for CI/CD
Everything is version controlled in GitHub, and I’m taking advantage of the free GitHub Actions runner minutes for building and deploying. The entire pipeline is handled by a single GitHub Action workflow:
name: Azure Static Web Apps CI/CD
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- main
jobs:
build_and_deploy_job:
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
runs-on: ubuntu-latest
name: Build and Deploy Job
steps:
- uses: actions/checkout@v2
with:
submodules: true
# Install Hugo
- name: Setup Hugo
uses: peaceiris/actions-hugo@v3
with:
hugo-version: '0.115.1'
# Build the Hugo site
- name: Build Hugo Site
run: hugo --minify --source hugo --destination hugo/public
# Deploy the public folder
- name: Build And Deploy
id: builddeploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
action: "upload"
app_location: "hugo"
api_location: "api"
output_location: "public"
close_pull_request_job:
if: github.event_name == 'pull_request' && github.event.action == 'closed'
runs-on: ubuntu-latest
name: Close Pull Request Job
steps:
- name: Close Pull Request
id: closepullrequest
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
action: "close"
The Workflow
The process is simple:
- Write a new post in markdown
- Commit and push to the
mainbranch - GitHub Actions automatically:
- Installs Hugo
- Builds the site (with minification)
- Deploys to Azure Static Web Apps
- Done—usually in under a minute
It’s a perfect example of how modern tooling can make personal projects both powerful and cost-effective. Sometimes the best solution is the simplest one.