Tracing wget's journey from its early beginnings as Geturl, written by Hrvoje Niksic in 1996, to becoming the de-facto standard non-interactive downloader for over 25 years, and understanding the real problems it solves in the DevOps world.

After setting up our environment in episode 0 — confirming GNU Wget 1.25.x is installed and verified — in this episode we'll take a brief pause from the hands-on work and understand why wget exists. The history and background of a tool may seem unimportant, but that's precisely where the reasons behind its design lie.
Why should you understand wget's history? Because wget isn't a project born in a corporate boardroom — it came from a very real, very simple need back in 1996. Understanding its origins will explain many of its design decisions — why wget was built to be non-interactive, why it excels at recursive downloads and mirroring, and why it's still the first choice for millions of sysadmins and DevOps engineers today.
The wget story starts with a developer named Hrvoje Niksic. In 1996, while studying in Zagreb, Hrvoje needed a way to download files from the web automatically — without having to open a browser one at a time. At the time, no practical tool existed for that simple task. So, like any good engineer, he wrote his own small tool and named it Geturl — exactly as the name suggests: a tool to get files via URLs.
Geturl grew quickly. The name wget — short for World Wide Web + get — was adopted shortly after, and in 1998 wget officially became part of the GNU project. From then on, its full name became GNU Wget. These two early decisions became the foundation of wget's design: able to run without interaction and able to fetch many files repeatedly.
Note
Don't get confused: Geturl (1996) was the tool's original name, and wget is the name used to this day. Unlike curl, which came from a side project of an IRC client, wget was born from a pure web-download need — that's why its main strength lies in recursive downloads and mirroring, not in API requests.
What confuses many people: there are currently two wget programs in circulation — classic wget and Wget2. They share the same name, but were rewritten in different ways.
Wget 1.x is the lineage that's over 25 years old and the default on almost all Linux distributions. It's maintained with a focus on stability and compatibility — wget scripts you write today will still run on next year's version. The latest version is 1.25.x, and this is the basis for the entire series.
Wget2 is a complete rewrite that's under active development. Its core engine is separated into a library called libwget — similar to the relationship between curl and libcurl. Wget2 brings modern protocol support like HTTP/2, much higher speeds thanks to parallel connections, and more resource-efficient processing. Unfortunately, its maturity hasn't yet matched wget 1.x, so most systems still rely on classic wget.
wget --versionIf wget2 --version isn't installed, don't worry — this series uses wget 1.25.x, and you can confirm that with wget --version. Once you master wget 1.x, moving to Wget2 feels natural because its options are designed to be as close as possible.
The core problem wget solves is simple to say, but hard to do well: automatically downloading many files from the web, without human interaction, and doing it reliably.
| Scenario | Why Wget |
|---|---|
| Recursive download | Fetches one page along with all its links and assets with a single command |
| Website mirroring | Copies an entire site to local disk or another server for backup |
| Timestamping | Only downloads files that changed since the last download — saving bandwidth |
| Batch download | Downloads dozens of URLs at once from a file list |
| Scripting & automation | Non-interactive, has exit codes, runs perfectly in cron, CI/CD, and on headless servers |
Think of wget as a courier who never tires: it doesn't need feeding, doesn't need to be told twice, doesn't need a screen, and can work in the middle of the night via cron. This is where wget excels — something a GUI browser can't do, because browsers require an interactive session and a human.
All the scenarios above share one common requirement: they must run without a human present. Scheduled downloads, nightly backups, asset synchronization in pipelines — all of these run when no one is watching the screen. This is where wget proves its value.
#!/usr/bin/env bash
wget -c -i urls.txt -P /backup/docs || exit 1
echo "Backup selesai"The script above — which you'll fully understand in episodes 4 and 5 — is already enough to be scheduled via cron. Without wget, this kind of task has to be done manually: opening a browser, downloading, moving files, then repeating. With wget, a single command line replaces dozens of error-prone clicks that can't be automated at all.
Note
Note the || exit 1 pattern in the script above. That's how you read wget's exit code: if wget fails (exits with a code other than 0), the script stops immediately with a failure status. We'll dissect the exit code language thoroughly in episode 2 — because it's the key to using wget as a reliable scripting component.
The most common question after people get to know both tools: "can't curl already download? Why do we still have wget?" The answer: the two have different strengths.
| Aspect | Wget | Curl |
|---|---|---|
| Main strength | Recursive download & mirroring | API request flexibility |
| Default output | Writes files to disk | Shows the body on screen |
| Recursive crawling | Built-in (-r, -m) | Not available |
| Resume & retry | -c, --tries, --continue | Available, but more manual |
| Custom requests (method, JSON, header) | Limited | Very comprehensive |
| Protocols | HTTP, HTTPS, FTP | Dozens of protocols |
A simple analogy: curl is a versatile broadcaster that can send any message to a server — great for API testing and precise requests. wget is an expedition truck designed to haul large quantities of goods — great for mass downloads, mirroring, and automation. In the real world, you'll use both; in this series, we focus on the truck.
Tip
A rule of thumb many DevOps teams use: use curl when you're talking to an API (sending methods, headers, JSON bodies), and use wget when you're downloading or mirroring (large files, many files, scheduled downloads). Both can be called from the same script without conflict.
| Year | Milestone |
|---|---|
| 1996 | Hrvoje Niksic writes Geturl for web download needs |
| 1998 | Wget officially becomes part of the GNU project |
| 2000s | Wget 1.x becomes the default downloader on most Linux distributions |
| 2025 | Release 1.25.0; Wget2 continues to be developed as the modern successor |
| 2026 | Wget 1.25.x is stable, used on millions of servers and automation pipelines |
In episode 1, you've traced wget's journey from a simple need in 1996 — Geturl — to becoming the de-facto standard non-interactive downloader with over 25 years of history. You also understand the two wget lineages (the stable 1.x and the modern Wget2), the real problems it solves, and its fundamental differences from curl.
Key takeaways:
In episode 2, we'll dissect wget's core concepts and main architecture — the non-interactive model that is its soul, the complete flow from URL to a file saved on disk, the role of the wgetrc configuration file, the exit code language, and how to control logging and output. See you in episode 2!