Alright, let’s get you set up with Hugo. This isn’t brain surgery, but there are a few paths you can take, and some are decidedly smoother than others. I’ll lay out your options, give you the commands, and more importantly, tell you which route I’d take and why. The goal is to get from zero to a running local server in under five minutes, without any cryptic error messages.

The Homebrew Method (macOS & Linux)

If you’re on a Mac or running a decent Linux distribution, Homebrew is, by a wide margin, my preferred package manager. It’s not just easy; it’s sane. It handles dependencies, updates, and installations in a way that feels like the developers actually use their own tool.

First, you need Homebrew itself. If you’re a Mac user and don’t have it, pause here and go install it. I’ll wait. Seriously, it’s non-negotiable for anyone who touches a terminal regularly.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Once that’s humming along, installing Hugo is a one-liner:

brew install hugo

To verify it worked and see what version you’re rocking:

hugo version

You should get a nice output like hugo v0.120.4+extended darwin/arm64. See that word “extended”? That’s crucial. The extended version includes the Sass/SCSS processor, which you will almost certainly need if you use any remotely modern theme. Homebrew gives you the extended version by default. This is why I like it.

The Chocolatey Method (Windows)

Windows folks, you’re not left out. Chocolatey brings a slice of that sane package management life to your world. It’s like Homebrew, but it has to deal with Windows, so you have to admire its perseverance.

First, install Chocolatey. You’ll need to run this in an Administrator PowerShell. Yes, Administrator. I know, it’s annoying, but it’s a Windows thing.

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

Once that’s done, you can install Hugo. And crucially, you want to specify the hugo-extended package. Don’t settle for the regular one.

choco install hugo-extended -y

Close and reopen your terminal, then check your work:

hugo version

The Snap Method (Linux)

Snap is a contentious topic in the Linux world. Some love its sandboxing and cross-distro compatibility, others… well, others hate how slow it can be and its philosophical implications. I’m not here to start a flame war. It’s an option. It usually works.

If your distribution has snapd installed and you’re cool with using it, the command is straightforward:

sudo snap install hugo

The potential gotcha here? You might not get the extended version. The Snap package maintainers sometimes lag behind, or the build might not include the Sass libraries. Run hugo version immediately after installing. If it doesn’t say “extended,” uninstall it (sudo snap remove hugo) and use another method. It’s not worth the future headache.

Going Binary: The Manual Download

Sometimes package managers are broken, you’re on a weird architecture, or you just want to get the absolute latest release directly from the source. For those times, you can download the binary directly from Hugo’s GitHub releases page.

  1. Go to github.com/gohugoio/hugo/releases.
  2. Find the latest release. Don’t get a pre-release version (e.g., v0.121.0-rc1) unless you’re feeling adventurous and don’t mind things breaking.
  3. This is the critical part: Look for the file that includes “extended” in the name and matches your OS and architecture (e.g., hugo_extended_0.120.4_linux-amd64.tar.gz).
  4. Download it, extract it, and find the hugo (or hugo.exe) binary inside.
  5. Now, you can’t just run it from anywhere. You have to put it somewhere your system can find it. The best place is a directory like /usr/local/bin/ (on macOS/Linux) or a directory in your Windows PATH. On Linux/macOS, you can usually just copy it over:
sudo cp hugo /usr/local/bin/

The major downside of this method is that you are now your own package manager. Hugo won’t auto-update. You’ll have to repeat this process every time you want a new version. It’s a bit tedious, but it gives you total control.

Whichever method you choose, the final test is always the same: crack open a terminal and type hugo version. If it comes back with a version number and the magical word “extended,” you’ve won. You’re ready to actually build something.