Tracing curl's journey from its beginnings as httpget in 1996 to becoming the de-facto standard for URL-based data transfer used on almost every operating system, while understanding why a single tool can handle dozens of protocols at once.

After setting up the environment in episode 0 — making sure curl 8.21.x is installed and verified — in this episode we'll take a short break from hands-on work and understand why curl exists. A tool's history and background may feel unimportant, but that's exactly where the reason for its current design lies.
Why must you understand curl's history? Because curl isn't a project born from a corporate boardroom, but from a very simple real-world need in 1996. Understanding its origins explains many design decisions — why curl supports dozens of protocols, why it ships as both a CLI and a library, and why it's still the first choice of millions of engineers today. You'll realize that curl is not just "a download command", but a de-facto standard that's more than 25 years old.
The curl story begins in Sweden, in the hands of a developer named Daniel Stenberg. In 1996, Daniel was working on Irssi — an IRC client — and wanted to offer IRC users a way to automatically check currency exchange rates. To do that, he needed to fetch data from an HTTP-based server.
The problem: back then, no practical tool existed for that simple task. The available tools felt heavy and didn't fit. So, as is the habit of a good engineer, Daniel wrote his own small tool and named it httpget — exactly as its name suggests: a tool to get (fetch) over HTTP.
httpget grew along with the needs. Irssi users wanted support for other protocols — starting with FTP, then gopher. The httpget code began to "branch out" and every fork carried its own copy — a maintenance nightmare. In 1998, Daniel decided to unify all those branches into a single new project named curl — popularly interpreted as Client for URL.
Note
Don't get confused: httpget (1996) was the tool's original name, and curl (1998) is the name used to this day. The birth date often cited for "curl" is 1998 — when all the code was reworked and unified under a single name.
One decision that changed everything happened in the early 2000s. As curl grew more popular, people started asking: "can I use curl's transfer engine inside my own program?"
Daniel answered by separating the core transfer engine into a standalone library named libcurl. From that point on, curl officially consisted of two faces:
This was a highly strategic decision. libcurl allowed other applications — browsers, mobile apps, servers, backup tools — to borrow curl's data transfer capabilities without rewriting from scratch. That's what made curl more than just a popular tool: it became infrastructure foundation — millions of applications around the world run libcurl without their users ever knowing it.
curl -L https://example.comNotice the example above: the same thing — fetch a page and follow redirects — takes a single line in the CLI, while libcurl needs several API calls. The CLI hides all the details behind simple options; libcurl gives developers full control. We'll dig deeper into both faces in episode 2.
Since being unified in 1998, curl has shipped releases consistently up to today. Up to version 8.21.0, the project has made around 275 releases — almost one release every six weeks for more than two decades. That's proof of a project that's alive and managed with discipline.
Why has curl been able to survive and dominate? Several reasons:
The analogy: like TCP/IP or JSON — technologies whose presence is rarely noticed, but which have become the unwritten standards holding up the entire internet. Curl is one of the few tools you could say is "everywhere".
The core problem curl solves is simple to say, but hard to do well: one tool to transfer data using URL syntax across various protocols.
Before curl, every protocol needed a different tool: ftp for FTP, telnet for Telnet, and so on. Curl unifies them all with one shared syntax — the URL. Here's the list of protocols supported by curl 8.21:
| Category | Protocol |
|---|---|
| Web | HTTP, HTTPS, WebSocket (ws, wss) |
| File transfer | FTP, FTPS, SFTP, SCP, TFTP |
| SMTP, SMTPS, POP3, POP3S, IMAP, IMAPS | |
| Directory | LDAP, LDAPS |
| Messaging | MQTT |
| Remote access | TELNET |
| Other | DICT, GOPHER, SMB, SMB (CIFS) |
With one shared syntax, you can send files to an FTP server with curl ftp://..., read email with curl imap://..., or talk to an MQTT broker — without switching tools.
| Scenario | Why Curl |
|---|---|
| Scripting & automation | Pure CLI, easy to call from bash/Python, clear exit codes |
| API testing | Headers, method, and body fully configurable; output easily piped to jq |
| CI/CD | Available in almost all builder images and runners |
| Network troubleshooting | Verbose mode reveals DNS, TCP, TLS, and HTTP details |
You'll spend most of this series with the curl CLI, so let's set the boundary from the start. Check your build first — the list of protocols and features can be read via curl --version:
One reassuring thing: everything you learn in the CLI also applies to libcurl. Every CLI option is essentially a wrapper around one libcurl setting — -L is CURLOPT_FOLLOWLOCATION, -d is CURLOPT_POSTFIELDS, and so on. Learning the CLI is the shortest path to understanding libcurl.
| Year | Milestone |
|---|---|
| 1996 | Daniel Stenberg writes httpget for exchange rate data in Irssi |
| 1998 | All code branches are unified as curl |
| Early 2000s | libcurl is split into a standalone library |
| 2026 | Release 8.21.0, around the 275th release |
In this episode 1, you've traced curl's journey from a simple need on IRC in 1996 — httpget — to a de-facto standard for URL-based data transfer that's more than 25 years old with around 275 releases. You also understand curl's two faces (CLI and libcurl) and the real problem it solves: one tool for dozens of protocols.
Key takeaways:
In the next episode 2, we'll dissect curl's core concepts and main architecture — what actually happens behind a single line of command: from URL parsing, DNS resolution, TCP/TLS connection, to sending and receiving data. We'll also get to know the core options and the language of exit codes that will accompany you throughout the series. See you in episode 2!