Every personal site is a small exercise in taste. Here is how this one is put together and why.
Static, on purpose
There is no database here and no server-side code. The whole site is plain HTML, CSS, and a little JavaScript, generated ahead of time. Static sites are fast, cheap to host, hard to break, and have almost no attack surface. For a portfolio and a blog, nothing else is needed.
Being static also means the site is not tied to any one host. I can build it once and serve it from anywhere, and move it later without a rewrite. That decoupling shapes every other choice below.
Hugo
I build the site with Hugo, a static site generator written in Go. That suits me: one binary, no toolchain to babysit, and builds that finish before I can look away. The theme is PaperMod, which gives a clean reading experience, dark mode that follows the system setting, and a tidy landing page out of the box.
Content is Markdown. A new post is a new file. That is the whole workflow.
Cloudflare Pages
For now the site is hosted on Cloudflare Pages. It watches the Git repository,
runs hugo on every push, and serves the result from a global network with HTTPS
handled for me. It is free for a site this size, and there is nothing to keep
running.
The Synology in the wings
I run a Synology NAS at home, and part of the fun is hosting my own things. The plan is to serve this same site from the NAS through a Cloudflare Tunnel. A tunnel means no open ports on my router and no exposed home IP address, with TLS still terminated at the edge. Because the site is static, moving it there is just a matter of pointing the tunnel at the built files. Same site, different roof.
That is the payoff of keeping things simple. The site does not care where it runs, so I get to choose based on what I feel like maintaining that week.
What is next
More writing, mostly about Go, distributed systems, and the operational tooling I spend my days in. If any of that sounds interesting, the projects page is a good place to start, and the code is all on GitHub.