I wanted a simple, fast personal site for writing about projects and whatever else I’m tinkering with, without dragging in a database, a CMS, or a hosting bill I didn’t already have. Here’s what it’s running on.
Hugo + PaperMod
The site is built with Hugo, a static site generator written in Go. Content is plain Markdown files with a bit of front matter; Hugo turns that into a folder of HTML at build time. No server-side rendering, no runtime dependencies, just files.
For the look and feel I’m using PaperMod, a clean, fast community theme, pulled in as a git submodule rather than forked. That keeps me on the upstream release train and out of the business of maintaining CSS.
The site has three sections: Blog (this), About, and Projects.
Blog posts get dated permalinks (/blog/2026/my-post/), which keeps URLs
stable even if I ever reorganize or retitle things.
Deploying without a new host
I already have web hosting, so standing up something new just to serve static files felt unnecessary. Instead, deployment is a GitHub Actions workflow that:
- Checks out the repo (with the theme submodule)
- Installs the pinned Hugo extended release
- Runs
hugo --gc --minify --cleanDestinationDirto build the site - Copies the resulting
public/directory to my host overscp, authenticated with an SSH key
Every push to main rebuilds and redeploys the site — no manual upload step,
no FTP client. The SSH host, username, private key, and target directory all
live as GitHub Actions repository secrets, never in the repo itself.
One thing that tripped me up: modern scp defaults to speaking the SFTP
protocol under the hood, and on my host that SFTP subsystem resolves relative
paths from a different root than an interactive SSH shell does. Uploads kept
failing with “no such file or directory” against a path that very much
existed. Forcing the legacy scp protocol (-O) fixed it — a good reminder
that “it worked over SSH” and “it’ll work over scp” aren’t always the same
claim.
What’s next
Mostly just writing more. The repo is set up so a new post is one command away:
hugo new blog/my-post-title.md
…and one git push away from being live.