What is Hugo?
What does it do?
It helps you convert markdown files (the files you will be writing your articles or blog posts in) to the static files that will be served later.
How is it different?
This is different to traditional methods like a wordpress site, that has a dedicated database and a web server that needs to respond to requests, communicate with the Databse, and serve the files on every request. It is much more slower than using a static-site generator like Hugo as nothing is dynamic; we know that the content is not going to change. HTTP web servers are extremely good and fast at just serving static content. Users ask for a file, and the server just has to give it. There is no other processing involved.
Your website can be deployed and hosted anywhere (On GCP cloud storage, AWS S3, Netlfify, Firebase, etc.), and can be deployed to a CDN (Content Delivery Network) so that it can be cached on a global edge network and significantly improve the performance and speed of page loads. This is especially important with poor internet connections, and for SEO (Search Engine Optimization).
However, that does not mean Hugo can not be used for anything dynamic. If your use case if very complex such as involving user input, you might not be able to use Hugo. Using a regular website, or single-page-application with React, Angular, Vue, or Svelte might be a better option. But if all you need is a simple blog, with a few extra features, like an option for users to provide comments, Hugo has everything you need.
The Hugo Documentation is very helpful and elaborate. It is the first place to check in case of references or issues.
Hugo is available in all platforms (Windows, MacOS, and Linux), as a binary that you can install, or via a package manager. If you have a compatible package manager, that is the recommended way as it is the easiest and has the least amount of work to maintain
Install using the Binaries
Availabe from their GitHub Releases page. (Choose the appropriate platform and type of file). Make sure to install it in a location that is somewhere in your
usr/local/bin is the best place for Linux. Otherwise, append the location to your
Install using a Package Manager
choco install hugo -confirm
scoop install hugo
On Linux and MacOS (Using Homebrew)
brew install hugo
To verify that the installation occurred successfully, run the following command.
There should not be any errors.
Creating the Site
Change directories into the location you want to create your project. Then run the following command with your project's name. This will create folder that contains all the files that you need to get started.
# Creates a new site and project called 'firstblog' hugo new site firstblog
Change directories into the project directory that was created.
You will notice a similar folder structure. The
config.toml file is where all the variables and settings for your projects live. You will be able to setup and configure most of your website from that one file.
. ├── archetypes ├── config.toml ├── content ├── data ├── layouts ├── static └── themes
If you want to change the file type for your configurations, you can change it to YAML or JSON depending on your preference. You can copy and paste the contents of the file using a tool like ConvertSimple to convert the format and syntax.
All of the actual content that you write as markdown files lives inside the
content directory. You can organize the content in folders, and subfolders, and Hugo will automatically take care of organizing the posts as categories or subcategories.
Use the following command to create a blank markdown file. You can specify where you want to store this file. If the file name alone is provided, then it is directly placed in the
hugo create first-post.md
or try the following to place it in
hugo create posts/first-post.md
Every markdown file that is created and used for your website has a section on the top that is unique to Hugo. It starts and ends with
---. The syntax used in this is
TOML by default. You can change this default setting with the following command:
# To convert to YML hugo convert toYAML
In the front matter, you can set options for the specific page, meta data, and other configuration that is specific to this particular page. Check out the documentation of Front Matter to learn the different options available.
Install a Theme
One of the powers of Hugo is to utilize one of the many themes created by the community. Check out the Complete List and choose one of the themes. Read the documentation and install the theme. This process is very straightforward. Mostly, you will have to download the code, either manually, or using Git, and place it in the
themes folder, then inside another folder with the name of the theme you chose.
Then make sure to go to the
config file and update the theme variable with the name of the theme you have chosen.
Running the Site
Hugo has an in-built web server that helps you view the site locally, and automatically watches your files for changes, and re-runs when the changes occur.
hugo server -D
With the following command, Hugo builds your site and outputs the final static content to the
public directory by default. That can be modified in the
config file if needed. The contents of this file needs to be deployed with whatever hosting provider you chose to use.
Hugo is very feature-rich, and is an amazing product if used wisely. You could set up a CI/CD Pipeline to run every time you make changes and deploy to your hosting provider of choice.
I have setup this blog using GitHub Actions and Firebase. Every time code is merged, a commit is made to the main branch, or a Pull Request is merged, a Firebase workflow runs on GitHub in the cloud that deploys the content of the
public directory to Firebase Hosting.
You can add a comments or discussion section to all of your pages (or select ones) easily using Disqus. Instructions and setup is very straightforward and simple.
That's all for this post and tutorial. I hoped this has helped you and given you an idea of how things work. You can read all my posts on Medium and Dev also.