Yesterday, I came to update my blog: I had a new post in draft form and I wanted to update the Swift code to version 4. However installing High Sierra had removed Jekyll which is the site generator that I had been using. I re-installed Jekyll but found that it had been updated from version 2 to version 3.


Jekyll Problems

Then my problems started: missing dependencies due to the basic Jekyll install no longer including certain features, and then syntax errors due to changes in the way things are done, particularly to do with pagination.

I tried to fix this myself, then thought that maybe the theme I was using had already solved these issues so I tried re-installing that. It wanted to add about 25 more gems and then failed to install - sigh - spend some time rolling that back…

At this point I decided that if Jekyll was going to cause me a lot of trouble, it might be worth looking at an alternative.

My main criteria were the ability to import my Jekyll site and the ability to host on GitHub Pages. After checking out the options, I decided to have a look at Hugo.


Moving to Hugo

One of the most lauded features of Hugo is speed. I had found with Jekyll that when I saved an edited page, it took about 5 seconds before the edits could be reloaded into the browser. Hugo is supposedly fast and does auto reloads.

Following the Quick Start guide, I installed Hugo. Importing my Jekyll site worked easily and so fast I wasn’t sure anything had happened, transferring my posts to contents/posts and my other files (status pages, images etc.) to static.

Then the main exercise appeared to be choosing a theme which would provide not only the visuals but the capabilities of the site.

So I drew up a list of demands for any theme I chose:

Must Have Features

  • Responsive
  • Blog style:
    • front page with recent posts
    • tags
    • archive page
  • Written using Markdown
  • Static pages for apps listing, about, contact etc.
  • Syntax highlighting
  • Social links
  • Google Analytics

Would Be Nice Features

  • Disqus commenting
  • Twitter cards
  • JSON Feed
  • Searching within the site

The Hugo themes page https://themes.gohugo.io has themes listed by capabilities, but no way that I could see to combine a selection of capabilities.

Some of the features like Google Analytics or Disqus comments, I could probably add myself using templates from theme that did include them, if the template I chose did not.

Conveniently, nearly all these seem to come with an exampleSite folder that contains the configuration info.


Configuring a Theme

After testing out several alternatives, I decided to go with Even - at least to start with. I installed the theme and copied the contents of the example config.toml to my own config.toml file and started configuring.

I wasn’t happy with some of the fonts, but soon worked out how to change the CSS in the theme and then re-build it to apply the changes. And I changed the theme colour from the default red to “Cobalt Blue”.

Most of the other changes were done using the config.toml file. I was able to set up menus, configure the social media links I wanted to show, set date formats, set the number of items to show per page and so on.

I had a couple of more static pages that I wanted to show, so I added their Markdown files to the content folder.

One nice feature which I had missed in Jekyll (or at least the way I had it set up) was the ability to separate blog posts from more static web pages. Each of my apps has an information/support page that does not accept comments and doesn’t need to be listed in the Archives. By moving these Markdown files from contents/posts to contents/pages, I was able to achieve this.

Adding Google Analytics and Disqus commenting was as easy as entering my IDs in the relevant places in the config.toml file.

I had to do some editing of my imported posts from Jekyll - mainly getting rid of references to {{ site.url }} so that images and internal links would work. And sometimes I just needed to re-save a file to make Hugo re-evaluate it (there is probably a command to force a complete re-build if I looked for it.)


Working out the Structure

One thing that I was puzzled by was what templates the various pages are generated from.

The main page is easy enough as the theme folder has a layouts folder with an index.html file containing the templating. When a post is displayed, that looks like it comes from layouts/posts/single.html while layouts/posts/summary.html contains the templating for each entry in the index page.

But clicking on the Archives link in the me takes me to https://troz.net/post/ and there is no post.html file in layouts. There is a post folder, but it contains the single.html & summary.html files described already.

Delving ever deeper, layouts/_default/section.html appears to contains the Archives page template. But how does that relate to the https://troz.net/post/ link? And the Tags template is in layouts/_default/terms.html but appears in https://troz.net/tags/. Checking the Hugo documentation for creating a theme, I find the information I need. Hugo has a selection of file paths that it checks for such templates, and these file paths match some of those. So now I know where to go to customise further.

One feature that I really like about the Even theme is the ability to have a table of contents displayed beside each blog post if your page is wide enough. It takes the headers in the post and uses them to make the table. I may need to add or edit the headers in some posts, but I really like this feature.

And if you want a laugh, test out the 404 page - here is a bad link - which generates a random text emoji each time!


Publishing

I wanted to use my existing GitHub Pages setup, so I replaced the site files in my local repository with the new Hugo site files. I generated the static site files using hugo in Terminal, then pushed the pages to GitHub. All I had to do then was change the settings so that GitHub Pages knew my site was coming from the docs folder and I was live with the new site.


Final Thoughts

So how am I going with my check list?

  • Responsive - ALMOST, not Hugo’s fault
  • Blog style - YES
  • Written using Markdown - YES
  • Static pages for apps listing, about, contact etc. - YES
  • Syntax highlighting - YES
  • Social links - YES
  • Google Analytics - YES
  • Disqus commenting - YES
  • Twitter cards - NO
  • JSON Feed - NO
  • Searching within the site - NO

The Hugo generated pages are all responsive and look great on my iPhone, but my old static page for listing my apps does not look good, so I need to re-design that.

Twitter cards - I have found some articles on how to set that up, so it is possible, but I haven’t done it yet.

JSON Feed is not working. There are themes that apparently have this, but I haven’t yet worked out how to implement it - hopefully later.

In-site search - this was something I was able to get in my old WordPress site, but not in Jekyll. There are Hugo themes listed that support search, but they seem to just give a link to Google or DuckDuckGo. Maybe this can be edited to restrict it to the site, but I dislike using such searches, so I will not add a search unless it works internally. One theme I found uses Algolia to search the site, so I will investigate that.

Overall, I am impressed. The transition was relatively easy, especially considering that I didn’t take the time to learn anything about Hugo first, but just blundered in and tried to work it out on the fly.

The speed of generating pages and the live reload while developing make Hugo a pleasure to work with. Now all I have to do is write some interesting posts…

And I want to tidy up the URLs, headers and tags for the older pages as well as investigating Twitter cards, search & JSON Feed.