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:

  1. Write a new post in markdown
  2. Commit and push to the main branch
  3. GitHub Actions automatically:
    • Installs Hugo
    • Builds the site (with minification)
    • Deploys to Azure Static Web Apps
  4. 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.