Hello, World!
Welcome to guirezen.de — my personal corner of the internet.
I built this site from scratch, and I want to walk you through the stack and the decisions behind it.
The stack
Hugo
Hugo generates the entire site as static HTML at build time. No application server running in production, no database, no runtime dependencies — just files served over the wire. Hugo is written in Go, it’s fast, and it handles everything I need: Markdown rendering, templating, taxonomies, and asset pipelines. Posts are .md files with YAML frontmatter, and Hugo compiles them into a full site in milliseconds.
Caddy
Caddy serves the static files in production with automatic HTTPS via Let’s Encrypt — zero configuration for TLS. It handles gzip compression, cache headers for fingerprinted assets, and security headers out of the box. One Caddyfile, no nginx configs to wrangle, no certbot cron jobs.
Docker Compose
The deployment is a single Docker Compose service. A multi-stage Dockerfile runs Hugo at build time to produce the static files, then copies them into a Caddy image. The result is a minimal container that only contains Caddy and the built HTML/CSS/JS. TLS certificates persist in a Docker volume across restarts. Deploying is docker compose up -d --build.
HTMX
HTMX gives the site SPA-like navigation with a single attribute: hx-boost. Clicking a link swaps the page content without a full reload, preserving scroll position and keeping the experience snappy — all without writing a line of JavaScript. No virtual DOM, no build step, no bundle size to worry about.
Alpine.js
Alpine.js handles the few bits that need client-side interactivity: the mobile navigation toggle and the accessibility panel. It’s roughly 15 KB, lives in a <script> tag, and stays out of the way. If I can do it with CSS, I do it with CSS. Alpine is the fallback for what CSS can’t handle alone.
Cyberpunk terminal theme
The visual design is a custom Hugo theme with neon accents, CRT scanline effects, and monospace fonts throughout. CSS is processed through Hugo Pipes — minified and fingerprinted for cache busting. It’s intentionally opinionated — a terminal aesthetic that feels like home to me.
Static-first architecture
There is no application server. There is no API. Hugo builds plain HTML at image build time, and Caddy serves it. Every page works with JavaScript disabled. The entire site is static, and I intend to keep it that way. If I need dynamic behavior, HTMX and Alpine handle it client-side without a backend round-trip.
Open source
The full source code is available on GitHub: github.com/guilhermebr/website. Feel free to look around, open issues, or use it as a reference for your own Hugo-powered site.
What’s next?
I plan to write about:
- Go patterns and idioms
- Infrastructure and deployment
- Side projects and experiments
Stay tuned. More posts coming soon.
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Thanks for reading!