The basis for the next evolution of my personal website is complete. There’s almost surely more to come, but the minimum that I’m happy with and the infrastructure to build up from is in place. The last step of all of that is to break in the blog with a post about the site and the blog itself. A quick overview of this weekend project seems like the perfect way to begin.

Let’s look at why I wanted to make this change, and at how I decided to do it.

Why?

This is a project that has been on my never-ending to-do list for almost as long as the last iteration of my website has existed. It was a pretty standard, out of the box, WordPress site. I never really did much with it other than to add the rare page to serve some purpose in that moment. I have wanted to increase my “content creation” presence online for a while, but kind of knew that I would be bumping up against the problems I had with that setup and kept putting it off until I got around to doing this.

The problems I faced weren’t with WordPress itself and I think it’s a great tool, but I really just wanted something simpler and with less bloat to write and think in. Something less tied to a “product” as big as WordPress is. Adding a feature there might mean looking through an over-saturated and over-commoditized plugin ecosystem or write one myself using only PHP and a restrictive set of WordPress hooks.

I also wanted to unify my personal site with other projects I’d worked on more recently as it relates to hosting, deployment, and infrastructure. I’ll discuss that a little more below, but suffice it to say that it carries some benefits for me and allows me to keep the actual content of my posts in a managed system (in this case Git), agnostic of the platform that serves it. That’s a big win for me.

So, with that being said, this was the weekend I finally made the time to do it. So far, I’m very happy with the results.

How?

I knew from the get-go that I wanted to unify my personal site with other projects I’ve been using and the infrastructure around them. That meant a few decisions had basically already been made.

Hosting

I’ve been moving my projects to Kubernetes. I have a private repo on Github that I use to manage the infrastructure of all of my Kubernetes clusters using Flux. It allows me to push a yaml file, wait 1-2 minutes and watch the reconiciliation take effect. If I were to accidentally change something in the cluster which was not represented in that repo, it will reconcile and revert that change, giving me one source of truth and the ability to easily move between clusters or even providers.

Since I switched to this, I’ve been a huge fan despite my initial concerns that I would miss the “fun” of setting up a new server and getting that nice blank slate feel.

Deployment

Kubernetes still needs a container to pull and run and to do that I have some pretty simple and basic Github workflows set up. I’ve never hit the limit for minutes that I get with my Pro account and it’s a system I know and have preferred using over any others I’ve tried.

Basically, the files are built/generate, copied into a docker image, and pushed to Docker Hub. I’ve considered hosting my own image repository and comparing costs, but haven’t taken the time to set on up as of this point. For the moment, at least, it’s worth the subscription cost to me.

Generator

I haven’t made a whole lot of built-to-last primarily static sites, so I didn’t havea horse in this race. I considered Jekyll, but in the end I decided to go with Hugo. This is my first time using it, but so far, I’m a fan for something that truly will be an almost entirely static site.

In making the site, I was able to push the limits of the “static” part of static site a little bit, which is a good indication that I made the right choice, since static sites that don’t have a clear and temporary purpose tend to grow at some point a bit beyond their static roots. I tried working through creating the contact page, which required a bit of Javascript (easy enough) and some code on the backend to send the email. A bit of nginx configuration and a PHP file placed in the static directory and it works about as well as any LAMP stack that I’ve ever set up. Not something I want to do on every page, but perfect for the kind of occasional use that I’ll need it for.

I was also pretty impressed by Hugo’s internationalization features. It wasn’t really something I’d thought about when choosing it, but as an American living in Germany and learning German, it’s a good excuse to learn and practice the language and make the site a bit more welcoming to so many of the people I interact with regularly. In theory that could extend to other languages as well, but given that my French isn’t great anymore and I don’t speak any other languages, I don’t see that happening any time soon.

Design

I always make a big point of saying that I’m not a designer. I have a pretty decent sense for UX (specifically bad UX), but I am just not the right kind of creative, artistic, fashionable, or trendy to really know if something looks “good”. Hugo has a really awesome collection of free (most of them? all?) themes on their site, which is another really awesome experience compared to browsing through WordPress themes, almost all of which tend to be paid or kind of poorly executed in my experience.

Eventually, I saw Hello Friend NG. It’s simple, clean, and I like the look, which is all I really need. A few tweaks to make it my own and some aspects of the design that the theme doesn’t include like my contact form, favicon, etc. and I was ready to go.

What’s Next?

I think that this is enough for one weekend. I want to try to start finding reasons to make posts, as well as reasons to start making posts over on Mastodon, so that and cleaning up little things that come up with the site will be the priorities for a little bit.

At some point, I’ll get a free night or weekend where I feel like doing some work on this and I’d like to expand it a little bit by adding a few things. The first would probably be a projects page where I can share projects I am working on, have worked on, or just want to share. The second would probably be the afformentioned German translation of the site. My German’s not great, so for the time being that’ll likely be sporadic and prioritizing the static pages, rather than the blog posts. The process has to start somewhere.

Beyond that, we’ll just see what I need as I need it. At least now I have a foundation that I like to work from. That goes a very long way.