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:

  1. Checks out the repo (with the theme submodule)
  2. Installs the pinned Hugo extended release
  3. Runs hugo --gc --minify --cleanDestinationDir to build the site
  4. Copies the resulting public/ directory to my host over scp, 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.