Wordpress issues

When I created my website blog, I didn’t put much thought into choosing a technology, so I went with WordPress as a “default” option. But almost immediately, I noticed several drawbacks that have been bothering me over the years — sometimes more, sometimes less:

  • Constant updates. Maybe it’s just me, but I get annoyed by the never-ending “new versions” of the software I use. I usually write posts far less frequently than WordPress updates — or worse, the dozens of plugins it requires. So every time I wanted to write something, I first had to spend half an hour updating everything. By the time I was done, my motivation to write had faded.
  • “Vendor lock-in”. While not absolute, it’s something you don’t usually notice until you try experimenting. The last straw for me was when I wanted to copy the raw text of a post… and I couldn’t! The controversial Gutenberg editor only allows copying one paragraph at a time.
  • Frequent “pentester” requests, to put it mildly. Since WordPress remains the most popular website engine in the world, thousands of scripts are constantly scanning for potential security holes, trying to leave spam comments, and so on.
  • No “backlinks” for photos. Once an image is uploaded to the blog, there’s no way to track where its original file is stored—whether it’s a RAW file from a camera or just the original phone photo. All the SEO-friendly URLs and file renaming completely erase the original information and “digital footprint”.
  • Speed issues. Even though I don’t have that many posts, it’s shocking to see how much unnecessary stuff loads along with the content. I really appreciate sites like this and this, and I believe the text content is the most important part of a post. The megabytes of useless scripts constantly frustrate me. If a page can load faster, why not make it so?
  • Limited plugin flexibility. Many plugins do something cool, but their full versions cost money. Sure, you can tweak some open-source options, but those are becoming rarer.
  • Questionable multilingual support. I sometimes try writing in English, and I’d like my blog to handle multilingual content properly out of the box. My last attempt at this in WordPress created a complete mess of categories (if you have a bookmarked link with something like “2019-ru” in it—that’s where it came from).

Static Site Generators (SSG)

So, I regularly felt the urge to explore what else was available in the world of website building and blogging. I really liked the idea of Static Site Generators (SSG) since they solve more than half of the issues I mentioned above right out of the box. However, I was missing a good example of how to handle photos and multilingual support. So, these attempts usually ended with me going back to WordPress to write my original post.

About a year ago, I tried looking into Pelican. I liked that it was written in Python, but something was still missing (though at this point, I can’t even remember what exactly).

Hugo

But at the end of January 2025, during yet another round of exploring my options, I stumbled upon Hugo . And I think I’ve finally found what I was looking for!

  • Fast. Website generation is super quick (though processing photos slows it down a bit, but that’s not the engine’s fault). The final speed depends only on what you’re generating.
  • Built-in multilingual support.
  • Markdown for posts and the ability to store the site’s “source code” in a Git repository—way better than Gutenberg.
  • While experimenting with a couple of “pilot” posts that I migrated from WordPress to Hugo, I found a photo management workflow that works well for me.

Of course, there are some downsides, though they’re more about SSGs in general rather than Hugo specifically:

  • No dynamic content. The biggest issue — no built-in comments. That’s pretty disappointing, but there are a few ways around it. The simplest (and the one I’ve enabled for now) is to load comments from corresponding GitHub discussions. It works fine for people with GitHub accounts but isn’t great for non-technical users. Anonymous commenting is a higly desirable feature, but the plugin doesn’t support it yet.
  • More hands-on work with themes, CSS, and HTML. Not really my thing, but at least it gives me much more control over the final result.
  • Some plugin issues. So far, the most noticeable one is that if a post contains multiple Leaflet maps with tracks, only the first one lets you “move” along the track. I’ve reported the issue—it should be an easy fix, but it’ll take some digging. Luckily, it’s not a dealbreaker.

Photography workflow

In order to be able to “backtrack” a photo, it’s enough to know its timestamp. So I put timestamped-named files directly into post sources.

├── 2018
│   └── 02-02-china-great-wall-jinshanling
│       ├── 2018-01-04 12.12.15.jpg
│       ├── 2018-01-04 12.54.36.jpg
│       ├── 2018-01-04 12.57.35.jpg
│       ├── 2018-01-04 13.00.25.jpg
│       ├── 2018-01-04 13.00.45.jpg
│       ├── 2018-01-04 13.02.20.jpg
│       ├── 2018-01-04 13.21.33.jpg
│       ├── 2018-01-04 14.08.36.jpg
│       ├── 2018-01-04 14.13.06.jpg
│       ├── index.en.md
│       ├── index.md

However in the post itself I’d like to keep human-readable-urls, so I had to implement own tag (“shortcode”) accepting original filename, desired human-readable filename and a title/description:

{{<  img "2024-12-21 09.56.20.jpg" "airport-lounge-world-1" "Интерьер зала" >}}

Obviously, first it was just a simple logic adding img tag, but quickly it grew to include lightbox (zoom on click), EXIF data extraction, generation of multuple sizes for responsivness and the gallery which I tried to recreate from the Wordpress plugin I was using.

Summary

If you’re reading this, I think it worked. I replaced old Wordpress website with the new one, statically generated with Hugo. However old blog is still alive and accessible on https://old.okainov.com/ - feel free to compare and give me any feedback, which one do you like better and what is still missing here. Stay tuned!