curl/curl
curl
curl is a command-line tool and a portable C library (libcurl) for transferring data between a client and a server using URLs. The project ships two products from one source tree: the curl executable in src/ and libcurl in lib/ plus the public headers in include/curl/. Almost every operating system, browser-less device, language runtime, and CI/CD pipeline relies on libcurl somewhere in the call chain — by the project's own count, libcurl is installed in the order of 20 billion instances worldwide.
What it does
curl moves bytes over the network using a long list of protocols:
- HTTP/0.9, HTTP/1.0, HTTP/1.1, HTTP/2, HTTP/3
- HTTPS over the same versions, with multiple TLS backends
- FTP and FTPS
- SMTP and SMTPS
- IMAP and IMAPS
- POP3 and POP3S
- LDAP and LDAPS
- SCP, SFTP (over libssh, libssh2, or wolfSSH)
- SMB, SMBS
- TELNET, TFTP, DICT, GOPHER/GOPHERS, FILE
- MQTT, MQTTS
- WebSockets (
ws://,wss://) - RTSP
It supports HTTP, HTTPS, and SOCKS proxies, including HTTPS-to-proxy and HTTP/2-to-proxy. It supports cookies, ETags, alt-svc, HSTS, content encoding (gzip, deflate, brotli, zstd), and a large catalog of authentication schemes (Basic, Digest, NTLM, Negotiate/SPNEGO, AWS SigV4, Bearer, OAuth 2.0).
Two products, one repository
| Product | Source | Public surface | Description |
|---|---|---|---|
curl |
src/ |
command-line options + exit codes | Single-binary CLI: parses flags, opens easy/multi handles, drives transfers |
libcurl |
lib/ |
headers in include/curl/ |
Reentrant C library with stable ABI and SONAME 4 (since 2006) |
The CLI is essentially a thin wrapper around libcurl. Almost every interesting capability lives in the library; src/ mostly translates command-line flags into curl_easy_setopt() calls and orchestrates one-or-many parallel transfers via the multi interface.
Where to start
| Goal | Page |
|---|---|
| Build curl and libcurl from source | Getting started |
| Understand the system at a glance | Architecture |
| Look up project-specific terminology | Glossary |
| Use the C API | API reference |
| Hack on libcurl internals | Systems, Patterns and conventions |
| Add a new TLS backend or protocol | Features, How to contribute |
Open Source
curl is distributed under an MIT-style license — see the COPYING file at the repository root. Daniel Stenberg has been the maintainer since December 1996, originally taking over and renaming Rafael Sagula's httpget 0.1. The code lives at https://github.com/curl/curl and the project's home is https://curl.se/.
Project status
The codebase is large, mature, and actively developed: ~196k lines of C in lib/ and src/, ~38,500 commits, a release every ~8 weeks, and a test suite with nearly 2,000 functional tests plus a few hundred unit tests. See By the numbers for a current snapshot and Lore for how the codebase reached its current state.
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.