Hugo is a static site generator written in Go. It allows building fast, secure websites without the need for dynamic servers. It’s especially designed for developers, technical writers and anyone who prefers writing content in Markdown and publishing it quickly with a professional design. Perfect for maintaining my technical notes and personal documentation.
It’s known for its compilation speed and for not requiring external dependencies like databases or complex template engines. Ideal for blogs, documentation, portfolios and corporate sites.
As you might imagine, I recently migrated this site to Hugo from the Jekyll version I built a while ago.
Advantages
- Ultra-fast compilation (thousands of pages in seconds)
- Markdown + shortcodes for writing content
- Customizable themes and a large theme community
- Static site with no dependencies: ideal for CDNs and GitHub Pages
- Clear folder-based structure
Generic Hugo Installation
Before describing the steps I took to migrate, let’s see how to do a generic Hugo installation.
On Linux
# Manual download and extraction
wget https://github.com/gohugoio/hugo/releases/download/v0.126.1/hugo_extended_0.126.1_Linux-64bit.tar.gz
tar -xvzf hugo_extended_0.126.1_Linux-64bit.tar.gz
sudo mv hugo /usr/local/bin/
On macOS
Option 1: Homebrew
brew install hugo
Option 2: Direct download
# Extended version
curl -LO https://github.com/gohugoio/hugo/releases/download/v0.126.1/hugo_extended_0.126.1_macOS-universal.tar.gz
tar -xvzf hugo_extended_0.126.1_macOS-universal.tar.gz
sudo mv hugo /usr/local/bin/
On Windows
Manual option
- Go to https://github.com/gohugoio/hugo/releases
- Download hugo_extended_*.zip for Windows.
- Extract and place hugo.exe in a directory on the PATH.
Then you create a site just that easily:
hugo new site my-blog
cd my-blog
git init
git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke themes/ananke
echo 'theme = "ananke"' >> config.toml
hugo new posts/my-first-post.md
hugo server -D
Open your browser at http://localhost:1313
Migration from Jekyll
Without going into detail, here are the steps I performed.
The final result with all the source files is here: gh-pages branch at LuisPalacios.github.io
I cloned my repository, where I had the Jekyll-generated site under the
docs/folder (gh-pagesbranch).I created a new Hugo site with
hugo new site src(new folder), to maintain a clean structure separated from the rest.I chose the PaperMod theme for its clean design, dark/light mode support, built-in search and good taxonomy support.
I copied the Jekyll blog content (
_posts/) to Hugo’ssrc/content/posts/directory, and adjusted the front matter (title,date,categories,tags,cover, etc.) to the TOML/YAML format compatible with Hugo. I created multiple bash scripts to do this.I converted the special pages (like
about.md,contact.md, etc.) to the new format and moved them tosrc/content/.I customized the configuration in
hugo.toml, defining taxonomies, menu, language, PaperMod parameters, etc.I adjusted the static assets like images, favicons and SVGs inside
src/static/.I enabled modern features like search with Fuse.js, SVG dark mode support, and social buttons.
I validated the site locally with
hugo server -D, and verified functionality, appearance, etc.I checked accessibility, basic SEO and responsive behavior to ensure the migration improved UX and maintained compatibility with old content.
I configured GitHub Pages in my repository to use “GitHub Actions” as the source and created the hugo.yaml workflow.
I removed the Jekyll content once I verified everything was working.
Result: a much faster, modern and sustainable site, without Ruby or Bundler dependencies, and with a more comfortable workflow. It’s extremely fast and I can clone it and work on any operating system in minutes. Achieving the same with Ruby (for Jekyll) was a nightmare. You have all the configuration files and sources in the repository.