This site costs nothing to run. No hosting fees, no WordPress subscription, no website builder. It’s built with Hugo, hosted on GitHub Pages, and served on a custom domain I pay about $12 a year for.

If you’re in cybersecurity or IT and want a blog that doubles as a portfolio, this is the stack I’d recommend. Here’s how to build one from scratch — even if you’ve never used a terminal before.

What you’ll be building

A static website that looks professional, loads fast, and deploys automatically every time you publish a new post. You write in plain text, run one command, push to GitHub, and it’s live.

The whole setup takes a few hours the first time. After that, publishing a post takes under five minutes.

What you’ll need

  • A computer running Mac, Windows, or Linux
  • A free GitHub account
  • A domain name (optional — you get a free one from GitHub, but a custom domain looks more professional)

No prior coding experience is required. You’ll be using the terminal, but every command is explained.


Step 1 — Install Git

Git is a tool that tracks changes to your files and lets you push them to GitHub. Think of it as a save system for code.

Download it from git-scm.com and run the installer. Once it’s installed, open your terminal (search “Terminal” on Mac, “Command Prompt” or “PowerShell” on Windows) and run:

git --version

If you see a version number, Git is installed.


Step 2 — Install Hugo

Hugo is the engine that turns your text files into a website. It’s fast, free, and widely used.

Mac:

brew install hugo

(If you don’t have Homebrew, install it first at brew.sh)

Windows:

winget install Hugo.Hugo.Extended

Linux:

sudo apt install hugo

Confirm it worked:

hugo version

Step 3 — Create your site

Navigate to where you want your site folder to live. Your home directory is fine:

cd ~
hugo new site mysite
cd mysite

This creates a folder called mysite/ with everything Hugo needs. It’s empty for now — no theme, no content yet.


Step 4 — Install a theme

A theme controls how your site looks. Hugo has hundreds of free themes at themes.gohugo.io. This guide uses PaperMod — it’s clean, fast, and works great for technical blogs.

First, initialise Git in your site folder:

git init

Then install PaperMod:

git submodule add --depth=1 https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod

Step 5 — Configure your site

Open the hugo.toml file in your site folder with any text editor (Notepad, TextEdit, or VS Code). Replace everything in it with this:

baseURL = "https://yourusername.github.io/mysite/"
title   = "Your Site Title"
theme   = "PaperMod"

[params]
  defaultTheme = "auto"

  [params.homeInfoParams]
    Title   = "Your Name"
    Content = "A short description of what your site is about."

  [[params.socialIcons]]
    name = "github"
    url  = "https://github.com/yourusername"

[[menu.main]]
  name   = "About"
  url    = "/about/"
  weight = 10

Replace yourusername with your actual GitHub username and fill in your title and description.


Step 6 — Write your first post

Hugo has a built-in command to create new posts:

hugo new content posts/my-first-post.md

This creates a file at content/posts/my-first-post.md. Open it in a text editor. You’ll see something like this at the top:

+++
title = "My First Post"
date  = 2026-01-01
draft = true
+++

Change draft = true to draft = false, then write your post below the +++ line using plain text. You can use Markdown for formatting — **bold**, # Heading, `code`, and so on.


Step 7 — Preview locally

Before publishing, you can see exactly how your site looks on your own computer:

hugo server -D

Open http://localhost:1313 in your browser. Your site is running locally — no internet required. Any changes you save will appear instantly.

Press Ctrl + C to stop the server when you’re done.


Step 8 — Create a GitHub repo

Go to github.com/new and create a new public repository. Name it mysite (or whatever you called your folder). Don’t tick “Add a README”.


Step 9 — Set up auto-deploy

This is the part that makes GitHub automatically rebuild your site every time you push. Create this folder structure inside your site folder:

.github/
  workflows/
    hugo.yml

On Mac and Linux you can do this in the terminal:

mkdir -p .github/workflows

Then create a file called hugo.yml inside that folder and paste in exactly this:

name: Deploy Hugo site to GitHub Pages

on:
  push:
    branches: [main]
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

concurrency:
  group: pages
  cancel-in-progress: false

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v3
        with:
          hugo-version: latest
          extended: true

      - name: Build
        run: hugo --minify

      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: ./public

  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: build
    env:
      FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4

Step 10 — Push to GitHub

Run these commands in your site folder, replacing the URL with the one GitHub gave you when you created the repo:

git add .
git commit -m "initial commit"
git branch -M main
git remote add origin https://github.com/yourusername/mysite.git
git push -u origin main

Step 11 — Enable GitHub Pages

In your GitHub repo go to Settings → Pages → Source and select GitHub Actions.

Go to the Actions tab — you’ll see a workflow running. Wait for the green checkmark. Your site is now live at https://yourusername.github.io/mysite/.


Step 12 — Connect a custom domain (optional)

If you want your own domain instead of the default GitHub URL, buy one from a registrar like Namecheap or GoDaddy — .com domains run about $10–15 a year.

Once you have it, go to your repo → Settings → Pages → Custom domain and enter your domain.

Then log into your registrar and add these DNS records:

TypeNameValue
A@185.199.108.153
A@185.199.109.153
A@185.199.110.153
A@185.199.111.153
CNAMEwwwyourusername.github.io

DNS changes can take a few minutes to a few hours to propagate. Once GitHub shows the DNS check as passing, tick Enforce HTTPS.

Finally update hugo.toml to use your new domain:

baseURL = "https://yourdomain.com/"

Push that change and you’re done.


Publishing new posts

From this point on, publishing is three commands:

git add .
git commit -m "new post"
git push

GitHub Actions rebuilds and deploys your site automatically. It’s live within a minute.


Why bother?

If you’re job hunting in cybersecurity or IT, a blog is one of the highest-leverage things you can do. It shows you can communicate technical concepts, demonstrates that you’re actively learning, and gives employers something to read beyond a resume.

The setup is a talking point in itself — you used Git, GitHub Actions, DNS configuration, and a static site generator. That’s a non-trivial technical project, and it’s yours.