curl/curl
Lore
Why curl looks the way it does today. Dates are derived from git history, the in-repo docs/HISTORY.md, and the project's own release notes. Where the why behind a change is not explicit, language hedges accordingly.
Eras
The Amiga IRC bot (Nov 1996 – Dec 1996)
Daniel Stenberg was writing an IRC bot for an Amiga channel on EFnet and needed currency conversion. He picked up Brazilian developer Rafael Sagula's httpget 0.1 (Nov 11 1996) and shipped his own 0.2 on Dec 17, 1996. He became maintainer effectively immediately.
urlget — beyond HTTP (Jan 1997 – Mar 1998)
- Jan 1997: HttpGet 0.3 accepts URLs on the command line.
- Apr 1997: 1.0 introduces HTTP proxy support.
- Aug 1997: GOPHER and FTP added; the project is renamed
urlget2.0. Build scripts learn Windows and Solaris. - Nov 1997: 3.1 adds FTP upload. The "I just want HTTP" days are over.
- Mar 1998: another rename, this time to
curl 4— chosen partly because "Client URL" was a nice expansion. (Unrelated, Curl Corporation was still alive then; their later non-response when contacted about the name confirmed the project could keep using it.)
Going public (Mar 1998 – Sep 1999)
- 1998: SSL via SSLeay; first cookie support; the project moves away from GPL because cookie code shipped under
(MPL or MIT)to keep libcurl link-friendly. Telnet and configure scripts arrive. - 1999: DICT, LDAP and FILE support join. OpenSSL replaces SSLeay. First Debian package. Move to curl.haxx.nu, then later curl.haxx.se. The project is hosted on SourceForge.
libcurl is born (2000 – 2001)
- Spring 2000: a major internal overhaul produces
libcurl. The first non-beta release is7.1in August 2000. Programs other thancurlitself can finally link to the library. - Aug 2000: PHP becomes the first third-party libcurl binding. Many follow.
- Mar 2001: HTTP/1.1 + persistent connections in 7.7. SONAME bumped to 2 for the overhaul.
- Nov 2000: SONAME first set to 1;
multiinterface starts being designed. SOCKS5, kerberos4 (later removed), test suite scaffold. - Jan 2001: license becomes MIT (or MPL); a few releases later it is MIT only.
The multi interface and ecosystem (2002 – 2009)
- 2003: distributed test farm "autobuilds" run testcurl.pl on volunteer machines.
- 2004: large-file support; IDN.
curl_formparse()removed → SONAME 3. - 2005: GnuTLS becomes a TLS option. The
multi_socket()API ships. TFTP added. - 2006: Gopher gets removed (re-added in 2010). SCP/SFTP added. SONAME 4 (unchanged since). Mozilla CA bundle generator ships.
- 2007: NSS as a TLS backend.
- 2009: CMake support; IMAP, POP3, SMTP added.
Modernizing transports (2010 – 2017)
- 2010: switch from CVS to Git on GitHub. RTSP, RTMP added. PolarSSL backend. Gopher reintroduced.
- 2011: axTLS, cyassl (later renamed wolfSSL).
- 2012: Schannel and Darwin SSL backends; Metalink.
- 2013: internals refactor — everything becomes the multi engine internally, even
curl_easy_performis a wrapper. First experimental HTTP/2 work begins. krb4 support removed. - 2014: first real HTTP/2 release. SMB/SMBS added.
- 2015: HTTP/2 multiplexing + server push. "Everything curl" book started.
- 2016: HTTP/2 default for HTTPS in the tool. HTTPS-proxy. First TLS 1.3.
- 2017: OSS-Fuzz starts fuzzing libcurl. MultiSSL (multiple TLS backends in one binary). SSLKEYLOGFILE; new MIME API. brotli.
HTTP/3 era (2018 – 2024)
- 2018: libssh backend. curl ships with Windows 10 1803. DoH and URL API land. MesaLink TLS. HTTP/2 enabled by default.
- 2019: alt-svc; first HTTP/3 requests; parallel downloads in 7.66.
- 2020: BearSSL; PolarSSL removed; wolfSSH; experimental MQTT; zstd; site moves to curl.se. alt-svc.
- 2021: Hyper backend (HTTP/1 in Rust); Rustls; HSTS.
- 2022:
--json; mesalink removed; msh3 HTTP/3 backend; initial WebSocket; gskit removed. - 2023:
curl_off_t < 8 bytesremoved; trurl spinoff; HTTP/2 over HTTPS proxy;.onionresolution refused; NSS removed; gskit fully gone; "variable" CLI feature. - 2024: docs migrated to "curldown"; experimental ECH; NTLM_WB removed; wcurl adopted;
--help [option]; TLS 1.3 early data; WebSocket "official"; Hyper dropped.
Native cleanup (2025 – present)
- 2025: 0-RTT for QUIC; experimental HTTPS RR; BearSSL, SecureTransport, msh3 removed (June). curl is installed on 110 OSes / 28 CPU architectures by year's end. krb-ftp, Heimdal, wolfSSH, winbuild dropped (November). Apple SecTrust added; native CA-store on Apple systems.
- 2026 (Apr): RTMP support removed.
Longest-standing features
| Feature | Introduced | Notes |
|---|---|---|
| HTTP | Nov 1996 | The original |
| FTP | Aug 1997 | Reworked many times — always present |
| TELNET | Nov 1998 | Has not changed in shape since |
| FILE | Aug 1999 | Implementation in lib/file.c is small and stable |
| LDAP | Aug 1999 | Two implementations (lib/ldap.c + lib/openldap.c) since 2010 |
| TFTP | Sep 2005 | Implementation centralized in lib/tftp.c |
| SCP/SFTP | Nov 2006 | Backend swappable since 2018 (libssh) and later wolfSSH |
| HTTP/2 | Mar 2014 | nghttp2 dependency since the beginning |
The multi interface |
2001 (incremental) | The multi state machine is the single non-negotiable abstraction |
Major rewrites
| What | When | Why |
|---|---|---|
| Synchronous-only → multi internals | Feb 2013 | Eliminate parallel implementations of the easy and multi paths |
| Connection layering → cfilter framework | 2022 → 2023 | Make HTTPS-over-HTTPS-proxy, HTTP/2-CONNECT, HTTP/3 cleanly composable |
| Documentation → curldown | Jan 2024 | One markdown source, one renderer, no more nroff hand-editing |
.netrc → API-level integration |
various | Cleaner, testable parsing |
| URL parsing → public API | Oct 2018 | Application reuse + reduced internal duplication |
| Resolver → multi backends | early 2010s | Async via c-ares or thread pool replacing blocking getaddrinfo |
| HTTP/3 → ngtcp2 + quiche | 2019 → 2023 | ngtcp2 is curl's preferred backend; quiche kept as a parallel option |
Deprecated and removed features
| Feature | Removed | Notes |
|---|---|---|
| Gopher (the first time) | Jan 2006 | Bugs in implementation that nobody had hit; re-added 2010 |
| krb4 | Oct 2013 | Long-deprecated; replaced by Kerberos 5 paths |
| FTP third-party transfer | 2006 | SONAME bumped to 4 because of this |
axTLS backend |
Dec 2018 | Upstream went stale |
MesaLink backend |
2022 | Upstream went stale |
NSS backend |
Aug 2023 | Upstream Mozilla NSS divergence cost too much |
gskit backend |
Sep 2023 | Maintenance burden |
Hyper HTTP backend |
Dec 2024 | Maintenance burden — the abstraction outlived its usefulness |
NTLM_WB (winbind helper) |
May 2024 | Security/maintenance — direct NTLM is preferred |
BearSSL, SecureTransport, msh3 |
Jun 2025 | Coordinated cleanup of less-used backends |
Heimdal, wolfSSH, winbuild |
Nov 2025 | Same |
RTMP |
Apr 2026 | Latest removal at the time of this snapshot |
Growth trajectory
- 1996: 1 person, ~600 lines of C in
httpget. - 2000: ~20k lines of C, libcurl is born, contributor count crosses double digits.
- 2008: 683 contributors, 145k unique website visitors.
- 2017: 1,609 contributors, 211 command-line options, 249 setopts.
- 2022: 2,601 contributors, 245 options, 295 setopts. Docker pulls cross 4 billion.
- 2025: 3,534 contributors, 273 options, 308 setopts, ~12 billion HTTP requests/month to curl.se. Estimated 20+ billion install instances.
The most active contributors over the last two years (excluding bots) are Viktor Szakats, Daniel Stenberg, Stefan Eissing, Jay Satiro, and Dan Fandrich. The full list — over 3,500 names — is in docs/THANKS.
Awards and recognition
- Oct 2017: Daniel Stenberg receives the Polhem Prize for his work on curl.
- Mar 2018: curl ships in Windows 10 1803, joining the OS rather than the optional-tools shelf.
- Oct 2025: Daniel Stenberg awarded a gold medal by the Royal Swedish Academy of Engineering Sciences for the curl project.
The official narrative of all of this lives in docs/HISTORY.md; this page is a derivative summary.
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.