If you’re a nerd like me, you probably want a fast, clean, and fully controllable personal website — something that doesn’t fight you, doesn’t hide behind layers of abstraction, and doesn’t require a small Kubernetes cluster just to publish a blog post.
Enter Hugo — one of the fastest static site generators on the planet.
But speed is only part of the story.
What really makes Hugo shine is the philosophy behind it: simplicity, portability, and raw performance. You write your content in Markdown, organize it in a sane folder structure, pick a theme (or build your own), and Hugo does the rest — compiling everything into a blazing-fast static site that you can host basically anywhere.
No database. No runtime. No mysterious background processes eating your RAM at 3 AM.
Just files.
⚡ Why Hugo feels different
If you’ve ever wrestled with WordPress plugins, waited for a bloated CMS admin panel to load, or debugged why your blog suddenly needs 512 MB more memory… Hugo feels like stepping out of the fog.
With Hugo you get:
- Ridiculous build speed — even large sites compile in seconds
- Single binary deployment — no dependency hell
- Markdown-first workflow — write anywhere, publish everywhere
- Git-friendly content — your site finally behaves like code
- Hosting freedom — GitHub Pages, Cloudflare Pages, S3, your homelab… whatever
For nerds (and proud of it), this is pure dopamine.
🧠 The mental model that clicks
The moment Hugo really “clicks” is when you realize:
Your website is just a compiled artifact.
You edit Markdown → Hugo builds → static files come out → web server serves them at light speed.
That’s it.
This model unlocks some beautiful workflows:
- Version your entire site with Git
- Preview locally in milliseconds
- Deploy with a simple CI pipeline
- Sleep peacefully knowing there’s no database to corrupt
🔧 Where Hugo really shines
Hugo is especially perfect if you:
- run a homelab
- like infrastructure-as-code
- prefer Markdown over WYSIWYG editors
- want near-zero maintenance
- care about performance (yes, you probably do)
It’s less ideal if you need heavy dynamic features out of the box — but honestly, in 2026, most of that can be bolted on cleanly with APIs and edge functions.
🚀 My take
After trying heavier CMS platforms, going back to Hugo feels almost… suspiciously fast. The feedback loop is tight, the output is clean, and the control level is exactly where a technical person wants it.
If your goal is:
- maximum speed
- minimum moving parts
- full ownership of your stack
…Hugo deserves a very serious look. So let’s jump into it.
In this tutorial you’ll learn:
- How to install Hugo
- How to create your personal website
- How to customize a theme
- How to deploy it (two ways):
- Self-host (my favourite)
- Host on Linode
Let’s go.
Prerequisites
You should have:
- Basic terminal knowledge
- Git installed
- A Linux/macOS/WSL environment
- A domain name (optional but recommended)
1. Install Hugo
Linux (Debian/Ubuntu)
sudo apt update
sudo apt install hugo
macOS (Homebrew)
brew install hugo
Verify installation
hugo version
2. Create Your Site
Create a new Hugo project:
hugo new site my-website
cd my-website
Your structure will look like:
my-website/
├── archetypes/
├── content/
├── layouts/
├── static/
├── themes/
└── hugo.toml
3. Add a Theme
Hugo without a theme is… ugly 😅
Let’s install the popular PaperMod theme.
git init
git submodule add https://github.com/adityatelange/hugo-PaperMod themes/PaperMod
Now edit your hugo.toml:
baseURL = "https://example.com/"
languageCode = "en-us"
title = "My Personal Website"
theme = "PaperMod"
4. Create Your First Post
hugo new posts/my-first-post.md
Edit the file:
---
title: "My First Post"
date: 2026-02-26
draft: false
---
Hello internet 👋
This is my new Hugo website.
5. Run Locally
Start the dev server:
hugo server -D
Open:
http://localhost:1313
Boom — your site is alive.
6. Build the Production Site
When ready to deploy:
hugo --minify
Your static site will be generated in:
public/
This folder is what you deploy.
Option 1 — Self-Host (My Favourite)
If you want full control, self-hosting is the way.
Advantages
- Full ownership
- Maximum privacy
- No platform lock-in
- Fun 😎
Step 1 — Prepare Your Server
You need:
- A home server…yes the old one laptop whos been abandoned for 10 years
- Nginx installed
- SSH access
Install nginx:
sudo apt install nginx
Step 2 — Upload Your Site
From your local machine:
rsync -avz public/ user@your-server:/var/www/mywebsite/
Step 3 — Nginx Config
Create:
sudo nano /etc/nginx/sites-available/mywebsite
Example config:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/mywebsite;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Enable it:
sudo ln -s /etc/nginx/sites-available/mywebsite /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Step 4 — Enable HTTPS (Recommended)
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
Your self-hosted Hugo site is now live.
Option 2 — Host on Linode
If you prefer less hardware responsibility, Linode is a solid choice.
Advantages
- Simple deployment
- Reliable infrastructure
- Cheap options
- Good performance
Step 1 — Create a Linode
From the Linode dashboard:
- Create → Linode
- Choose Ubuntu LTS
- Shared CPU is fine
- Deploy
Step 2 — Install Nginx on Linode
SSH into your Linode:
sudo apt update
sudo apt install nginx
Step 3 — Upload Your Hugo Site
rsync -avz public/ root@LINODE_IP:/var/www/mywebsite/
Step 4 — Configure Nginx
Use the same configuration shown in the self-host section.
Reload nginx:
sudo systemctl reload nginx
Step 5 — Point Your Domain
At your DNS provider:
A record → yourdomain.com → LINODE_IP
Wait for DNS propagation.
Pro Tips
- Use Git for version control
- Automate deploys with CI/CD
- Put Cloudflare in front for caching
- Keep themes as git submodules
- Use
hugo server -Dduring development
Final Thoughts
Hugo is insanely fast, simple, and production-ready.
My personal recommendation:
- Want control and fun → self-host
- Want convenience → Linode
Both are solid — it depends on your philosophy.
Happy building 🚀