Before downloading your first file, there are a few basic skills and tools you need to prepare: comfortable navigation in the terminal, an understanding of HTTP and networking fundamentals, and confirmation that GNU Wget 1.25.x is installed and ready to use in your own environment.

Welcome to the Learn Wget series! This series will take you from mastering GNU Wget — the non-interactive command-line downloader and recursive website downloader — from your first file download to mirroring, scripting, and production hardening. There are 23 episodes in total, each building your understanding layer by layer.
But before typing your first wget command, there are a few basic skills and tools you need to prepare. Why are these prerequisites important? Because wget is a client: it talks to servers over the network using the HTTP protocol, then writes the results to files on disk. If you don't yet understand how an HTTP conversation works, or you're not comfortable in the terminal, wget commands will feel like a black box — you know the command, but you don't understand what's happening inside.
Imagine wanting to become an expedition truck driver without understanding road maps. No matter how capable the truck is — and wget is a very reliable truck — it's still hard to deliver goods without knowing the route. Episode 0 is your road map: we prepare the basic skills, make sure GNU Wget 1.25.x is installed and verified, and equip the supporting tools that will accompany you throughout the series.
Wget is a Command Line Interface (CLI) tool. All of its power is accessed through the terminal — not by clicking buttons. That's why the first step is to adopt the right mindset: don't be afraid to type, read errors carefully, and build your muscle memory patiently.
A simple analogy: a GUI is like a TV remote control — simple, but limited to the buttons it offers. A CLI is like an airplane's instrument panel — intimidating at first, but it gives you full control over every aspect. All DevOps work — fetching files from servers, mirroring websites, scheduling downloads — starts with a command in the terminal.
Before diving into wget, make sure you're comfortable navigating the terminal. These four commands are enough as a starting point:
| Command | Function |
|---|---|
pwd | Shows the current working directory |
ls | Lists the contents of a directory |
cd | Changes to another directory |
man | Reads a command's manual |
One concept you must understand from now on: stdout. Many commands write their results to stdout — in other words, to your terminal screen. This output can be redirected to a file with > (redirect) or piped to another command with | (pipeline). You'll use this pattern throughout the series, for example wget -O - URL | jq — so understand it from the start.
HTTP (Hypertext Transfer Protocol) is the protocol wget uses most often. Every HTTP request starts from a single object called a URL — the destination address of the transfer. The URL anatomy can be broken down into five components:
| Component | Example | Function |
|---|---|---|
| Scheme | https | The protocol used |
| Host | example.com | The domain name of the destination server |
| Port | 443 | The connection door on the server (default if omitted) |
| Path | /files/ | The location of the resource on the server |
| Query | ?id=1 | Extra parameters for the request |
Once you understand URLs, you also need to understand the shape of the conversation: request and response. The client (wget) sends a request containing a method, path, and headers. The server answers with a response containing a status code, headers, and a body. Wget mainly uses the GET method — fetching data — but it's important to know the status code classes, because they are the "report card" of every download:
| Class | Meaning | Example |
|---|---|---|
| 2xx | Success | 200 OK |
| 3xx | Redirect | 301 Moved Permanently, 302 Found |
| 4xx | Client error | 403 Forbidden, 404 Not Found |
| 5xx | Server error | 500 Internal Server Error |
Besides status codes, there are headers — metadata sent before the body. The most common ones: Content-Length (file length in bytes), Content-Type (file type), Content-Disposition (the suggested file name), and Last-Modified (the last time the file was changed). These headers will become important in later episodes, especially for resume and file naming.
Besides HTTP, there are four networking concepts that will keep appearing throughout the series:
| Concept | Explanation | Analogy |
|---|---|---|
| DNS | Translates domain names into IP addresses | A phone book: you remember the name, the system looks up the number |
| IP Address | A server's unique address on the internet | A home address |
| Port | A specific door on a server | An apartment unit number: 80 for HTTP, 443 for HTTPS |
| TLS/SSL | Encrypts data while in transit | A sealed envelope: its contents can only be safely read by the recipient |
| Proxy | An intermediary between client and server | A receptionist who forwards your letters |
Why does this matter? Because wget will "talk" directly to all of these layers. When wget downloads from https://example.com, it performs DNS resolution, opens a TCP connection to port 443, performs a TLS handshake, then sends the HTTP request. In episode 2 we'll dissect this flow step by step.
The good news: most Linux distributions ship wget by default — just open a terminal and type:
wget --versionGNU Wget 1.25.0 linux-gnu
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Originally written by Hrvoje Niksic <hniksic@xemacs.org>.
Currently maintained by Tim Ruehsen <tim.ruehsen@gmx.de>.
Please send bug reports and questions to <wget@gnu.org>.Pay attention to two parts of the output above:
GNU Wget 1.25.0) and the target system (linux-gnu). This series assumes wget 1.25.x.Unlike curl --version, wget doesn't list its features in a single Features line. TLS, HTTP/2, and WARC capabilities are determined at compile time. Here's how to verify them:
| Feature | How to Verify |
|---|---|
| TLS/HTTPS enabled | wget -S https://example.com and look for the SSL connection using TLSv1.3 line in the output |
| WARC support | wget --help includes the --warc-file option |
| HTTP/2 | Available in wget 1.25+ builds compiled with HTTP/2 support |
Tip
The fastest way to make sure your build is healthy: wget -S https://example.com. If the SSL connection using TLSv1.3 line appears and an index.html file is saved, TLS is working and wget is ready to use — no need to guess from the --version output.
On Windows 10+, wget isn't available out of the box the way curl is. The most comfortable option is WSL2 — there, wget runs as a native Linux binary, exactly like in a production server environment.
If wget --version instead shows command not found, install it with the package manager for your system:
sudo apt update
sudo apt install wgetNote that macOS doesn't bundle wget — curl is the built-in tool there. So on macOS, brew install wget is a required step. On Windows, besides WSL2, you can also use package managers like scoop or choco (for example scoop install wget), or download the official binary from the project.
Wget is great on its own, but some jobs will be much easier with these four companion tools:
| Tool | Use in This Series | Verification |
|---|---|---|
curl | Comparison and complement; flexible for API requests | curl --version |
jq | Parses and colorizes JSON output (for example from wget -O -) | jq --version |
gpg | Verifies signatures of downloaded files | gpg --version |
openssl | Inspects TLS certificates and encrypted connection details | openssl version |
jq matters most in the early episodes because the wget -O - URL | jq pattern will be used to fetch and read data from APIs. gpg will come in handy in the episode about verifying the authenticity of downloaded files. Make sure all four are installed by running:
curl --version
jq --version
gpg --version
openssl versionpwd, ls, cd, man).wget --version shows GNU Wget 1.25.x.wget -S https://example.com).curl, jq, gpg, and openssl are installed.In episode 0 you've laid the foundation for the entire series: understanding basic CLI skills and HTTP concepts (URL, request/response, status codes, headers), knowing the networking basics (DNS, ports, TLS, proxies), confirming GNU Wget 1.25.x is installed and verified with active TLS support, and equipping yourself with the supporting tools curl, jq, gpg, and openssl.
Key takeaways:
wget --version: make sure the version is 1.25.x and HTTPS works.curl, jq, gpg, and openssl as your companions throughout the series.In the next episode, we'll discuss the history, background, and why the world needs wget — from the Geturl written by Hrvoje Niksic in 1996, wget's entry into the GNU project, to how a small tool became the de-facto standard non-interactive downloader for over 25 years. Make sure your environment is ready, because the Learn Wget journey is just beginning!