Building This Site with Hugo
I decided to build my personal site with Hugo, a static site generator. The goal was something simple: two blogs, a photo gallery behind authentication, and a clean design that stays out of the way of the images.
Why Hugo
Hugo is fast. Builds complete in milliseconds, even with hundreds of pages. It’s a single binary — no Node.js, no Ruby, no Python runtime needed. And it has built-in support for taxonomies (tags, categories) which saved me from bolting on something custom.
The Dual-Image Approach
The interesting architectural decision was the image model. Blog posts include smaller, compressed versions of photos that are publicly accessible. Each one links to a full-size version on an image detail page that requires authentication:
[](/gallery/album-name/photo-id/)
The small images live in the Hugo static/ directory and deploy with the site. The full-size originals live in a separate S3 bucket, served through CloudFront with Lambda@Edge doing JWT validation.
Data-Driven Gallery
Rather than creating a Markdown file for every photo (500+ would get unwieldy), I used Hugo’s data files. Each photo gets a small YAML file:
id: photo-001
filename: IMG_2024_001.jpg
caption: "Sunset over Capitol Lake"
albums:
- olympia-sunsets
exif:
camera: "Canon EOS R5"
aperture: "f/8"
A shell script generates thin content stubs from these YAML files, and Hugo templates do the rest — album pages, image detail pages, prev/next navigation.
What’s Next
The authentication layer uses AWS Cognito with Google sign-in, enforced at the CDN edge. That’s a whole post on its own.